Pages: [1]   Go Down
Print
Author Topic: Parola palindorma in c  (Read 956 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
GiovanniELongo
Matricola
*
Offline Offline

Posts: 34


« on: 25-11-2013, 18:43:06 »

Stavo esercitandomi in C, e volevo creare un programma per rilevare se una parola è palindroma o meno:
Mi è venuto furi il seguente sorgente:

Code:
#include<stdio.h>
#include<string.h>

int i,n,j,cont;

int main() {
    printf("Inserire la lunghezza della stringa");
    scanf("%d",&n);
    char parola[n];
    char inv[n];
    printf("inserire parola");
    scanf("%s",&parola);
    j=n;
    for(i=0;parola[i]!='/0';i++)
     {
       inv[i]=parola[j];
       j--;
       }
       for(i=0;i<n;i++)
       {
                       cont=strcmp(parola,inv);
                       }
                       if(cont==0)
       printf("parola palindroma");
       else
       printf("parola non palindroma");
                       getchar();
                       getchar();
                       }


Il problema è che non và e io non riesco a trovare il problema, qualcuno che mi aiuti????Grazie in anticipo ciao
« Last Edit: 25-11-2013, 20:46:09 by ɹǝǝuıƃuǝsɹǝʌǝɹ » Logged
Mario Pavone
Administrator
Apprendista Forumista
*****
Offline Offline

Posts: 167


« Reply #1 on: 25-11-2013, 19:02:40 »

Dando uno sguardo veloce le segnalo i seguenti errori:

1) le variabili in C devono essere dichiarate prima di qualunque istruzione (vedi parola e inv);
2) le due stringhe sono definite di lunghezza n... ma quanto vale n?
3) il simbolo di fine stringa è '\0';
4) n (qualora fosse definita) non è detto che sia la reale lunghezza della stringa;
5) non è chiaro cosa dovrebbe svolgere la sequenza di istruzioni:
j=n;
for(i=0;parola!='/0';i++) {
       inv=parola[j];
       j--;
}
6) per eseguire strcmp(s1, s2) non deve utilizzare alcun ciclo for.

MP.
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.475


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #2 on: 25-11-2013, 20:56:44 »

È sufficiente avviare la compilazione e leggerne l'output per capire dove sta l' (un?) errore.

Al momento non ho un compilatore C installato, perciò mi sono affidato al tiny-c-compiler (tcc) presente dentro questa meraviglia di sistema operativo Linux fatto in JavaScript ed eseguito interamente dentro il browser, e il responso è stato:
Code:
/var/root # tcc -o prog prog.c                                                 
prog.c:9: constant expression expected

La riga 9 è proprio quella in cui si dichiara per la prima volta un array la cui dimensione è specificata da "n", che (come lamenta il compilatore) non è una espressione costante .

Non so se avete già gestito la memoria dinamica (malloc, free, ecc...), ma se non si sa quanto è lunga la stringa a priori e non si conosce la memoria dinamica, è opportuno allocare una quantità sufficiente (e fissata) di memoria con un array a dimensione costante (costante definita con #define, ben prima della compilazione), e usare funzioni memory-safe auto-limitanti nell'uso della memoria del tipo fgets, così:
Code:
#define LUNGHEZZA 1024
//...
char parola [LUNGHEZZA];
fgets (parola, LUNGHEZZA, stdin);
//...
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
GiovanniELongo
Matricola
*
Offline Offline

Posts: 34


« Reply #3 on: 25-11-2013, 22:45:40 »

Ringrazio per le risposte date, sono riuscito a sistemare in parte il programma nel seguente modo:
Code:
int i,n,j,cont,h;
    char parola[10];
    char inv[10];
int main() {
    printf("inserire parola");
    scanf("%s",&parola);
    i=(strlen(parola)-1);
     for(j=0; j<i && parola[i]==parola[j];j++,i--)
                       if(j<i)
       printf("parola palindroma");
       else
       printf("parola non palindroma");
                       getchar();
                       getchar();
                       }
So chee ci sono variabili inutilizzate dichiarate ma sono rimaste da prima.
Unico problema è che il programma riconosce le palindrome, ma se si inserisce una non palindroma non dice nulla.
« Last Edit: 25-11-2013, 23:15:53 by ɹǝǝuıƃuǝsɹǝʌǝɹ » Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.475


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #4 on: 25-11-2013, 23:52:53 »

Ho corretto entrambi i tuoi messaggi racchiudendo il codice nell'opportuno tag CODE, altrimenti si vedeva male perché tutte le indicizzazioni su i, cioè le scritture [i], venivano interpretate come corsivo in BBCode.

Per il futuro ti invito a usare sempre il tag CODE quando inserisci codice.

Tornando all'esercizio, nella tua attuale formulazione, fondamentalmente il tuo codice dopo aver acquisito la stringa, fa il seguente controllo:

Code:
SE (primo carattere = ultimo carattere)
    STAMPA "parola palindroma"
ALTRIMENTI
    STAMPA "parola non palindroma"
Come vedi, non viene fatto alcun controllo sui caratteri interni della parola, solo gli estremi vengono valutati.

Mentre è altresì opportuno apprezzare lo sforzo di fare un esercizio di questo tipo in un linguaggio avanzato per una materia come Programmazione 1 (la cui scelta ha i suoi pro- e i suoi contro-, come tutto del resto), devo farti notare errori più e meno gravi, che potresti non apprezzare anche dopo aver seguito tutto il corso (a seconda se certe cose verranno trattate o no, non conosco il programma).

Li elenco comunque:
  • Variabili globali: è sempre opportuno dichiarare una variabile nel più annidato blocco di codice possibile, per evitare fuoriuscite involute o semplicemente mantenere micro-modularità e, tra le altre cose, facilitare il riutilizzo del codice;

  • Sei stato graziato dal fatto che &parola non potrebbe in alcun modo essere valutato come "l'indirizzo di ciò che viene valutato con -parola-", giacché in C/C++ la seguente espressione valuta vero:
    se parola è array, allora       parola == &parola [0]
    Dunque, scrivendo tu &parola, hai involontariamente tentato di far capire al compilatore &&parola [0], il ché non ha senso e dal mio compilatore viene correttamente fatto passare chiudendo un occhio e considerandolo semplicemente "parola" (probabilmente è il comportamento standard dei compilatori C, ma non ho tempo né voglia di documentarmi al riguardo ).

    Nel futuro, e per capire meglio il senso di ciò che si fa, è meglio scrivere scanf ("%s", parola)

  • Credo di aver intuìto il tipo di controllo che volevi fare, ma fatto in questo modo fai due volte gli stessi controlli: se ci pensi puoi smettere di ciclare uno (cioè entrambi) gli indici, quando arrivi a \fs{4}\lfloor\frac{\text{strlen}(parola)}{2}\rfloor;

  • Rimanendo nell'ipotesi del controllo indovinato al punto precedente, se tu non volessi diminuire il numero di controlli come suggerito, sono quasi certo che manchi comunque un punto e virgola (;) alla fine della intestazione del ciclo for, poiché questo ciclo for dovrebbe avere corpo nullo.

    E conseguentemente dovresti invertire i rami del ciclo if (una volta reso esterno e conseguente alla conclusione del for).

    Se vuoi dimezzare i controlli da fare, puoi verificare che avvenga sovrapposizione o inversione del lato in cui gli indici si trovano a fine ciclo for (sostituendo < con >=       );

Buona sera .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Pages: [1]   Go Up
Print
Jump to: