View Full Version : Help C parole palindrome
Ragazzi sono nuovo del c e lo devo imparare. oggi mi sono imbattuto in questo esempio che ho rimodellato ad intuito perchè non funzionava... solo che non mi è molto chiaro... l'esercizio è questo:
#include <stdio.h>
#include <string.h>
void main()
{
char s[100];
int i, flag;
i = 0;
scanf ("%s", s);
flag = 1;
while ((i < (strlen(s)/2)) && (flag == 1)) {
if (s[i] != s[strlen(s)-i-1]) {
flag = 0;
}
i++;
}
if (flag == 1) {
printf ("La parola è palindroma.\n");
return main();
} else {
printf ("La parola non è palindroma.\n");
return main();
}
}
non mi è molto chiara questa parte:
scanf ("%s", s);
flag = 1;
while ((i < (strlen(s)/2)) && (flag == 1)) {
if (s[i] != s[strlen(s)-i-1]) {
flag = 0;
}
i++;
}
e soprattutto queste 2 righe di codice:
while ((i < (strlen(s)/2)) && (flag == 1)) {
if (s[i] != s[strlen(s)-i-1]) {
inizia il while e io capisco questo:
mentre i(inizializzato a zero) è minore di parola/2 e flag è = a 1
se la lettera i-esima=lunghezza parola -i-1
flag =0
:help:
grazie in anticipèo a tutti
yorkeiser
24-05-2007, 15:44
flag è un valore che vale 1 se la stringa può essere palindroma, 0 se non lo è.
Il ciclo vuol dire: finchè non arrivi a metà stringa (per controllare che una parola sia palindroma basta controllarne la metà, dal momento che la stringa è simmetrica), confronta i caratteri simmetrici rispetto alla metà (ovvero il primo e l'ultimo, il secondo ed il penultimo...). Se sono diversi allora setta flag=0 (stringa non palindroma) altrimenti la stringa finora è palindroma (flag resta = 1) e prosegui con il controllo del prossimo carattere
quindi "-i-1"
è ilo simmetrico di "i+1" rispetto la metà della parola?
yorkeiser
24-05-2007, 15:56
Esatto. Immagina la parola sia: HWUPGRADE (strlen = 9)
Posizione : lettera
i = 0 : lettera H -> strlen-i-1=8 lettera E
-----------------------------------------
i = 1 (W) -> strlen-i-1=7 (D)
-----------------------------------------
i = 2 (U) -> strlen-i-1=6 (A)
e così via
Grazie mille... ora ti rompo per l'ultima volta( credo :D)
quel: flag=1; prima del ciclo sarebbe una sorta di if(questo)-> print(questo)
else print(quest'altro)?
se si come mai è scritto così? nn mi pare molto elegante diciamo :p
yorkeiser
24-05-2007, 16:16
Figurati, non rompi tranquillo :)
Il flag ti serve per uscire dal ciclo appena ti accorgi che la parola non è palindroma: se al primo giro nel while ti accorgi che la prima lettera e l'ultima non sono uguali, sai già che la parola non è palindroma ed è quindi inutile andare a fare il controllo per il resto dei caratteri. Infatti, se vedi, appena due caratteri simmetrici risultano diversi, il flag viene impostato a 0, la condizione del while fallisce ed esci dal while con flag=0 che è la condizione di stringa non palindroma. Più che come un if, puoi vederlo come una variabile di stato. flag viene impostato a 1 prima che entri nel ciclo perchè ragioni secondo la filosofia "parto con la condizione iniziale che la stringa è palindroma, appena mi accorgo che non lo sia setto flag=0". Se invece tutte le lettere simmetriche sono uguali, flag resta sempre ad 1 prima, durante e dopo l'uscita dal while e quindi la stringa risulta palindroma. Ovvio che il tutto poteva essere scritto in maniera diversa e forse più compatta, ma dal mio punto di vista sono sempre favorevole all'uso di variabili di stato, anche se conviene chiamarle con un nome un attimino più significativo (flag da sè non dice granchè)
Figurati, non rompi tranquillo :)
Il flag ti serve per uscire dal ciclo appena ti accorgi che la parola non è palindroma: se al primo giro nel while ti accorgi che la prima lettera e l'ultima non sono uguali, sai già che la parola non è palindroma ed è quindi inutile andare a fare il controllo per il resto dei caratteri. Infatti, se vedi, appena due caratteri simmetrici risultano diversi, il flag viene impostato a 0, la condizione del while fallisce ed esci dal while con flag=0 che è la condizione di stringa non palindroma. Più che come un if, puoi vederlo come una variabile di stato. flag viene impostato a 1 prima che entri nel ciclo perchè ragioni secondo la filosofia "parto con la condizione iniziale che la stringa è palindroma, appena mi accorgo che non lo sia setto flag=0". Se invece tutte le lettere simmetriche sono uguali, flag resta sempre ad 1 prima, durante e dopo l'uscita dal while e quindi la stringa risulta palindroma. Ovvio che il tutto poteva essere scritto in maniera diversa e forse più compatta, ma dal mio punto di vista sono sempre favorevole all'uso di variabili di stato, anche se conviene chiamarle con un nome un attimino più significativo (flag da sè non dice granchè)
Grazie mille :mano:
beh allora dico:
O MORDO TUA NUORA O ARO UN AUTODROMO :D
Raga riscrivo qui per un esercizio diverso ma faccio solo per nn aprire un nuovo thread....
non iresco a capire come mai mi dia errorre... mi deve dire solo se il numero che metto io è uguale o diverso da quello random del computer:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a, t, r;
r = rand();
printf("Il numero random è:%d\n",r);
a = -1;
while (a != r) {
printf ("Inserisci un numero: ");
scanf("%d",&a); }
if (a < r)
{
printf ("Inserisci un numero maggiore.\n");
}
else if(a > r)
{
printf ("Inserisci un numero minore.\n");
}
else
{
printf("Il numero che hai digitato corrisponde al numero random");
}
grazie mille :)
Ziosilvio
31-05-2007, 15:54
non iresco a capire come mai mi dia errorre... mi deve dire solo se il numero che metto io è uguale o diverso da quello random del computer:
#include <stdio.h>
#include <stdlib.h>
void main()
main deve restituire un int.
E usa il tag CODE, per cortesia.
{
int a, t, r;
r = rand();
printf("Il numero random è:%d\n",r);
Il numero random è per caso 1?
Da' un'occhiata a http://www.hwupgrade.it/forum/showthread.php?t=1196677
(sì, lo so, dovrei aggiornarla...)
a = -1;
while (a != r) {
printf ("Inserisci un numero: ");
scanf("%d",&a); }
Quando scanf ha finito di leggere il numero, se ne accorge perché legge un carattere newline, che non fa parte della scrittura di un numero.
Questo carattere viene rimesso a posto sullo standard input.
Quindi, la successiva scanf legge solo quel newline, con le conseguenze del caso.
Per ripulire lo standard input dopo la tua scanf,
while (getchar() != '\n')
;
yorkeiser
31-05-2007, 16:12
Hai semplicemente cannato una graffa:
while (a != r) {
printf ("Inserisci un numero: ");
scanf("%d",&a);
} // <--- NON DEVI CHIUDERE IL WHILE QUI
Questa ti va in loop e continui a leggere il numero in input indefinitamente.
Devi semplicemente mettere quella graffa dopo l'else: ti posto la soluzione corretta
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a, t, r;
r = rand();
printf("Il numero random è:%d\n",r);
a = -1;
while (a != r) {
printf ("Inserisci un numero: ");
scanf("%d",&a);
if (a < r)
{
printf ("Inserisci un numero maggiore.\n");
}
else if(a > r)
{
printf ("Inserisci un numero minore.\n");
}
else
{
printf("Il numero che hai digitato corrisponde al numero random");
}
}
}
P.S. Se sei alle prime armi, ti consiglio di cominciare a prendere la buona abitudine di indentare il codice, così errori di questo tipo li riconosci al volo. Ciao
Grazie ad esntrambi ho risolto...
ehm si sono alle prime armi mi potresti dire che vuol dire identare? :p
Ziosilvio
31-05-2007, 21:02
che vuol dire identare?
Scrivere il codice di un programma, in modo che le righe corrispondenti a uno stesso blocco di istruzioni, comincino dalla stessa colonna di testo.
Per inciso, l'indentazione è esattamente il metodo con cui si suddividono i blocchi di codice in Python.
Ma phyton non è un linguaggio di programmazione?
Ziosilvio
31-05-2007, 21:29
Ma phyton non è un linguaggio di programmazione?
Phyton, non lo so; Python, sì, e anche molto valido.
Si vabbeh...cm si scrive si sacrive, cmq che c'entra col C? :)
Ragazzi ho trovato qualche esercizio in pdf e melo son fatto... avete ualche link da consigliarmi?:stordita:
in cui ci siano tanti esercizi con difficoltà appropriata e crescente?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.