Segui il video qui sotto per vedere come installare il nostro sito come web app sulla tua schermata principale.
Nota: Questa funzionalità potrebbe non essere disponibile in alcuni browser.
Pubblicità
okay come faccio con gli arrayBeh i file vanno usati se è richiesta la persistenza, cioè che i contenuti non vadano persi alla terminazione del programma. Ma, se questo requisito non è specificato, potresti anche inserire le richieste direttamente in un array.
ma il prof ha detto di usare cioè che vogliamo quindi avevo usato il fileokay come faccio con gli array
Crei un array per contenere le richieste, e una funzione per aggiungere una richiesta all'array, molto semplicemente. Oppure, puoi fare una funzione che ti consenta di inserire più richieste alla volta con un ciclo for, ad esempio. L'array deve avere una dimensione sufficiente a contenere tutte le richieste che vorrai inserire, oppure potresti creare un array dinamico con i puntatori, in modo che possa crescere/decrescere a seconda delle richieste, ma non voglio complicarti troppo la vita (non so nemmeno se avete studiato questo argomento).okay come faccio con gli array
ma con le liste risulta molto difficile farlo?Crei un array per contenere le richieste, e una funzione per aggiungere una richiesta all'array, molto semplicemente. Oppure, puoi fare una funzione che ti consenta di inserire più richieste alla volta con un ciclo for, ad esempio. L'array deve avere una dimensione sufficiente a contenere tutte le richieste che vorrai inserire, oppure potresti creare un array dinamico con i puntatori, in modo che possa crescere/decrescere a seconda delle richieste, ma non voglio complicarti troppo la vita (non so nemmeno se avete studiato questo argomento).
No, ti ho suggerito un array per una questione di efficienza e anche di semplicità. Però dipende da come deve funzionare il programma: cioè, tutte le richieste memorizzate in questo array/lista devono essere eseguite tutte quante una dopo l'altra, oppure solo una alla volta quando lo richiede l'utente? Te lo chiedo perché nel primo caso (non è richiesta eliminazione) è più semplice ed efficiente usare un array, nel secondo (vuoi eliminare le richieste di volta in volta che vengono esaudite) forse è meglio una lista. Dipende dal workflow del programma.ma con le liste risulta molto difficile farlo?
il progetto questo non lo dice ma secondo me è a piacereNo, ti ho suggerito un array per una questione di efficienza e anche di semplicità. Però dipende da come deve funzionare il programma: cioè, tutte le richieste memorizzate in questo array/lista devono essere eseguite tutte quante una dopo l'altra, oppure solo una alla volta quando lo richiede l'utente? Te lo chiedo perché nel primo caso (non è richiesta eliminazione) è più semplice ed efficiente usare un array, nel secondo (vuoi eliminare le richieste di volta in volta che vengono esaudite) forse è meglio una lista. Dipende dal workflow del programma.
io l'inserimento della richiesta nel file già l'ho fatta mi serve prendere il titolo che è stato inserito nella richiesta e vedere se è presente nella lista dei libriil progetto questo non lo dice ma secondo me è a piacere
comunque ho fatto cosiil progetto questo non lo dice ma secondo me è a piacere
--- i due messaggi sono stati uniti ---
io l'inserimento della richiesta nel file già l'ho fatta mi serve prendere il titolo che è stato inserito nella richiesta e vedere se è presente nella lista dei libri
void ricerca (struct libri *l,char titolo[MAXTITOLO]){
int trovato = 0 ;
while (l != NULL && trovato != 1) {
if(strcmp(l->titolo, titolo)==0) {
printf("\nIl libro richiesto e' presente nell'archivio ed la richiesta è stata accettata quindi il libro è stato prestato con successo.\n");
trovato=1;
}
l = l->next;
}
if(trovato != 1)
printf("\nIl libro richiesto non e' presente nell'archivio la richiesta è stata rifiutata. La invitiamo ad richiederlo nei prossimi giorni.\n");
}
fd=fopen("Richieste.txt","r");
fscanf(fd, "%s", titolo);
ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);
Ci sarà qualche errore. Posta tutto il codice completo sotto spoiler e con il tag CODE come ti ho mostrato prima. E, per favore, che sia indentato bene e senza righe bianche o B, altrimenti è difficile da leggere e interpretare.
#ifndef funzioni_h
#define funzioni_h
#define funzioni_h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITOLO 20
#define MAXAUTORE 50
#define MAXNOME 255
#define MAXCOGNOME 255
#define MAXMATRICOLA 9
struct libri{
char titolo [MAXTITOLO];
char autore [MAXAUTORE];
int cod_id;
struct libri *next;
};
typedef struct libri* list;
int menu(void);
void printList(list L);
void gestioneErrore(void);
void ricerca (struct libri *l, char titolo [MAXTITOLO]);
void freeNodo(struct libri *nodo);
void freeLista(struct libri *lista);
void stampaLista(struct libri *top);
void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
list cancellalibri(list lis, char titolo[MAXTITOLO]);
struct libri *leggiFile(FILE *fp, struct libri *lista);
struct libri *nuovoNodo(char *titolo, char *autore, int cod_id);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
list initList(char titolo[MAXTITOLO],char autore[MAXAUTORE],int cod_id);
list insertTail(list L, char titolo[MAXTITOLO], char autore[MAXAUTORE], int cod_id);
#endif
#include "funzioni.h"
#define MAXNOME 255
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int menu(){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \nBenvenuto nel programma di gestione biblioteca\n* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \n");
printf(" 1. Mostra archivio\n");
printf(" 2. Richiedi libro\n");
printf(" 3. Restituire libro\n");
printf(" 4. Esegui richiesta\n");
printf(" 5. Uscire\n");
printf("Inserisci scelta:");
scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
while(scelta<0 || scelta>5) {
printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
printf("Scelta: ");
scanf("%d", &scelta);
return scelta;
}
return scelta;
}
struct libri *nuovoNodo(char *titolo ,char *autore, int cod_id)
{
struct libri *nodo;
nodo = (struct libri *) malloc(sizeof(struct libri));
if (nodo == NULL) return NULL;
strcpy(nodo->titolo, titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
nodo->next = NULL;
return nodo;
}
struct libri *inserisciLista(struct libri *nodo, struct libri *lista)
{
if (lista==NULL) return nodo;
lista->next = inserisciLista(nodo, lista->next);
return lista;
}
void gestioneErrore()
{
printf("Errore\n");
exit(0);
}
struct libri *leggiFile(FILE *fp, struct libri *lista)
{
char titolo[MAXTITOLO];
char autore[MAXAUTORE];
int cod_id;
struct libri *nodo;
while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
nodo = nuovoNodo(titolo, autore, cod_id);
if (nodo == NULL)
gestioneErrore();
lista = inserisciLista(nodo, lista);
}
return lista;
}
void scriviFile(FILE *fp, struct libri *lista) {
while (lista!=NULL) {
fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
lista = lista->next;
}
}
void scriviLista(struct libri *lista) {
while (lista!=NULL) {
printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id);
lista = lista->next;
{
printf("\n");
}
}
}
void ricerca (struct libri *l,char titolo[MAXTITOLO]){
int trovato = 0 ;
while (l != NULL && trovato != 1) {
if(strcmp(l->titolo, titolo)==0) {
printf("\nIl libro richiesto e' presente nell'archivio ed la richiesta è stata accettata quindi il libro è stato prestato con successo.\n");
trovato=1;
}
l = l->next;
}
if(trovato != 1)
printf("\nIl libro richiesto non e' presente nell'archivio la richiesta è stata rifiutata. La invitiamo ad richiederlo nei prossimi giorni.\n");
}
list insertTail(list L, char titolo[MAXTITOLO], char autore[MAXAUTORE] ,int cod_id) {
if (L != NULL) {
L->next = insertTail(L->next, titolo, autore, cod_id);
}else{
L = initList(titolo,autore,cod_id);
}
return L;
}
list initList(char titolo[MAXTITOLO] ,char autore[MAXAUTORE] ,int cod_id) {
list L = (list)malloc(sizeof(struct libri));
strcpy(L->titolo, titolo);
strcpy(L->autore, autore);
L->cod_id= cod_id;
L->next = NULL;
return L;
}
void printList(list L) {
if (L != NULL) {
printf("%s %s %d\t\n", L->titolo, L->autore, L->cod_id );
printList(L->next);
}
}
void freeNodo(struct libri *nodo)
{
free((void *) nodo);
}
void freeLista(struct libri *lista)
{
if (lista != NULL) {
freeLista(lista->next);
freeNodo(lista);
}
}
list cancellalibri(list lis, char titolo[MAXTITOLO])
{
if(!lis) return NULL;
if(strcmp(lis->titolo, titolo)==0)
{
list tmp = lis->next;
freeNodo(lis);
return tmp;
}
lis->next = cancellalibri(lis->next, titolo);
return lis;
}
[SPOILER]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "funzioni.h"
int main() {
int scelta;
FILE *fp;
FILE *fd;
struct libri *lista=NULL; //per libri
char titolo[50];
char autore[20];
int id = 0;
int n;
char nome[255];
char cognome[255];
char matricola[9];
int i;
int m =0; //per inserimento libri
fp = fopen("Libri.txt","r");
if (fp == NULL) gestioneErrore();
lista = leggiFile(fp, lista);
fclose(fp);
while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*Stampa archivio*/
printList(lista);
break;
case 2: /* Richiesta libro*/
printf("\nQuanti libri desideri richiedere ?");
scanf("%d",&m);
fd=fopen("Richieste.txt","a");
if(fd==NULL)
printf("Errore in scrittura\n");
else /* file aperto con successo */
{
for(i=0;i<m;i++)
{
printf("\nInserisci Cognome dello studente: ");
scanf("%s",cognome);
fprintf(fd,"cognome: %s\n",cognome);
printf("\nInserisci il Nome dello studente: ");
scanf("%254s",nome);
fprintf(fd,"Nome: %s\n",nome);
printf("\nInserisci Matricola dello studente(9 caratteri): ");
scanf("%s",matricola);
fprintf(fd,"Matricola: %s\n",matricola);
printf("\nInserisci titolo del libro che si desidera richiedere: ");
scanf("%s",titolo);
fprintf(fd,"titolo: %s\n",titolo);
printf("\nInserisci autore del libro che si desidera richiedere:");
scanf("%s",autore);
fprintf(fd,"autore: %s\n",autore);
printf("\nInserisci codice del libro che si desidera richiedre(5 caratteri):");
scanf("%d", &id);
fprintf(fd,"codice: %d\n", id);
fprintf(fd, "\n");
printf("\nRichiesta effettuata con successo\n");
}
fclose(fd);
}
lista = insertTail (lista, titolo, autore, id);
break;
case 3: /* Case costruito per restituire un libro tramite codice*/
printf("\nQuanti libri vuoi restituire?:\n");
scanf("%d", &n);
for (int i=0; i<n; i++) {
printf("\nInserire titolo: ");
scanf("%49s", titolo);
printf("\nInserire autore: ");
scanf("%19s", autore);
printf("\nInserire codice(5 caratteri): ");
scanf("%d", &id);
printf("\nLibro restituito con successo\n");
lista = insertTail(lista, titolo, autore, id);
}
break ;
case 4: /*esegui richiesta*/
fd=fopen("Richieste.txt","r");
fscanf(fd, "%s", titolo);
ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);
break ;
case 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
return 0;
break;
default: /*Se l'utente sbaglia ad inserire il numero*/
printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
break;
} /*Fine switch*/
} /*Fine do*/
return 0;
} /*Fine main*/
[/SPOILER]
fattoNon hai messo bene lo spoiler, lo puoi sistemare assicurandoti che l'indentazione sia buona?
puoi aiutarmi a risolvere il problema del collegare il titolo nella richiesta al titolo presente nella lista e poi eliminarlo dalla lista....ed se ci sono ulteriori errori puoi aiutarmi?fatto
fatto
--- i due messaggi sono stati uniti ---
puoi aiutarmi a risolvere il problema del collegare il titolo nella richiesta al titolo presente nella lista e poi eliminarlo dalla lista....ed se ci sono ulteriori errori puoi aiutarmi? domani devo consegnarlo
grazie in anticipo
vuoto...l'utente inserisce titolo ,autore nome matricola e codice e vengono scritti sul fileProcediamo con ordine. Com'è fatto il file delle richieste?
Sì ok, mi ero confuso. Comunque ho capito il problema: usi la stessa lista sia per la biblioteca che per memorizzare le richieste, invece ne dovresti usare due (oppure un array per le richieste). Inoltre, se guardi bene, nel for che hai scritto nel caso 2 dello switch, memorizzi i dati nella lista solo dopo il for, quindi memorizzi solo l'ultimo dato inserito, gli altri vanno persi (salvati nel file ma non nella lista). Posso suggerirti un approccio secondo me migliore? Quando l'utente sceglie 2, memorizza tutti i dati in una lista/array e alla fine la salvi nel file "Richieste.txt". Quando si seleziona 4, apri il file e lo carichi tutto in una lista, dopodiché con un ciclo esaudisci una richiesta alla volta.vuoto...l'utente inserisce titolo ,autore nome matricola e codice e vengono scritti sul file
nono i dati vengono inseriti tutti nel file richiesta...ho fatto delle prove tipo ho inserito due libri di una stessa persona ed i dati non vengono sovrascrittoSì ok, mi ero confuso. Comunque ho capito il problema: usi la stessa lista sia per la biblioteca che per memorizzare le richieste, invece ne dovresti usare due (oppure un array per le richieste). Inoltre, se guardi bene, nel for che hai scritto nel caso 2 dello switch, memorizzi i dati nella lista solo dopo il for, quindi memorizzi solo l'ultimo dato inserito, gli altri vanno persi (salvati nel file ma non nella lista). Posso suggerirti un approccio secondo me migliore? Quando l'utente sceglie 2, memorizza tutti i dati in una lista/array e alla fine la salvi nel file "Richieste.txt". Quando si seleziona 4, apri il file e lo carichi tutto in una lista, dopodiché con un ciclo esaudisci una richiesta alla volta.
Quando l'utente sceglie 2, memorizza tutti i dati in una lista/array e alla fine la salvi nel file "Richieste.txt". Questo non è come ho fatto io?nono i dati vengono inseriti tutti nel file richiesta...ho fatto delle prove tipo ho inserito due libri di una stessa persona ed i dati non vengono sovrascritto
ah no io li memorizzo direttamente nel file...come faccio a memorizzarli in una lista e poi salvarli in un file?nono i dati vengono inseriti tutti nel file richiesta...ho fatto delle prove tipo ho inserito due libri di una stessa persona ed i dati non vengono sovrascritto
--- i due messaggi sono stati uniti ---
Quando l'utente sceglie 2, memorizza tutti i dati in una lista/array e alla fine la salvi nel file "Richieste.txt". Questo non è come ho fatto io?
quindi creo una lista richieste con titolo autore, codice , nome , cognome e matricola faccio l'inserimento e poi questi dati li salvo nel file?nono i dati vengono inseriti tutti nel file richiesta...ho fatto delle prove tipo ho inserito due libri di una stessa persona ed i dati non vengono sovrascritto
--- i due messaggi sono stati uniti ---
Quando l'utente sceglie 2, memorizza tutti i dati in una lista/array e alla fine la salvi nel file "Richieste.txt". Questo non è come ho fatto io?
--- i due messaggi sono stati uniti ---
ah no io li memorizzo direttamente nel file...come faccio a memorizzarli in una lista e poi salvarli in un file?
Lo so, ed è giusto, solo che pensavo volessi memorizzarli anche in una lista, visto che prima del break nel case 2 hai scrittonono i dati vengono inseriti tutti nel file richiesta...ho fatto delle prove
lista = insertTail (lista, titolo, autore, id);
. In effetti non ti serve, lo puoi cancellare, e tra l'altro è sbagliato perché salvavi la richiesta nella stessa lista dei libri. Ok.case 4: /*esegui richiesta*/
fd=fopen("Richieste.txt","r");
fscanf(fd, "%s", titolo);
ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);
break ;
cognome: Rossi
Nome: Mario
Matricola: 123456
titolo: Libro1
autore: A.Verdi
codice: 34565
fd=fopen("Richieste.txt","r");
char buf[30];
// legge le righe in un buffer temporaneo
for (int i = 0; i < 4; ++i)
fgets(buf, 30, fd);
// buf contiene "titolo: TitoloLibro"
// prendiamo solo "TitoloLibro"
sscanf(buf, "%*s %s", titolo);
ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);