Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

função que retorna vetor

Recommended Posts

1. Fazer um subalgoritmo que receba, por parâmetro um vetor K(15) e retorne, também, por parâmetro, um vetor P contendo apenas os valores primos de K.

 

#include <stdio.h>
#include <stdlib.h>
#define N 5

void VerificaPrimos(int k[], int *p);
int Primo(int a);

int main()
{
	int k[N], *p;
	int i;
	for(i=0;i<N;i++)
	{
		printf("Digite um valor para V[%d]: ",i);
		scanf("%d",&k[i]);
		p = '\0';
	}
	VerificaPrimos(k,p);
	for(i=0;i<N;i++)
	{
		printf("\nPrimos do vetor: %d",p[i]);
	}
	free(p);
	return 0;
}
void VerificaPrimos(int k[], int *p)
{
	int i;
	int qtd = 1;
	for(i=0;i<N;i++)
	{
		if(Primo(k[i]) == 1)
		{
			p = (int*)calloc(qtd,sizeof(int));
			if(p == NULL)
			{
				printf("\nESTOURO DE MEMORIA!");
				exit(0);
			}
			qtd++;
			p[i] = k[i];
		}
	}
}
int Primo(int a)
{
	int i;
	int qtd_primos = 0;
	for(i=2;i<=a;i++)
	{
		if(a%i == 0)
		{
			qtd_primos++;
		}
	}
	if(qtd_primos == 1)
	{
		return(1);
	}
	else
	{
		return(0);
	}
}
Ta certo isso que eu fiz? Uma coisa, não tem como retornar um vetor por valor neh? Nesso caso, teria que declarar a variável vetor p já no main e passar como parâmetro neh? Ou tem outra forma?

Essa minha alocação não ta funcionando tb, da um erro quando vou mostar o vetor p, alguém pode ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>
#include <stdlib.h>
#define N 15

void VerificaPrimos(int k[], int *p);

int main() {
int k[N], *p;
int i;
for(i=0;i<N;i++) {
	printf("Digite um valor para V[%d]: ",i);
	scanf("%d",&k[i]);
}

p = (int *)malloc(0);
if(p == NULL) exit(1);

VerificaPrimos(k,p);
i = sizeof(p)+1;
while(i >=0){
	printf("\n%d",p[i]);
	i--;
}

free(p);
return 0;
}

void VerificaPrimos(int k[], int *p) {
int i,j;
j = 0;
for(i=0;i<N;i++) {
	divisor = 2;
	while (divisor < k[i] && k[i]%divisor != 0) divisor++;
	if (divisor == k[i]) {
	   p = (int *)realloc(p,(j + 1) * sizeof(int));
	   p[j] =k[i];
	   j++;
	}
}
}

 

Array sao sempre passados por referencia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isis, não tem que verificar o estouro de memória quando do realloc tb? Qual a diferença no argumento do exit(), zero ou um?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas veja, nesta parte:

i = sizeof(p)+1;
	while(i >=0){
		printf("\n%d",p[i]);
		i--;
	}

está pegando o tamanho em bytes de p, e está pegando só o primeiro elemento, to tentando fazer aqui mas ta f***, acho que vai ter q passar aquele j por referência tb "/

Compartilhar este post


Link para o post
Compartilhar em outros sites
isis@linux-0khy:~/Desktop> ./a.out

Digite um valor para V[0]: 12

Digite um valor para V[1]: 52

Digite um valor para V[2]: 63

Digite um valor para V[3]: 27

Digite um valor para V[4]: 41

Digite um valor para V[5]: 20

Digite um valor para V[6]: 5

Digite um valor para V[7]:

7

Digite um valor para V[8]: 94

Digite um valor para V[9]: 86

Digite um valor para V[10]: 2

Digite um valor para V[11]: 15

Digite um valor para V[12]: 31

Digite um valor para V[13]: 75

Digite um valor para V[14]: 49

 

i= 5 p+i= 0x804b01c *(p+i)=135145 &p = 0x804b01c p = 135145

i= 4 p+i= 0x804b018 *(p+i)=31 &p = 0x804b018 p = 31

i= 3 p+i= 0x804b014 *(p+i)=2 &p = 0x804b014 p = 2

i= 2 p+i= 0x804b010 *(p+i)=7 &p = 0x804b010 p = 7

i= 1 p+i= 0x804b00c *(p+i)=5 &p = 0x804b00c p = 5

