Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Eduardo18

Implementaçao duma aplicação capaz de calcular e informar

Mensagens Recomendadas

Eduardo18

Foi efetuado um questionário a um número indeterminado de estudantes numa universidade. A todos os estudantes foi solicitado o género, a idade e se está a gostar ou não do curso que está a frequentar. Implemente uma aplicação capaz de calcular e informar:

•O número de estudantes entrevistados;

•Percentagem de estudantes de género feminino e masculino;

•Quantidade de estudantes de masculino com menos de 23 anos e não gostam do curso que estão a tirar.

Tenho o meu codigo assim,mas acho que está mal,ao compilar insiro um numero ,depois salta para gosta curso e está sempre a pedir o mesmo.

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	
	/*Declarar varoáveis*/
	int idade, intervistados=0, feminino=0, masculino=0, contador, naoGostaCurso=0;
	char genero [1];
	char gostaCurso [1];
	
	while(idade >= 0)
	{
		printf("Insira a idade:\n");
		scanf("%d", &idade);
		
		printf("\nInsira o genero:\n");
		scanf("%c", genero);
		
		printf("\nInsira gosta curso:\n");
		scanf("%c", gostaCurso);
		
		if(intervistados=0){
			intervistados++;
		}
		if(genero == masculino){
			masculino++;
			if(genero == feminino){
				feminino++;
			}
		}
		if( idade <23){
			idade++;
			if(naoGostaCurso =0){
				naoGostaCurso++;
			}
		}
	}
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Tens o mesmo problema no scanf() que está farto de ser discutido. (eu também empanquei inúmeras vezes nisto)

Quando escrevemos algo com o teclado e pressionamos o Enter, todos os caractéres pressionados ficam guardados num buffer chamado stdin.

A natureza da função scanf() lê este buffer até encontrar o caracter \n que é precisamente o de mudança de linha ou o Enter. ATÉ... Não lê este \n, por isso ele continua no buffer. O que acontece nos scanf() seguintes é que ele vê logo o \n que lá ficou anteriormente e como não o lê, segue o código, daí que apenas o 1º scanf() esteja a funcionar correctamente. A explicação não está completa porque até eu tenho receio de não estar a ser absolutamente preciso e por isso fico-me por aqui. O Happy explica isso melhor que eu!

Solução mais fácil é colocar um espaço antes do %d, assim:

scanf(" %d", &var);

 

Atenção ao uso de operadores em vez de comparadores dentro dos if's.

Não sei como pretendes verificar se o género é masculino ou feminino quando usas duas variáveis que as iniciaste a zero e as comparas com zero para depois incrementares um contador! Pensa lá mais um pouco no código.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
33 minutos atrás, PsySc0rpi0n disse:

Tens o mesmo problema no scanf() que está farto de ser discutido. (eu também empanquei inúmeras vezes nisto)

Quando escrevemos algo com o teclado e pressionamos o Enter, todos os caractéres pressionados ficam guardados num buffer chamado stdin.

A natureza da função scanf() lê este buffer até encontrar o caracter \n que é precisamente o de mudança de linha ou o Enter. ATÉ... Não lê este \n, por isso ele continua no buffer. O que acontece nos scanf() seguintes é que ele vê logo o \n que lá ficou anteriormente e como não o lê, segue o código, daí que apenas o 1º scanf() esteja a funcionar correctamente. A explicação não está completa porque até eu tenho receio de não estar a ser absolutamente preciso e por isso fico-me por aqui. O Happy explica isso melhor que eu!

Solução mais fácil é colocar um espaço antes do %d, assim:


scanf(" %d", &var);

 

Atenção ao uso de operadores em vez de comparadores dentro dos if's.

Não sei como pretendes verificar se o género é masculino ou feminino quando usas duas variáveis que as iniciaste a zero e as comparas com zero para depois incrementares um contador! Pensa lá mais um pouco no código.

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	
	/*Declarar varoáveis*/
	int idade, intervistados=0, feminino=0, masculino=0, naoGostaCurso=0;
	char genero [2];
	char gostaCurso [1];
	
	while(idade >= 0)
	{
		printf("\nInsira a idade:\n");
		scanf("%d", &idade);
		
		printf("\nInsira o genero:\n");
		scanf(" %c", genero);
		
		printf("\nInsira gosta curso:\n");
		scanf(" %c", gostaCurso);
	
		if(intervistados=0){
			intervistados++;
		}
		if(genero == "masculino"){
			masculino=0;
			masculino++;
			if(genero == "feminino"){
				feminino=0;
				feminino++;
			}
		}
		if( idade <23){
			idade++;
			if(naoGostaCurso =0){
				naoGostaCurso++;
			}
		}
	}
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

