Salve a tutti,
sto cercando di creare un programma che:
1)Permetta di inserire nuovi libri
2)Permetta di trovarli(usando la ricerca binaria)
3)Li stampi su schermo e mi permetta di ritirarli e segnali che non sono più disponibili nel caso uno li richieda ancora.
Il difficile(almeno per me ) è che lo voglio fare su un file.
Posto il programma senza file che sono riuscito a fare ma che ha la deplorabile seccatura di dover inserire tutte le volte a mano i libri e non li mette in ordine(anche se per quello so usare il bubblesort).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct libro{ //Già che ci siete mi potete spiegare la differenza tra il
char titolo[40];//mettere "libro" dopo struct o metterlo dopo le graffe?
char autore[40];
char disponibile[15];
};
int rcrcbnr(libro biblioteca[], int i, char ricerca[]){
int inizio, fine, centro;
inizio = 0; fine = i - 1;
printf("\n%s%d\n", ricerca, i);//Stampa a titolo indicativo
while(inizio <= fine){
centro = (inizio + fine) / 2;
printf("\nCentro:%d\nInizio:%d\nFine:%d", centro, inizio, fine); /*Stampa a titolo indicativo*/
if(!(strcmp(biblioteca[centro].titolo,ricerca)))
return centro;
if(strcmp(biblioteca[centro].titolo,ricerca) < 0)
inizio = centro + 1;
if(strcmp(biblioteca[centro].titolo,ricerca) > 0)
fine = centro - 1;
}
return -1;
}
int main(){
int a;
char lineanuova;
printf("libri da inserire: ");
scanf("%d", &a);
scanf("%c", &lineanuova); //A questo non fateci caso perchè non ha una funzione in sè
libro biblio[a];
int i;
char ricerca[40];
for(i = 0; i < a; i++){
printf("\nInserire titolo%d: ", i+1);
gets(biblio[i].titolo);
printf("\nInserire autore%d: ", i+1);
gets(biblio[i].autore);
printf("\nInserire se è disponibile%d: ", i+1);
gets(biblio[i].disponibile);
}
printf("\nInserire il titolo da ricercare: ");
gets(ricerca);
i = rcrcbnr(biblio,a,ricerca);
if(i == (-1))
printf("\nLibro non trovato\n");
else
printf("\nLibro trovato:\n%s\n%s\n%s\n", biblio[i].titolo, biblio[i].autore, biblio[i].disponibile);
if(biblio[i].disponibile == "si"){
printf("Ritirare?: ");
gets(scelta);
if(scelta == "si")
strcpy(biblioteca[i].disponibile,"no");
}
printf("\n");
system("pause");
return 0;
}
Sono comunque riuscito ad iniziare ma non so come scrivere i libri sul file perché restino ordinati così da usare la binaria...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITOLO 40
#define MAXAUTORE 40
#define MAXDISPONIBILE 15 //Permette l'inserimento di "disponibile" o "nondisponibile"
int main(){
FILE *archi;
archi = fopen("BIBLIOTECA.txt","r+");
if(!archi){
printf("Errore apertura database biblioteca");
system("pause");
return 1;
}
typedef struct{
char titolo[MAXTITOLO];
char autore[MAXAUTORE];
char disponibile[MAXDISPONIBILE];
}libro;
char titolo[MAXTITOLO];
char autore[MAXAUTORE];
char scelta[MAXDISPONIBILE];
int i, numlibri;
fscanf(archi,"%d",&numlibri); //Prende il numero dei libri dal file
printf("Benvenuti alla biblioteca\n\n");
do{
printf("Registrare un nuovo libro(si/no)? ");
gets(scelta);
}while(strcmp(scelta,"si") != 0 && strcmp(scelta,"Si") != 0 && strcmp(scelta,"no") != 0 && strcmp(scelta,"No") != 0);
if(strcmp(scelta,"Si") == 0 || strcmp(scelta,"si") == 0){
printf("\nQuanti nuovi libri si devono registrare? ");
scanf("%d", &i);
numlibri += i;
rewind(archi);
fprintf(archi,"%d ",numlibri); //Aggiorno il totale dei libri scrivendo sul file
libro biblio[i]; //i rappresenta il numero di libri immessi mentre numlibri è il totale dei libri
int j;
for(j = 0; j < i; j++){
do{
printf("\nTitolo: ");
gets(biblio[j].titolo);
printf("\nAutore: ");
gets(biblio[j].autore);
printf("\nDisponibilità(disponibile o nondisponibile): ");
gets(biblio[j].disponibile);
}while(strcmp(biblio[j].disponibile,"disponibile") != 0 && strcmp(biblio[j].disponibile,"nondisponibile") != 0);
printf("\n\nVuoi cercare:per titolo, per autore o per entrambi(scrivere titolo o autore o titoloautore o no)?");
do{
printf("Ricerca: ");
gets(scelta);
}while(strcmp(scelta,"titolo") != 0 && strcmp(scelta,"autore") && 0 || strcmp(scelta,"titoloautore") != 0 && strcmp(scelta,"no") != 0 && strcmp(scelta,"No") != 0);
if(!(strcmp(scelta,"titolo")){//Ecc...
Devo usare la funzione fseek? Se si come?
E come faccio ad inserire i titolo dei libri in modo che siano ordinati in ordine alfabetico?
Avevo pensato di strutturare il file di testo in questo modo:
3 //Numero dei libri presenti
Titolo
Autore
Disponibile
Titolo
Autore
Disponibile
Ecc...
Grazie in anticipo per le vostre risposte!