• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

vx3

Agenda Telefonica em C urgente!!!

10 mensagens neste tópico

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.... :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agr criei a funçao, e dá-me muitos erros, nem sequer reconhece as váriaveis k eu ja tinha definido noutra funçao. gostava k me dissesem o k está mal, eu nao consigo perceber donde vem tanto erro :wallbash:. akilo 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;

                        }

}

Fikem bem!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :rant_01:

Fikem bem :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

falta-te 1 plica a seguir ao 3, no ultimo case de falta te o return 0; no final do programa...  ve isso

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

errospap8yd.th.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!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

errospap8yd.th.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..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora