jaozinpnk Posted June 9, 2020 Posted June 9, 2020 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); }
Supporter - Byte ipax Posted June 11, 2020 Supporter - Byte Posted June 11, 2020 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!
Recommended Posts
Archived
This topic is now archived and is closed to further replies.