vx3 Posted March 7, 2006 at 03:41 PM Report #17219 Posted March 7, 2006 at 03:41 PM 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!
deathseeker25 Posted March 7, 2006 at 05:35 PM Report #17232 Posted March 7, 2006 at 05:35 PM 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.... 😁
vx3 Posted March 8, 2006 at 07:46 PM Author Report #17408 Posted March 8, 2006 at 07:46 PM 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!
deathseeker25 Posted March 8, 2006 at 07:51 PM Report #17416 Posted March 8, 2006 at 07:51 PM 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. 🙂
Saco Posted March 8, 2006 at 10:35 PM Report #17480 Posted March 8, 2006 at 10:35 PM 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...
vx3 Posted March 9, 2006 at 07:26 PM Author Report #17580 Posted March 9, 2006 at 07:26 PM 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!
vx3 Posted March 16, 2006 at 07:22 PM Author Report #18545 Posted March 16, 2006 at 07:22 PM 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 😕
saramgsilva Posted March 16, 2006 at 07:26 PM Report #18547 Posted March 16, 2006 at 07:26 PM falta-te 1 plica a seguir ao 3, no ultimo case de falta te o return 0; no final do programa... ve isso www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
vx3 Posted March 17, 2006 at 07:29 PM Author Report #18629 Posted March 17, 2006 at 07:29 PM 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!!!
saramgsilva Posted March 18, 2006 at 01:29 PM Report #18673 Posted March 18, 2006 at 01:29 PM 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.. www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now