jaozinpnk Posted June 9, 2020 at 05:08 PM Share Posted June 9, 2020 at 05:08 PM Boa tarde, Foi proposto um exercício sobre vetores (imagem abaixo), que pede para sinalizarmos, respectivamente qual o maior e o menor valor recebido do usuário. O código escrito consegue identificar qual o maior valor dentre os 20 digitados e a sua posição, porém quando ele deve sinalizar qual o menor valor presente no vetor e a sua posição, ele só retorna 0. Segue o código: #include <stdio.h> #define TAM 3 int main() { int vetor[TAM]; int i, j; int maior=0, menor = 0; int posmaior = 0, posmenor = 0; //LEIURA for(j=0; j <TAM; j++) { printf("Digite um numero para o indice [%d]: ", j); scanf("%d", &vetor[j]); } //MAIOR for(j=0; j <TAM; j++) if(vetor[j] > maior) { maior = vetor[j]; posmaior = j; } //MENOR for(j=0; j < TAM; j++) if(vetor[j] < menor) { menor = vetor[j]; posmenor = j; } //FINAL printf("\nMaior valor: %d", maior); printf("\nPosicao: %d", posmaior); printf("\n"); printf("\nMenor valor: %d", menor); printf("\nPosicao: %d", posmenor); } Link to comment Share on other sites More sharing options...
Supporter - Byte ipax Posted June 11, 2020 at 01:47 PM Supporter - Byte Share Posted June 11, 2020 at 01:47 PM On 6/9/2020 at 10:08 AM, jaozinpnk said: Boa tarde, Foi proposto um exercício sobre vetores (imagem abaixo), que pede para sinalizarmos, respectivamente qual o maior e o menor valor recebido do usuário. O código escrito consegue identificar qual o maior valor dentre os 20 digitados e a sua posição, porém quando ele deve sinalizar qual o menor valor presente no vetor e a sua posição, ele só retorna 0. Segue o código: #include <stdio.h> #define TAM 3 int main() { int vetor[TAM]; int i, j; int maior=0, menor = 0; int posmaior = 0, posmenor = 0; //LEIURA for(j=0; j <TAM; j++) { printf("Digite um numero para o indice [%d]: ", j); scanf("%d", &vetor[j]); } //MAIOR for(j=0; j <TAM; j++) if(vetor[j] > maior) { maior = vetor[j]; posmaior = j; } //MENOR for(j=0; j < TAM; j++) if(vetor[j] < menor) { menor = vetor[j]; posmenor = j; } //FINAL printf("\nMaior valor: %d", maior); printf("\nPosicao: %d", posmaior); printf("\n"); printf("\nMenor valor: %d", menor); printf("\nPosicao: %d", posmenor); } Opa, bom dia! Acredito que o problema esteja mais na lógica e entendimento do exercício proposto. Abordando inicialmente o problema apresentado que o menor retorna o valor 0. A variável menor é inicializada com o valor 0. Considerando os seguintes valores aleatórios do seu vetor: int vetor[3] = { 30, 10, 15 }; A expressão que está sendo testada if(vetor[j] < menor) produziria as seguintes verificações: if (30 < 0) if (10 < 0) if (15 < 0) E como nenhum dos valores são menores que 0, tanto a variavel menor quanto posmenor retornariam zero (valores previamente inicializados). O mesmo problema ocorreria com a variável maior caso tivesse utilizado números negativos. int vetor[3] = { -20, -10, -15 } Pois as seguintes expressões nunca seriam verdadeiras: if (-20 > 0) if (-10 > 0) if (-15 > 0) Algumas considerações e sugestões adicionais. Quando voce fizer o for loop pelo vetor, você pode verificar as duas condições maior ou menor sem a necessidade de fazer 2 loops separados. Você declarou int main() portanto a função espera um int como retorno e boas práticas sugerem que coloque um valor, exemplo: return 0; Isso fica mais claro quando voce começa a trabalhar com funções. Outro ponto na questão de otimização é que as seguintes linhas podem ser simplificadas: printf("\nPosicao: %d", posmaior); printf("\n"); Por: printf("\nPosicao: %d\n", posmaior); E por último, eu sempre gosto de trabalhar com os laços e condições dentro de { } tanto para facilidade de leitura quanto para delimitação de escopo. for ( .. ; .. ; .. ) { if ( .. ) { ... } } Um típico exemplo de como isso pode ser um problemão e as vezes não mostrar o resultado desejado segue: #include <stdio.h> int main() { int val = 0; for (int temp=1; temp < 5; temp++) if (val < temp) printf("%d ", val); val++; printf("\nval: %d\n", val); return 0; } $ ./for-if 0 0 0 0 val: 1 No mais é isso e espero que tenha ajudado, um grande abraço! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.