Jump to content
Sign in to follow this  
vx3

Agenda Telefónica em C

Recommended Posts

vx3

Boas!

Sou novo no forum!

Estou a fazer uma agenda telefónica em C, e agora queria que o programa desse para apagar um numero de contacto.

Mas nao sei como o fazer, isto é para uma trablaho e é muito importante e tenho que entragar até dia 20 deste mês.

Logo se me podessem dar uma ajudinha...

O programa está muito simples, e o que faz é" Inserir o contacto", "Listar os contactos" agora preciso da funçao "Apagar contacto"

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

int mostralista()
{
char ch;
printf("Lista de contactos :\n\n");
FILE *vx3;
vx3 = fopen("pap.txt" , "r");
ch=getc(vx3); // Lê um caracter do ficheiro "pap.txt".
while(ch!=EOF) //Enquanto o caracter nao chegar ao fim do ficheiro...
  {
   putchar(ch); // Mostra no monitor o ficheiro "pap.txt".
   ch=getc(vx3); // Guarda o caracter ch no ficheiro "pap.txt"
  }
fclose(vx3); // Fecha o ficheiro "pap.txt".
getch();
}

char inserir()
{

char nome[10];
char morada[25];
char opcao;
int telefone;

FILE *vx3;
fflush(stdin); // Despeja os dados no disco
vx3 = fopen("pap.txt" , "a"); // Abre o ficheiro "pap.txt".
printf("Insira o nome do contacto: ");
gets(nome);   // Guarda o nome do contacto na variavel "nome".
fflush(stdin); // Despeja os dados no disco
printf("Insira o numero de telefone: "); 
scanf("%d", &telefone);  // Guarda o numero do telefone na variavel"telefone".
fflush(stdin); // Despeja os dados no disco
printf("Insira a morada: ");
gets(morada);
fflush(stdin);
fprintf(vx3, "Nome do contacto: %s \n",nome);  // Escreve no ficheiro "pap.txt"o nome do contacto que foi inserido anteriormente.
fprintf(vx3, "Numero de telefone: %d \n", telefone); // Escreve no ficheiro"pap.txt" o numero de telefone do contacto que foi inserido anteriormente.
fprintf(vx3, "Morada: %s \n\n", morada); // Escreve no ficheiro "pap.txt" amorada que foi inserida anteriormente.
printf("Deseja inserir mais contactos? S/N \n");
fflush(stdin); // Despeja os dados no disco
scanf(" %c", &opcao);  // Guarda a opção na variavel "opcao".

switch(opcao)  // Verifica se a opção é "n" ou "s".
  {
   case 's' :
   case 'S' : inserir() ;  break;  // Se for "s" chama outra vez a função"inserir" para inserir mais um contacto
   case 'n' :
   case 'N' : exit(1);  break;  // Se for "n" sai.
  }

fclose(vx3);  // Fecha o ficheiro "pap.txt".
}


int main()
{
printf("\t\t\tAgenda Telefonica\n");   // Mostra o menu.
printf(" Carregue no numero para ir para a opção desejada :\n\n"); // Aparece amesagem "Carregue no numero para ir para a opção desejada :"
printf("1 - Inserir/adicionar contacto na lista\n"); // Aparece a mensagem "1 -Inserir/adicionar contacto na lista"
printf("2 - Consultar a agenda telefonica\n"); // Aparece a mensagem "2 -Consultar a agenda telefónica"

printf("0 - Sair\n\n\n"); // Aparece a mensagem "0 - Sair" 
char escolha;
scanf(" %s", &escolha); // Guarda a opção escolhida.
switch(escolha)  // Verifica qual foi a opção.
  {
   case '1' : 
   inserir();
   break; // Caso a operação escolhida seja a "1" inicia o procedimento"inserir".

   case '2' :
   mostralista();  // Caso a opção escolhida seja "2" chama o procedimento"mostralista".
   break;
                          
   case '0' : 
   exit(1); // Caso a opção escolhida seja "0" sai.
   break;
  }
}

Por favor ajudem-me com linhas de códigos e nao como o fazer.

Obrigado!

Share this post


Link to post
Share on other sites
deathseeker25

Boas,

Não programo em C há alguns meses e nunca cheguei a ser um grande programador na linguagem (apesar de achar que no futuro vou dar atenção a esta linguagem novamente). C

Como me lembrava de ter visto algo do género aqui pelos livros por onde estudava C, lá decidi pesquisar. Tenta adaptar isto conforme as tuas necessidades:

typedef struct{
short label;
short deleted;
Disk disk;
}Item;

void BuildItem(Item *x, int b, int t, Disk *d)
{
x -> label=b;
x ->deleted=t;
x ->disk=*d;
}

void MarkDeleted(Item *t)
{
t->deleted=1;
}

void MarkUndeleted(Item *t)
{
t ->deleted=0;
}


