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

Agenda in c (riprovo con liste e dynall)

Messaggioda Blallo » mar lug 07, 2009 16: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: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

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

Messaggioda Vito » mar lug 07, 2009 16: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: 4135
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg (DE)
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

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

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

Prova a togliere il cast dalla malloc.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16: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 17: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 0: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 19: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: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

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

Messaggioda Vito » mar lug 07, 2009 19: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: 4135
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg (DE)
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

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

Messaggioda kreen » mer lug 08, 2009 20: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 18: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 2 ospiti