Agenda Telefônica Simples em C
Publicado por Samuel Leonardo (última atualização em 25/06/2018)
[ Hits: 12.705 ]
Homepage: localhost
Segue uma agenda telefônica simples. Você pode usar todo o código como base de estudo para criar uma agenda melhor. No código não há nenhum uso de funções escritas por mim, isso facilita mais o entendimento.
Essa agenda usa máquina de estado para controlar as telas.
Compile com:
$ gcc -o agenda agenda.c
Depois crie um arquivo de texto chamado contatos.bin (apenas na primeira execução).
E então rode a agenda com:
$ ./agenda
Siga o menu de opções para navegar entre as telas da agenda.
/* Criado em 03/05/2018 Criado para este tópico: https://www.vivaolinux.com.br/topico/C-C++/Ajuda-Simples-com-Struct-e-C-Puro/ */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CONTATOS 1000 //numero máximo de contatos typedef enum { TELA_SAIR=-1, TELA_PRINCIPAL,//0 TELA_CADASTRAR,//1 TELA_DESCADASTRAR,//2 TELA_LISTAR_TODOS,//3 } Telas; typedef struct { char nome[128];//nome completo char telefone[64];//não é um numero } Contato; typedef struct { Telas menu; int totalContatos; Contato contatos[MAX_CONTATOS]; } AgendaTelefonica; int main (void) { AgendaTelefonica agenda; //zera todos os bytes de agenda memset(&agenda, 0x0, sizeof(agenda)); //menu da agenda agenda.menu = TELA_PRINCIPAL; //abre o contattos.bin para leitura, contatos.bin deve ser criado caso não exista antes de abrir a agenda FILE * memoria = fopen("contatos.bin", "rb"); if (memoria == NULL) { printf("Erro ao abrir arquivo de memoria de contatos. \nVocê deve criar o arquivo 'contatos.bin' na primeira execução\n"); return 1; } //lê todos os contatos size_t lidos = fread(agenda.contatos, sizeof(Contato), MAX_CONTATOS, memoria); printf("Lidos %zd contatos\n", lidos); //faz totalContatos conter a quantidade de contatos lidos agenda.totalContatos = (int)lidos; fclose(memoria); while (agenda.menu != TELA_SAIR) { switch (agenda.menu) { case TELA_PRINCIPAL: { printf("-------------------------------------\n"); printf("\tAGENDA TELEFONICA:\n"); printf("-------------------------------------\n"); int opcao = -1; do { printf("Escolha uma opção:\n"); printf("\tdigite 1 para cadastrar contato\n"); printf("\tdigite 2 para remover contato\n"); printf("\tdigite 3 para listar todos os contatos\n"); printf("\tdigite 0 para sair do programa\n"); scanf("%d", &opcao);//pode ria ser de A ao C //NOTA: eu sei que este código não é adequado mas é que é dificil encontrar //uma boia soluçlão para o problema de lixo no buffer em C //Limpa o buffer para evitar problemas int c = 0; while ((c = getchar()) != '\n' && c != EOF) { } } while (opcao < 0 || opcao > 3);//se for menor que zero é invalido e maior que 3 está fora do intervalo if (opcao == 0) agenda.menu = TELA_SAIR; if (opcao == 1) { //vai para tela de cadastrar contato agenda.menu = TELA_CADASTRAR; //verifica se tem muitos contatos if (agenda.totalContatos >= MAX_CONTATOS) { printf("\tAgenda está lotada, nao é possivel adicionar novoso contatos\n"); //volta para tela principal agenda.menu = TELA_PRINCIPAL; } } if (opcao == 2) { agenda.menu = TELA_DESCADASTRAR; //se NÃO tem nenhum contato listado if (agenda.totalContatos == 0) { printf("\tNão há nenhum contato cadastrado para remover\n"); agenda.menu = TELA_PRINCIPAL; } } if (opcao == 3) { agenda.menu = TELA_LISTAR_TODOS; if (agenda.totalContatos == 0) { printf("\tAgenda não tem nenhum contato para listar\n"); //volta para tela principal agenda.menu = TELA_PRINCIPAL; } } } break; case TELA_CADASTRAR: { printf("-------------------------------------\n"); printf("\tTELA DE CADASTRO:\n"); printf("-------------------------------------\n"); Contato novo; char opcao = 's'; do { //zera os bytes de novo memset(&novo, 0x0, sizeof(novo)); printf("Digite um novo nome para o contato: \n"); //lê uma string da entrada padrão fgets(novo.nome, 128, stdin); //remove o \n do final int id = 0; while (novo.nome[id] != '\0' && novo.nome[id] != '\n') id++; novo.nome[id] = '\0'; printf("Digite um novo telefone para o contato:\n"); //lê o novo telefone da entrada padrão fgets(novo.telefone, 64, stdin); //remove o \n do final id = 0; while (novo.telefone[id] != '\0' && novo.telefone[id] != '\n') id++; novo.telefone[id] = '\0'; printf("Tem certeza que quer adicionar este contato? [s/n]\n"); opcao = getchar(); //Limpa o buffer para evitar problemas int c = 0; while ((c = getchar()) != '\n' && c != EOF) { } } while (opcao == 'n' || opcao == 'N'); //agora adiciona no final o contato agenda.contatos[agenda.totalContatos] = novo; agenda.totalContatos++; //abre contatos.bin para escrita memoria = fopen("contatos.bin", "w+b"); if (memoria == NULL) { printf("erro ao abrir contatos.bin\n"); return 0; } //salva os contatos size_t salvos = fwrite(agenda.contatos, sizeof(Contato), agenda.totalContatos, memoria); if (salvos != (size_t)agenda.totalContatos) { printf("Erro ao salvar contatos na memoria contatos.bin\n"); return 1; } fclose(memoria); //volta para tela principal agenda.menu = TELA_PRINCIPAL; } break; case TELA_DESCADASTRAR: { printf("-------------------------------------\n"); printf("\tTELA DE DESCADASTRAR:\n"); printf("-------------------------------------\n"); int i; for (i = 0; i < agenda.totalContatos; i++) { printf("Contato %d\n", i); printf("\tNome: %s\n", agenda.contatos[i].nome); printf("\tTelefone: %s\n", agenda.contatos[i].telefone); printf("----------------------------------------------------\n"); } int indice = -1; do { printf("Digite um indice de contato para descadastrar: de 0 até %d\n", agenda.totalContatos-1); scanf("%d", &indice);//póde ocorrer de ficar caracteres no buffer e causar alguns erros //Limpa o buffer para evitar problemas int c = 0; while ((c = getchar()) != '\n' && c != EOF) { } } while (indice < 0 || indice >= agenda.totalContatos); //copia todos os contatos da frente do contato de indice e remove indice for (i = indice; i < agenda.totalContatos - 1; i++) agenda.contatos[i] = agenda.contatos[i + 1]; //remove um contato (o de indice foi removido acima) agenda.totalContatos--; //para salvar os contatos que foram modificados (mesmo código dali da outra tela) memoria = fopen("contatos.bin", "w+b"); if (memoria == NULL) { printf("erro ao abrir contatos.bin\n"); return 0; } //salva os contatos size_t salvos = fwrite(agenda.contatos, sizeof(Contato), agenda.totalContatos, memoria); if (salvos != (size_t)agenda.totalContatos) { printf("Erro ao salvar contatos na memoria contatos.bin\n"); return 1; } fclose(memoria); //volta para tela principal agenda.menu = TELA_PRINCIPAL; } break; case TELA_LISTAR_TODOS: { printf("-------------------------------------\n"); printf("\tLISTANDO CONTATOS:\n"); printf("-------------------------------------\n"); int i; for (i = 0; i < agenda.totalContatos; i++) { printf("Contato %d\n", i); printf("\tNome: %s\n", agenda.contatos[i].nome); printf("\tTelefone: %s\n", agenda.contatos[i].telefone); printf("----------------------------------------------------\n"); } //volta para tela principal agenda.menu = TELA_PRINCIPAL; } break; default: agenda.menu = TELA_PRINCIPAL; break; } } return 0; }
EXPRESSÕES ARITMÉTICAS - PARTE 2
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Falta pacotes de suporte ao sistema de arquivos (Gerenciador de discos... (2)
Enzo quer programar mas não faz código pra não bugar (12)
Erro de Montagem SSD Nvme (12)
WebScrapping através de screenshot devido a bloqueios de Shadow DOM (1)