domingo, 24 de março de 2019

Cadastro de pessoas físicas

Comecei escrevendo o código
Aninhando uma struct dentro de um union,
como obtive sucesso de imediato,
segui escrevendo o código normalmente.
Mas só um bom tempo depois que percebi
que funcionaria normalmente sem a union,
ainda assim deixei como está.
Na verdade quase tudo já funcionava na cabeça,
mas me deparei com um erro que me deixou
algumas horas para resolver,
Na hora da leitura dos dados a variável
char Bairro [ ], reproduzia a string que
foi armazenado na variável char Rua [ ],
e erro nenhum foi detectado nem pelo compilador,
e nem por mim, mas tem momentos que a lógica
fala mais alto e só assim foi possível resolver.
As funções para interface e para o menu do programa
já estavam prontas, já venho usando isto
há alguns anos, desde quando comecei a programar em C/C++.
Então só precisava criar as duas funções para manipulação
dos dados no arquivo, onde uma colhe os dados do usuário
pelo teclado e escreve num arquivo, e a outra faz a leitura
destes dados através de pesquisa.
Se o programa escreve e ler apenas um cadastro,
isto não é nenhum problema, basta usar um laço while
com um laço for para que outros cadastros possam ser
inseridos e lidos naturalmente por sua entrada
e saída respectivamente.


Veja abaixo o código do programa:


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/*============================================================================*/
union {
     struct {
         char Procura [ 30 ];
         char Nome    [ 30 ];
         char Rua     [ 30 ];
         char Rua_1   [ 30 ];
         char Bairro  [ 30 ];
         char Cidade  [ 30 ];
         int Telefone;
         int Numero;
     }Cadastro;
}dados;
void MenuPrimcipal ( );
/*============================================================================*/
void Janela ( ) {
     int l, c;
     for ( l = 1; l <= 30; l++ ) {
         for ( c = 1; c < 80; c++ ) {
              gotoxy ( c, l );
              if ( l == 2 ) {
                   printf ( " " );
              }
              if ( c == 1 ) {
                   printf ( "  " );
              }
              if ( c == 79 ) {
                   textbackground ( 12 );
                   printf ( "  " );
              }
         }
     }
}
/*============================================================================*/
void Janela6 ( ) {
     int lin, col;
     col = 0;
     for ( lin = 2; lin <= 24; lin++ )
         for ( col = 3; col <= 78; col++ ) {
              gotoxy ( col, lin );
              textbackground ( 9 );
              printf ( " " );
         }
     col = 0;
     for ( lin = 5; lin <= 21; lin++ )
         for ( col = 6; col <= 75; col++ ) {
              gotoxy ( col, lin );
              textbackground ( 15 );
              printf ( " " );
         }
}
/*============================================================================*/
void Criar_Cadastro ( ) {
     system ( "Color F0" );
     Janela ( );
     textbackground ( 15 );
     textcolor ( LIGHTRED );
     gotoxy ( 28, 3 );
     printf ( "CADASTRO DE PESSOAS FÍSICAS" );
     FILE *arquivo = fopen ( "Cadastro.txt", "w" );
     if ( arquivo == NULL ) {
         textcolor ( LIGHTRED );
         gotoxy ( 28, 12 );
         printf ( "O arquivo não pode ser criado" );
         getche ( );
         exit ( 1 );
     }
     fflush ( stdin );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22,5 );
     printf ( "Nome: " );
     textcolor ( LIGHTRED );
     gets ( dados.Cadastro.Nome );
     fprintf ( arquivo, "%s\n", dados.Cadastro.Nome );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22,7 );
     printf ( "Telefone: " );
     textcolor ( LIGHTRED );
     scanf ( "%d", &dados.Cadastro.Telefone );
     fflush ( stdin );
     fprintf ( arquivo, "%d\n", dados.Cadastro.Telefone );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 9 );
     printf ( "Rua: " );
     textcolor ( LIGHTRED );
     gets ( dados.Cadastro.Rua );
     fflush ( stdin );
     fprintf ( arquivo, "%s\n", dados.Cadastro.Rua );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 11 );
     printf ( "Número: " );
     textcolor ( LIGHTRED );
     scanf ( "%d", &dados.Cadastro.Numero );
     fflush ( stdin );
     fprintf ( arquivo, "%d\n", dados.Cadastro.Numero );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 13 );
     printf ( "Bairro: " );
     textcolor ( LIGHTRED );
     gets ( dados.Cadastro.Bairro );
     fflush ( stdin );
     fprintf ( arquivo, "%s\n", dados.Cadastro.Bairro );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 15 );
     printf ( "Cidade: " );
     textcolor ( LIGHTRED );
     gets ( dados.Cadastro.Cidade );
     fflush ( stdin );
     fprintf ( arquivo, "%s\n", dados.Cadastro.Cidade );
     textcolor ( LIGHTRED );
     gotoxy ( 29, 23 );
     printf ( "PRESSIONE QUALQUER TECLA" );
     getche ( );
     fclose ( arquivo );
     MenuPrimcipal ( );
}
/*============================================================================*/
void Ler_Cadastro ( ) {
     system ( "Color F0" );
     Janela ( );
     textbackground ( 15 );
     textcolor(LIGHTRED);
     gotoxy ( 28, 3 );
     printf("CADASTRO DE PESSOAS FÍSICAS");
     FILE *arq = fopen ( "Cadastro.txt", "r" );
     if ( arq == NULL ) {
         textcolor ( LIGHTRED );
         gotoxy ( 28, 12 );
         printf ( "O arquivo não pode ser aberto" );
         getche ( );
         exit ( 1 );
     }
     fflush ( stdin );
     textcolor ( LIGHTBLUE );
     gotoxy ( 22, 5 );
     printf ( "Nome da pessoa cadastrada: " );
     textcolor ( LIGHTRED );
     gets ( dados.Cadastro.Procura );
     fflush ( stdin );
     textcolor ( BLACK );
     gotoxy ( 22, 7 );
     printf ( "Dados cadastrados no arquivo" );
     textcolor ( LIGHTBLUE );
     if ( strcmp ( dados.Cadastro.Procura, dados.Cadastro.Nome ) == 0 ) {

         fscanf ( arq , "%[^\n]s" , dados.Cadastro.Nome, 30 );
         gotoxy ( 22, 9 );
         textcolor ( LIGHTBLUE );
         printf ( "Nome: " );
         textcolor ( LIGHTRED );
         printf ( "%s", dados.Cadastro.Nome );

         fscanf ( arq , "%d" , &dados.Cadastro.Telefone );
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 10 );
         printf ( "Telefone: " );
         textcolor ( LIGHTRED );
         printf ( "%d", dados.Cadastro.Telefone );

         fscanf ( arq , "%[^\n]s" , dados.Cadastro.Rua, 30 );
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 11 );
         printf ( "Rua: " );
         textcolor ( LIGHTRED );
         printf ( "%s", dados.Cadastro.Rua );

         fscanf ( arq , "%d" , &dados.Cadastro.Numero );
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 12 );
         printf ( "Número: " );
         textcolor ( LIGHTRED );
         printf ( "%d", dados.Cadastro.Numero );

         fscanf ( arq , "%[^\n]s" , dados.Cadastro.Rua_1, 30 );
         fscanf ( arq , "%[^\n]s" , dados.Cadastro.Bairro, 30 );
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 13 );
         printf ( "Bairro: " );
         textcolor ( LIGHTRED );
         printf ( "%s", dados.Cadastro.Bairro );

         fscanf ( arq , "%[^\n]s" , dados.Cadastro.Cidade, 30 );
         textcolor ( LIGHTBLUE );
         gotoxy ( 22, 14 );
         printf ( "Cidade: " );
         textcolor ( LIGHTRED );
         printf ( "%s", dados.Cadastro.Cidade );
     }
     textcolor ( LIGHTRED );
     gotoxy ( 29, 23 );
     printf ( "PRESSIONE QUALQUER TECLA" );
     getche ( );
     fclose ( arq );
     MenuPrimcipal ( );
}
/*============================================================================*/
#define MaxNo_Menu 3
void MenuPrimcipal ( ) {
     system ( "title CADASTRO DE PESSOAS FÍSICAS" );
     system ( "Color E0" );
     Janela6 ( );
     textbackground ( 15 );
     textcolor ( LIGHTRED );
     gotoxy ( 34, 23 );
     printf ( "PRESSIONE ENTER" );
     textcolor ( LIGHTRED );
     gotoxy ( 28, 3 );
     printf ( "CADASTRO DE PESSOAS FÍSICAS" );
     textcolor ( LIGHTRED );
     gotoxy ( 28, 6 );
     printf ( "Por: Samuel Lima" );
     textcolor ( BLACK );
     gotoxy ( 28, 7 );
     printf ( "sa_sp10@hotmail.com" );
     textcolor ( LIGHTBLUE );
     gotoxy ( 28, 9 );
     printf ( "Escolha uma opção no menu" );
     textcolor ( BLACK );
     char *menu_list [ MaxNo_Menu ] = {
              "Criar cadastro",
              "Pesquisar cadastro",
              "Sair" };
     int i, xpos = 10, ypos [ MaxNo_Menu ] = { 13, 15, 17 };
     for ( i = 0; i < MaxNo_Menu; ++i ) {
         gotoxy ( xpos, ypos [ i ] );
         //textattr ( 16 );
         //textbackground ( 16 );
         printf ( "%s", menu_list [ i ] );
     }
     i = 0;
     while ( 1 ) {
         gotoxy ( xpos, ypos [ i ] );
         textbackground ( 12 );
         printf ( "%s", menu_list [ i ] );
         switch ( _getch ( ) ) {
              case 72:
                   if ( i > 0 ) {
                        gotoxy ( xpos, ypos [ i ] );
                        textbackground ( 15 );
                        printf ( "%s", menu_list [ i ] );
                        --i;
                   }
                   break;
              case 80:
                   if ( i < MaxNo_Menu - 1 ) {
                        gotoxy ( xpos, ypos [ i ] );
                        textbackground ( 15 );
                        printf ( "%s", menu_list [ i ] );
                        ++i;
                   }
                   break;
              case 13:
                   if ( i == 0 ) {
                        system ( "cls" );
                        Criar_Cadastro ( );
                   }
                   if ( i == 1 ) {
                        system ( "cls" );
                        Ler_Cadastro ( );
                   }
                   if ( i == 2 ) {
                        system ( "cls" );
                        exit ( 0 );
                   }
                   break;
         }
     }
}
/*============================================================================*/
int main ( void ) {
     MenuPrimcipal ( );
}
/*============================================================================*/