pointers i stedet for Array???

Tags:    c++

<< < 12 > >>
Jeg har tidligere fået hjælp af "Bertel" med at færdiggøre en kode der skulle vise om den indtastede sætning var en palindrom eller ej. Jeg har så igen kigget på opgaven og tænkte så, at hvis man nu ignorer alle tegn, der ikke er bogstaver og bruger integer variabler til at holde styr på positionerne i arrayen. Hvordan kan man så revidere programmet til at bruge pointers i stedet for integers til at holde styr på positionerne i arrayen???.. hvis det altså overhovedet kan lade sig gøre.

koden er:

#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 = -1;
right = strlen(palindrome);

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

return 0;
}




Jeg er ikke helt sikker på at jeg forstår spørgsmålet korrekt.

Du kan lave left og right om til pointere:
char* left = &palindrome[-1];
char* right = &palindrome[strlen(palindrome)];

(Der er muligvis en eller anden der vil mene at "&palindrome[-1]" er ulovligt, det er det egentlig også, index -1 eksisterer ikke, men det virker sandsynligvis...)

Der hvor du har palindrome[left] skal du så bruge *left, og det samme gælder for right.

Hvis du vil fjerne alle tegn der ikke er bogstaver, burde det være ret simpelt i en loop at lave et kopi af palindrome uden de tegn der ikke er bogstaver. Så burde du kunne den nuværende loop meget simplere.

Du behøver ikke skrive Bertel i "", jeg hedder Bertel.



Jeg er ikke helt sikker på at jeg forstår spørgsmålet korrekt.

Du kan lave left og right om til pointere:
char* left = &palindrome[-1];
char* right = &palindrome[strlen(palindrome)];

(Der er muligvis en eller anden der vil mene at "&palindrome[-1]" er ulovligt, det er det egentlig også, index -1 eksisterer ikke, men det virker sandsynligvis...)


Det er nok ikke ulovligt, men kønt er det sgu heller ikke :)
En anden (efter min mening lidt kønnere) måde at skrive det samme er:
char * left = palindrome - 1;
char * right = palindrome + strlen(palindrome);



Ja det ser godt nok ikke for pænt ud, men nu er jeg ikke heller ikke en perfektionist i at koder skal se så "smukke" ud som muligt:). Det skal bare fungere.
Hvordan kan man fjerne alle tegn der ikke er bogstaver??.. så kan man da ikke få programmet til at køre, eller kan man??.Er sku meget usikker.

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

int main()
{
char palindrome[80];

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

char * left=palindrome -1;
char * right=palindrome + strlen(palindrome);

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

return 0;
}





Ja det ser godt nok ikke for pænt ud, men nu er jeg ikke heller ikke en perfektionist i at koder skal se så "smukke" ud som muligt:). Det skal bare fungere.

Læsbar kode er ellers meget vigtigt. Kode læses flere gange, end det skrives, og de fleste virksomheder har en såkaldt code convention, som indikerer, hvordan man skal skrive kode, og at man skal lægge vægt på at koden kan forståes.


Hvordan kan man fjerne alle tegn der ikke er bogstaver??.. så kan man da ikke få programmet til at køre, eller kan man??.Er sku meget usikker.

Der er ingen grund til at fjerne tegnene. Man kan godt, men det ville være mere besværligt, end bare at rende hen over dem.
Men bare for at illustrere, hvordan du kunne gøre:
Fold kodeboks ind/udKode 


Fold kodeboks ind/udKode 




Ja det har du nok ret i, men nu er det sådan at jeg lige for knap en måneder siden har lært at programmere..så til tider kan det godt være lidt uoverskueligt:)

Jeg fik af vide at det ikke var muligt at fjerne tegnene, så det undrer mig lidt at det kan lade sig gøre, at få programmet til at køre uden tegn.





Jeg forstår ikke "Jeg fik af vide at det ikke var muligt at fjerne tegnene"?



never mind:), det er bare mig der vrøvler.

men jeg er ikke helt med på følgende:

"Hvis du vil fjerne alle tegn der ikke er bogstaver, burde det være ret simpelt i en loop at lave et kopi af palindrome uden de tegn der ikke er bogstaver. Så burde du kunne den nuværende loop meget simplere."






Den første kode du postede tog ikke højde for mellemrum, specielle tegn og store og små bogstaver. Så hvis du brugte den på den streng hvor du har fjernet specielle tegn, burde det virke.



Hvis jeg nu kun vil revidere programmet til at bruge pointers i stedet for integers til at holde styr på positionerne i arrayen, gider denne kode stadigvæk ikke at virke:

der kommer følgende fejl:
"array subscript has type "char""


int main()
{
char palindrome[80];

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

char * left = palindrome -1 ;
char * right = palindrome + strlen(palindrome);

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



I stedet for
palindrome[* left]

Skal du bare bruge:
*left

left er allerede en pointer, ikke et index. left peger ind i palindrome.



<< < 12 > >>
t