rettelse af en "palindrome"

Tags:    c++

<< < 12 > >>
Hej alle
Jeg har fået den opgave at skrive et program, der læser en besked, så kontroller, om det er en palindome (bogstaverne i beskeden er de samme fra venstre til højre, og fra højre til venstre).

fx:
Enter a message: He lived as a devil, eh?
Palindrome

Enter a message: Madam, I am Adam.
Not a palindrome.

Min c++ kode er:

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

int main()
{
char palindrome[80];
int left, right;

printf("Enter a message:\n");
fflush(stdout);
gets(palindrome);

left = 0;
right = strlen(palindrome) - 1;

while (palindrome[left] == palindrome[right] && left < right)
{
left++;
right--;
}

if ( left < right )
{
printf("NOT a palindrome.\n\n\t\"%s\"s\n",palindrome);
}
else
{
printf("Palindrome.\n\n\t\"%s\"\n",palindrome);
}

return 0;
}


problemet er så at den angiver hver en tekst jeg skriver ind som værende et "not a palindrome", også selvom det er et palindome. Er der nogen derude der kan se hvad jeg har gjort i min kode???



16 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Du kunne evt. bare fjerne ?...



Skriver du "pop" eller "poop" skriver den at det er et palindrome, men "p op" mener den ikke er et palindrome.
Så du skal nok tage højde for mellemrum og komma også i koden, f.eks. ved at flytte på left og right indtil de "peger" på et tegn der ikke er et bogstav.



Skriver du "pop" eller "poop" skriver den at det er et palindrome, men "p op" mener den ikke er et palindrome.
Så du skal nok tage højde for mellemrum og komma også i koden, f.eks. ved at flytte på left og right indtil de "peger" på et tegn der ikke er et bogstav.


...og konvertér tegnet til et lille bogstav (eller stort) for 'A' er ikke lig med 'a'.



jeg er ikke lige helt med på det i skriver, men nu når jeg ser på eksemplet:

He lived as a devil, eh? ...det r da ikke et palindrom...eller er jeg helt forkert på den.???




Jo, det er et palindrom, du skal se bort fra mellemrum og komme og, som Robert siger, så er 'a' det samme som 'A' når man checker om det er palindrom.

Så her skal kan du bruge tolower
tolower(palindrome[left]) == tolower(palindrome[right])
tolower findes i ctype.h

I stedet for:
left++;

Kan du lave:
do
{
left++
}
while(!isalpha(palindrome[left] && left != right);

isalpha findes også i ctype.h



jeg er ikke lige helt med på det i skriver, men nu når jeg ser på eksemplet:

He lived as a devil, eh? ...det r da ikke et palindrom...eller er jeg helt forkert på den.???


Prøv at skrive dit palindrom på et ternet stykke papir, med ét tegn i hvert kvadrat. Også mellemrum og komma.

Følg så med venstre finger ét felt af gangen fra venstre, og ét felt af gangen fra højre. Så vil du se problemet.

"En af dem der red med fane"

Først sammenligner vi 'E' med 'e'. De er ikke éns. Dermed er det ikke et palindrom. Medmindre vi "lowercaser" begge tegn. Så har vi 'e' og 'e'. Foreløbig et palindrom.

Derefter har vi 'n' og 'n'. Stadig et palindrom. Så har vi ' ' og 'a'. Ikke éns og derfor ikke et palindrom. Medmindre vi bevæger os forbi mellemrum. Så springer vi mellemrummet over og går videre til 'a' (tredje bogstav fra venstre).

Fortsæt selv :)



Ja kan godt se at man bliver nød til at tage højde for mellemrum samt store og små bogstaver. jeg har prøvet med følgende kode, men lortet virker stadigvæk ikke:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
char palindrome[80];
int left, right;

printf("Enter a message:\n");
fflush(stdout);
gets(palindrome);

left = 0;
right = strlen(palindrome) - 1;

tolower(palindrome[left]) == tolower(palindrome[right])
{
do
{
left++
}
while(!isalpha(palindrome[left] && left != right);
}
if ( left < right )
{
printf("NOT a palindrome.\n",palindrome);
}
else
{
printf("Palindrome.\n",palindrome);
}

return 0;
}




Denne her skal du have ind i en while, på samme måde som din oprindelige kode:
tolower(palindrome[left]) == tolower(palindrome[right])

Og du skal gøre ca. det samme for right som du gør for left her:

do
{
left++
}
while(!isalpha(palindrome[left] && left != right);



Ja selvfølgelig.

koden er nu:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
char palindrome[80];
int left, right;

printf("Enter a message:\n");
fflush(stdout);
gets(palindrome);

left = 0;
right = strlen(palindrome) - 1;

while (tolower(palindrome[left]) == tolower(palindrome[right]))
{
do
{
left++
}
while(!isalpha(palindrome[left] && left != right);
}
{
do
{
right--
}
while(!isalpha(palindrome[right] && right != left);
}
if ( left < right )
{
printf("NOT a palindrome.\n",palindrome);
}
else
{
printf("Palindrome.\n",palindrome);
}

return 0;
}

Den angiver følgende fejl:
..\src\Opg122A.c:31: error: syntax error before ';' token
..\src\Opg122A.c:37: error: syntax error before '}' token
..\src\Opg122A.c:38: error: syntax error before ';' token
..\src\Opg122A.c:42: warning: too many arguments for format
..\src\Opg122A.c:46: warning: too many arguments for format
Build error occurred, build is stopped
Time consumed: 93 ms.



Det er mest et spørgsmål om at få styr på ; { )

Fold kodeboks ind/udKode 




<< < 12 > >>
t