Ajuda no programa de vectores (C)

n0ob

Membro
Boas...

Não percebo poruqe razão isto não me ordena bem os valores, dando numeros estranhos no final...

Preciso mesmo de ajuda =S

cumps

#include <stdio.h>
#include <stdlib.h>

int n,i,j,aux;

void recebe_valores()
{ int vet[n];

printf("Indique o valor de numeros desejados : ");
scanf(" %d",&n);

for(i=0;i<n;i++)
{ printf("Coloque o valor desejado %d: \n ",i+1);
scanf(" %d", &vet);
}
}
void ordenavector()
{ int vet[n];
int aux, i=0, j=0;
for(i=0; i<n; i++)
{ for(j=0; j<n; j++)
{ if(vet<vet[j])
{ aux=vet;
vet=vet[j];
vet[j]=aux;
}
}
}
}


void imprimir()
{
int vet[n];

for(i=0;i<n;i++)
{
printf(" %d ",vet);
}

}
main()
{
int vet[n];
recebe_valores();
ordenavector();
imprimir();

system("pause");
}
 
Assim à 1ª vista, tu defines um array de inteiros em todas as funções porquê?

Assim ao receberes os valores e ao guarda-los num array na função recebe_valores, os valores só estão nessa função.

Ou seja, apesar de a varíavel vet[n] ter o mesmo nome em todas as funções, só vai ter os valores que queres no recebe_valores. Para teres nas outras funções ou tornas a variável global (apenas uma) ou vais passando o array como atributo sempre que chamares um função

Assim sendo, na função ordenavector vais estar a ordenar lixo que esteja no vector e na função imprimir vais imprimir o lixo e atenção que não é o mesmo lixo, apesar de as variáveis terem o mesmo nome o conteúdo é diferente.

Experimenta colocar o ciclo que tens no imprimir no recebe_valores e vais ver como te imprime os valores correctos mas não ordenados
 
Última edição:
O primeiro erro ÓBVIO logo à partida é que estás a declarar um vector de tamanho n mas só mais tarde é que vais buscar o valor do n.

Não é assim que funciona, o código é executado de forma sequencial, portanto quando declaras o vector, já tens de saber o seu tamanho, não podes declará-lo com tamanho n e só depois ir buscar o valor n.

Depois, aquilo que o dagas46 disse é o segundo erro óbvio: o vector[n] que estás a usar em cada uma das funções, estás a declará-lo dentro das próprias funções, isso significa que esse vector só existirá dentro dessa função. A partir do momento que uma função termina, perdes essa variável. O facto de declarares uma variável com o mesmo nome/tamanho nas funções seguintes não faz a variável miracuolsamente ressuscitar.

Terceiro erro óbvio: Não se devem usar variáveis globais. É má prática. No entanto, neste programa até se poderia entender que usasses o vector de inteiros como variável global, de forma que o seu valor estivesse disponível em todas as funções. No entanto, tu fazes exactamente o contrário, estás a declarar o n, i, j e aux como global quando essas variáveis são apenas variáveis auxiliares que devem ser declaraste em cada uma das funções. Isto não é uma questão de "repetir código", mas sim de usar os recursos da máquina de forma apropriada. Ao declarares estas variáveis em cada uma das funções, estás a utilizar a memória do PC apenas quando é de facto necessária. Já o vector[n] é sempre necessário, portanto até se compreende que declares essa variáveis, e apenas essa, como global, embora existem outras formas mais correctas de o fazer.

De qualquer forma não te eskeças: só podes declarar uma variável do tipo vector[n] se já souberes o n.
Isso pode ser um problema para a tua implementação.

Cumps
 
Back
Topo