Array di stringhe palindrome

di il
12 risposte

Array di stringhe palindrome

Salve a tutti,
Ho un problema da risolvere e questo è il testo: si supponga di avere un array e che al suo interno ci siano stringhe di caratteri alfabetici. Si scriva un programma che dia il numero delle stringhe palindrome all’interno dell’array. E infine si scriva in un file l’array contenente le stringhe palindrome con il nome del file scelto dall’utente.

Questo è quello che ho scritto fin adesso, ma non riesco a continuare. Se faccio lo stesso ragionamento con una sola stringa mi viene facile, ma il problema sorge quando devo avere a che fare con un array di stringhe...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char a[][8] = {"radar", "casa"};
    int i,j, len[100], flag = 0;

    for (i=0, j=0; i<2 && j<100;i++, j++) {
        len[j]=strlen(a[i]);
        if(a[i]==a[len[j]-i-1])
            flag++;
        printf("len is %d\n", len[j]); // test
    }
    for (i=0, j = 0;i<2 && j < len[100];i++, j++){ // punto in cui mi blocco a causa del flag
    if(flag==len[j])
    {
        printf("\nLa stringa %s é palindroma, a[i]);}
    else
           printf("\nLa stringa %s non è palindroma, a[i]);}
}

12 Risposte

  • Re: Array di stringhe palindrome

    Devi dividere il problema e, sostanzialmente, scrivere delle funzioni di base.
    Parti con lo scrivere una funzione che riceve in input una stringa e restituisce un int che indica se la stringa è palindroma oppure no.
  • Re: Array di stringhe palindrome

    Potresti fare qualcosa del genere
    
    #include <stdbool.h>
    #include <stdlib.h>
    #include <stdio.h>
    bool ispalindrome(char *s)
    {
        char *start = s;
        char *end = s + qualcosa che devi capire tu;
        while(qualcosa)
               qualcos'altro
               ++start;
               --end;
         return qualcosa;
    }
    int main(int argc,char **argv)
    {
        if(argc > 1)
        {
            for(size_t i = 1; i < argc ; ++i)
             {
                   printf("%s %s palidroma.\n",argv[i], ispalindrome(argv[i]) ? "è" : "non è");
             }
        }
        else
        {
            puts("Too few arguments.");
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }
    
    Ovviamente il codice non è completo,devi correggerlo tu se no non impari nulla.
  • Re: Array di stringhe palindrome

    Eccomi di nuovo qui, ho fatto come mi avete suggerito e fin adesso funziona... Il problema è nella copia delle parole palindrome all'interno del nuovo array, dove purtroppo copia anche le parole non palindrome... Qualche suggerimento?
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int Palindroma(char* s);
    
    int main(int argc, const char * argv[]) {
        
        char *s[] = {"radar", "casa", "osso", "canna"};
        char *newArray[100];
        
        for (int i = 0; i < 4; ++i) {
            //pos = s[i];
            while (s[i] != '\0') {
                if (Palindroma(s[i]) == 0) {
                    printf("%s non palindroma.\n", s[i]);
                    /*for (int j = 0; j < 5; j++)
                    {
                    newArray[j] = s[j]; // nuovo array in cui copiare parole palindrome
                    }*/
                    break;
                }
                else{
                    printf("%s palindroma.\n", s[i]);
                    break;
                }
            }
        
        }
        /*for (int j = 0; j < 3; j++)
            printf("%s\n", newArray[j]);*/ // stampa anche "casa"
    }
    
    int Palindroma(char* s)
    {
        /* restituisce 1 se la stringa s palindroma, 0 altrimenti*/
        int i = 0;
        int j = strlen(s) - 1;
        while (s[i] == ' ')
            i++;
        while (s[j] == ' ' && j > 0)
            j--;
        while (i < j)
        {
            if (s[i] != s[j]) return 0;
            while (s[++i] == ' ')
                ;
            while (s[--j] == ' ')
                ;
        }
        return 1;
    }
  • Re: Array di stringhe palindrome

    Non capisco come tu voglia operare ma

    char *newArray[100];

    è un vettore di 100 puntatori a stringhe che bisogna ancora allocare.
  • Re: Array di stringhe palindrome

    Oltre a quanto già evidenziato da Oregon, la logica del codice è gravemente errata e inutilmente complicata. Peraltro è anche incoerente con la convenzione di ritorno della funzione Palindroma() che tu stesso hai scelto.
    Un secondo array non è affatto necessario, ma anche nel caso in cui lo fosse, la copia delle stringhe dovrebbe avvenire con funzioni come strcpy() o strncpy().
    Tra l'altro, lavorando in C è opportuno evitare la sintassi C++ per la dichiarazione in-place della variabile di induzione nella for().
    
        unsigned int Tot_palindrome = 0;
        unsigned int i;
        ...
        for (i = 0; i < 4; ++i)
        {
            if (1 == Palindroma(s[i]))
            {
                /* Qui si incrementa il contatore e si scrive direttamente la stringa nel file */
                Tot_palindrome++;
                fprintf(...);
            }
        }
    
    Il testo del problema, come riportato, è comunque ambiguo e non specifica esplicitamente di scrivere nel file le sole stringhe palindrome, anche se questa è la tua interpretazione.
  • Re: Array di stringhe palindrome

    Caro Alex ora scrivi una funzione che riceve in input un nome di file e un array di stringhe e scrive sul file specificato le stringhe. Provi wuesta funzione con un nome file fisso e l'array di partenza.
  • Re: Array di stringhe palindrome

    Ok, grazie delle dritte. Mi sono reso conto degli errori assurdi commessi e ho ributtato giù questa parte di codice. Però, sarà che è pure tardi, non riesco a stampare sul txt più di una parola palindroma nonostante l'fprintf sia già in un ciclo for. Dove sbaglio?
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int palindroma(const char *s);
    
    int main(int argc, const char * argv[]) {
        FILE *p;
        int i, tot_pal = 0;
        char *s[] = {"casa", "radar", "osso", "canna"};
        
        for (i = 0; i < 4; i++) {
            if (palindroma(s[i]) == 1) {
                p = fopen("stringhe.txt", "w");
                fprintf(p, "%s\n", s[i]);
                printf("%s palindroma.\n", s[i]);
                tot_pal++;
            }
            else{
                printf("%s non palindroma.\n", s[i]);
            }
            fclose(p);
        }
        printf("%d", tot_pal);
        return 0;
    }
    int palindroma(const char *s)
    {
        int i,l;
        l = strlen(s);
        for(i=0; i<l/2; i++)
        {
            if ( s[i] != s[l-i-1] ) 
                    return 0;
        }
        return 1;
    }
  • Re: Array di stringhe palindrome

    Gli errori che noto sono:
    - non controlli se il file è stato aperto con successo
    - usi return 0,al posto di EXIT_SUCCESS. Non è un vero e proprio errore,ma usa EXIT_SUCCESS. Per ulteriori informazioni leggi il thread Return 0.
    - la funzione palindroma è errata. La frase "i topi non avevano nipoti" risulta non essere palindroma. Inoltre puoi semplificarla di molto.
    
    bool ispalindrome(char *s)
    {
    	size_t i = 0;
    	size_t j = strlen(s) - 1;
    	bool ispal = true;
    	while(i < j && ispal)
    	{
    		while(isblank(s[i]) || !(s[i] ^ '\n')) ++i;
    		while(isblank(s[j]) || !(s[j] ^ '\n')) --j;
    		ispal = !(s[j] ^ s[i]);
    		++i;
    		--j;
    	}
    	return ispal;
    }
    
  • Re: Array di stringhe palindrome

    loopunrolling ha scritto:


    Gli errori che noto sono:
    - non controlli se il file è stato aperto con successo
    - usi return 0,al posto di EXIT_SUCCESS. Non è un vero e proprio errore,ma usa EXIT_SUCCESS. Per ulteriori informazioni leggi il thread Return 0.
    - la funzione palindroma è errata. La frase "i topi non avevano nipoti" risulta non essere palindroma. Inoltre puoi semplificarla di molto.
    
    bool ispalindrome(char *s)
    {
    	size_t i = 0;
    	size_t j = strlen(s) - 1;
    	bool ispal = true;
    	while(i < j && ispal)
    	{
    		while(isblank(s[i]) || !(s[i] ^ '\n')) ++i;
    		while(isblank(s[j]) || !(s[j] ^ '\n')) --j;
    		ispal = !(s[j] ^ s[i]);
    		++i;
    		--j;
    	}
    	return ispal;
    }
    
    Ho corretto i primi due punti, ma per quanto riguarda la terza per adesso la lascio così perchè si tratta di aggiungere soltanto parole e non frasi. Eventualmente lo modificherò non appena sarò riuscito a farlo funzionare...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int palindroma(const char *s);
    
    int main(int argc, const char * argv[]) {
        FILE *p;
        int i, tot_pal = 0;
        char *s[] = {"casa", "radar", "osso", "canna"};
        
        for (i = 0; i < 4; i++) {
            if (palindroma(s[i]) == 1) {
                if ((p = fopen("stringhe.txt", "w")) != NULL){
                    fprintf(p, "%s\n", s[i]);
                }
                
                else{
                    printf("Non posso aprire il file.\n");
                    return 1;
                }
                printf("%s palindroma.\n", s[i]);
                tot_pal++;
            }
            else{
                printf("%s non palindroma.\n", s[i]);
            }
            fclose(p);
        }
        printf("%d", tot_pal);
        return 0;
    }
    int palindroma(const char *s)
    {
        int i,l;
        l = strlen(s);
        for(i=0; i<l/2; i++)
        {
            if ( s[i] != s[l-i-1] ) return EXIT_SUCCESS;
        }
        return 1;
    }
  • Re: Array di stringhe palindrome

    -EXIT_SUCCESS va messo alla fine del main.
    - è inutile che apri il file che è già aperto
    - nel primo post dicevi di dover controllare stringhe,non singole parole. In ogni caso la funzione può essere migliorata. Prendi il codice che ho postato e togli i due while in mezzo e hai una soluzione scolastica ma pulita.
  • Re: Array di stringhe palindrome

    loopunrolling ha scritto:


    -EXIT_SUCCESS va messo alla fine del main.
    - è inutile che apri il file che è già aperto
    - nel primo post dicevi di dover controllare stringhe,non singole parole. In ogni caso la funzione può essere migliorata. Prendi il codice che ho postato e togli i due while in mezzo e hai una soluzione scolastica ma pulita.
    Perfetto, adesso funziona. Grazie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    
    bool ispalindrome(char *s);
    
    int main(int argc, const char * argv[]) {
        FILE *p;
        int i, tot_pal = 0;
        char *s[] = {"casa", "radar", "osso", "canna"};
        if ((p = fopen("stringhe.txt", "w")) != NULL)
        {
            for (i = 0; i < 4; i++)
                
            {
                if (ispalindrome(s[i]) == 1)
                {
                    fprintf(p, "%s\n", s[i]);
                    printf("%s palindroma.\n", s[i]);
                    tot_pal++;
                }
                else{
                    printf("%s non palindroma.\n", s[i]);
                }
            }
            fclose(p);
        }
        else{
            printf("Non posso aprire il file.\n");
            return 1;
        }
        printf("%d", tot_pal);
        return EXIT_SUCCESS;
    }
    bool ispalindrome(char *s)
    {
        size_t i = 0;
        size_t j = strlen(s) - 1;
        bool ispal = true;
        while(i < j && ispal)
        {
            ispal = !(s[j] ^ s[i]);
            ++i;
            --j;
        }
        return ispal;
    }
    
  • Re: Array di stringhe palindrome

    Bene. Come già ti ho detto per ben due volte devi usare EXIT_SUCCESS ed EXIT_FAILURE definite in <stdlib.h>. Naturalmente usi EXIT_SUCCESS quando il programma termina con sucesso e EXIT_FAILURE quando ci sono problemi. Il motivo è semplice: alcuni sistemi operativi come VMS interpretano il valore 0 (in return 0) come una terminazione con warning,mentre vedono 1 come fine del programma con successo. Siccome non tutti i sistemi operativi hanno gli stessi codici di uscita,lo standard C ha definito le due (ma anche più) costanti per fare in modo che il codice di uscita dal programma sia indipendente dal sistema operativo. Usando quelle due costanti non ti devi preoccupare di quale codice corrisponde a cosa e rendi il tuo software portabile.
Devi accedere o registrarti per scrivere nel forum
12 risposte