Repository 32bit  Forum
Repository 64bit  Wiki

Agenda in c (riprovo con liste e dynall)

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza dell'ultima regola porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Agenda in c (riprovo con liste e dynall)

Messaggioda Blallo » mar lug 07, 2009 17:32

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLN 80
#define MAXCN 32
#define MAXNM 20

const char name[]="mydatabase.dat";

typedef struct agenda
{
   char nome[MAXNM];
   char cognome[MAXCN];
   char indirizzo[MAXLN];
   int num;
   char nota[MAXLN];
   struct agenda *next;
}agenda;

typedef agenda * agendaPtr;

agendaPtr push(agendaPtr head, agenda val);
agendaPtr pop(agendaPtr head);

int main()
{
   agendaPtr tmp;
   agendaPtr head=NULL;
   agenda val;
   FILE *fp;
   int c=0;
   char t_cogn[MAXCN], t_nom[MAXNM];

   printf("************************\n");
   printf("*********AGENDA*********\n");
   printf("************************\n");
   printf("***(c) Savino Liguori***\n");
   //printf("************************");
   
   if((fp=fopen(name,"r+w"))==NULL)
   {
      fprintf(stderr,"Errore apertura database");
      return EXIT_FAILURE;
   }

   while(c<5)
   {
      printf("************************\n");
      printf("1:Leggi Lista Contatti\n");
      printf("2:Aggiungi Contatto\n");
      printf("3:Rimuovi Contatto\n");
      printf("4:Cerca Contatto\n");
      printf("0:Esci Dal Programma\n");
      scanf("%d", &c);
      if(c==0)
      {
         printf("Grazie per aver usato AGENDA");
         return EXIT_SUCCESS;
      }
      else if(c==1)
      {   
         while(!feof)
         {
            fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
            printf("%s %s", val.nome, val.cognome);
         }
         rewind(fp);
      }
      else if(c==2)
      {
         printf("(Inserire _ al posto dello spazio:\n)");
         printf("Nome:\n");
         scanf("%s", val.nome);
         printf("Cognome:\n");
         scanf("%s", val.cognome);
         printf("Indirizzo:\n");
         scanf("%s", val.indirizzo);
         printf("Numero di telefono:\n");
         scanf("%d", &val.num);
         printf("Note:\n");
         scanf("%s", val.nota);
         head=push(head, val);
         rewind(fp);
      }
      else if(c==3)
      {
         printf("(Inserire _ al posto dello spazio:\n)");
         printf("Cognome:\n");
         scanf("%s", t_cogn);
         printf("Nome:\n");
         scanf("%s", t_nom);
         while(!feof && ((strcmp(t_cogn, val.cognome)==0) && (strcmp(t_nom, val.nome)==0)))
            fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
         head=pop(head);
         rewind(fp);
      }
      else if(c==4)
      {
         printf("(Inserire _ al posto dello spazio:\n)");
         printf("Cognome:\n");
         scanf("%s", t_cogn);
         while(!feof && (strcmp(t_cogn, val.cognome)==0))
            fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
         printf("%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, val.num, val.nota);
         rewind(fp);
      }
   }
   if (c>4)
      printf("Parametro non valido");
   return EXIT_SUCCESS;
}

agendaPtr push(agendaPtr head, agenda val)
{
   agendaPtr tmp;
   
   tmp=(agendaPtr)malloc(sizeof(agenda));
   if(tmp==NULL)
   {
      printf("Allocazione fallita!");
      exit (1);
   }
   
   tmp->nome=val.nome;
   tmp->cognome=val.cognome;
   tmp->indirizzo=val.indirizzo;
   tmp->num=val.num;
   tmp->nota=val.nota;
   tmp->next=head;
   head=tmp;
   return head;
}

agendaPtr pop(agendaPtr head)
{
   agendaPtr tmp;
   tmp->next=head;
   head=NULL;
   return head;
}

compilando mi da un errore nella push...
Codice: Seleziona tutto
Agenda.c:124: error: incompatible types in assignment
Agenda.c:125: error: incompatible types in assignment
Agenda.c:126: error: incompatible types in assignment
Agenda.c:128: error: incompatible types in assignment
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda Vito » mar lug 07, 2009 17:59

Se vuoi io ho fatto una tesina su una lista dove implementavo anche il salvataggio e caricamento da file...
te la posso passare :-)
però è un progetto diviso in 3 file.
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Avatar utente
Vito
Staff
Staff
 
Messaggi: 3924
Iscritto il: mar dic 05, 2006 18:28
Località: Forio / Napoli
Nome Cognome: Vito Magnanimo
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Ubuntu 12.04

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda 414N » mar lug 07, 2009 18:36

Prova a togliere il cast dalla malloc.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2844
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda FireEater » mar lug 07, 2009 18:41

Stai copiando indirizzi, come nel post precedente.
Se noti per la variabile intera non ti da problemi.

Per i vettori di caratteri si usano strcpy & co.

Ciao

PS: quel cast dovrebbe andar bene, IMHO usare typedef per definire un puntatore ad agenda non è bello.
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 1:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda Blallo » mar lug 07, 2009 20:45

@vito: se puoi mi farebbe molto piacere grazie:)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda Vito » mar lug 07, 2009 20:50

jimmy_page_89 ha scritto:@vito: se puoi mi farebbe molto piacere grazie:)


Ti mando tutto a breve ;-)


Se mi dai la mail via pm faccio prima :-D
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Avatar utente
Vito
Staff
Staff
 
Messaggi: 3924
Iscritto il: mar dic 05, 2006 18:28
Località: Forio / Napoli
Nome Cognome: Vito Magnanimo
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Ubuntu 12.04

Re: Agenda in c (riprovo con liste e dynall)

Messaggioda kreen » mer lug 08, 2009 21:03

Ciao.
Se non ti offendi ad accettare un consiglio, utile in tutti i campi, non solo con il C, quando fai una operazione, certa di pensare perche' la fai e cosa ci sta dietro.

Cosa vuoi fare con
tmp->nome=val.nome;

Ricordati che gli array non sono puntatori.

Inoltre, malloc e realloc non devono vivere senza free. Non ne vedo nel tuo codice. Non liberi la memoria.
Prendi certe abitudini (non so se stai studiando a scuola o se programmi per "hobby"), ma in ogni caso ti risparmi ore di debug per nulla.

***IMHO***
Userei un switch invece degli if.

L'else dopo l'if(0==c) e' inutile.

while(!feof) <--- ??? man feof
{

*** Sicuro di questo?
while(!feof && ((strcmp(t_cogn, val.cognome)==0) && (strcmp(t_nom, val.nome)==0)))
fscanf(fp, "%s %s %s %d %s", val.nome, val.cognome, val.indirizzo, &val.num, val.nota);
head=pop(head);

e se tizio avvia il programma e sceglie per prima cosa l'opzione 3, cosa succede?

etc...
Avatar utente
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 19:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite