Repository 32bit  Forum
Repository 64bit  Wiki

agenda in c (strutture e database)

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 (strutture e database)

Messaggioda Blallo » lun lug 06, 2009 22:16

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

typedef struct persona
{
   char nome[MAXNM];
   char cognome[MAXCN];
   char indirizzo[MAXLN];
   int telefono;
   char nota[MAXLN];
}persona;

avendo una struttura del genere (datami dal testo) devo leggere da un database (database.dat) con dentro come si può intuire i dati ordinati come nella struttura. Ora da qui dovrei printare a schermo solo il nome e cognome, ma sto impazzendo perchè non vorrei dover leggere per forza tutto ogni volta...come faccio?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
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 (strutture e database)

Messaggioda ulisse89 » mar lug 07, 2009 7:31

Non capisco cosa intendi per non voglio leggere tutto ogni volta. In ogni caso, dopo aver letto da file e caricato magari in un array di struct persona, non va bene fare un ciclo e stampare ogni volta persona[i].nome e persona[i].cognome?

PS: sembra ci sia un errore nell' orologio del forum, ho lasciato il messaggio alle 8.35 e segna un ora prima. Anche ieri sera faceva così.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: agenda in c (strutture e database)

Messaggioda Blallo » mar lug 07, 2009 11:42

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

typedef struct persona
{
   char nome[MAXNM];
   char cognome[MAXCN];
   char indirizzo[MAXLN];
   int telefono;
   char nota[MAXLN];
}persona;

int main()
{
   int c=0;
   FILE *fp;
   char str1[]="database.dat", cogntemp[MAXCN], nomtemp[MAXNM];
   persona p;

   printf("**********************\n");
   printf("********AGENDA********\n");
   printf("**********************\n");
   
   if((fp=fopen(str1,"r+w"))==NULL)
   {
      printf("Errore apertura database");
      return EXIT_FAILURE;
   }

   while(c!=5)
   {
      printf("1:Visualizza Records\n");
      printf("2:Aggiungi Record\n");
      printf("3:Cancella Record\n");
      printf("4:Cerca Record\n");
      printf("5:Esci dal programma\n");
      scanf("%d",&c);
      if(c>5 || c<=0)
      {
         printf("Valore non valido");
         return EXIT_SUCCESS;
      }
      switch(c)
      {
         case 1:
            while(!feof)
            {
               fscanf(fp, "%s %s %s %d %s", &p.nome, &p.cognome, &p.indirizzo, &p.telefono, &p.nota);
               printf("%s %s", p.cognome, p.nome);
               rewind(fp);
               break;
            };
         case 2:
         {
            printf("Nome:");
            scanf("%s", &p.nome);
            printf("Cognome:");
            scanf("%s", &p.cognome);
            printf("Indirizzo:");
            scanf("%s", &p.indirizzo);
            printf("Numero telefono:");
            scanf("%d", &p.telefono);
            printf("Note:");
            scanf("%s", &p.nota);
            fprintf(fp, "%s %s %s %d %s", p.nome, p.cognome, p.indirizzo, p.telefono, p.nota);
            rewind(fp);
            break;
         };
         case 3:
         {
            printf("Cognome:");
            scanf("%s", &cogntemp);
            printf("Nome:");
            scanf("%s", &nomtemp);
            while(!feof && (p.cognome != cogntemp && p.nome != nomtemp))
               fscanf(fp, "%s %s %s %d %s", &p.nome, &p.cognome, &p.indirizzo, &p.telefono, &p.nota);

            rewind(fp);
            break;
         };
         case 4:
         {
            printf("Cognome:");
            scanf("%s", &cogntemp);
            while(!feof)
            {
               fscanf(fp, "%s %s %s %d %s", &p.nome, &p.cognome, &p.indirizzo, &p.telefono, &p.nota);
               if(strcmp(cogntemp, p.cognome)==0)
                  printf("%s %s %s %d %s", p.cognome, p.nome);
            }
            rewind(fp);
            break;
         };
      };
   }
}

ora mi da problema solo il case 3, dove devo eliminare un record dal database :(
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
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 (strutture e database)

Messaggioda ulisse89 » mar lug 07, 2009 12:05

E' perchè confronti due stringhe con != ma ciò che stai facendo in realtà è confrontare due indirizzi. Quindi ti da sempre falso. C'è la funzione strcmp.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: agenda in c (strutture e database)

Messaggioda Vito » mar lug 07, 2009 12:12

Non ho letto alla lettera benissimo il programma (anche perchè sto preparando l'orale di Fisica II,che ben capirai quanto sia pesante..) comunque:
Perchè non appoggiarti agli array anche per rimuovere un nome?
In soldoni :

-Carichi tutto il database in un array (di record da te dichiarati);
-Elimini il nome e cognome da te scelti (tramite una ricerca sequenziale con una and tra nome e cognome);
-Fai uno shift verso sinistra degli elementi dell'array che stanno prima di quello eliminato (ovviamente se esiste l'elemento);
-Sovrascrivi il vecchio database con quello nuovo;

Se l'hai già fatto chiedo venia ;-)
"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: 4134
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 (strutture e database)

Messaggioda Vito » mar lug 07, 2009 12:15

ulisse89 ha scritto:E' perchè confronti due stringhe con != ma ciò che stai facendo in realtà è confrontare due indirizzi. Quindi ti da sempre falso. C'è la funzione strcmp.


Dice bene ulisse89, per confrontare stringhe hai bisogno di strcmp
"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: 4134
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 (strutture e database)

Messaggioda ulisse89 » mar lug 07, 2009 12:30

Vito ha scritto:Non ho letto alla lettera benissimo il programma (anche perchè sto preparando l'orale di Fisica II,che ben capirai quanto sia pesante..) comunque:
Perchè non appoggiarti agli array anche per rimuovere un nome?
In soldoni :

-Carichi tutto il database in un array (di record da te dichiarati);
-Elimini il nome e cognome da te scelti (tramite una ricerca sequenziale con una and tra nome e cognome);
-Fai uno shift verso sinistra degli elementi dell'array che stanno prima di quello eliminato (ovviamente se esiste l'elemento);
-Sovrascrivi il vecchio database con quello nuovo;

Se l'hai già fatto chiedo venia ;-)

Volevo digli la stessa cosa, ma ho pensato che così volesse l'esercizio. Anche per me è più comodo come dici, soprattutto quando i programmi diventano più complessi è impossibile caricare da file per ogni operazione.
PS: Io già fisica 1 la reputo pesante. :lol:
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: agenda in c (strutture e database)

Messaggioda Vito » mar lug 07, 2009 12:43

ulisse89 ha scritto:
Volevo digli la stessa cosa, ma ho pensato che così volesse l'esercizio. Anche per me è più comodo come dici, soprattutto quando i programmi diventano più complessi è impossibile caricare da file per ogni operazione.
PS: Io già fisica 1 la reputo pesante. :lol:

Il problema è che una volta eliminato un nome dal file dovrebbe restare uno spazio vuoto..invece caricandolo su un array il tutto risulta più pulito...e molto più semplice,poi se l'esercizio vuole tutto "on fly" pazienza!


Offtopic: Fortunatamente ho passato già lo scritto di fisica II(con un buon voto) e mi manca l'orale che sosterrò intorno al 20luglio;dopo: Vacanze!
"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: 4134
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


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti