Agenda Telefônica Simples em C
Publicado por Samuel Leonardo (última atualizaçăo em 25/06/2018)
[ Hits: 12.632 ]
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; }
Conta e substitui caracteres de uma frase
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
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes năo usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Wifi năo funciona no Aspire ES 15 com o Debian (11)
Teclado năo funciona no Debian (1)
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automaçăo de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas ŕs imagens de uma pasta