Enviado em 23/05/2021 - 20:25h
Senhor professores,#include <stdio.h>
#include <ctype.h> // Para toupper
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//#include <stdio_ext.h> // Para __fpurge
//#ifndef _STDIO_EXT_H
#define _STDIO_EXT_H
#define MAX 100
#define LISTA_TELA 0
#define LISTA_ARQUIVO 1
// Variavel que indica se a lista foi modificada e nao salva
int nao_salvo = 0;
struct addr {
char name [30];
char street[40];
char city [20];
char state [3];
long zip;
} *addr_info;
// Funcao para leitura de uma string de tamanho n
void LerString(char *txt, int n)
{
// Descarrega o buffer e faz a leitura de string
// __fpurge(stdin);
fgets(txt, n, stdin);
// Procura por quebras de linha, espacos ou tab no final da string, removendo-os
n = strlen(txt) - 1;
while(txt[n] == '\n' || txt[n] == '\r' || txt[n] == ' ' || txt[n] == '\t')
txt[n--] = 0;
}
// Funcao para validar uma string como CEP. Retorna o cep ou -1 se invalido
long ValidaCEP(char *cep)
{
int i;
// Para ser um cep, a string deve conter 8 (se nao fornecido o hifen) ou 9 caracteres.
if(strlen(cep) == 9 && cep[5] == '-') {
// CEP com hifen. Vamos remove-lo.
for(i=5; i<9; i++) {
cep[i] = cep[i+1];
}
} else if(strlen(cep) != 8) {
return -1; // CEP invalido
}
// Verifica se todos os caracteres sao numericos
for(i=0; i<8; i++) {
if(cep[i] < '0' || cep[i] > '9')
return -1; // Encontrado caracter nao numerico, cep invalido.
}
// Se o programa chegou ate aqui, indica que temos um cep valido. Basta retornarmos o cep convertido para long int
return atol(cep);
}
void CarregaCEP(char *cep_txt, int cep_num)
{
int cep_alto, cep_baixo;
cep_alto = cep_num/1000;
cep_baixo = cep_num - (cep_alto*1000);
sprintf(cep_txt, "%05d-%03d", cep_alto, cep_baixo);
}
//Otem a seleção
int menu_select(void)
{
char s[80];
printf("1. Inserir um nome\n\n");
printf("2. Excluir um nome \n\n");
printf("3. Listar o arquivo \n\n");
printf("4. Salvar Registros\n\n");
printf("5. Exportar como Texto\n\n");
printf("6. Sair\n\n");
printf("Digite sua escolha:____");
LerString(s, sizeof(s));
return atoi(s);
}
//Encontra um estrutura não usada
int find_free(void)
{
int t;
for(t=0;addr_info[t].name[0] && t<MAX; t++);
if(t==MAX)
return -1; //nenyhum elemento livre
return t;
}
//Insere os endereços na lista.
void enter(void)
{
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("Lista cheia\n\n");
return;
}
nao_salvo = 1;
printf("Digite o nome: \n\n");
LerString(addr_info[slot].name, sizeof(addr_info[slot].name));
printf("Digite a rua: \n\n");
LerString(addr_info[slot].street, sizeof(addr_info[slot].street));
printf("Digite a cidade: \n\n");
LerString(addr_info[slot].city, sizeof(addr_info[slot].city));
printf("Digite o Estado: \n\n");
LerString(addr_info[slot].state, sizeof(addr_info[slot].state));
do {
printf("Digite o CEP: \n\n");
LerString(s, sizeof(s));
addr_info[slot].zip = ValidaCEP(s);
if(addr_info[slot].zip < 0) {
printf("CEP invalido!\n");
}
} while(addr_info[slot].zip < 0);
}
int procura(char *nome)
{
int t;
for(t=0; t < MAX; t++){
if(!strcmp(nome, addr_info[t].name))
return t;
}
return -1;
}
//Apaga um endereço
void delete(void)
{
int slot;
char s[80];
printf(" Digite o registro #:\n\n");
LerString(s, sizeof(s));
slot = atoi(s);
if(slot>=0 && slot < MAX) {
addr_info[slot].name[0]= 0;
nao_salvo = 1;
}
}
//Mostra lista na tela
void list(int tipo)
{
int t;
FILE *saida;
char txt[10];
if(tipo == LISTA_TELA) {
saida = stdout;
} else {
saida = fopen("dados.txt", "w");
if(saida == NULL) {
printf("Erro abrindo arquivo!\n");
}
}
for(t=0; t<MAX; ++t){
if(addr_info[t].name[0]){
fprintf(saida, "---------------------------------\n");
fprintf(saida, "Registro %d\n", t);
fprintf(saida, "%s \n", addr_info[t].name);
fprintf(saida, "%s \n", addr_info[t].street);
fprintf(saida, "%s \n", addr_info[t].city);
fprintf(saida, "%s \n", addr_info[t].state);
CarregaCEP(txt, addr_info[t].zip);
fprintf(saida, "%s \n", txt);
if(tipo==LISTA_TELA && t && !(t%5))
sleep(4);
}
}
fprintf(saida, "\n\n");
if(tipo == LISTA_ARQUIVO) {
fclose(saida);
}
}
int salva(void){
FILE *dadosHd;
dadosHd = fopen("dados.txt", "wb");
fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);
fclose(dadosHd);
nao_salvo = 0;
return 0;
}
void inicia(void){
FILE *dadosHd;
addr_info = malloc(sizeof(struct addr) * MAX);
dadosHd = fopen("C:\\Users\\jonny\\Documentos\\dados.txt", "wb");
if(dadosHd != NULL) {
fread(addr_info, sizeof(struct addr), MAX, dadosHd);
printf("%d ------------------<\n", sizeof(struct addr));
printf("nome - %s\n", addr_info[0].name);
fclose(dadosHd);
} else {
memset(addr_info, 0, sizeof(struct addr) * MAX);
printf("Arquivo inexistente\n");
}
}
int main(void)
{
char choice;
inicia();
printf("Legal heim\n\n\n");
for(;;) {
choice=menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list(LISTA_TELA);
break;
case 4: salva();
break;
case 5: list(LISTA_ARQUIVO);
break;
case 6:
if(nao_salvo) {
printf("Lista nao salva desde a ultima modificacao! Sair mesmo assim? (S/N): ");
if(toupper(getchar()) != 'S') // Nao confirmou, continuar o programa.
break;
}
exit(0);
break;
default:
printf("Opcao invalida!\n");
}
}
}
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
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Alguma pessoa pode me ajudar com drriver Core i3 7020u (Debian 12)? (2)
Mikrotik não mostra bytes nem packtes (1)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código [RESOLVID... (4)
[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