[C] Palindromy z polskimi znakami.

pkol
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 7 paź 2016, o 22:38
Płeć: Mężczyzna
Lokalizacja: Ostrów Wielkopolski
Podziękował: 4 razy

[C] Palindromy z polskimi znakami.

Post autor: pkol »

Witam, mam napisać program który właśnie sprawdza czy dany wyraz jest palindromem, mam już szkic który w miarę działa, lecz jeden przypadek mi pozostał. Kod:

Kod: Zaznacz cały

/*a jest zmienna od sprawdzania w tablicach znaków czy są one takie same*/

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

int main()
{
	char word[30];
	int a=0;  
	
	scanf("%s",word);
	
	while(a < strlen(word)/2)
	{
		if(word[a] == word[strlen(word)-1-a])
			a=a+1;

		else
		{
			if(word[a] == word[strlen(word)-a-2] && word[a+1] == word[strlen(word)-a-1] && a != strlen(word)-a-2)	
				a=a+2;

			else
			{
				printf("FALSE");
				return 1;
			}
		}
	}
	
	printf("TRUE");

	return 0;
}
lecz jeden przypadek mi nie działa, gdy znaków jest 8, tzn. na przykład słowa TRASTART i TRAŁART, jedno i drugie pokazuje mi na true i wiem dlaczego, musiałbym drugiego if-a przerobić, tylko nie wiem właśnie jaki dać warunek Ł, które jest w swoich obu znakach różne jak słowa S i T, żeby Ł pokazywał mi jako true a S i T jako false. Być może trochę niejasno wytłumaczyłem, to proszę pisać.
Ostatnio zmieniony 30 lis 2016, o 08:51 przez Afish, łącznie zmieniany 1 raz.
Powód: Kod umieszczaj na forum.
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C] Palindromy z polskimi znakami.

Post autor: mortan517 »

A nie możesz po prostu pozbyć się tych długich warunków i po prostu sobie sprawdzać? Bierzesz pierwszą literę oraz ostatnią, jak są takie same to nic nie robisz, jak są różne wywalasz od razu false. A na samym końcu po tej pętli jak przeleci wszystkie, czyli palindrom to zwróć true. Wtedy kod skróci się o połowę.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Palindromy z polskimi znakami.

Post autor: kalwi »

Aleś to przekombinował...

Kod: Zaznacz cały

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

int main(void)
{
    char string[30];
    scanf("%s", string);
    size_t length = strlen(string);

    if(length % 2)
    {
    	for(size_t i = 0, j = length - 1; i < length/2; ++i, --j)
    		if(string[i] != string[j])
    		{
    			printf("
FALSE
");
    			break;
    		}
    }
    else
    {
    	for(size_t i = 0, j = length - 1; i <= length/2; ++i, --j)
    		if(string[i] != string[j])
    		{
    			printf("
FALSE
");
    			break;
    		}
    }
    return 0;
}
Poza tym nie używaj polskich znaków diakrytycznych w C, bo będziesz dostawał błędne wyniki (chyba, że użyjesz szerokiego chara..., wchar_t)
pkol
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 7 paź 2016, o 22:38
Płeć: Mężczyzna
Lokalizacja: Ostrów Wielkopolski
Podziękował: 4 razy

[C] Palindromy z polskimi znakami.

Post autor: pkol »

Ale niestety muszę zrobić tak żeby mi akceptowało polskie znaki.. Tak to wiem, że program byłby o połowę krótszy. Czyli jeśli użyję zamiast char tego szerokiego chara to znaki polskie będzie mi rozpatrywał jako jeden, tak? (z tego co wnioskuje po ilości użytego miejsca przez nie)
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Palindromy z polskimi znakami.

Post autor: kalwi »

pkol pisze:Ale niestety muszę zrobić tak żeby mi akceptowało polskie znaki.. Tak to wiem, że program byłby o połowę krótszy. Czyli jeśli użyję zamiast char tego szerokiego chara to znaki polskie będzie mi rozpatrywał jako jeden, tak? (z tego co wnioskuje po ilości użytego miejsca przez nie)
mówisz i masz..

Kod: Zaznacz cały

#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
    setlocale(LC_ALL, "pl_PL.UTF-8");
    char tab[30];
    wchar_t string[100];
    scanf("%s", tab);
    mbstowcs(string, tab, sizeof(tab));
    size_t length = wcslen(string);

    for(size_t i = 0, j = length - 1; i < length / 2; ++i, --j)
    {
	     if(string[i] != string[j])
        {
           printf("FALSE
");
           break;
        }
    }     
    return 0;
}
i nie chodziło mi o długość kodu, ale jakość - jest on przekombinowany i za trudny (no i jak sam zauważyłeś - błędny). Swoją drogą, sam się walnąłem przy poprzednim kodzie.
ODPOWIEDZ