Agora vem a parte com mais importância que certamente te interessa:

#define MAX_ITEMS 1024

Items items[MAX_ITEMS];
int n_items;

int n_deleted;

int n_modifs;

void DeleteItem(Item *);

void DeleteItem(Item *)
{
MarkDeleted(t);
++n_modifs;
++n_deleted;
}

E agora a função final:

void DoDeleteItems(void)
{
Item *x;
while(printf("Delete disk\n"),SelectItem(&x))
switch(ButtonSelect("Delete this disk?","No;Yes;Cancel;"))
{

case 1:
break;

case 2: 

DeleteItem(x);
if(!NumberofElements())
return;
break;

case 3:
return;
}
}

Aqui ficam uns cheirinhos de código que te proponho analisar.

Já agora, bem-vindo ao fórum.... :cheesygrin:

Share this post


Link to post
Share on other sites
vx3

Obrigado!

Agora esta linha dá-me erro:        void BuildItem(Item *x, int b, int t, Disk *d)

porque diz que nenhuma daquelas variaveis está declarada.

E ja agora, o que é que faz a funçao disk, é que eu nunca a dei, e por sinal também dá erro.

Cumps!

Share this post


Link to post
Share on other sites
deathseeker25

Obrigado!

Agora esta linha dá-me erro:        void BuildItem(Item *x, int b, int t, Disk *d)

porque diz que nenhuma daquelas variaveis está declarada.

E ja agora, o que é que faz a funçao disk, é que eu nunca a dei, e por sinal também dá erro.

Cumps!

Disk não é uma função, mas sim uma estrutura. Eu forneci-te (copiei) o código de modo a poderes adaptar a função para eliminar item. O resto do código não interessa. :)

Share this post


Link to post
Share on other sites
Saco

vx3: Não sei se notaste mas este codigo que o deathseeker meteu aí é para usares com structs... que nao é o teu caso.

Por acaso a opçao de usar uma lista de estruturas é mais inteligente do que usar ficheiros e andar sempre a ler e a escrever do disco, ja que esta é muito mais lenta.

Mas se queres continuar a usar a opção de ficheiros, aqui vai o pseudo-codigo para a operaçao de remocao:

char* nome = perguntar_o_nome_a_remover();

char* linha = ler_primeira_linha_do_ficheiro();

while(linha != EOF)
{
if(nome == linha) //se for este o contacto a remover passa ao proximo
{
le_numero_mas_nao_guarda();
le_morada_mas_nao_guarda();
}
else // caso contrario guarda-o num ficheiro temporario 
{
guarda_nome();
le_e_guarda_numero();
le_e_guarda_morada();
}
linha = le_proximo_nome();
}

//agora que tens so os contactos que interessam é so guardar o ficheiro temporario com o nome do ficheiro que tem a lista de contactos.

espero ter sido claro...

Share this post


Link to post
Share on other sites
vx3

Agora criei a função, e dá-me muitos erros, nem sequer reconhece as variáveis k eu ja tinha definido noutra função. gostava k me dissessem o que está mal, eu não consigo perceber donde vem tanto erro. aquilo parece-me tudo bem.

char apagar()
{
char *linha();       
char* nome();
char* linha = fopen("pap.txt" , "r");

while(linha != EOF)
{
            if(nome == linha) //se for este o contacto a remover passa ao proximo
            {
                    gets(telefone);
                    telefone=0;
                    gets(morada);
                    morada=0;
                    }
                    else // caso contrario guarda-o num ficheiro temporario
                    {
                        gets(nome);
                        gets(telefone);
                        gets(morada);
                        }
                        linha = nome;
                        }
}

Fiquem bem!

Share this post


Link to post
Share on other sites
vx3

Boas!

agr tenho o programa da seguinte forma:

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

int mostralista()
{
char ch;
printf("Lista de contactos :\n\n");
FILE *vx3;
vx3 = fopen("pap.txt" , "r");
ch=getc(vx3); // Lê um caracter do ficheiro "pap.txt".
while(ch!=EOF) //Enquanto o caracter nao chegar ao fim do ficheiro...
  {
   putchar(ch); // Mostra no monitor o ficheiro "pap.txt".
   ch=getc(vx3); // Guarda o caracter ch no ficheiro "pap.txt"
  }
fclose(vx3); // Fecha o ficheiro "pap.txt".
getch();
}

