Jump to content
Sign in to follow this  
einstein

Duvida com comparações

Recommended Posts

einstein

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?

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
einstein

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);
}

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
einstein

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.  :P

Share this post


Link to post
Share on other sites
bsccara

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;

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.