einstein Posted April 4, 2012 Report Share Posted April 4, 2012 Estou a fazer um programa em que preciso de ler numeros escritos pelo utilizar e termina a leitura quando o leitor carrega em ctr-d, para fazer isto utilizo um ciclo while com a condição de o fgets ser diferente de NULL? Para calcular o máximo e o minimo dos valores introduzidos pelo utilizador como faço? Aqui nao pretendo utilizar if encadeados, por isso nao sei como fazer. Nao existe nenhuma função que o faça? Link to comment Share on other sites More sharing options...
pmg Posted April 4, 2012 Report Share Posted April 4, 2012 Atenção: o Ctrl+D funciona em Un*x; em Windows a combinação de teclas com o mesmo efeito é o Ctrl+Z. ... termina a leitura quando o leitor carrega em ctr-d, para fazer isto utilizo um ciclo while com a condição de o fgets ser diferente de NULL? Sim. O fgets() devolve NULL em caso de erro. O erro mais provável é o de o input ter terminado (o que faz o Ctrl+D é isso mesmo: sinalizar que o input terminou). Para calcular o máximo e o minimo dos valores introduzidos pelo utilizador como faço? Aqui nao pretendo utilizar if encadeados, por isso nao sei como fazer. Nao existe nenhuma função que o faça? Fazes com um ciclo para olhares para todos os valores. Para facilitar podes inicializar tanto o máximo como o mínimo com o valor do primeiro elemento e fazes o ciclo a partir do segundo elemento. Dentro do ciclo, actualizas, se necessário, o máximo ou o mínimo, quando o valor do elemento inspeccionado for respectivamente maior ou mais pequeno. Não existe nenhuma função que faça isso. O mais aproximado que existe (e mesmo assim tens de escrever uma função de comparação) é ordenares o array e depois escolheres o primeiro (o mínimo) e o último (o máximo). What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
einstein Posted April 4, 2012 Author Report Share Posted April 4, 2012 Atenção: o Ctrl+D funciona em Un*x; em Windows a combinação de teclas com o mesmo efeito é o Ctrl+Z. Sim. O fgets() devolve NULL em caso de erro. O erro mais provável é o de o input ter terminado (o que faz o Ctrl+D é isso mesmo: sinalizar que o input terminou). Fazes com um ciclo para olhares para todos os valores. Para facilitar podes inicializar tanto o máximo como o mínimo com o valor do primeiro elemento e fazes o ciclo a partir do segundo elemento. Dentro do ciclo, actualizas, se necessário, o máximo ou o mínimo, quando o valor do elemento inspeccionado for respectivamente maior ou mais pequeno. Não existe nenhuma função que faça isso. O mais aproximado que existe (e mesmo assim tens de escrever uma função de comparação) é ordenares o array e depois escolheres o primeiro (o mínimo) e o último (o máximo). Esqueci-me de referir que estava a usar unix O código que fiz foi o seguinte: Onde posso inicializar as variaveis com os primeiros valores? #include<stdlib.h> #include<stdio.h> #define BUFFSIZE 1024 int main () { float media,valor,soma,mediana; int i,num; int n=0; i=num=0; float max=0.0; float min=0.0; media=valor=soma=mediana=0.0; char linha[bUFFSIZE]; while (fgets(linha,BUFFSIZE,stdin)!=NULL) { printf("Introduza o numero %d\n", (i+1)); n=sscanf(linha,"%f",&valor); if(n==1){ if (valor>max){ max=valor; } else { if (valor<min) { min=valor; } } soma=soma+valor; i++; } else { printf("Numero invalido"); } } media=soma/i; printf("O valor da media e %.3f, o valor da soma e %.3f\n",media,soma); printf("O valor maximo e %.3f e o minimo e %.3f\n",max,min); exit(0); } Link to comment Share on other sites More sharing options...
pmg Posted April 4, 2012 Report Share Posted April 4, 2012 O código que fiz foi o seguinte... Ah! Não estás a usar arrays. ... Onde posso inicializar as variaveis com os primeiros valores? Bom, da maneira que estás a fazer tens que usar "um truque". Mas primeiro certifica-te que a tua solução (inicializar maximo e minimo a zero) não serve: imagina que todos os números introduzidos são negativos ... o teu programa dirá, erradamente, que o máximo é 0. Quanto ao "truque": antes do ciclo inicializa uma variável auxiliar com um valor qualquer (por exemplo 1); dentro do ciclo verificas se essa variavel tem esse valor e, se tiver, mudas o valor e inicializas o maximo e minimo. int primeiro_ciclo = 1; while ( /* whatever */ ) { /* ... */ if (primeiro_ciclo == 1) { primeiro_ciclo = 0; maximo = minimo = /* whatever */; } /* ... */ } Só mais uma coisa: tens o printf que pede números depois do fgets(). Isso vai parecer esquisito ao utilizador, pelo menos da primeira vez. Sugestão: copia o printf para fora do ciclo, e move o que está lá dentro para o fim do ciclo. Tens de acertar o indice dos números ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
einstein Posted April 4, 2012 Author Report Share Posted April 4, 2012 Ah! Não estás a usar arrays. Bom, da maneira que estás a fazer tens que usar "um truque". Mas primeiro certifica-te que a tua solução (inicializar maximo e minimo a zero não serve: imagina que todos os números introduzidos são negativos ... o teu programa dirá, erradamente, que o máximo é 0). Quanto ao "truque": antes do ciclo inicializa uma variável auxiliar com um valor qualquer (por exemplo 1); dentro do ciclo verificas se essa variavel tem esse valor e, se tiver, mudas o valor e inicializas o maximo e minimo. int primeiro_ciclo = 1; while ( /* whatever */ ) { /* ... */ if (primeiro_ciclo == 1) { primeiro_ciclo = 0; maximo = minimo = /* whatever */; } /* ... */ } Só mais uma coisa: tens o printf que pede números depois do fgets(). Isso vai parecer esquisito ao utilizador, pelo menos da primeira vez. Sugestão: copia o printf para fora do ciclo, e move o que está lá dentro para o fim do ciclo. Tens de acertar o indice dos números ... Ah. Muito obrigado, já consegui fazer o programa funcionar correctamente. 😛 Link to comment Share on other sites More sharing options...
bsccara Posted April 4, 2012 Report Share Posted April 4, 2012 int primeiro_ciclo = 1; while ( /* whatever */ ) { /* ... */ if (primeiro_ciclo == 1) { primeiro_ciclo = 0; maximo = minimo = /* whatever */; } /* ... */ } Não estou a ver qual o interesse ou sequer que funcione em todos os cenários o código acima. A solução parece-me muito mais simples: float max=-1e37; float min=1e37; Link to comment Share on other sites More sharing options...
pmg Posted April 4, 2012 Report Share Posted April 4, 2012 A solução parece-me muito mais simples: float max=-1e37; float min=1e37; Concordo ... mas em vez das "magic constants", usa macros predefinidas #include <float.h> /* ... */ double max = -DBL_MAX; // ou float max = -FLT_MAX; double min = DBL_MAX; // ou float min = FLT_MAX; /* ... */ What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now