Agenda in c (riprovo con liste e dynall)

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
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 della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3270
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

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
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

Avatar utente
Vito
Staff
Staff
Messaggi: 4175
Iscritto il: mar dic 05, 2006 17:28
Nome Cognome: Vito
Distribuzione: Linux Mint 17
Località: Augsburg (DE)
Contatta:

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
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: current
Kernel: 3.14.23
Desktop: KDE4
Località: Bulagna
Contatta:

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
FireEater
Linux 2.6
Linux 2.6
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino
Contatta:

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
Blallo
Packager
Packager
Messaggi: 3270
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

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:)
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

Avatar utente
Vito
Staff
Staff
Messaggi: 4175
Iscritto il: mar dic 05, 2006 17:28
Nome Cognome: Vito
Distribuzione: Linux Mint 17
Località: Augsburg (DE)
Contatta:

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
kreen
Linux 2.4
Linux 2.4
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

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


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti