maj 2018

Data ostatniej modyfikacji:
2018-07-25

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");
}

 

Wyniki: 

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.

 

Odpowiedzi: 

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".

 

Powrót na górę strony