Tekstowy typ danych (ang. string - sznurek, ciąg, łańcuch) służy do przechowywania ciągu znaków. Po polsku mówimy „łańcuch znaków” lub krótko „łańcuch”.
W Turbo Pascalu zmienna typu String może przechowywać do 255 znaków. W C++ oprócz ciągów znaków znacznie dłuższych niż w Turbo Pascalu, istnieje biblioteka standardowa klasy std::string,
która umożliwia zarządzanie pamięcią, określanie długości łańcuchów, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisach. Odwoływanie się do poszczegółnych znaków w napisie odbywa się przez indeks, przy czym numeracja znaków zaczyna się od 0, np.:
#include <iostream>
using namespace std: int main () { string a = "Matematyka"; cout << "pierwszy: " << a[0] << endl;
cout << "czwarty: " << a[3] << endl;
}
pierwszy: M
czwarty: e
Zad. 1. Napisz program w C++, który zamieni napis "Wroclawski Portal Matematyczny: matematyka jest ciekawa" na napis "WROCLAWSKI PORTAL MATEMATYCZNY:
MATEMATYKA JEST CIEKAWA" (bez używania biblioteki String i jej wbudowanych funkcji).
Zad. 2. W pierwotnym napisie z zadania 1 zlicz liczby poszczególnych liter (również bez użycia biblioteki String i jej wbudowanych funkcji).
Zad. 3. Co i dlaczego wyświetli poniższy program?
#include <iostream>
using namespace std;
int main()
{
string a,b,c,d,e;
a = "Matematyka";
b = "zero";
c = "matura";
d = "matematyk";
e = "maturalny";
if (a > b) cout << a << endl;
else cout << b << endl;
if (a > c) cout << a << endl;
else cout << c << endl;
if (a > d) cout << a << endl;
else cout << d << endl;
if (a > e) cout << a << endl;
else cout << e << endl;
if (b > c) cout << b << endl;
else cout << c << endl;
if (b > d) cout << b << endl;
else cout << d << endl;
if (b > e) cout << b << endl;
else cout << e << endl;
if (c > d) cout << c << endl;
else cout << d << endl;
if (c > e) cout << c << endl;
else cout << e << endl;
if (d > e) cout << d << endl;
else cout << e << endl;
cout << e + d << endl;
system("PAUSE");
}
W tym miesiącu uczestnicy poradzili sobie bezbłędnie z zadaniami. 3 pkt. zdobyli Krystyna Lisiowska - redaktor z Warszawy i Krzysztof Danielak - student informatyki przemysłowej na PWr.
Po ośmiu miesiącach trwania Ligi czołówka prezentuje się nastęująco:
- 19,75 pkt. - Krystyna Lisiowska,
- 16,5 pkt. - Marzena Wąsiewicz,
- 12,25 pkt. - Krzysztof Danielak.
Zad. 1. Pomysły były dość zbliżone. Oto przykładowe rozwiązania.
#include <iostream>
using namespace std;
int main()
{
char a[56]= "Wroclawski Portal Matematyczny: matematyka jest ciekawa";
int i;
int x;
x = 'a' - 'A';
for (i=0; i<56; i++)
{ if (a[i]>='a' && a[i]<='z' ) a[i]=a[i]-x;
cout << a[i];
}
system("PAUSE");
}
#include <iostream>
using namespace std;
int main()
{
string a = "Wroclawski Portal Matematyczny: matematyka jest ciekawa";
cout << a << endl;
for (int i=0;a[i]!=NULL;i++)
{
if(a[i]>90) a[i]=a[i]-32;
}
cout << a << endl;
system("PAUSE");
}
Zad. 2. Również w tym zadaniu pojawiły się ciekawe rozwiązania.
#include <iostream>
using namespace std;
int main()
{
char tekst[56]= "Wroclawski Portal Matematyczny: matematyka jest ciekawa";
char a[56];
int ile[56];
int i;
int j;
int jest;
int max;
a[0]=tekst[0];
ile[0]=1;
jest=0;
max=1;
for (i=1; i<56; i++)
{
for (j=0; j<max; j++)
if (tekst[i]== a[j])
{ile[j]=ile[j]+1; jest=1;
}
if (jest==0)
{ a[max]=tekst[i];
ile[max]=1;
max++;
}
jest=0;
}
for (i=0; i<(max-1); i++) if (a[i] >='A' && a[i] <='z') cout << a[i] << " - " << ile[i] << endl;
system("PAUSE");
}
#include <iostream>
using namespace std;
int main()
{
string a= "Wroclawski Portal Matematyczny: matematyka jest ciekawa";
cout << a << endl;
int litery[52];
for (int i = 0;i<52;i++)
{
litery [i]=0;
}
for (int i=0;a[i]!=NULL;i++)
{
if (a[i]<=90) litery[a[i]-39]++;
if(a[i]>90)
{
a[i]=a[i]-32;
litery[a[i]-65]++;
}
}
for (int i = 0;i<52;i++)
{
if(litery[i]>0)
{
char litera;
if (i<26) litera = i+97;
else litera =i+39;
cout << litera << " =" << litery[i] << " razy" << endl;
}
}
system("PAUSE");
}
Zad. 3. Program wyświetli:
zero
matura
matematyk
maturalny
zero
zero
zero
matura
maturalny
maturalny
maturalnymatematyk
Dlaczego? Ponieważ porównywanie stringów przebiega leksykograficznie, najpierw według pierwszej litery, następnie według drugiej i tak dalej. Porównywalne są leksykalnie kody znaków, czyli (przyjmując kodowanie ASCII) "a" jest mniejsze od "b", ale jest większe od "B".