Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucastt182

Exercício Registros

Recommended Posts

Olá, eu queria pedir ajuda dos programadores mais experientes com um exercício de C.

 

Eis o enunciado:

"Foi realizada uma pesquisa sobre algumas características físicas de 50 habitantes de certa região. De cada habitante foram coletados os seguintes dados: sexo, altura, idade e cor dos olhos(A- azuis, V- verdes, C-castanhos).

Faça um programa que leia os dados armazene-os em um registro tipo vetor e determine:

 

* a média das pessoas com olhos castanhos e altura superior a 1.60 m;

* a maior idade dos habitantes;

* a quantidade de indivíduos do sexo feminino com idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70m;

* percentual de homens;"

 

Estou com problemas nos dois últimos requisitos do programa, aqui está meu código ( utilizei um vetor de tamanho 2 no registro apenas para facilitar no processo de debug). Por enquanto estou apenas exibindo a quantidade de homens.


#include <stdio.h>
#include <stdlib.h>
#include <string.h> // a função strupr necessita desta biblioteca

// declarando os registros
struct{

	char sexo[1], corOlhos[1];
	float altura;
	int idade;


} pessoas[2];

int main(){

	// declarando as variáveis
	int i, k, maiorIdade, qtdMulheres, qtdHomens;
	float somaIdades;
	char handler[1];

	// inserindo os dados no registro
	for(i=0;i<2;i++){
	
		printf("\nQual o sexo da %da. pessoa? M/F \n", i+1);
			scanf("%s", handler);

			// Este loop converte o que handler recebe para maiúsculo.
			for(k=0;handler[k]!='\0'; k++){

				handler[k] = toupper(handler[k]);  
		
			}

			// Fazendo a verificação do que a variável handler recebeu. Se passar na verificação, a variável pessoas[i].sexo recebe o valor de handler.
			// Se não passar na verificação, exibe mensagem e retorna ao início do loop
			if((strcmp(handler,"M")== 0) || (strcmp(handler, "F")==0)){

				for(k=0;handler[k]!='\0'; k++)

					pessoas[i].sexo[k] = handler[k];

			} else {

				printf("\nSexo inválido, digite apenas M ou F !");
				i--;
				continue;

			}		
		
		printf("\nDigite a altura: ");
			scanf("%f", &pessoas[i].altura);

		printf("\nDigite a idade: ");
			scanf("%d", &pessoas[i].idade);
			
		printf("\nQual a cor dos olhos? C(castanhos)/A(azuis)/V(verdes) : ");
			scanf("%s", handler);

			// Passando o que foi digitado para cor dos olhos para MAIÚSCULO e fazendo a verificação do que foi digitado.
			for(k=0; handler[k]!='\0'; k++)
		
				handler[k] = toupper(handler[k]);

			// Verificando se o valor digitado para cor dos olhos é igual a C, A ou V
			if((strcmp(handler,"C")==0) || (strcmp(handler,"A")==0) || (strcmp(handler,"V")==0)) {
		
				for(k=0;handler[k]!='\0'; k++)			
					pessoas[i].corOlhos[k] = handler[k];
		
			} else {

				printf("\n\nA cor dos olhos digitada é inválida! Utilize: C(castanhos), A(azuis) ou V(verdes!\n");
				i--;
				continue;		

			}

	}

	// verificando o registro
	
	somaIdades = 0;
	maiorIdade = 0;

	
	for(i=1;i<2;i++){
	
		// soma a idade das pessoas de olhos castanhos e altura superior a 1,60 m
		// IMPORTANTE : para fazer a comparação entre 2 STRING's utiliza-se o comando STRCMP( string1, string2) => retorna ZERO se forem iguais
		if((strcmp(pessoas[i].corOlhos,"C")==0) && (pessoas[i].altura>1.60)) {

			somaIdades += pessoas[i].idade;	
		
		}

		// verifica qual a maior idade entre as pessoas cadastradas no registro
		if(pessoas[i].idade> pessoas[maiorIdade].idade)
			maiorIdade = i;	


	
	}

	qtdMulheres = 0;
	qtdHomens = 0;

	// é nesta parte aqui embaixo que estou com problemas V

	for(i=0;i<2;i++){
	
		// verifica a quantidade de mulheres com idade entre 20 e 45 anos(inclusive). Se a verificação anterior retornar 0(zero), verifica a quantidade de mulheres de olhos verdes e altura 			//inferior a 1.70 m e salva essa quantidade em uma variável	
		if(strcmp(pessoas[i].sexo,"F")==0){

			// #rofl, essa verificação aqui tá pequena hein :P			
			if((pessoas[i].idade>20) && (pessoas[i].idade<=45)) 
				qtdMulheres++;
							
			if((strcmp(pessoas[i].corOlhos,"V")==0) && (pessoas[i].altura<1.70))	
				qtdMulheres++;

		}

		// calcula a quantidade de homens existentes no cadastro
		if(strcmp(pessoas[i].sexo,"M")==0)			
			qtdHomens++;	


	}


	// exibindo os resultados das verificações

	printf("\nA media das idades de pessoas de olhos castanhos e altura superior a 1.60 m eh : %3.2f", somaIdades/2);
	printf("\nA maior idade das pessoas cadastradas eh : %d", pessoas[maiorIdade].idade);
	printf("\nA quantidade de mulheres de idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70 m eh : %d", qtdMulheres);
	printf("\nA quantidade de homens eh: %d\n", qtdHomens);

	return 0;

}









Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu dei uma olhada rápida. O que acontece se houver uma mulher com idade entre 20 e 45 E que tem olhos verdes e altura inferior a 1.70m? :)

 

Outra coisa... funções que você não deveria usar:

 

 strcmp();
 scanf(); // especialmente com %s

E tem mais uma coisinha, que neste caso não tem problema: se você alguma vez tentar comparar o sexo com alguma coisa que tenha mais de 1 caracter, ou tentar imprimir o sexo usando %s, seu programa vai dar segfault. Isso porque você faz:

 

 for(k=0;handler[k]!='\0'; k++)
         pessoas[i].sexo[k] = handler[k];

O nullbyte nunca é inserido em "sexo". Até porque você declara "sexo" como uma array de 1 elemento... se essa é realmente a inteção, seria melhor fazer:

 

 char sexo, corOlhos, handler;
 //...
 handler = fgetc(stdin);
 //...
 sexo = toupper(handler);
 //...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.