printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);
v[n] va messo dentro un for
Si si è vero, hai ragione. Così non stava stampando nulla, ho anche aggiunto un break per interrompere il ciclo che sennò andava all'infinito.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);
v[n] va messo dentro un for
int main(void)
{
lib v[L] = { 0 };
int t = 0;
/* switch, etc.. */
}
#define L (100)
int m = 0;
void aggiunta_librif(lib v[]);
void ricerca_codicef(lib v[]);
void ricerca_prezzof(lib v[]);
void aggiunta_librif(lib v[])
{
char buffer[1] = { 'n' };
int i = 0;
/* ... */
}
void ricerca_codicef(lib v[])
{
int i = 0;
int cerca = 0;
/* ... */
}
void ricerca_prezzof(lib v[])
{
int max = v[0].prezzo;
int i = 0;
int max_index = 0;
/* ... */
}
if (m == 0) {
puts("\nNon ci sono libri nell'archivio\n");
return;
}
for (i = m; i < L; ++i) {
/* Insert... */
}
fgets(v[i].titolo, 50, stdin);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef struct{
char titolo[40];
char autore[20];
int prezzo;
int codice;
int stato; //disponibilità, quindi se il libro è in prestito o meno
}lib;
int L=100;
int m=0;
int confronta(const void* a, const void* b){
lib* sa = (lib*)a;
lib* sb = (lib*)b;
return (strcmp(sa->titolo,sb->titolo));
}
int main(){
lib v[100];
int t;
char buffer[40];
int i=0;
int j=0;
int codice;
while(1){
puts("Specificare un'operazione");
puts("1- Aggiungi un nuovo libro");
puts("2- Ricerca per codice");
puts("3- Stampa l'archivio");
puts("4- Cerca libro più costoso")
puts("0- Esci dal programma");
scanf("%d\n",&t);
switch(t){
case 0:
return 0;
case 1:
for(;i<L;i++)
{
printf("Inserisci il titolo: ");
fflush(stdin);
fgets(v[i].titolo, sizeof(v[i].titolo), stdin);
printf("Inserisci l'autore: ");
fflush(stdin);
fgets(v[i].autore, sizeof(v[i].autore), stdin);
printf("Inserisci il prezzo: ");
fflush(stdin);
fgets(v[i].prezzo, sizeof(v[i].prezzo), stdin);
fflush(stdin);
printf("Inserisci il stato (1 o 0): "); /*per lo stato dovrei ancora inserire finire, con un if magari, ma ci penso dopo*/
fflush(stdin);
fgets(v[i].stato, sizeof(v[i].stato), stdin);
fflush(stdin);
/*qui è dove ho il mio problema*/
v[i].codice = ++;
fflush(stdin);
printf("Il codice del libro e': %d", v[i].codice);
puts("Aggiungere un altro libro?");
scanf("%1s",buffer);
fflush(stdin);
if((buffer[0]=='n')||(buffer[0]=='N'))
{
i++;
break;
}
}
continue;
case 2:
puts("Inserisci il codice da cercare");
scanf("%d",codice);
for (j=0;j<L;j++){
if(strstr((v+j)->codice,codice)){
puts("Corrispondenza trovata");
printf("%s\n %s\n",v[j].titolo, v[j].codice);
}
}
continue;
case 3:
qsort(v,i,sizeof(lib),confronta);
for(j=0;j<i;j++){
printf("%s %s\n",v[j].titolo, v[j].codice);
}
continue;
default:
puts("Errore di input. Riprova");
continue;
}
}
return 0;
}
++m;
v[i].codice=m;
printf("Il codice del libro e': %d", v[i].codice);
Non ho provato il tuo codice, ma da una lettura superficiale potresti usare la variabile i invece di dichiarare m ed incrementarla.Ok, sono riuscito a sbloccarmi. Ho corretto così, nella maniera più stupida possibile. Non capisco perché prima non ci riuscivo...
C:++m; v[i].codice=m; printf("Il codice del libro e': %d", v[i].codice);
Però finché non finisco preferirei tenere la discussione aperta (se i moderatori consentono), se avete consigli da darmi li accetto volentieri.
Non ho provato il tuo codice, ma da una lettura superficiale potresti usare la variabile i invece di dichiarare m ed incrementarla.
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
{
if(cerca!=v[i].codice)
{
break;
}
if(cerca==v[i].codice)
{
printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
break;
}
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef struct{
char titolo[40];
char autore[20];
int prezzo;
int stato; //disponibilità, quindi se il libro è in prestito o meno
int codice;
}lib;
int L=100;
int m=0;
int confronta(const void* a, const void* b){
lib* sa = (lib*)a;
lib* sb = (lib*)b;
return (strcmp(sa->titolo,sb->titolo));
}
int main()
{
lib v[100];
int t;
char buffer[40];
int i;
int j=0;
int codice;
int cerca;
int n, pos, trovato;
while(1){
puts("\n----- BIBLIOTECA -----\n");
puts("Specificare un'operazione\n");
puts("1 - Aggiungi un nuovo libro");
puts("2 - Ricerca per codice");
puts("3 - Stampa l'archivio");
puts("4 - Cerca libro piu' costoso");
puts("0 - Esci dal programma");
scanf("%d",&t);
fflush(stdin);
switch(t)
{
case 0:
return 0;
case 1:
for(i=0;i<L;i++)
{
puts("Inserisci il titolo");
scanf("%40s",v[i].titolo);
fflush(stdin);
puts("Inserisci l'autore");
scanf("%20s",v[i].autore);
fflush(stdin);
puts("Inserisci il prezzo");
scanf("%d",&v[i].prezzo);
fflush(stdin);
puts("Inserisci lo stato");
scanf("%d",&v[i].stato);
fflush(stdin);
++m;
v[i].codice=m;
printf("Il codice del libro e': %d\n",v[i].codice);
puts("Aggiungere un'altro numero?");
scanf("%s",buffer);
fflush(stdin);
if((buffer[0]=='n')||(buffer[0]=='N'))
{
i++;
break;
}
}
continue;
case 2:
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
{
if(cerca!=v[i].codice)
{
break;
}
if(cerca==v[i].codice)
{
printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
break;
}
}
continue;
case 3:
qsort(v,i,sizeof(lib),confronta);
for(j=0;j<i;j++)
{
printf("%s %s\n",v[j].titolo, v[j].codice);
}
continue;
default:
puts("Errore di input. Riprova");
continue;
}
}
return 0;
}
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
{
if(cerca==v[i].codice)
{
//libro trovato
printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
break;
}
}
//nessun libro trovato
Puoi usare un solo if nella ricerca:
C++:printf("\nInserisci il codice del libro da cercare: "); scanf("%d", &cerca); for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio { if(cerca==v[i].codice) { //libro trovato printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato); break; } } //nessun libro trovato
Si si hai ragione! Grazie mille! ;DProbabilmente perchè l'array v in "v.codice" viene scandito utilizzando i al posto di n "v[n].codice".
max=v[0].prezzo;
for(n=0;n<100;++n)
{
if(v[n].prezzo>max)
{
max=v[n].prezzo;
}
}
printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char titolo[40];
char autore[20];
int prezzo;
int stato;/*disponibilità, quindi se è in prestito o meno. Lo stato è solo un abbozzo*/
int codice;
}lib;
int L=100;
int m=0;
lib v[100];
int t;
char buffer[40];
int i;
int j=0;
int codice;
int cerca;
int n, pos, trovato, h;
int max;
int main()
{
while(1){
puts("\n----- BIBLIOTECA -----\n");
puts("Specificare un'operazione\n");
puts("1 - Aggiungi un nuovo libro");
puts("2 - Ricerca per codice");
puts("3 - Cerca libro piu' costoso");
puts("0 - Esci dal programma");
scanf("%d",&t);
fflush(stdin);
switch(t)
{
case 0:
return 0;
case 1:
for(i=0;i<L;i++)
{
puts("Inserisci il titolo");
scanf("%40s",v[i].titolo);
fflush(stdin);
puts("Inserisci l'autore");
scanf("%20s",v[i].autore);
fflush(stdin);
puts("Inserisci il prezzo");
scanf("%d",&v[i].prezzo);
fflush(stdin);
puts("Inserisci lo stato");
scanf("%d",&v[i].stato);
fflush(stdin);
++m;
v[i].codice=m;
printf("Il codice del libro e': %d\n",v[i].codice);
puts("Aggiungere un altro libro?");
scanf("%s",buffer);
fflush(stdin);
if((buffer[0]=='n')||(buffer[0]=='N'))
{
i++;
break;
}
}
continue;
case 2:
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<L;++n) //100 è il limite di libri che possono stare in archivio
{
if(cerca==v[n].codice)
{
//libro trovato
printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);
break;
}
}
continue;
case 3:
max=v[h].prezzo;
for(h=0;h<L;++h)
{
if(v[h].prezzo>max)
{
max=v[h].prezzo;
}
printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
break;
}
continue;
default:
puts("Errore di input. Riprova");
continue;
}
}
return 0;
}
Immagino succeda quando inserisci un nuovo libro dopo aver già fatto la prima serie di inserimenti. Infatti ricominci a ciclare sempre da 0 quando aggiungi un libro:Io non riesco a capire perché passando da un'opzione all'altra del programma si resettano man mano i libri, scomparendo dall'archivio. Cosa può essere?
Credo che entrando e uscendo dai cicli for avvenga qualcosa che faccia perdere le "memorie" degli array. Come posso risolvere
for(i=0;i<L;i++)
{
/* Inserimento dati libro */
}
Si esatto, ora non "perdo" i libri.Immagino succeda quando inserisci un nuovo libro dopo aver già fatto la prima serie di inserimenti. Infatti ricominci a ciclare sempre da 0 quando aggiungi un libro:
Immagino tu voglia quindi togliere l'inizializzazione della variabile i.
case 3:
max=v[0].prezzo;
for(;j<L;j++)
{
if(v[j].prezzo>max)
{
max=v[j].prezzo;
}
}
for(;h<L;++h)
{
if(max==v[h].prezzo)
{
printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
}
}
continue;
case 3:
max=v[j].prezzo;
for(j=0;j<L;j++)
{
if(v[j].prezzo>max)
{
max=v[j].prezzo;
}
}
for(h=0;h<L;++h)
{
if(max==v[h].prezzo)
{
printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
}
}
L=100;
continue;
Immagino che l'intenzione di max=v[j].prezzo fosse quella di max=v[0].prezzo. Infatti dalla seconda volta che entri nel terzo caso dello switch la variabile j avrà il vecchio valore, ovvero 100. Quindi di fatto stai inizializzando max con un valore fuori dall'array che, se ti va bene, è 0, altrimenti potrebbe essere qualunque cosa (o meglio, dipende da cosa c'è dopo nello stack).Ecco come ho risolto.
#include "header.h"
int L=100;
int m;
lib v[100];
int t;
char buffer[1];
int i;
int j;
int codice;
int cerca;
int n;
int h;
int max;
int main()
{
while(t!=4){
puts("\n----- BIBLIOTECA -----\n");
puts("Specificare un'operazione\n");
puts("1 - Aggiungi un nuovo libro");
puts("2 - Ricerca per codice");
puts("3 - Cerca libro piu' costoso");
puts("4 - Esci dal programma\n");
scanf("%d",&t);
fflush(stdin);
switch(t)
{
case 1:
aggiunta_librif(i,L,m,v,buffer);
continue;
case 2:
ricerca_codicef(v,n,L,cerca);
continue;
case 3:
ricerca_prezzof(j,h,max,L,v);
continue;
case 4:
return 0;
}
} fflush(stdin);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char titolo[50];
char autore[25];
int prezzo;
int stato;
int codice;
}lib;
void aggiunta_librif(int i,int L, int m, lib v[], char buffer[]);
void ricerca_codicef(lib v[],int n, int L, int cerca);
void ricerca_prezzof(int j, int h, int max, int L, lib v[]);
#include "header.h"
void aggiunta_librif(int i,int L, int m, lib v[], char buffer[])
{
for(i;i<L;++i)
{
puts("\nInserisci il titolo:\n");
gets(v[i].titolo);
puts("\nInserisci l'autore:\n");
gets(v[i].autore);
puts("\nInserisci il prezzo:\n");
scanf("%d",&v[i].prezzo);
fflush(stdin);
puts("\nDefinire se il libro e' disponibile o in presito (1/0):\n");
scanf("%d",&v[i].stato);
fflush(stdin);
++m;
v[i].codice=m;
printf("\nIl codice del libro e': %d\n",v[i].codice);
puts("\nAggiungere un altro libro? (Y/N)\n");
scanf("%s",buffer);
fflush(stdin);
if((buffer[0]=='n')||(buffer[0]=='N'))
{
break;
}
}
}
void ricerca_codicef(lib v[],int n, int L, int cerca)
{
puts("\nInserisci il codice del libro da cercare:\n");
scanf("%d", &cerca);
fflush(stdin);
for(n=1;n<L;n++)
{
if(cerca==v[n].codice)
{
printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[n].titolo,v[n].autore,v[n].prezzo);
break;
}
}
if(cerca!=v[n].codice)
{
puts("\nIl libro non e' in archivio\n");
}
if(v[n].stato==1)
{
puts("\nIl libro e' disponibile\n");
}
else if(v[n].stato!=0)
{
puts("\nIl libro non e' disponibile\n");
}
}
void ricerca_prezzof(int j, int h, int max, int L, lib v[])
{
max=v[0].prezzo;
for(j=0;j<L;j++)
{
if(v[j].prezzo>max)
{
max=v[j].prezzo;
}
}
for(h=0;h<L;++h)
{
if(max==v[h].prezzo)
{
printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[h].titolo,v[h].autore,v[h].prezzo);
break;
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char titolo[50];
char autore[25];
int prezzo;
int stato;
int codice;
}lib;
int L=100;
int m;
lib v[100];
int t;
char buffer[1];
int i;
int j;
int codice;
int cerca;
int n;
int h;
int max;
void aggiunta_librif(int i,int L, int m, lib v[], char buffer[]);
void ricerca_codicef(lib v[],int n, int L, int cerca);
void ricerca_prezzof(int j, int h, int max, int L, lib v[]);
int main()
{
while(t!=4)
{
puts("\n----- BIBLIOTECA -----\n");
puts("Specificare un'operazione\n");
puts("1 - Aggiungi un nuovo libro");
puts("2 - Ricerca per codice");
puts("3 - Cerca libro piu' costoso");
puts("4 - Esci dal programma\n");
scanf("%d",&t);
fflush(stdin);
switch(t)
{
case 1:
aggiunta_librif(i,L,m,v,buffer);
continue;
case 2:
ricerca_codicef(v,n,L,cerca);
continue;
case 3:
ricerca_prezzof(j,h,max,L,v);
continue;
case 4:
return 0;
}
}
}
void aggiunta_librif(int i,int L, int m, lib v[], char buffer[])
{
for(;i<L;++i)
{
puts("\nInserisci il titolo:\n");
gets(v[i].titolo);
puts("\nInserisci l'autore:\n");
gets(v[i].autore);
puts("\nInserisci il prezzo:\n");
scanf("%d",&v[i].prezzo);
fflush(stdin);
puts("\nDefinire se il libro e' disponibile o in presito (1/0):\n");
scanf("%d",&v[i].stato);
fflush(stdin);
++m;
v[i].codice=m;
printf("\nIl codice del libro e': %d\n",v[i].codice);
puts("\nAggiungere un altro libro? (Y/N)\n");
scanf("%s",buffer);
fflush(stdin);
if((buffer[0]=='n')||(buffer[0]=='N'))
{
break;
}
}
}
void ricerca_codicef(lib v[],int n, int L, int cerca)
{
puts("\nInserisci il codice del libro da cercare:\n");
scanf("%d", &cerca);
fflush(stdin);
for(n=1;n<L;n++)
{
if(cerca==v[n].codice)
{
printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[n].titolo,v[n].autore,v[n].prezzo);
break;
}
}
if(cerca!=v[n].codice)
{
puts("\nIl libro non e' in archivio\n");
}
if(v[n].stato==1)
{
puts("\nIl libro e' disponibile\n");
}
else if(v[n].stato!=0)
{
puts("\nIl libro non e' disponibile\n");
}
}
void ricerca_prezzof(int j, int h, int max, int L, lib v[])
{
max=v[0].prezzo;
for(j=0;j<L;j++)
{
if(v[j].prezzo>max)
{
max=v[j].prezzo;
}
}
for(h=0;h<L;++h)
{
if(max==v[h].prezzo)
{
printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[h].titolo,v[h].autore,v[h].prezzo);
break;
}
}
}