[C++] Zamiana liter

malzon
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 15 paź 2010, o 16:57
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 1 raz

[C++] Zamiana liter

Post autor: malzon »

Witam serdecznie!

Mam za zadanie napisać program w Visual Basic C++, który zamienia małe litery na duże. Wszystko działa poprawnie, prócz zamiany polskich liter tj. ą, ę, ś itd.

Kod:

Kod: Zaznacz cały

{
			 System::Char znak;
			 pole->Text="";
			 StreamReader^ plik1= gcnew StreamReader("g:\male.txt", System::Text::Encoding::Default);
			 StreamWriter^ plik2 = gcnew StreamWriter("g:\duze.txt",0,System::Text::Encoding::Default);
			 while(plik1->Peek()!=-1) 
			 {
				 znak=(System::Char)plik1->Read();
				 if(znak>96 && znak<123)
					 znak-=32;
				 pole->Text+=znak;
				 plik2->Write(znak);
			 }
			 plik1->Close();
			 plik2->Close();
}
Pozdrawiam
pawellogrd
Użytkownik
Użytkownik
Posty: 844
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[C++] Zamiana liter

Post autor: pawellogrd »

Rzecz w tym, że polskie znaki w ASCII są zapisywane inaczej niż "zwykłe", tzn. przy zamianie małych liter na duże odejmujesz \(\displaystyle{ 32}\), jednak dla polskich znaków to nie zadziała. Spojrzyj na listę kodów polskich znaków w ASCII:

Kod: Zaznacz cały

Ą - 164
ą - 165
Ć - 143
ć - 134
Ę - 168
ę - 169
Ł - 157
ł - 136
Ń - 227
ń - 228
Ó - 224
ó - 162
Ś - 151
ś - 152
Ź - 141
ź - 171
Ż - 189
ż - 190
I zmodyfikuj kod programu bazując na tych kodach
malzon
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 15 paź 2010, o 16:57
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 1 raz

[C++] Zamiana liter

Post autor: malzon »

Byłem świadomy tego, ale potrafiłem napisać jedynie część, zamieniając litery poprzez odejmowanie "32". Nie mam pomysłu jak zrobić to z polskimi znakami.
pawellogrd
Użytkownik
Użytkownik
Posty: 844
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[C++] Zamiana liter

Post autor: pawellogrd »

Nie widzę innego wyjścia jak zastosować odpowiednio wiele instrukcji warunkowych (if) dla każdej grupy polskich znaków (przez grupę rozumiem zestaw takich polskich znaków, których zamiana z małych na duże wymaga odjęcia takiej samej liczby).

Innym wyjściem, jeżeli możesz to zastosować, znacznie wygodniejszym byłoby użycie to_upper lub transform. Oto przykłady:

Kod: Zaznacz cały

#include <boost/algorithm/string.hpp>
#include <string>

std::string str = "Hello World";

boost::to_upper(str);

std::string newstr = boost::to_upper_copy("Hello World");
oraz

Kod: Zaznacz cały

#include <algorithm>
#include <string>

std::string str = "Hello World";
std::transform(str.begin(), str.end(),str.begin(), ::toupper);
ODPOWIEDZ