Logo Hardware.com.br
INTEL_KILLER
INTEL_KILLER Zerinho Registrado
1.2K Mensagens 4 Curtidas

Trabalho de faculdade em C [Problemas com IF]

#1 Por INTEL_KILLER 07/12/2009 - 14:17
Olá a todos, estou fazendo um trabalho meu de faculdade e faz alguns dias que estou tentando resolver esse problema e não consigo!
é o seguinte, estou estudando funções e tal, por isso o programa ta dividido em várias funções, eu já arrumei uns problemas com as outras funções de cadastramento e não consigo resolver essa de comparação, vou postar o código fonte e espero uma luz de vocês, pq eu estou quebrando a cabeça e não consigo resolver!!


#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define MAXFICHA 20

struct ficha {
char nome[50];
int altura;
int peso;
char endereco[50];
};
struct suspeito {
int altura;
int peso;
};

int menu() {
int opcao;
fflush(stdin);
system("cls&quot;
printf("### I D E N T I F I C A D O R D E S U S P E I T O S ###\n\n&quot;
printf("1- Cadastrar Ficha de Criminosos.\n&quot;
printf("2- Preencher Informacoes do Suspeito.\n&quot;
printf("3- Procurar Suspeito nas Fichas.\n&quot;
printf("4- Sair.\n\n&quot;
printf("Escolha uma das opcoes: &quot;
scanf("%i", &opcao);
return(opcao);
}

void adicionarFicha(struct ficha array[MAXFICHA], int *cont) {
fflush(stdin);
system("cls&quot;
printf("### I D E N T I F I C A D O R D E S U S P E I T O S ###\n\n&quot;
printf("Cadastrar Ficha de Criminosos.\n\n\n&quot;
printf("Digite o Nome: &quot;
gets(array[*cont].nome);
do {
printf("Digite a Altura(cm): &quot;
scanf("%i", &array[*cont].altura);
if(array[*cont].altura <= 0) {
printf("!!! Altura invalida, por favor digite novamente.!!!\n&quot;
}
}while(array[*cont].altura <=0);
do {
printf("Digite o Peso(Kg): &quot;
scanf("%i", &array[*cont].peso);
if(array[*cont].peso <= 0) {
printf("!!! Peso invalido, por favor digite novamente.!!!\n&quot;
}
}while(array[*cont].peso <=0);
fflush(stdin);
printf("Digite o Endereco: &quot;
gets(array[*cont].endereco);
(*cont)++;
system("pause&quot;
}

void suspeito(struct suspeito array2) {
system("cls&quot;
printf("### I D E N T I F I C A D O R D E S U S P E I T O S ###\n\n&quot;
printf("Preencher Informacoes do Suspeito.\n\n\n&quot;
fflush(stdin);
do {
printf("Digite a Altura(cm) Estimada: &quot;
scanf("%i", &array2.altura);
if(array2.altura <= 0) {
printf("!!! Altura invalida, por favor digite novamente.!!!\n&quot;
}
}while(array2.altura <=0);
do {
printf("Digite o Peso(Kg): &quot;
scanf("%i", &array2.peso);
if(array2.peso <= 0) {
printf("!!! Peso invalido, por favor digite novamente.!!!\n&quot;
}
}while(array2.peso <=0);
printf("\nCadastro Efetuado com Sucesso!\n\n&quot;
system("pause&quot;
}

void comparar(struct ficha array[MAXFICHA], struct suspeito array2, int cont) {
int i=0;

system("cls&quot;
printf("### I D E N T I F I C A D O R D E S U S P E I T O S ###\n\n&quot;
printf("Procurando Fichas Compativeis com as informacoes dos suspeitos....\n\n\n&quot;
printf("Suspeitos Compativeis com a Altura Fornecida:\n\n&quot;
for(i=0;i<cont;i++) {
if(array[i].altura <= array2.altura+5) {
if(array[i].altura >= array2.altura-5) {
printf("Nome: %s\nAltura: %i\nPeso: %i\nEndereco: %s\n\n", array[i].nome, array[i].altura, array[i].peso, array[i].endereco);
}
}
}
printf("Suspeitos Compativeis com o Peso Fornecido:\n\n&quot;
for(i=0;i<cont;i++) {
if(array[i].peso <= array2.peso+5) {
if(array[i].peso >= array2.peso-5) {
printf("Nome: %s\nAltura: %i\nPeso: %i\nEndereco: %s\n\n", array[i].nome, array[i].altura, array[i].peso, array[i].endereco);
}
}
}
system("pause&quot;
}

main() {

struct ficha array[MAXFICHA];
struct suspeito array2;

int opcao, cont;
cont=0;

while(opcao != 4) {
opcao = menu();
switch(opcao) {
case 1: {
if (cont < MAXFICHA) {
adicionarFicha(array ,&cont);
}else{
printf("\nNumero de Fichas Cadastradas esta no maximo!\n\n&quot;
system("pause&quot;
}
break;
}
case 2: {
if (cont==0) {
printf("\nNenhuma Ficha Cadastrada!\n\n&quot;
system("pause&quot;
}else{
suspeito(array2);
}
break;
}
case 3: {
if(cont==0) {
printf("\nNenhuma Ficha Cadastrada!\n\n&quot;
system("pause&quot;
}else{
comparar(array, array2, cont);
}
break;
}
case 4: {
break;
}

default: {
printf("Opcao Invalida! Aperta uma tecla para Retornar ao Menu....&quot;
getch();
break;
}
}
}
}
Ta ai o código galera, aguardo....


Edit: Esqueci de postar a propósta, ta ai:

Suponha que você foi encarregado de escrever um programa em linguagem C cuja tarefa será auxiliar a Delegacia de Polícia a identificar possíveis suspeitos de envolvimento em um crime com base na descrição de testemunhas oculares. Esta identificação se dará pela comparação das características do suspeito (fornecidas pelas testemunhas) com as características previamente cadastradas nos arquivos da Delegacia de Polícia. As seguintes funcionalidades são esperadas do programa:

a) ler a partir do teclado e armazenar em um array as “fichas” de 20 criminosos conhecidos, contendo as seguintes informações: Nome, Altura (em cm), peso (em Kg) e Endereço. A execução desta funcionalidade deverá ser implementada por uma função.

b) ler a partir do teclado a descrição do suspeito fornecida pela testemunha ocular, contendo as seguintes informações: Altura Estimada do Suspeito (em cm) e Peso Estimado (em kg). A execução desta funcionalidade também deverá ser implementada por uma função.

c) Comparar a descrição do suspeito com os criminosos cadastrados, imprimindo todos os nomes e endereços que sejam compatíveis com a descrição fornecida. Para a comparação admite-se uma diferença de 5 cm na altura (para mais ou para menos) e uma diferença de 5 kg no peso (também para mais ou menos). A execução desta funcionalidade também deverá ser implementada por uma função.

d) A chamada de cada uma das funcionalidades deverá ser feita a partir de um menu de opções implementado na função main(). Este menu deverá apresentar mais uma opção que permitirá ao usuário encerrar o programa.

e) No cadastramento das alturas e pesos solicitados nos itens a) e b) não são admitidos valores nulos ou negativos, portanto o programa deverá fazer a consistência dos valores digitados para evitar que isto aconteça. A execução destas funcionalidades também deverá ser implementada por funções.
Trevas Arcanas
Trevas Arcan... Membro Senior Registrado
200 Mensagens 10 Curtidas
#4 Por Trevas Arcan...
07/12/2009 - 18:20
O erro está na forma como foi construída a função suspeito, para que as alterações que você fizer na váriavel array2 dentro da função alterarem a variável array2 no main (são váriaveis diferentes), você deve passar um ponteiro para struct suspeito, não uma struct suspeito.
Você provavelmente não percebeu isso porque pensou que o que acontecesse à um array de um tipo deveria acontecer igual à uma varável daquele tipo.
Para consertar isso altere o protótipo da função para:
void suspeito(struct suspeito* array2)
e a chamada para:
suspeito(&array2);
Além disso substitua todos os "array2." dentro da função suspeito por "array2->".

Recomendo urgentemente que você estude sobre ponteiros e passagem por referência (ponteiros) em C.

Resumindo o problema: Quando você chamava a função suspeito a função fazia uma cópia da váriavel array2 do main para a váriavel array2 da função suspeito, você fazia as alterações na cópia e quando suspeito terminava a cópia simplesmente desaparecia, logo nenhuma mudança ocorria na váriavel array2 no main e ela continuava com o valor aleatório com o qual ela foi iniciada, aí ao passá-la para função compara os valores aleatórios não passavam nos ifs (poderiam, mas a probabilidade é mínima, os valores de altura e peso podem ser quaisquer entre -2 bilhões e +2 bilhões).
"A alma é essa coisa que nos pergunta se a alma existe"
Mário Quintana
INTEL_KILLER
INTEL_KILLER Zerinho Registrado
1.2K Mensagens 4 Curtidas
#5 Por INTEL_KILLER
07/12/2009 - 20:04
Trevas Arcanas disse:
O erro está na forma como foi construída a função suspeito, para que as alterações que você fizer na váriavel array2 dentro da função alterarem a variável array2 no main (são váriaveis diferentes), você deve passar um ponteiro para struct suspeito, não uma struct suspeito.
Você provavelmente não percebeu isso porque pensou que o que acontecesse à um array de um tipo deveria acontecer igual à uma varável daquele tipo.
Para consertar isso altere o protótipo da função para:
void suspeito(struct suspeito* array2)
e a chamada para:
suspeito(&array2);
Além disso substitua todos os "array2." dentro da função suspeito por "array2->".

Recomendo urgentemente que você estude sobre ponteiros e passagem por referência (ponteiros) em C.

Resumindo o problema: Quando você chamava a função suspeito a função fazia uma cópia da váriavel array2 do main para a váriavel array2 da função suspeito, você fazia as alterações na cópia e quando suspeito terminava a cópia simplesmente desaparecia, logo nenhuma mudança ocorria na váriavel array2 no main e ela continuava com o valor aleatório com o qual ela foi iniciada, aí ao passá-la para função compara os valores aleatórios não passavam nos ifs (poderiam, mas a probabilidade é mínima, os valores de altura e peso podem ser quaisquer entre -2 bilhões e +2 bilhões).


Muito obrigado, o programa está funcionando agora, só me tire mais uma duvida, esse 'array2->' ao inves de 'array2.' eu não intendi.... pode me explicar? pq meu professor passo com o ponto e não com ->

Obrigado
Trevas Arcanas
Trevas Arcan... Membro Senior Registrado
200 Mensagens 10 Curtidas
#6 Por Trevas Arcan...
07/12/2009 - 20:16
O operador ponteiroParaEstrutura->membroDaEstrutura é idêntico a estrutura.membroDaEstrutura, ou seja, ele serve para acessar um membro de uma estrutura a partir de um ponteiro para estrutura, e não de uma variável da estrutura.
Ex:
[PHP]
struct T estrutura; //Uma estrutura do tipo T
struct T * ponteiroParaEstrutura = &estrutura; //Um ponteiro (váriavel que guarda a posição na memória RAM de uma váriavel) que aponta para variável estrutura.
estrutura.campoNumerico = 5;
ponteiroParaEstrutura->campoNumerico = 5;
[/PHP]
São sempre usados ponteiros para uma estrutura quando precisamos alterá-la, pois senão passaremos somente cópias das estruturas. Com ponteiros passamos cópias dos ponteiros, mas como eles são o endereço na memória RAM da variável de estrutura podemos alterá-la por meio deles.
"A alma é essa coisa que nos pergunta se a alma existe"
Mário Quintana
INTEL_KILLER
INTEL_KILLER Zerinho Registrado
1.2K Mensagens 4 Curtidas
#7 Por INTEL_KILLER
08/12/2009 - 11:54
Trevas Arcanas disse:
O operador ponteiroParaEstrutura->membroDaEstrutura é idêntico a estrutura.membroDaEstrutura, ou seja, ele serve para acessar um membro de uma estrutura a partir de um ponteiro para estrutura, e não de uma variável da estrutura.
Ex:
[php]
struct T estrutura; //Uma estrutura do tipo T
struct T * ponteiroParaEstrutura = &estrutura; //Um ponteiro (váriavel que guarda a posição na memória RAM de uma váriavel) que aponta para variável estrutura.
estrutura.campoNumerico = 5;
ponteiroParaEstrutura->campoNumerico = 5;
[/php]São sempre usados ponteiros para uma estrutura quando precisamos alterá-la, pois senão passaremos somente cópias das estruturas. Com ponteiros passamos cópias dos ponteiros, mas como eles são o endereço na memória RAM da variável de estrutura podemos alterá-la por meio deles.


Entendi, muito obrigado! Tirou minhas duvidas feliz.png
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal