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

Napisy zestaw 6C/2014

Zadanie

Oryginalna treść zadania

Rozwiązanie

Omówienie podpunktu 1 - znajdzPierwszy()

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 znajdzPierwszy(char* s, char* x){

W zadaniu należy zauważyć, że dla każdego znaku z napisu x musimy sprawdzić czy ma swój odpowiednik w napisie s. Trudność tutaj polega na fakcie, że jak zawsze nie znamy długości napisu, więc musimy użyć pętli while. Tutaj będzie to pętla w pętli, bo pierwsza pętla będzie przechodziła po każdym znaku napisu s, a druga sprawdzi czy i-ty znak jest równy któremukolwiek z x. Idee takiego rozwiązania przedstawia poniższy kod:

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

Cele zadania określają, że jeśli w napisie s nie wystąpi żaden znak z x to ma zwrócić -1. W naszym przypadku zakończenie obu pętli oznacza, że mamy zwrócić -1. Wyjście z pętli w pętli oznacza, że któryś znak z s jest równy znakowi z x.

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 = 1; i <= length; i++){
  5.     napis[i-1]=s[i*k - 1];
  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. Problem może stwarzać (4. - 6.)przepisywanie, ponieważ zazwyczaj co drugi znak oznacza, ze wybieramy znaki o indeksie 2, 4, 6, ..., ale w informatyce liczenie zaczyna się od 0, więc musimy odjąć od każdego indeksu 1 czyli wtedy indeksy do wybrania to 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ładowo 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 znajdzPierwszy()\ndla " << s << " i " << x << " wynik to:\n" << znajdzPierwszy(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. }