
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");
}
}
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