E agora, já funciona? Não? Porquê? O que acontece? E o que devia acontecer?

Tens que executar o código e investigar um pouco. Usa printfs para controlares o valor das várias variáveis!

Eu tenho co código feito e tem um bug que estou a tentar perceber a razão de ele estar a acontecer!

 

Edited:

Pronto. Com um printf, descobri o meu bug.

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
int main(int argc, char *argv[]) {
	
	/*Declarar varoáveis*/
	int idade, intervistados=0, feminino=0, masculino=0, naoGostaCurso=0;
	char genero [2];
	char gostaCurso [1];
	
	while(idade >= 0)
	{
		printf("\nInsira a idade:\n");
		scanf("%d", &idade);
		
		printf("\nInsira o genero:\n");
		scanf(" %c", genero);
		
		printf("\nInsira gosta curso:\n");
		scanf(" %c", gostaCurso);
	
		if(intervistados=0){
			printf("numero de estudantes:\n", intervistados);
			intervistados++;
		}
		if(genero == "masculino"){
			printf("Percentagem de estudantes de género masculino:\n", masculino);
			masculino=0;
			masculino++;
			if(genero == "feminino"){
				printf("Percentagem de estudantes de género feminino:\n", feminino);
				feminino=0;
				feminino++;
			}
		}
		if( idade <23){
			printf("Percentagem de estudantes de género feminino e masculino:\n", idade);
			idade++;
			if(naoGostaCurso =0){
				printf("não gostam do curso que estão a tirar:\n", naoGostaCurso);
				naoGostaCurso++;
			}
		}
	}
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

dois pontos:

- apresentar código é completamente irrelevante quando não se apresenta uma dúvida

- vais fazer este exercício: para cada linha de código, vais comentar à frente o que essa linha de código deveria fazer (nota não é o que faz porque para isso eu sei ler)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
2 horas atrás, HappyHippyHippo disse:

dois pontos:

- apresentar código é completamente irrelevante quando não se apresenta uma dúvida

- vais fazer este exercício: para cada linha de código, vais comentar à frente o que essa linha de código deveria fazer (nota não é o que faz porque para isso eu sei ler)

não entendo porque dá compilar,mas no ecrã dá mal

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	setlocale(LC_ALL,"Portuguese");
	
	/*Declarar varoáveis*/
	int idade, intervistados=0, feminino=0, masculino=0, naoGostaCurso=0;
	char genero [2];
	char gostaCurso [1];
	
	while(idade >= 0)
	{
		//Recolher idade,genero e gosta curso no ecrã
		printf("\nInsira a idade:\n");
		scanf("%d", &idade);
		
		printf("\nInsira o genero:\n");
		scanf(" %c", genero);
		
		printf("\nInsira gosta curso:\n");
		scanf(" %c", gostaCurso);
		
		//implementaçao capaz de calcular e informar
		if(intervistados=0){//numero de estuantes intervistados
			printf("numero de estudantes:\n");
			intervistados++;
		}
		if(genero == "masculino"){//se for masculino
			printf("Percentagem de estudantes de género masculino:\n", genero[2]);
			masculino=0;
			masculino++;
			if(genero == "feminino"){//se for feminino
				printf("Percentagem de estudantes de género feminino:\n", genero[2]);
				feminino=0;
				feminino++;
			}
		}
		if( idade <23){ //se a idade for menor que 23
			printf("Percentagem de estudantes de género feminino e masculino:\n", idade);
			idade++;
			if(naoGostaCurso =0){ //se nao gosta curso
				printf("não gostam do curso que estão a tirar:\n", gostaCurso[1]);
				naoGostaCurso++;
			}
		}
	}
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Pois, mas eu disse cada uma das linhas... 

Para facilitar, podes colocar os comentários inline após o código

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
2 horas atrás, Eduardo18 disse:

não entendo porque dá compilar, mas no ecrã dá mal

O facto do programa compilar apenas significa que o mesmo está sintaticamente correcto.  Não significa que esteja semanticamente correcto.  Por comparação, a afirmação "O leão é um peixe." está sintaticamente correcta, mas não semanticamente.

Mas se queres ver alguns erros do teu programa, experimenta nas comparações com constantes inverter a ordem dos operadores, e.g. usar 0=intervistados em vez de intervistados=0 (já agora, se calhar o nome mais adequado para a variável era entrevistados).

Adicionalmente o @HappyHippyHippo já te sugeriu comentares o código indicando aquilo que esperas que cada linha faça.  Isto permitiria dizer onde é que o teu raciocínio está a falhar (o objectivo do fórum não é corrigir o código dos outros, mas sim ajudar a perceber por que é que o código não funciona).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
4 horas atrás, Rui Carlos disse:

O facto do programa compilar apenas significa que o mesmo está sintaticamente correcto.  Não significa que esteja semanticamente correcto.  Por comparação, a afirmação "O leão é um peixe." está sintaticamente correcta, mas não semanticamente.

Mas se queres ver alguns erros do teu programa, experimenta nas comparações com constantes inverter a ordem dos operadores, e.g. usar 0=intervistados em vez de intervistados=0 (já agora, se calhar o nome mais adequado para a variável era entrevistados).

Adicionalmente o @HappyHippyHippo já te sugeriu comentares o código indicando aquilo que esperas que cada linha faça.  Isto permitiria dizer onde é que o teu raciocínio está a falhar (o objectivo do fórum não é corrigir o código dos outros, mas sim ajudar a perceber por que é que o código não funciona).

obrigado,ja tenho o feito.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Podes partilhar o código para a gente ver e comparar? Eu pelo menos, gostava de comparar com o meu!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
17 horas atrás, PsySc0rpi0n disse:

Podes partilhar o código para a gente ver e comparar? Eu pelo menos, gostava de comparar com o meu!

int main(int argc, char *argv[]) {
	setlocale(LC_ALL,"Portuguese");
	
	/*Declarar varoáveis*/
	int idade, intervistados=0, feminino=0, masculino=0, naoGostaCurso=0;
	char genero, gostaCurso;
	//Recolher idade,genero e gosta curso no ecrã
	printf("\nInsira a idade:\n");
	scanf("%d", &idade);
	
	while(idade >= 0)
	{
		//contar estudantes
		intervistados++;
		
		printf("\nInsira o genero: m/f \n");
		scanf(" %c", &genero);
		fflush(stdin);
		
		printf("\nInsira gosta curso: s/n \n");
		scanf(" %c", &gostaCurso);
		
		if(genero == 'm'){//se for masculino
			//conta estudantes do  genero masculino
			masculino++;
			if(idade<23 && gostaCurso == 'n'){
				//conta estudantes que nao gostam do curso e tem menos de 23 anos e sao homens
				naoGostaCurso++;
			}
		}
		else{//se for feminino
		
			//contar estudantes do genero feminino
			feminino++;
		}
		
		//Recolher idade,genero e gosta curso no ecrã
		printf("\nInsira a idade:\n");
		scanf("%d", &idade);
		fflush(stdin);
	}
	
	
		//mostrar resultados
		printf("numero de estudantes: %d \n", intervistados);
		printf("Percentagem de estudantes de género masculino: %d \n", masculino *100/intervistados);
		printf("Percentagem de estudantes de género feminino: %d \n", feminino *100/intervistados);
		printf("quantidade de estudantes de genro masculino que tem menps 23 anos e nao gostam do curso: %d", naoGostaCurso);
		
		
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Deixaste mesmo a variável "intervistados" no teu code? Opá, em termos de programação tudo bem, mas em termos de português, isso é uma vergonha!

 

Sobre o teu code, levou uma grande reviravolta depois das primeiras versões que aqui apresentaste.

Fica a maneira como eu fiz:

#include <stdio.h>

int main(void){
   int idade = 0, genero = 0, estado;
   int contaEstudantes = 0, contaNaoGostaCursoMen23 = 0;
   int fem = 0, masc = 0;

   do{
      printf("Insira idade ou -1 para terminar:\n");
      scanf(" %d", &idade);
      if(idade < 0)
         break;

      printf("Insira género: [0] - masculino --//--[1] - feminino\n");
      scanf(" %d", &genero);

      printf("Gosta do curso? [0] - Não --//-- [1] - Sim\n");
      scanf(" %d", &estado);

      if(idade > 0)
         contaEstudantes++;

      !genero ? masc++ : fem++;

      if( (!estado) && (idade < 23) && (!genero))
         contaNaoGostaCursoMen23++;
   }while(idade > 0);

   printf("Número de Alunos entrevistados: %d\n", contaEstudantes);
   printf("Percentagem de estudantes masculinos: %.1f%%\n", ((masc + 0.0)/ contaEstudantes) * 100);
   printf("Percentagem de estudantes femininas: %.1f%%\n", ((fem + 0.0)/ contaEstudantes) * 100 + 0.0);
   printf("Quantidade de estudantes masculinos menores de 23 anos que não gostam do curso: %d\n", contaNaoGostaCursoMen23);
  
   return 0;
}

 

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.