Olá, sou novo aqui, estou começando agora meu curso de engenharia de software e preciso desenvolver um sistema de cadastro de pessoas em C.
Infelizmente venho tendo problemas em algumas partes do código e estou aceitando QUALQUER DICA só pra fazer isso funcionar (sério, to desesperado).
Problemas:
1) Eu executo o cadastro da pessoa corretamente, mas ao entrar na função consultar_pessoa(), meu programa não reconhece o numero digitado pelo usuario (cpf) como existente, e logo após recebo a mensagem "Cpf não encontrado"
Alguém poderia me explicar o motivo?
2) Preciso criar uma função que lista as pessoas em ordem alfabética por cidade, conseguem me explicar como fazer isso? Foi disponibilizado um arquivo de texto que contem todas as cidades com e sem acento e o uf das cidades respectivamente.
obs: tentei utilizar o "Printf()" em algumas partes do código para entender o que exatamente meu programa estava recebendo mas não obtive sucesso.
obs2: pode ser que alguns comentários no meio do código estejam errados ou incompletos pois esse código já foi muito alterado.
O resto das funções creio que sejam mais fáceis de resolver, por hora é isso
O #include "function.c" por enquanto só foi utilizado para incluir uma função de limpar o buffer e a tela, mas também tem uma função que valida o cpf que não usei ainda.
Código function:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
void limpar_buffer() // Limpar buffer
{
char ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
void limpar_tela()// Limpa terminal
{
#if defined(linux) || defined(unix) || defined(APPLE)
system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
system("cls");
#endif
}
int validador_cpf(){
// Declaração de variaveis
int soma, resultado, num, cont;
char digito10, digito11, cpf[11];
scanf("%s", cpf); // gets usado como scanf para variaveis do tipo char
// Validar o primeiro digito
soma = 0;
for(cont = 0; cont < 9; cont++){
num = cpf[cont] - 48;
soma = soma + (num * (10 - cont));
}
resultado = 11 - (soma % 11);
if((resultado == 10) || (resultado == 11)){
digito10 = '0';
}else digito10 = resultado + 48;
// Validar o segundo digito
soma=0;
for(cont = 0; cont < 10; cont++){
num = cpf[cont] - 48;
soma = soma + (num * (11 - cont));
}
resultado = 11 - (soma % 11);
if((resultado == 10) || (resultado == 11))
digito11 = '0';
else digito11 = resultado + 48;
// Comparação entre os cálculos
if((digito10 != cpf[9]) && (digito11 != cpf[10]))
return 1;
else
return 0;
}
int main();
Código main:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
#include "function.c"
#define TAM_NOME 100 // tamanho max do nome
#define TAM_CPF 11 // tamanho max do cpf
#define TAM_SX 10
bool sair = false; // caso sair seja verdadeiro ele encerra o programa
FILE *arquivo; // declaração do arquivo
typedef struct pessoa { //criação do tipo "pessoa"
char nome[TAM_NOME];
char cpf[TAM_CPF];
int dia;
int mes;
int ano;
char sexo[TAM_SX];
char cidade[25];
char ufederal[25];
} PESSOA;
typedef struct cidade { // criação do tipo "cidade"
char uf[3];
char nome[100];
char nome_sem_acento[200];
} CIDADE;
PESSOA pessoa;
void cadastrar_pessoa(){
limpar_tela(); // limpar o terminal
arquivo = fopen("pessoa.txt", "a"); // acrescenta ou cria um arquivo para leitura/escrita denominado "pessoas.txt"
if(arquivo == NULL){ // if para caso ocorra um erro na abertura
printf("Erro na abertura do arquivo\n");
system("pause");
exit(1);
}
limpar_buffer(); // Sempre limpar o buffer antes de escanear uma variavel do tipo char
// Recebendo os dados
printf("Digite o CPF: ");
scanf("%[^\n]", pessoa.cpf);
printf("%s", pessoa.cpf);
limpar_buffer();
printf("Digite o nome: ");
scanf("%[^\n]", pessoa.nome);
printf("Digite o dia de nascimento: ");
scanf("%d", &pessoa.dia);
printf("Digite o mes de nascimento: ");
scanf("%d", &pessoa.mes);
printf("Digite o ano de nascimento: ");
scanf("%d", &pessoa.ano);
limpar_buffer();
printf("Digite o seu sexo: ");
scanf("%[^\n]", pessoa.sexo);
limpar_buffer();
printf("Digite sua cidade: ");
scanf("%[^\n]", pessoa.cidade);
limpar_buffer();
printf("Digite sua unidade de federacao: ");
scanf("%[^\n]", pessoa.ufederal);
rewind(arquivo); // Função que retorna para o começo do arquivo
fprintf(arquivo, "%s %s %d/%d/%d %s %s %s\n", pessoa.nome, pessoa.cpf, pessoa.dia, pessoa.mes, pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal); // Escrevendo o struct pessoa recem cadastrado
fclose(arquivo); // Fechando arquivo
system("pause"); // "pressione qualquer tecla para continuar"
}
void consultar_pessoa(){
// Declarações
char cpf[TAM_CPF];
int a=0;
// Instruções
limpar_tela();
arquivo = fopen("pessoa.txt", "r"); // abre o arquivo denominado "pessoas.txt" em forma de leitura
if(arquivo == NULL){ // if para caso ocorra um erro na abertura
printf("Erro na abertura do arquivo\n");
system("pause");
exit(1);
}
limpar_buffer();
printf("Informe o CPF que deseja pesquisar: ");
scanf("%s", cpf); // lendo o cpf digitado pelo usuário
rewind(arquivo); // posicionando o ponteiro no início do arquivo
while (fscanf(arquivo, "%s %s %d/%d/%d %s %s %s", pessoa.nome, pessoa.cpf, &pessoa.dia, &pessoa.mes, &pessoa.ano, pessoa.sexo, pessoa.cidade, pessoa.ufederal) != EOF) {
if (strcmp(pessoa.cpf, cpf) == 0) {
a++;
printf("Nome: %s\n", pessoa.nome);
printf("Data de nascimento: %d/%d/%d\n", pessoa.dia, pessoa.mes, pessoa.ano);
printf("Cpf: %s\n", pessoa.cpf);
printf("Sexo: %s\n", pessoa.sexo);
printf("Cidade: %s\n", pessoa.cidade);
printf("Unidade de Federacao: %s\n", pessoa.ufederal);
fclose(arquivo);
break;
system("pause");
}
if(a == 0)printf("Cpf não encontrado\n");
fclose(arquivo);
system("pause");
}
}
void menu(){
//Declarações
int op__menu;
//Instruções
limpar_tela();
printf("\n Menu de opções: \n\n");
printf("1) Cadastrar Pessoa\n");
printf("2) Consultar Pessoa\n");
printf("3) Listar pessoas por Cidade\n");
printf("4) Gerar relatorio\n");
printf("5) Excluir Pessoa\n");
printf("6) Encerrar Programa\n\n");
printf("Digite o numero da opcao: ");
scanf("%d", &op__menu);
switch (op__menu){
case 1:cadastrar_pessoa(); // procedimento de cadastro de pessoa.
break;
case 2:consultar_pessoa(); //CONSULTAR_PESSOA
break;
case 3://listar_pessoa(); //LISTAR_PESSOAS POR CIDADE
break;
//essa função não precisa ser feita no momento
case 4://gerar_relatorio(); //RELATORIO
printf("Esta funcao ainda não esta pronta.\n");
sleep(2);
break;
//essa função não precisa ser feita no momento
case 5://excluir(); //EXCLUIR_PESSOA
printf("Esta funcao ainda não esta pronta.\n");
sleep(2);
break;
case 6:sair = true; //ENCERRAR_PROGRAMA
break;
default:printf("Essa opcao não existe!\n");sleep(1);
}
}
int main(){
arquivo = fopen("pessoa.txt", "a+");
if(arquivo == NULL){
printf("Erro na abertura do arquivo\n");
system("pause");
exit(1);
}
fclose(arquivo);
while(!sair){
limpar_tela();
menu();
}
return 0;
}