i= 0 p+i= 0x804b008 *(p+i)=41 &p = 0x804b008 p = 41

 

 

Trocando por sizeof(p):

 

isis@linux-0khy:~/Desktop> ./a.out

Digite um valor para V[0]: 12

Digite um valor para V[1]: 30

Digite um valor para V[2]: 52

Digite um valor para V[3]: 64

Digite um valor para V[4]: 5

Digite um valor para V[5]: 7

Digite um valor para V[6]: 94

Digite um valor para V[7]: 83

Digite um valor para V[8]: 2

Digite um valor para V[9]: 3

Digite um valor para V[10]: 14

Digite um valor para V[11]: 79

Digite um valor para V[12]: 61

Digite um valor para V[13]: 23

Digite um valor para V[14]: 17

 

i= 4 p+i= 0x804b018 *(p+i)=3 &p = 0x804b018 p = 3

i= 3 p+i= 0x804b014 *(p+i)=2 &p = 0x804b014 p = 2

i= 2 p+i= 0x804b010 *(p+i)=83 &p = 0x804b010 p = 83

i= 1 p+i= 0x804b00c *(p+i)=7 &p = 0x804b00c p = 7

i= 0 p+i= 0x804b008 *(p+i)=5 &p = 0x804b008 p = 5

 

com sizeof(p)+1 e while >0:

 

isis@linux-0khy:~/Desktop> ./a.out

Digite um valor para V[0]: 12

Digite um valor para V[1]: 63

Digite um valor para V[2]: 48

Digite um valor para V[3]: 53

Digite um valor para V[4]: 2

Digite um valor para V[5]: 7

Digite um valor para V[6]: 34

Digite um valor para V[7]: 19

Digite um valor para V[8]: 64

Digite um valor para V[9]: 61

Digite um valor para V[10]: 78

Digite um valor para V[11]: 79

Digite um valor para V[12]: 49

Digite um valor para V[13]: 60

Digite um valor para V[14]: 23

 

i= 5 p+i= 0x804b01c *(p+i)=79 &p = 0x804b01c p = 79

i= 4 p+i= 0x804b018 *(p+i)=61 &p = 0x804b018 p = 61

i= 3 p+i= 0x804b014 *(p+i)=19 &p = 0x804b014 p = 19

i= 2 p+i= 0x804b010 *(p+i)=7 &p = 0x804b010 p = 7

i= 1 p+i= 0x804b00c *(p+i)=2 &p = 0x804b00c p = 2

 

E com sizeof(p) e while > 0:

 

isis@linux-0khy:~/Desktop> ./a.out

Digite um valor para V[0]: 25

Digite um valor para V[1]: 63

Digite um valor para V[2]: 5

Digite um valor para V[3]: 7

Digite um valor para V[4]: 13

Digite um valor para V[5]: 61

Digite um valor para V[6]: 48

Digite um valor para V[7]: 49

Digite um valor para V[8]: 79

Digite um valor para V[9]: 51

Digite um valor para V[10]: 20

Digite um valor para V[11]: 24

Digite um valor para V[12]: 38

Digite um valor para V[13]: 23

Digite um valor para V[14]: 33

 

i= 4 p+i= 0x804b018 *(p+i)=79 &p = 0x804b018 p = 79

i= 3 p+i= 0x804b014 *(p+i)=61 &p = 0x804b014 p = 61

i= 2 p+i= 0x804b010 *(p+i)=13 &p = 0x804b010 p = 13

i= 1 p+i= 0x804b00c *(p+i)=7 &p = 0x804b00c p = 7

 

 

Coisas que só ponteiros fazem por você...

Não precisa passar j por referencia... Só retorne a variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

retornei a variável, mas continua dando errado...o primero numero fica certo, mas o resto vem uns valores nada a ver, eu debuguei e dentro da função fica certo dai quando vou rodar no main da errado

 

ta certo ficar realocando a memoria a cada iteração do laço ali?? nao vai mudar as variáveis de lugar dai?

#include <stdio.h>
#include <stdlib.h>
#define N 5

int VerificaPrimos(int k[], int *p);
int Primo(int a);

int main()
{
	int k[N], *p;
	int i;
	for(i=0;i<N;i++)
	{
		printf("Digite um valor para V[%d]: ",i);
		scanf("%d",&k[i]);
	}
	if( (p = (int*)malloc(0)) == NULL) exit(1);

	i = VerificaPrimos(k,p);

	while (i >= 1)
	{
		printf("\nPrimos do vetor V[%d]: %d",i,p[i]);
		i--;
	}

	free(p);
	return 0;
}
int VerificaPrimos(int k[], int *p)
{
	int i;
	int qtd = 1;
	for(i=0;i<N;i++)
	{
		if(Primo(k[i]) == 1)
		{
			if( (p = (int*)realloc(p, qtd * sizeof(int))) == NULL) exit(1);
			p[qtd] = k[i];
			qtd++;
		}
	}
	qtd = qtd - 1;
	return(qtd);
}
int Primo(int a)
{
	int i;
	int qtd_primos = 0;
	for(i=2;i<=a;i++)
	{
		if(a%i == 0)
		{
			qtd_primos++;
		}
	}
	if(qtd_primos == 1)
	{
		return(1);
	}
	else
	{
		return(0);
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não só está certo como precisa porque é alocação dinâmica.

Se não tiver espaço p/ realocar,é óbvio que o endereço de *p vai mudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

se não tiver espaço pra realocar, vai sair do programa "/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não tiver espaço ( 4 bytes <5 bytes) ele vai realocar e dar um endereco diferente.

Se não tiver mais MEMÓRIA DISPONÍVEL PARA O PROGRAMA OCUPAR (seja porque você esgotou a máquina ou porque você ultrapassou o limite de memória para o processo) ele termina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas nao existe essa condição ali, vai realocar a cada iteração e vai dar um endereço diferente pra cada valor, por isso ta dando erro axo, esse programa do jeito q você postou ta certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites
mas nao existe essa condição ali, vai realocar a cada iteração e vai dar um endereço diferente pra cada valor, por isso ta dando erro axo

 

SO != programador

Saber se tem que realocar pra socar mais dados na memória é trabalho do programador.

Verificar se tem memória disponível p/ fazer isso é trabalho do SO.

 

Mas já que é pra confundir: o malloc pode tanto retornar o mesmo endereço quanto um diferente. Quando não dá p/ colocar num pedaço de memória porque não tem espaço, é trabalho de uns algoritmos (deve ser algo da laia do best-fit,first-fit ou next-fit) achar um pedaço onde o treco caiba, se houver. Segundo a ISO ele dealoca a memória p/ depois realocar.Bizonho?Nem tanto. O ponteiro pode ter sido dealocado,mas o endereço que ele tinha continua com o valor que você colocou pelo simples fato de que o SO protege o espaço de endereçamento do processo contra escrita de outros.Como você não trocou nada a não ser o tamanho da memória alocada...

 

O ponto é que os pedaços de memória alocada devem ser disjuntos (http://www.gnu.org/software/libc/manual/html_node/Changing-Block-Size.html#Changing-Block-Size). Por isso se não tem espaço,os dados são copiados p/ um local novo. Os detalhes mais podres estao nessa pagina: http://www.gnu.org/software/libc/manual/ht...able-Parameters

 

 

No teu está dando erro.O meu funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o teu da erro, como roda sem a variável divisor nem está declarada? Mas independente disso, não roda..

dentro da função, os valores estão corretos, mas quando passa por refêrencia pra main(), fica errado, pega lixo...nao entendo isso, se to alterando o vetor dentro da função auxiliar através de ponteiro, como pode no main retornar algo diferente? Como corrigir isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá faltando declaração, declara ué.

Olha o vídeo mostrando que essa coisa roda: http://video.google.com/videoplay?docid=-5862899100127803246

 

Agora olha a seqüência do teu (se conseguir ler,porque a qualidade cai muito qdo se coloca na internet)

 

http://video.google.com/videoplay?docid=3250254797946501566

http://video.google.com/videoplay?docid=5534878437788045336

http://video.google.com/videoplay?docid=5534878437788045336

 

Essa é a correção do teu programa,que não sei porque conta os divisores de N até o final,coisa que é desnecessária:

http://video.google.com/videoplay?docid=-6451808120576639166

Compartilhar este post


Link para o post
Compartilhar em outros sites

... Se você der uma olhada no canto do video, vai ter um botão escrito google.clica e escolhe Fit to Window e Soft Video.fácil,fácil.

Gravei com qualidade média e no media player ta excelente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha essa opção soft video não tem...se eu coloco em tamanho original, fica minuscula a tela. Eu até baixei os videos, dá a msm coisa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah sei lah, nessa screen que você postou da pra ver, mas aqui não tem como não...sei lah pq

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.