Skocz do zawartości
Roundstic

Zadanie C++ 2

Rekomendowane odpowiedzi

Cześć mam kolejne zadanie w c++

 

Brzmi ono następująco:

 

Napisz funkcję czyPalindrom(...), która sprawdzi, czy podane przez użytkownika słowo jest palindromem. Funkcja ma zwracać wartość typu bool (true albo false).

 

Mam narazie taki kod, który nie działa:

 

#include <iostream>
#include <cstring>
using namespace std;

bool CzyPalindrom(char napis[])
{
   int n = strlen (napis);
   for(int i= 0; i <= n/2; i++)
   {
       if (n[i] !== n[n-1-i]) //porownywanie liter
       {
           return false;
       }
       else
       {
           return true;
       }
   }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Mam narazie taki kod, który nie działa:

Nie działa, bo:

1. Niepoprawny zapis "różny od":

if (n[i] !== n[n-1-i]) //porownywanie liter

"Różny od" zapisuje się jako !=

if (n[i] != n[n-1-i])

2. Porównujesz złe wartości - pomieszałeś długość słowa i zapisane słowo. Zmienną od słowa jest napis, a długością n.

3. Spójrz na to, co się dzieje po porównaniu pierwszej pary liter. Jeśli są takie same, funkcja zwraca true i nie patrzy na kolejne litery. Powinieneś sobie ustawić jakąś zmienną w funkcji (przed pętlą) na daną wartość (np. że słowo jest palindromem) i jeśli litery się różnią, zwracać false. Jeśli są takie same, sprawdzić kolejną parę, a jeśli pętla przeszła przez wszystkie pary i wszystko było ok - zwrócić true.

 

4. Warunek stopu w pętli można uprościć, choć nie ma to wpływu na prawidłowy wynik działania funkcji. Weź sobie za przykład słowo, które ma 4 znaki (n = 4). Pętla przejdzie 3 razy:

  • 1 przejście - i = 0; 0 <= 2
  • 2 przejście - i = 1; 1 <= 2
  • 3 przejście (zbędne) - i = 2; 2 <= 2

Powinno być samo "mniejsze od". Jeżeli coś nie działa i podejrzewasz, że to pętla, sprawdź warunki początku i końca pętli (czyli i = ileś oraz i < inne_ileś). To najczęstsze problemy z pętlami - bo przechodzą raz za dużo albo za mało.

Nie wiem jak u ciebie z angielskim, ale generalna zasada jest prosta - kompilator zawsze mówi, co jest nie tak. Jeśli nauczysz się to czytać ze zrozumieniem (choć znam ludzi, którzy po inżynierskich studiach z informatyki tego nie potrafią), sporo błędów naprawisz bez większych problemów.

Edytowane przez Kitu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jak kompilator nie mówi, to trzeba mu nakazać mówić.

Przede wszystkim flaga -Wall

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#include <iostream>
#include <cstring>
using namespace std;


bool CzyPalindrom(char napis[])
{

   int n = strlen(napis);
   for(int i= 0; i < n/2; i++)
   {
       if (napis[i] != napis[n-1-i]) //porownywanie liter
       {
           return false;
       }
   }
   return true;
}

int main()
{
   char wyraz[100];
   cout<<"Podaj wyraz do sprawdzenia: ";
   cin>>wyraz;

   cout<<CzyPalindrom(wyraz);


   return 0;
}

 

Może być tak?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Może być tak?

 

Na pierwszy rzut oka wygląda ok, więc jeśli działa, to chyba tak ;) Sprawdź dla kilku przypadków typu zwykłe słowo, palindrom z parzystą liczbą znaków, palindrom z nieparzystą, pusty łańcuch znaków itp.

 

Jako że to dopiero początki programowania - zawsze zaczynaj od napisania sobie na kartce co powinien robić program - krok po kroku, możliwie jak najdokładniej. Później sprawdź "na papierze" czy ten algorytm działa, jeśli tak - spróbuj go przenieść na kod. Zazwyczaj przy początkach nauki programowania to sporo pomaga, a niedługo będziesz mógł pominąć ten etap dokładnego rozpisywania programu - będziesz to robić automatycznie w głowie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
4. Warunek stopu w pętli można uprościć, choć nie ma to wpływu na prawidłowy wynik działania funkcji.

Czy nie ma wpływu to zależy czy spodziewamy się pustego napisu, bo wtedy porównamy element 0 z -1 ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czy nie ma wpływu to zależy czy spodziewamy się pustego napisu, bo wtedy porównamy element 0 z -1 ?

 

W sumie racja ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...