Domanda Risolto Problema con un esercizio in linguaggio C

Stato
Discussione chiusa ad ulteriori risposte.

eryxx

Utente Bronze
30 Settembre 2016
18
5
3
34
Ultima modifica da un moderatore:
Ho un esercizio con questa traccia: • scrivere una funzione str_pal che restituisce 1 se una stringa è palindroma, 0 altrimenti.
Ho provato a fare l'esercizio, i restanti punti funzionano tranquillamente, però su questo punto mi si blocca e la funzione mi ritorna sempre 1, quindi anche scrivendo una qualsiasi parola mi ritorna sempre che la parola è palindroma (Palindroma quando la parola letta al contrario è esattamente uguale (es. anna, invertiamola = anna)).
Vi allego il codice della funzione, grazie in anticipo a tutti!

C:
int str_pal(char s[],int lun){
    int i,j,k;
    char p[500];
    for(i=(lun-1),j=0;i>=0;i--,j++){
            p[j]=s;
    }
    j=0;
    for(k=0;k<lun;k++){
        if(s[k]==p[k]){
            j++;}
    }
    if(lun!=j){
        return 1;
        }
    else{
        return 0;
        }
}
 
L'ho riscritto cambiando il meno possibile del tuo codice. Le parti commentate (che hai scritto tu) le ho lasciate in modo che tu possa capire meglio cosa andava bene e cosa no.

C:
//int str_pal(char s[], int lun)
int str_pal(char const s[], int lun)
{
    /*int i, j, k;
    char p[500];
    for (i = (lun - 1), j = 0; i >= 0; i--, j++)
    {
        p[j] = s;
    }*/
    //j = 0;
    int k = 0;
    --lun; /* puoi pure usare `lun--;`, non importa
              in quanto non stai usando il valore restituito
              dall'espressione pre/post-incremento */

    //for (k=0;k<lun;k++)
    for (; k < lun; ++k, --lun)
    {
        //if(s[k]==p[k]){
        if (s[k] != s[lun]) {
            return 0; // la stringa non è palindroma
            //j++;
        }
    }
    /*
    if (lun != j)
    {
        return 1;
    }
    else
    {
        return 0;
    } */
    return 1; // se esce dal ciclo la stringa è palindroma
}

Ovviamente, inutile nasconderlo, il codice è molto scompigliato e ci sono diversi errori semantici che risolveresti riflettendo meglio su come dovrebbe funzionare il programma e imparando le basi del C. Dovresti prendere un foglio di carta e mettere per iscritto una scaletta del tuo ragionamento.

Prendendo il tuo esempio chiami la funzione così:
C:
if (str_pal("anna", 4)) {
   // palindroma
}
else {
   // non palindroma
}

PS: Per ottenere la lunghezza di una stringa puoi utilizzare strlen() della libreria standard del C.
 
  • Mi piace
Reazioni: DanyDollaro
Ovviamente, inutile nasconderlo, il codice è molto scompigliato e ci sono diversi errori semantici che risolveresti riflettendo meglio su come dovrebbe funzionare il programma e imparando le basi del C. Dovresti prendere un foglio di carta e mettere per iscritto una scaletta del tuo ragionamento.
Grazie mille per l'aiuto ho capito gli errori fatti, però è brutto al terzo anno di ingegneria informatica sentirsi dire che devo imparare le basi del C :'(
Comunque grazie mille veramente, gentilissimo!
 
@eryxx: ovviamente non l'ho detto per sminuirti. Quando vedo per la miliardesima volta un utente che posta un codice indentato male e con diversi errori semantici, mi viene di sponte immaginare che non abbia del tutto le basi materiali per programmare in quel linguaggio specifico.
Comunque è abbastanza soddisfacente e appagante per me aiutare gente che frequenta corsi (anche di laurea) di programmazione, e non solo perchè io non ne ho mai frequentato uno ahah.

Io al momento ho zero certificazioni (nemmeno una d'inglese), nemmeno un'esperienza lavorativa e ho un diploma in un indirizzo tutt'altro che informatico. Mi sono messo alla prova facendo 1/4 di stage per un'azienda insieme ad un ingegnere biomedico, un ragazzo che ha frequentato (e poi interrotto) l'università di ingegneria informatica ed un altro ragazzo diplomato ad un indirizzo informatico. Diciamo che con tutto ciò ero comunque il "leader" del gruppo o comunque mi trattavano da tale in quanto ho realizzato (quasi da solo) un lavoro di programmazione di una settimana in una nottata. E no, da bambino non sono stato nemmeno prodigio, ho solo sempre avuto un carattere forte e una mente tanto sveglia. Anzi, ricordo che odiavo la matematica. Ora ho anche capito che questo accade perchè molti insegnanti danneggiano l'autostima dei ragazzi e li sobillano ad avere un profondo disamore per quella materia. Questo è uno dei motivi per cui il sistema scolastico non fa per me.

Ora non sono più i pregiudizi a spostarmi le idee.

Inoltre qui ho sicuramente anche avuto modo di aiutare gente con anni di esperienza da sviluppatore alle spalle. E forse il loro datore di lavoro preferirebbe sempre loro a me per un pezzo di carta in più ahah. Questa è l'Italia, molto poco meritocratica e di conseguenza i ragazzi come me preferiscono volentieri trovare lavoro all'estero.

Le chiavi che mi rendono almeno un gradino superiore a tanti altri sono tre: passione, disciplina e forza di volontà. Nessuno mi ha mai spiegato niente, leggo e rileggo libri, documentazioni e tanto altro da solo fin quando il concetto non è mio. Voler continuamente imparare e sapere che non si nasce imparati è importante.

Perciò non essere triste, perchè io non sono meglio di te. Sono solo più affamato di passione di te.

In bocca al lupo con gli studi ;).
 
Stato
Discussione chiusa ad ulteriori risposte.