Strona główna » Kursy » Zadania » Napisy zestaw 6D/2014
 

Napisy zestaw 6D/2014

Zadanie

Oryginalna treść zadania

Rozwiązanie

Omówienie podpunktu 1 - znajdzOstatni()

Na początek zadeklarujmy nagłówek funkcji. Będzie ona zwracać indeks czyli liczbę całkowitą innymi słowy int, a argumenty to dwa napisy:

  1. int znajdzOstatni(char* s, char* x){

W zadaniu mamy znaleźć ostatni znak w napisie s, który występuje również w napisie x. Do rozwiązania posłużymy się pętlą while jako, że nie posiadamy długości napisu, ale wiemy kiedy się kończy (na znaku \0). Chcąc znaleźć ostatni taki element musimy sprawdzić każdy znak z napisu s z każdym znakiem z napisu x. Indeks wystąpienia znaku zgodnego z s będziemy zwracać na samym końcu wykonywania funkcji, dal tego na początku zadeklarujemy zmienną pozycja, która będzie przechowywać, gdzie jest element z s należący do x. Do rozwiązania użyjemy podwójnej pętli while:

  1.   int pozycja = -1;
  2.   int i = 0;
  3.   while(s[i]!='\0'){
  4.     int j = 0;
  5.     while(x[j]!='\0'){
  6.       if(s[i] == x[j])
  7.         pozycja = i;
  8.       j++;
  9.     }
  10.     i++;
  11.   }
  12.   return pozycja;
  13. }

Cele zadania określają, że jeśli w napisie s nie wystąpi żaden znak z x to ma zwrócić -1. Tak się stanie jeśli w pętli nie znajdziemy elementu spełniającego kryteria. Wtedy zmienna pozycja nie zostanie zmieniona i funkcja zwróci -1.

Omówienie podpunktu 2 - cokaty()

W treści polecenia określone zostało, że funkcja zwraca listę znaków, a jako argumenty przyjmuje napis s oraz liczbę całkowitą k.

  1. char* cokaty(char* s, int k){
  2.   int length = (int)(strlen(s)/k);
  3.   char* napis = new char[length + 1];
  4.   for(int i = 0; i < length; i++){
  5.     napis[i]=s[i*k];
  6.   }
  7.   napis[length]='\0';
  8.   return napis;
  9. }

W celu (2.) wyliczenia ile znaków zostanie przepisanych musimy znać długość tekstu, podzielić przez k ( co który wyraz wybieramy) i pobrać część całkowitą (tu castujemy na inta). (3.) Pamiętajmy, że nasz nowy napis musi zawierać wszystkie napisy do przepisania oraz znak specjalny \0. (4. - 6.) Rozpoczynamy przepisywanie. Pierwszy znak ma zostać przeniesiony do drugiego napisu, więc wybieramy wyrazy 0, k, 2k, ... czyli np. 0, 2, 4, ... (co dla zwykłego człowieka należy tłumaczyć jako element 1, 3, 5, ...) (7.) Na sam koniec nie zależy zapomnieć o znaku końca linii \0. i (8.) zwróceniu wyniku.

Omówienie podpunktu 3 - Testy

Przykładowoa funkcja main():

  1. int main () {
  2.   char* s = new char[10];
  3.   s[0]='d';s[1]='e';s[2]='c';s[3]='a';s[4]='b';s[5]='c';s[6]='d';s[7]='a';s[8]='a';s[9]='\0';
  4.   char* x = new char[4];
  5.   x[0]='a';x[1]='b';x[2]='c';x[3]='\0';
  6.   cout << "Test funkcji znajdzOstatni()\ndla " << s << " i " << x << " wynik to:\n" << znajdzOstatni(s,x);
  7.   cout << "\n\n";
  8.   char* napis = new char[7];
  9.   napis[0]='1';napis[1]='2';napis[2]='3';napis[3]='4';napis[4]='5';napis[5]='6';napis[6]='\0';
  10.   int k = 2;
  11.   cout << "Test funkcji cokaty()\ndla " << napis << " i " << k << " wynik to:\n" << cokaty(napis,k);
  12.   cout << "\n\n";
  13.   delete[] s, x, napis;
  14.   system("pause");
  15.   return 0;
  16. }