Ricerca di una stringa in una struct

di il
7 risposte

Ricerca di una stringa in una struct

Salve, dovrei svolgere un progetto assegnatomi in università, il primo punto mi richiede di controllare se e' disponibile all'acquisto una determina rivista ricercandola per nome.
Bene non capisco cosa c'è che non va,mi dice sempre che la rivista non è disponbile.(perdonatemi se sarà un errore banale o grave ma sono alle prime armi con la programmazione)
Di seguito il programma in c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int mediano;
struct progetto {
    char titolo[30];
    int codice;
    float prezzo;
    int scorta;
    char genere[30];
    char strumenti[50];
};
typedef struct progetto Riviste;
typedef enum {False,True} Logical;
Logical acquisto(char nome[],Riviste rivista[],int n);
void main()
{
char nome[20];
int n=10;
Riviste rivista[10]={
                {"Relix",03,3.50,3,"jazz","tromba"},
                {"RockSound",04,4.00,5,"rock","batteria,chitarra"},
                {"Magnetic",05,4.00,5,"punk","batteria,chitarra,piano"},
                {"WeRaveYou",06,5.00,0,"pop","batteria,chitarra"},
                {"Attack",07,5.00,2,"pop","batteria,chitarra"},
                {"RollingStone",12,6.00,0,"rock","batteria,chitarra,tromba"},
                {"ESSEMagazine",15,10.00,10,"pop","piano"},
                {"HipHopDX",23,3.00,0,"hip-hop","batteria,chitarra"},
                {"FACT",01,12.00,10,"rock","batteria,chitarra,piano,tromba"},
                {"CaliforniaRocker",00,20.00,0,"jazz","batteria,chitarra,piano,tromba"},
                };
puts("inserire il nome della rivista");
gets(nome);
if (acquisto(nome,rivista,strlen(rivista[mediano].titolo))==True)
    printf("la rivista %s e' disponibile all'acquisto il suo prezzo e' %2f",rivista[mediano].titolo, rivista[mediano].prezzo);
else
    printf("la rivista %s non e' disponibile",nome);
}
Logical acquisto(char nome[],Riviste rivista[],int n)
{
if(n == 0)
return False;
mediano=(n-1)/2;
if(strcmp(nome,rivista[mediano].titolo)==0 && rivista[mediano].scorta>0)
return True;
else if(strcmp(nome,rivista[mediano].titolo)<0)
return acquisto(nome,rivista,mediano);
else
return acquisto(nome,rivista+mediano+1,
n-mediano-1);
}

7 Risposte

  • Re: Ricerca di una stringa in una struct

    Se ho capito cosa ti serve, prova così
     puts("inserire il nome della rivista");
    	scanf("%s", nome);
    
    	for(i=0; i<10; i++){
     res=strcmp(nome, rivista[i].titolo); 
    	if (res==0) { identificato=i; i=50;}    }
    	
    	if (i>50 && rivista[identificato].scorta>0)
    	printf("la rivista %s e' disponibile all'acquisto il suo prezzo e' %2f",rivista[identificato].titolo, rivista[identificato].prezzo);
    else
        printf("la rivista %s non e' disponibile",nome);
    p.s Tutto sto casino
      { identificato=i; i=50;}   
    perché mi hanno detto che vado all'inferno se uso break
  • Re: Ricerca di una stringa in una struct

    antragorn ha scritto:


    ...
    p.s Tutto sto casino
      { identificato=i; i=50;}   
    perché mi hanno detto che vado all'inferno se uso break
    Avevo sentito la stessa cosa, però sul goto!

    Scherzi a parte, ho sempre utilizzato break e continue senza farmi alcun problema.
  • Re: Ricerca di una stringa in una struct

    antragorn ha scritto:


    Se ho capito cosa ti serve, prova così
     puts("inserire il nome della rivista");
    	scanf("%s", nome);
    
    	for(i=0; i<10; i++){
    	res=strcmp(nome, rivista[i].titolo); 
    	if (res==0) { identificato=i; i=50;}    }
    	
    	if (i>50 && rivista[identificato].scorta>0)
    	printf("la rivista %s e' disponibile all'acquisto il suo prezzo e' %2f",rivista[identificato].titolo, rivista[identificato].prezzo);
    else
        printf("la rivista %s non e' disponibile",nome);
    p.s Tutto sto casino
      { identificato=i; i=50;}   
    perché mi hanno detto che vado all'inferno se uso break
    Potresti scrivere
    
    	for(i=0, res=1; res!=0 && i<10; i++)
              res=strcmp(nome, rivista[i].titolo); 
              
    	if (res==0 && rivista[identificato].scorta>0)
    
    Ma comunque break e continue si possono usare. E anche il goto, anche se in casi molto rari
  • Re: Ricerca di una stringa in una struct

    Grazie mille a tutti per le risposte, ho utilizzato la soluzione di antragorn e funziona a meraviglia, mi sono incasinato inutilmente la vita con la tecnica ricorsiva
    EDIT: Se potete levarmi un dubbio, perche' la condizione i>50 è vera se poniamo i=50 nella prima if? (scusate il mio livello davvero molto basso )
  • Re: Ricerca di una stringa in una struct

    Gian01 ha scritto:


    perche' la condizione i>50 è vera se poniamo i=50
    Ma chi te l'ha detto?
  • Re: Ricerca di una stringa in una struct

    Perché c'è l'ultimo i++ del for che lo porta a 51.

    Riscrivi il for come è stato mostrato o in un altro modo. Meglio un break che una logica contorta...
  • Re: Ricerca di una stringa in una struct

    Weierstrass ha scritto:


    Perché c'è l'ultimo i++ del for che lo porta a 51.

    Riscrivi il for come è stato mostrato o in un altro modo. Meglio un break che una logica contorta...
    Ho seguito il tuo consiglio ed ho riscritto il for come mi hai mostrato tu, lo riesco a comprendere meglio.
    Ancora grazie per l'aiuto.
Devi accedere o registrarti per scrivere nel forum
7 risposte