char inserir()
{

char nome[10];
char morada[25];
char opcao;
int telefone;

FILE *vx3;
fflush(stdin); // Despeja os dados no disco
vx3 = fopen("pap.txt" , "a"); // Abre o ficheiro "pap.txt".
printf("Insira o nome do contacto: ");
gets(nome);   // Guarda o nome do contacto na variavel "nome".
fflush(stdin); // Despeja os dados no disco
printf("Insira o numero de telefone: "); 
scanf("%d", &telefone);  // Guarda o numero do telefone na variavel"telefone".
fflush(stdin); // Despeja os dados no disco
printf("Insira a morada: ");
gets(morada);
fflush(stdin);
fprintf(vx3, "Nome do contacto: %s \n",nome);  // Escreve no ficheiro "pap.txt"o nome do contacto que foi inserido anteriormente.
fprintf(vx3, "Numero de telefone: %d \n", telefone); // Escreve no ficheiro"pap.txt" o numero de telefone do contacto que foi inserido anteriormente.
fprintf(vx3, "Morada: %s \n\n", morada); // Escreve no ficheiro "pap.txt" amorada que foi inserida anteriormente.
printf("Deseja inserir mais contactos? S/N \n");
fflush(stdin); // Despeja os dados no disco
scanf(" %c", &opcao);  // Guarda a opção na variavel "opcao".

switch(opcao)  // Verifica se a opção é "n" ou "s".
  {
   case 's' :
   case 'S' : inserir() ;  break;  // Se for "s" chama outra vez a função"inserir" para inserir mais um contacto
   case 'n' :
   case 'N' : exit(1);  break;  // Se for "n" sai.
  }

fclose(vx3);  // Fecha o ficheiro "pap.txt".
}

char apagar()
{
char *linha();        
char* nome();
char* linha = fopen("pap.txt" , "r");
while(linha != EOF)
{
            if(nome == linha) //se for este o contacto a remover passa ao proximo
            {
                    gets(telefone);
                    telefone=0;
                    gets(morada);
                    morada=0;
                    }
                    else // caso contrario guarda-o num ficheiro temporario 
                    {
                         gets(nome);
                         gets(telefone);
                         gets(morada);
                         }
                         linha = nome;
                         } 
}

int main()
{
printf("\t\t\tAgenda Telefonica\n");   // Mostra o menu.
printf(" Carregue no numero para ir para a opção desejada :\n\n"); // Aparece amesagem "Carregue no numero para ir para a opção desejada :"
printf("1 - Inserir/adicionar contacto na lista\n"); // Aparece a mensagem "1 -Inserir/adicionar contacto na lista"
printf("2 - Consultar a agenda telefonica\n"); // Aparece a mensagem "2 -Consultar a agenda telefónica"
printf("3 - Apagar contacto da agenda telefonica")
printf("0 - Sair\n\n\n"); // Aparece a mensagem "0 - Sair" 
char escolha;
scanf(" %s", &escolha); // Guarda a opção escolhida.
switch(escolha)  // Verifica qual foi a opção.
  {
   case '1' : 
   inserir();
   break; // Caso a operação escolhida seja a "1" inicia o procedimento"inserir".

   case '2' :
   mostralista();  // Caso a opção escolhida seja "2" chama o procedimento"mostralista".
   break;
   
   case '3 :
   apagar();  // Caso a opção escolhida seja "3" chama o procedimento"apagar".
   break;
                          
   case '0' : 
   exit(1); // Caso a opção escolhida seja "0" sai.
   break;
  }
}

Não sei o k aki está mal, ajudem-me pff, ek eu tenho de entregar isto a funcionar até dia 20 (proxima 2ª feira), pk se tiver algum erro levo 0  😡

Fikem bem :confused:

Share this post


Link to post
Share on other sites
vx3

Aki está uma imagem a demontrar os erros k o programa tem:

http://img226.imageshack.us/my.php?image=errospap8yd.jpg

O k eu n percebo daki é:

char* linha = fopen("pap.txt" , "r"); // Esta linha era suposto abrir o ficheiro pap.txt em modo de leitura, e diz k tem erro.

E dpx nas linhas em k guarda uma variavel e a ponha a 0, diz k a variavel nao está declarada,

Talvez se eu usar pointers para declarar as variaveis k estao noutra funçao.

Cumps!!!

Share this post


Link to post
Share on other sites
saramgsilva
Em 17/03/2006 às 19:29, vx3 disse:

Aki está uma imagem a demontrar os erros k o programa tem:

http://img226.imageshack.us/my.php?image=errospap8yd.jpg

O k eu n percebo daki é:

char* linha = fopen("pap.txt" , "r"); // Esta linha era suposto abrir o ficheiro pap.txt em modo de leitura, e diz k tem erro.

E dpx nas linhas em k guarda uma variavel e a ponha a 0, diz k a variavel nao está declarada,

Talvez se eu usar pointers para declarar as variaveis k estao noutra funçao.

Cumps!!!

eu vi..das os mesmos erros que me deu...mas tu tas a fazer asneiras!! tas a declarar funcao dentro de outras...bue estranho... e se reparares falta declarar algumas coisas.... como n sei ficheiros...  :dontgetit: tens k analisar as coisas...devagarinho... para corrigires isso..

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.