Pagina 1 di 1
agenda in c (strutture e database)
Inviato: lun 6 lug 2009, 23:16
da Blallo
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?
Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 8:31
da ulisse89
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.nome e persona.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ì.
Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 12:42
da Blallo
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

Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 13:05
da ulisse89
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.
Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 13:12
da Vito
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

Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 13:15
da Vito
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
Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 13:30
da ulisse89
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.

Re: agenda in c (strutture e database)
Inviato: mar 7 lug 2009, 13:43
da Vito
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.

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!