Jump to content
Fórum Script Brasil
  • 0

Ajuda com programa de agenda em C++


GabrielBroetto

Question

Tenho esse código de uma agenda pronto em C++, e quero adicionar uma opção para excluir os dados cadastrados, alguém pode me ajudar?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

typedef struct Agenda
{
char nome[50];
char fone[20];
char fonecelular[20];
char email[80];
}T_agenda;

// prototipos
void inclusao(void);
void Listar(void);
void quick_struct(int);
void qs_struct(int,int);
void ordenar(void);
void pesquisar(void);
char Validaresp();

static int qtd = 0;

T_agenda Tab[100];
FILE *fp;


// =================================================================
// ======Incluir dados no arquivo ==================================

void inclusao(void){
int total = 0, retorno;
char op = 's';

if ((fp = fopen("agenda.db", "a")) == NULL)
{
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}
while ((total < 100) && (op == 's'))
{
printf ("Digite o nome: ");
gets(Tab[total].nome);
printf ("Digite o numero do telefone fixo: ");
gets(Tab[total].fone);
printf ("Digite o numero do telefone celular: ");
gets(Tab[total].fonecelular);
printf ("Digite o E-mail: ");
gets(Tab[total].email);

retorno = fwrite (&Tab[total], sizeof(struct Agenda) ,1,fp);

if (retorno == 1) {
printf(" \nGravacao ok ! ");
}
total++;
op = Validaresp();
qtd++;
}
fclose (fp);
}

//======================================================================
// ======Valida resposta ===============================================

char Validaresp() {
char op;
do {
printf(" \nDeseja inserir novos dados? [s ou N] ? " );
op = getch();
printf("\n" );
} while (op != 's' && op != 'n');
return op;
}

//======================================================================
// ======Organizar em ordem alfabetica =================================

void ordenar(void){

T_agenda vet;
int aux,i,j,k,retorno;
char *str, *str2, *straux;


aux = qtd; // aux recebe a quantidade de contatos inscritos
for ( i = 0 ; i < aux ; i++ ){
str = Tab.nome;
for ( j = i+1 ; j < aux ; j++ ){
str2 = Tab[j].nome;
if ( strcmp ( str, str2 ) > 0 ){
vet = Tab;
Tab = Tab[j];
Tab[j] = vet;
}
}
}

remove("agenda.db");
if ((fp = fopen("agenda.db", "w+")) == NULL){
printf ("ERRO!\n");
getch();
exit(1);
}
for ( k = 0 ; k < aux ; k++ ){
retorno = fwrite (&Tab[k], sizeof(struct Agenda) ,1,fp);
if (retorno != 1) {
printf(" \nERRO ! ");
}
}
fclose(fp);
printf("\nLista Ordenada! \n");
getch();
}

//======================================================================
// ======Pesquisar contato pelo nome ===================================

void pesquisar(void){
int indice = 0, retorno = 1, cont = 0;
char nome[80],op;

if ((fp = fopen("agenda.db", "r")) == NULL){
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}
printf ("Digite o nome: ");
gets(nome);

retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);

while (retorno == 1){
if (strcmp(nome, Tab[indice].nome) == 0 ){
printf ("\nNome ..: %s\nFone ..: %s\nE-mail ..: %s\n", nome, Tab[indice].fone, Tab[indice].email);
cont++;
}
indice++;
retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);
}
if(cont == 0){
printf("não contatos com este nome!\n");
}
getch();
fclose(fp);
}

//======================================================================
// ======Pesquisar Telefone ============================================

void pesquisarfone(void){
int indice = 0, retorno = 1, cont = 0;
char fone[80],op;

if ((fp = fopen("agenda.db", "r")) == NULL){
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}
printf ("Digite o telefone fixo: ");
gets(fone);

retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);

while (retorno == 1){
if (strcmp(fone, Tab[indice].fone)==0){
printf ("\nNome ..: %s\nFone ..: %s\nE-mail ..: %s\n", Tab[indice].nome, Tab[indice].fone, Tab[indice].email);
cont++;
}
indice ++;
retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);
}
if(cont == 0){
printf("não contatos com este Telefone!\n");
}
getch();
fclose(fp);
}

void pesquisarfonecelular(void){
int indice = 0, retorno = 1, cont = 0;
char fone[80],op;

if ((fp = fopen("agenda.db", "r")) == NULL){
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}
printf ("Digite o telefone celular: ");
gets(fone);

retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);

while (retorno == 1){
if (strcmp(fone, Tab[indice].fone)==0){
printf ("\nNome ..: %s\nFone ..: %s\nE-mail ..: %s\n", Tab[indice].nome, Tab[indice].fone, Tab[indice].email);
cont++;
}
indice ++;
retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);
}
if(cont == 0){
printf("não contatos com este Telefone!\n");
}
getch();
fclose(fp);
}

//======================================================================
// ======Pesquisar contato por Email ===================================

void pesquisaremail(void){
int indice = 0, retorno = 1, cont =0;
char email[80],op;

if ((fp = fopen("agenda.db", "r")) == NULL){
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}
printf ("Digite o E-mail: ");
gets(email);

retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);

while (retorno == 1){
if (strcmp(email, Tab[indice].email)==0){
printf ("\nNome ..: %s\nFone ..: %s\nE-mail ..: %s\n", Tab[indice].nome, Tab[indice].fone, Tab[indice].email);
cont++;
}
indice ++;
retorno = fread(&Tab[indice], sizeof(struct Agenda), 1, fp);
}
if(cont == 0){
printf("não contatos com este Email!\n");
}
getch();
fclose(fp);
}

//======================================================================
// ======Lista os contatos cadastrados =================================

void Listar(void){
int i = 0, retorno;

if ((fp = fopen("agenda.db", "r")) == NULL)
{
printf ("O arquivo da lista não pode ser aberto!\n");
printf ("Insira dados!\n");
getch();
exit(1);
}

retorno = fread(&Tab, sizeof(struct Agenda), 1, fp);
// fread retorna a quantidade de itens ...

while ( retorno == 1) {
printf("\n Nome ..: %s", Tab.nome);
printf("\n Telefone fixo ..: %s", Tab.fone);
printf("\n Telefone celular ..: %s", Tab.fonecelular);

printf("\n E-mail ..: %s\n", Tab.email);
i++;
retorno = fread(&Tab, sizeof(struct Agenda), 1, fp);
}
printf(" \n\n %d Contatos salvos!\n", i);
getch();
fclose(fp);
}

//======================================================================
// ======Menu ==========================================================

void menu(void){
char op;
int teste;

if ((fp = fopen("agenda.db", "r")) != NULL){
qtd = 0;
do {
teste = fread(&Tab, sizeof(struct Agenda), 1, fp);
qtd++;
}while ( teste == 1 );
qtd--;
}

do{
system("cls");
printf("\n(1)Incluir\n(2)Listar\n(3)Ordenar por nome\n(4)Pesquisar por nome\n");
printf("(5)Pesquisar por telefone fixo\n(6)Pesquisar por telefone celular\n(7)Pesquisar por E-mail\n(8)Qualquer outra tecla para sair\n\n");
op = getch();
switch(op){
case '1':
inclusao();
break;
case '2':
Listar();
break;
case '3':
ordenar();
break;
case '4':
pesquisar();
break;
case '5':
pesquisarfone();
break;
case '6':
pesquisarfonecelular();
break;
case '7':
pesquisaremail();
break;
default:
exit(1);
}
}while (op < '7');
}

int main (){
int var;
if(var == 27){ exit(1);}
menu();
system("pause");
}

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Normalmente não se deve borrar dados de uma base de dados, basta com por alguma marca diante que diga que esse usuário esta excluído da lista, por exemplo:

usuario ativo:

nome sobrenome 999222333 nome@sobrenome.com

Repare que tem um espaço em branco antes do nome. Nesse caso si não tem marca o usuario estaria ativo.

Para indicar que ele esta excluído da lista basta por algo na frente como '*'. Ficando da seguinte forma:

*nome sobrenome 999222333 nome@sobrenome.com

Então si você tiver que listar os dados, esses com simbolo '*' adiante não se mostram. É convenhamos algo, não é bom borrar nenhum usuário já que pode servir para algo más adiante, para alguma especie de controle o consulta, algo assim.

Então é só mudar a estrutura:

typedef struct Agenda
{
        char nome[50];
        char fone[20];
        char fonecelular[20];
        char email[80];
}T_agenda;

... Por:

typedef struct Agenda
{
        char excluido; //incluir isso para armazenar o '*'
        char nome[50];
        char fone[20];
        char fonecelular[20];
        char email[80];
}T_agenda;

Também você esta passando algo muito más importante por alto no seu código.

Quando você usar sizeof para ler o tamanho da estrutura para fwrite, a estrutura pode variar de um computador a outro. WTF!!. Isso acontece por causa do Byte align ou alinhamento de Bytes.

você pode executar esse código que eu vou por a continuação e comprovar nele que eu tenho uma estrutura que contem um char+um int+um double, supondo que char tem um tamanho de 1Byte, um int 4Bytes e um double tem 8Bytes(pode ser diferente dependendo de vários fatores). Si somamos 1+4+8 é igual a 13Bytes não é? NAAAUMMM... É mais!!! Comprova.

#include<stdio.h>
#include<stdlib.h>

struct _estrutura{
	char c;
	int n;
	double d;
};


int main(){
	struct _estrutura s;
	printf ( "%d", sizeof( s ) ); 

	return 0;
}

Percebemos que o valor é mais alto que a soma dos 3 juntos(pode imprimir os 3 por separados para comprovar). Isso porque? Pelo alinhamento de Bytes! Byte Align altera alguns dados inflando eles para optimizar o rendimento do programa. Qual o problema então, más optimizado melhor não é? Depende! Melhor é, o problema é que cada compilador faz sua optimização dependendo de vários fatores como arquitetura do PC, versão e ajustes de compilador e sei la más que regras.

Vai ser bonito que você tire um fim de semana inteiro preparando um programa, e quando você chegar la na sala do profes e você se dar conta que a po**a do programa não funciona, e que você tirou um fim de semana inteiro fazendo a me**a do programa, e agora ele não funciona, e você nem sabe por que di***s isso acontece... hahah

Busca no Google faça um favor: "Alinhamento de Bytes em C" ou C++ como quiser. Arranje um bom articulo para ler sobre isso e entender o que eu estou falando.

E ainda tem mais...

se você guardar essa estrutura num arquivo você esta desperdiçando memoria. Se o zé ruela se chamar nome: Zé sobrenome: Ruela, para o nome você reservou 50 caráteres, no arquivo você vai ver a coisa assim:

"Zé :P Ruela"... Não é melhor si fosse assim: "Zé Ruela"??? pois isso você consegue melhor escrevendo o arquivo com fprintf e lendo com fscanf (Só si for texto plano!). Si for binário melhor seguir com fwrite e fread.

Vou demostrar o que eu estou falando com um exemplo:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct Dados{
	char excluido;
	char nome[50];
	char sobrenome[50];
	int edade;
};


int main(){
	FILE* f;
	f = fopen( "data.txt", "w+" );
	if ( f == 0 ){
		return 1;
	}
	//recheio de dados express XD
	Dados d[5] ={
		{ '\0', "Marco", "Antonio", 27},
		{  '*', "Maria", "Dolores", 67}, //Maria Dolores se va a gravar no arquivo más não se vai imprimir por que tem a marca * diante do seu nome.
		{ '\0', "Edvan", "Menezes", 43},
		{ '\0', "Paulo", "Augusto", 28},
		{ '\0', "Lurdes","Aquilar", 33},
	};

	//gravando
	for ( int i = 0; i<5; i++ ){
		fprintf( f, "%c %s %s %d\n",d[i].excluido, d[i].nome, d[i].sobrenome, d[i].edade );
	}
	fclose(f);
	
	
	//ato seguinte é ler da mesma forma
	f = fopen( "data.txt", "r" ); //modo só de leitura
	if ( f == 0 ){
		return 2;
	}
	//outra estrutura diferente para guardar desde o arquivo.
	Dados d2[5] = {0};
	
	//lemos todas as linhas
	for ( int i = 0; i<5; i++ ){
		fscanf( f, "%c %s %s %d%*c",&d2[i].excluido, d2[i].nome, d2[i].sobrenome, &d2[i].edade );
		//só imprimimos o cliente si não tiver a marca '*' que indica que esta excluido da lista de clientes.
		if ( d2[i].excluido != '*' ){
			printf("%c %s %s %d\n",d2[i].excluido, d2[i].nome, d2[i].sobrenome, d2[i].edade );
		}
	}	
	fclose(f);
	
	printf("Observe como maria dolores não esta incluida na lista devido a que tem a marca '*' de excluida.");
	
	getchar();
	return 0;
}

Essa criatura aqui é melhor que essa outra a continuação:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct Dados{
	char excluido;
	char nome[50];
	char sobrenome[50];
	int edade;
};


int main(){
	FILE* f;
	f = fopen( "data.txt", "w+" );
	if ( f == 0 ){
		return 1;
	}
	//recheio de dados express XD
	Dados d[5] ={
		{ '\0', "Marco", "Antonio", 27},
		{  '*', "Maria", "Dolores", 67}, //Maria Dolores se va a gravar no arquivo más não se vai imprimir por que tem a marca * diante do seu nome.
		{ '\0', "Edvan", "Menezes", 43},
		{ '\0', "Paulo", "Augusto", 28},
		{ '\0', "Lurdes","Aquilar", 33},
	};

	//gravando
	for ( int i = 0; i<5; i++ ){
		fwrite( &d[i], sizeof(struct Dados), 1, f);
	}
	fclose(f);
	
	
	//ato seguinte é ler da mesma forma
	f = fopen( "data.txt", "r" ); //modo só de leitura
	if ( f == 0 ){
		return 2;
	}
	//outra estrutura diferente para guardar desde o arquivo.
	Dados d2[5] = {0};
	
	//lemos todas as linhas
	for ( int i = 0; i<5; i++ ){
		fread( &d2[i], sizeof(struct Dados), 1, f);
		//só imprimimos o cliente si não tiver a marca '*' que indica que esta excluido da lista de clientes.
		if ( d2[i].excluido != '*' ){
			printf("%c %s %s %d\n",d2[i].excluido, d2[i].nome, d2[i].sobrenome, d2[i].edade );
		}
	}	
	fclose(f);
	
	
	
	getchar();
	return 0;
}

Da primeira forma você se livra de 2 problemas de uma só tacada. 1ºSem problemas de (sorte) por causa do Byte Align, e 2º o arquivo fica muito melhor organizado. Veja a diferença entre os 2 na forma em que se organizam nos seus arquivos, um esta bem compacto é o outro desperdiça memoria em disco.

Ainda tem muitos más problemas no seu código... É horrível que alguém ainda use getch no seu código... Uma função do já extinto Juracic Borland? Isso não favorece a criação de programas portáveis.

O ideal mesmo é você trabalhar com streams em vez do sistema de arquivos de C. C++ tem melhores mecanismos para streams com fstream más é questao de gosto, uns são puristas, e outros não lhes importa misturar C com C++(Depende do seu chefe XD).

Espero que tudo isso que eu falei te sirva de alguma coisa. Te desejo sorte.
Se precisar de más ajuda aqui estamos para auxiliar na medida do possível.

Edited by vangodp
Link to comment
Share on other sites

  • 0

Obrigado, foi de grande ajuda, eu não muito bom em programação e meu código tá meio bagunçado mesmo, a lógico dele é pra interagir com o usuário, pedindo pra ele digitar os dados e guarda-los no programa, você consegue fazer o código dessa maneira pra mim ver?

Link to comment
Share on other sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

Obrigado, foi de grande ajuda, eu não muito bom em programação e meu código tá meio bagunçado mesmo, a lógico dele é pra interagir com o usuário, pedindo pra ele digitar os dados e guarda-los no programa, você consegue fazer o código dessa maneira pra mim ver?

Podemos entrar em contato por chat(skype ou outros) para que possa te ajudar no que você quiser, não tem problema.

No skype eu chamo igual. Esa noite eu estaria aqui na net.

Link to comment
Share on other sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

Obrigado, foi de grande ajuda, eu não muito bom em programação e meu código tá meio bagunçado mesmo, a lógico dele é pra interagir com o usuário, pedindo pra ele digitar os dados e guarda-los no programa, você consegue fazer o código dessa maneira pra mim ver?

Podemos entrar em contato por chat(skype ou outros) para que possa te ajudar no que você quiser, não tem problema.

No skype eu chamo igual. Esa noite eu estaria aqui na net.

Me adiciona no facebook, só pesquisar Gabriel Broetto, to com a mesma foto que to aqui no forum.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...