Visualizzazione dei risultati da 1 a 5 su 5

Discussione: struct e file

  1. #1

    struct e file

    salve,
    avrei questo programma da creare:


    Creare i file libri.h e libri.c che consentano di utilizzare la seguente struttura:

    codice:
    struct libro { 
    unsigned int codice; 
    char titolo[255];
     unsigned int pagine; 
    };

    e la funzione:
    codice:
    struct libro *filtra_libri (struct libro *plibri, unsigned int *pn, const char *cerca);
    La struttura contiene il campo codice che contiene un identificatore di un libro, il campo titolo che ne contiene il titolo (che può includere degli spazi) e il campo pagine che contiene il numero di pagine. La funzione accetta come parametro plibri, un puntatore ad una zona di memoria contenente un numero di libri indicato dal valore puntato da pn. Accetta inoltre una stringa zero terminata cerca. La funzione deve ritornare un puntatore ad una nuova zona di memoria (allocata dinamicamente nell’heap) contenente tutti i libri nel cui titolo è presente la stringa contenuta in cerca e impostare il valore puntato da pn al numero di libri ritornati. Se nessun libro contiene la stringa, la funzione deve ritornare NULL e impostare il valore puntato da pn a 0.



    Io l'ho fatto cosi:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    
    struct libro{
    unsigned codice;
    char titolo[255];
    unsigned pagine;
    };
    struct libro *filtra_libri(struct libro *plibri,unsigned int *pn,const char *cerca){
    struct libro*lib=NULL;
    int i=0,j=0,k=0,l=0,*m=0,c=*m;
    
    
    
    
    lib=(struct libro*)realloc(lib,(i+1)*sizeof(struct libro));
    while(plibri[c].codice>0){
    while(plibri->titolo[j]!='\0'){
    	if(plibri->titolo[j]==cerca[l]){
    		k+=1;
    		l++;
    	}j++;
    	}
    if(k>0)
    {
    	lib->codice=plibri->codice;
    	strcpy(lib->titolo,plibri->titolo);
    	lib->pagine=plibri->pagine;
    	i++;
    }
    else {
    	*pn=0;
    	return NULL;
    }*pn=i;
    *m++;
    return lib;
    }
    
    
    }
    
    
    main(){
    int i,j,k,p=0;
    unsigned pn;
    struct libro libb[40],*lib=NULL;
    char cerca[]={"del"};
    printf("Quanti libri vuoi inserire: ");
    scanf("%d",&i);
    for(j=0;j<i;j++){
    	printf("Inserisci il %d codice: ",j+1);
    	scanf("%d",&libb[j].codice);
    	fflush(stdin);
    	printf("Inserisci il Titolo: ");
    	gets(libb[j].titolo);
    	fflush(stdin);
    	printf("Inserisci le Pagine: ");
    	scanf("%d",&libb[j].pagine);
    	fflush(stdin);
    }
    
    
    lib=(struct libro*)realloc(lib,(p+1)*sizeof(struct libro));
    do{
    lib[p]=*filtra_libri(libb,&pn,cerca);
    }while(filtra_libri(libb,&pn,cerca)==NULL);
    for(k=0;k<pn;k++){
    	printf("%d; %s; %d\n",lib[k].codice,lib[k].titolo,lib[k].pagine);
    }
    }
    il problema è che mi stampa solo un libro con quel titolo e non gli altri che sono presenti nella struct,cs sbaglio?
    Ultima modifica di MItaly; 30-08-2014 a 16:52 Motivo: Tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il codice è piuttosto confuso. Perché utilizzi un array statico di strutture

    struct libro libb[40]

    e poi nel resto del programma lavori con puntatori e allocazione dinamica delle strutture??
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    lo uso per memorizzare tt i libri che l'utente vuole memorizzare,non va bn?
    come lo faresti tu?

  4. #4
    struct libro *filtra_libri (struct libro *plibri, unsigned int *pn, const char *cerca){
    int i=0,l,q=0,j=0,k=0,m=*pn;
    struct libro *buf=NULL;


    for(i=0;i<m;i++){

    for(l=0;plibri->titolo[l]>0;l++){
    if(plibri->titolo[l]==cerca[j]){
    q++;
    j++;
    }}


    if(q>0){
    buf=(struct libro*)realloc(buf,(k+1)*sizeof(struct libro));
    buf[k].codice=plibri[i].codice;
    strcpy(buf[k].titolo,plibri[i].titolo);
    buf[k].pagine=plibri[i].pagine;
    }


    }
    *pn=k;
    return buf;
    }












    main(){
    int j=0,i;unsigned pn=0;
    char risp,cerca[]={"del"};
    struct libro lib[40],*ris;






    do{
    printf("Inserisci il %d codice: ",j+1);
    scanf("%d",&lib[j].codice);
    fflush(stdin);
    printf("Inserisci il Titolo: ");
    gets(lib[j].titolo);
    fflush(stdin);
    printf("Inserisci le Pagine: ");
    scanf("%d",&lib[j].pagine);
    fflush(stdin);
    j++;
    pn++;
    printf("vuoi inserire un'altro? ");
    scanf("%c",&risp);


    }while(risp=='s' || risp=='S');




    ris=filtra_libri(lib,&pn,cerca);
    for(i=0;i<pn;i++){
    printf("%d,%s,%d",ris[i].codice,ris[i].titolo,ris[i].pagine);
    }








    }

    cosi va bn?
    ma nn mi stampa alla fine.....

  5. #5
    struct libro *filtra_libri (struct libro *plibri, unsigned int *pn, const char *cerca){
    int i,l,q=0,j=0,m=*pn;
    struct libro *buf=NULL;


    for(i=0;i<m;i++){

    for(l=0;plibri->titolo[l]>0;l++){
    if(plibri->titolo[l]==cerca[j]){
    q++;
    j++;
    }}


    if(q>0){
    buf=(struct libro*)realloc(buf,(i+1)*sizeof(struct libro));
    buf[i].codice=plibri[i].codice;
    strcpy(buf[i].titolo,plibri[i].titolo);
    buf[i].pagine=plibri[i].pagine;
    }


    }
    *pn=i;
    return buf;


    }












    main(){
    int j=0,i;unsigned pn=0;
    char risp,cerca[]={"del"};
    struct libro lib[40],*ris;






    do{
    printf("Inserisci il %d codice: ",j+1);
    scanf("%d",&lib[j].codice);
    fflush(stdin);
    printf("Inserisci il Titolo: ");
    gets(lib[j].titolo);
    fflush(stdin);
    printf("Inserisci le Pagine: ");
    scanf("%d",&lib[j].pagine);
    fflush(stdin);
    j++;
    pn++;
    printf("vuoi inserire un'altro? ");
    scanf("%c",&risp);


    }while(risp=='s' || risp=='S');




    ris=filtra_libri(lib,&pn,cerca);
    for(i=0;i<pn;i++){
    printf("\n%d,%s,%d",ris[i].codice,ris[i].titolo,ris[i].pagine);
    }


    printf("\n");
    system("pause");




    }


    Funziona....

    grazie lo stesso

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.