Aiuto su un programma

di il
16 risposte

Aiuto su un programma

implementare la funzione int multipla(char*a,char*b) che restituisce 1 se la stringa b può essere costruita concatenando la stringa a con se stessa un numero qualsiasi di volte, 0 altrimenti.
Esempi: a="gatto" b="gattogattogatto" ==> 1
a="XxXy" b="XxXyt" ==>0

Non si possono usare funzioni definite in string.h, ma solo stdio.h e ctype.h con cicli if, for while
Grazie a tutti, ma non ho neanche la minima idea da dove partire..

16 Risposte

  • Re: Aiuto su un programma

    Potresti cominciare a guardare se la lunghezza di b è un multiplo di quella di a, in caso negativo restituisci 0.

    Se invece è un multiplo, chiamiamo n il mumero di volte che è contenuta (lo hai appena calcolato) e per n volte guardi se la stringa a è ripetuta in b.

    Come spunto potrebbe bastare.

    P.S. se a % b == 0 allora a è multiplo di b.
  • Re: Aiuto su un programma

    Buon lunedi!

    Io ti consiglio di scorrere in parallelo i 2 puntatori fino a fine stringa del secondo o per caratteri differenti. Nell'iterazione controlla se la prima stringa è arrivata a termine e rimettila all'inizio.

    @barba
    Dato che non puoi usare string.h per ricavare le lunghezze devi comunque scorrere le 2 stringhe
  • Re: Aiuto su un programma

    ixamit ha scritto:


    buon lunedi!

    Io ti consiglio di scorrere in parallelo i 2 puntatori fino a fine stringa del secondo o per caratteri differenti. Nell'iterazione controlla se la prima stringa è arrivata a termine e rimettila all'inizio.

    @barba
    Dato che non puoi usare string.h per ricavare le lunghezze devi comunque scorrere le 2 stringhe
    Quoto, come dici tu è meglio
    Anche se si potesse usare string.h che contiene strlen (lo dico per zanna_5) sarebbe preferibile il sistema dei due puntatori. Fai una sola passata sulla stringa b.
  • Re: Aiuto su un programma

    Ho risolto ragazzi..
    #include<stdio.h>
    #include<ctype.h>
    #define MAX 600
    
    main()
    {
        char a[MAX], b[MAX];
        printf("inserisci a:\n");
        scanf("%s",a);
        printf("inserisci b:\n");
        scanf("%s",b);
        printf("la funzione ritorna %d\n", multipla(a,b));
    
        return 0;
    }
    
    int len(char *a)
    {
        int i=0;
    
        while( a[i]!='\0' )
                i++;
    
        return i;
    }
    
    int multipla(char *a, char* b)
    {
        int i,j,p,l;
    
        if (len(b)%len(a) != 0)
            return 0;
    
        for( i=0;i<len(b);i++ )
            {
                if (a[i%len(a)]!=b[i])  //genialata
                    return 0;
    
            }
        return 1;
    }
    
  • Re: Aiuto su un programma

    Fantastico!!!

    Puoi migliorare l' efficienza assegnando il valore di len(a) ad una variabile locale in modo da non dover continuamente ricalcolare la lunghezza all' interno del ciclo.

    Se poi vuoi strafare, potresti seguire il suggerimento di ixamit. In effetti il prof. ti ha chiesto di non usare string.h, presumo per risolvere il problema senza usare la strlen(), tu ne ha fatto un clone per cui l' hai fregato. Però se vedi anche l' altro sistema impari qualcosa di utile.
  • Re: Aiuto su un programma

    Un'altra soluzione potrebbe essere:
    
    int multipla (char *a, char *b){
        char *p , *q;
        if(*a ==0){
            if(*b)return 0;
            else return 1;
        }
        p=a;
        q=b;
        while (*q){
            if (*p++ != *q++)break;
            else if (*p == 0)p=a;
        }
        if (p==a) return 1;
        else return 0;
    }
    
  • Re: Aiuto su un programma

    Per gli amanti della cripto-programmazione
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p == *b)
          p = *++p ? p: a, b++;              
    
       return !*b && p==a ? 1: 0;
    }
    
    Funziona (forse) ma ovviamente è uno scherzo, non programmate mai così
  • Re: Aiuto su un programma

    Scusa l'gnoranza. Qual'è il compito di a nella operazione ternaria nel tuo esempio?
    io lo traducerei così il tuo codice e la a non ha ruolo (almeno io l'ho capito così)
    
    while (*b && *p == *b)
    {
          p++;
          if(*p) 
                p = p;
          else
          {
             p = a;
             b++;
           }
    }
    
    Edit: Come non detto a ha ruolo e il controllo dell'if che non mi convince
    Edit2: Tutto chiaro. Si vede che non mi piace il codice cripto
  • Re: Aiuto su un programma

    Per gli amanti della cripto-programmazione
    --- cut ---
    Funziona (forse) ma ovviamente è uno scherzo, non programmate mai così
    e perché non usarla?!?.... eventualmente poteva essere meno cripto con la stessa logica che hai usato,ma in forma più leggibile... qualcosa tipo:
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p++ == *b++)
    	 if (!*p) p=a;
    
       return (p==a) ?1:0;
    }
    
    * Non testata
  • Re: Aiuto su un programma

    Scusate il messaggio esageratamente lungo ma la cosa è diventata divertente.

    ixamit ha scritto:


    e perché non usarla?!?....
    Hai ragione se la funzione supera i test non c' è motivo di non usarla! Questo esercizio è diventato un bellissimo esempio sull' importanza di avere una corretta suite di test, tutte (ripeto tutte, pure la mia ) soluzioni proposte sono sbagliate!

    Ho scritto i sequenti test:

    1 ) a = ""; b = "a"; // 0
    2 ) a = "a"; b = ""; // 0
    3 ) a = "a"; b = "ab"; // 0
    4 ) a = "ab"; b = "a"; // 0
    5 ) a = "ab"; b = "abc" // 0
    6 ) a = ""; b = ""; // 1
    7 ) a = "a"; b = "a"; // 1
    8 ) a = "ab"; b = "ab"; // 1
    9 ) a = "ab"; b = "abab"; // 1

    la prima funzione
    
    int len(char *a)
    {
        int i=0;
    
        while( a[i]!='\0' )
                i++;
    
        return i;
    }
    
    int multipla(char *a, char* b)
    {
        int i,j,p,l;
    
        if (len(b)%len(a) != 0)
            return 0;
    
        for( i=0;i<len(b);i++ )
            {
                if (a[i%len(a)]!=b[i])  //genialata
                    return 0;
    
            }
        return 1;
    }
    si impianta per una 'division by zero sul primo test' (len(b)%len(a), non si può fare modulo 0).

    la seconda:
    
    int multipla (char *a, char *b){
        char *p , *q;
        if(*a ==0){
            if(*b)return 0;
            else return 1;
        }
        p=a;
        q=b;
        while (*q){
            if (*p++ != *q++)break;
            else if (*p == 0)p=a;
        }
        if (p==a) return 1;
        else return 0;
    }
    

    Sbaglia il secondo test e restituisce 1.

    la terza:
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p == *b)
          p = *++p ? p: a, b++;              
    
       return !*b && p==a ? 1: 0;
    }
    
    Pure lei sbaglia il secondo test e restituisce 1.

    la quarta
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p == *b)
       {
    	  p++;
    	  if(*p) 
            	p = p;
    	  else
    	  {
    		 p = a;
    		 b++;
    	   }
       }
    
       return !*b && p==a ? 1: 0;
    }
    
    Questa in effetti non era stata scritta cosi (c' era solo il while) magari era intesa diversamente, comunque sbaglia i tes 2, 8, 9.

    la quinta
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p++ == *b++)
        if (!*p) p=a;
    
       return (p==a) ?1:0;
    }
    
    Sbaglia il secondo test.

    A questo punto è con profonda umiltà che propongo una (forse) giusta versione (è ancora una cripto-funzione )
    
    int multipla(char *a, char *b)
    {
       char* p = a;
       while (*b && *p == *b)
           if (++b, (*++p == 0) && *b) p = a;
    
       return (!*p && !*b) ? 1 : 0;
    }
    
    In attesa di un test che la invalidi.
  • Re: Aiuto su un programma


    finalmente un thread interessante!
    Grazie barba59!
  • Re: Aiuto su un programma

    Bhe... se la seconda è errata facciamo un patch sulla versione precedente
    
    int multipla (char *a, char *b)
    {
       char* p=(*b || !*a)?a:0;
       
       while (*b && *p++ == *b++)
    	 if (!*p) p=a;
    	 
       return (p==a) ?1:0;
    }
    
  • Re: Aiuto su un programma

    barba59 ha scritto:


    ...In attesa di un test che la invalidi.
    E' sufficiente?
    
    char* a = NULL;
    char* b = NULL;
    multipla(a,b)
    
  • Re: Aiuto su un programma

    Che sia la volta buona?
    
    int multipla (char *a, char *b)
    {
       char* p = a;
       if (!a || !b || (!*b && *a)) return 0;
       
       while (*b && *p++ == *b++)
    	 if (!*p) p=a;
    	 
       return (p==a) ?1:0;
    }
    
Devi accedere o registrarti per scrivere nel forum
16 risposte