[C++] Pętla dla tablicy jednowymiarowej

anniemarie
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 21 lis 2014, o 16:22
Płeć: Kobieta
Podziękował: 2 razy

[C++] Pętla dla tablicy jednowymiarowej

Post autor: anniemarie »

Witam, mam zadanie aby napisać program sprawdzający czy połowy tablicy jednowymiarowej są palindromami. Pierwsza pętla działa mi prawidłowo. Natomiast druga już nie bardzo, czyli jak podam dane prawidłowe dla palindromu to nie działa. Warunek kopiowałam z pierwszej pętli, więc miałam nadzieję, że będzie działać. Ktoś widzi gdzie jest błąd?

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main()
{
/* tab - tablica, s - srodek tablicy, i-petla, n - wielkosc tablicy */
int n;
cout << "Podaj wielkosc tablicy:" << endl;
cin >> n;
int *tab = new int[n];
int i, s, k, j;
s=(n/2); --s;
cout << s << "s" << endl;
cout << "Podaj dane do tablicy:" << endl;
for (i=0; i<n; i++) /*Wpisanie elementów*/
	{
	cin >> tab[i];
	}
k=1; /*Zalozenie, ze jest palindromem*/
for(i=0;i<=s/2;i++) /*Petla dla pierwszej polowy tablicy*/
	{
	if(tab[i]!=tab[s-i]) k=0; 
	cout << tab[i] << tab[s-i] << k << endl; /*Wypisanie porownywanych elementow i wartosci k*/
	}
s++;
if (n%2!=0) s++; /*Pominiecie srodkowego elementu jesli tablica nieparzysta*/
j=1; /*Zalozenie, ze jest palindromem*/
for(i=s; i<n; i++) /*Petla drugiej polowy tablicy*/
	{
	if(tab[i]!=tab[n]) j=0;
	--n;
	cout << tab[i] << tab[n] << j << endl; /*Wypisanie porownywanych elementow i wartosci j*/
	}
delete[] tab;
if (k==0) cout << "Pierwsza polowa nie jest palindromem" << endl;
	else cout << "Pierwsza polowa jest palindromem" << endl;
if (j==0) cout << "Druga polowa nie jest palindromem" << endl;
	else cout << "Druga polowa jest palindromem" << endl;
return 0;
} 
lemoid
Użytkownik
Użytkownik
Posty: 199
Rejestracja: 24 maja 2012, o 23:36
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 5 razy
Pomógł: 30 razy

[C++] Pętla dla tablicy jednowymiarowej

Post autor: lemoid »

Trochę nieczytelnie. Nie wiem na ile to wynika z przyjętej konwencji kodowania a ile z braku jej znajomości - warto jednaksobie przyswoić bo o wiele łatwiej analizuje się taki kod.

Błędów jest parę, jeżeli zależy Ci na odklepaniu tego zadania to popraw następujące rzeczy:

1) s jak rozumiem jest środkiem tablicy. Po co więc --s?
2) Jeżeli okazuje się, że nie jest palindromem to po co dalej sprawdzać wartości?
3) Pętla działa dopóki i jest mniejsze od n. Skoro za każdym razem dekrementujesz n to nic dziwnego, że pętla nie działa tak jak powinna.

Ja bym to napisał jakoś tak: (nie kompilowalem, moze wymagac kilku poprawek)

Kod: Zaznacz cały

#include <iostream>

bool isPalindrome(int *tab, int from, int to)
{
  for (int i = from; i < to / 2; i++)
    if (tab[i] != tab[to - i] )
      return false;

  return true;

}

int
main()
{
// pobieranie danyej n, wpisywanie elementów do tablicy .

int s = n / 2;

if (isPalindrome(tab,0,s))
  std::cout << "Pierwsza czesc jest palindromem!
";
if (isPalindrome(tab,s+1,n))
  std::cout << "Druga czesc jest palindromem!
";

}
Ostatnio zmieniony 3 sty 2015, o 17:43 przez lemoid, łącznie zmieniany 1 raz.
Gouranga
Użytkownik
Użytkownik
Posty: 1565
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 243 razy

[C++] Pętla dla tablicy jednowymiarowej

Post autor: Gouranga »

nie będę czytał tamtego kodu (nie ma nic gorszego jak babrać się w cudzym kodzie), ja bym to zrobił tak:

Kod: Zaznacz cały

int n = 100;
char arr[n];
//zapełnienie tablicy
int i = 0, j=n-1;
while (i < j && arr[i++] == arr[j--]);
if (i < j) nie ma palindromów else są palindromy
istotne żeby kod działał jest to, że musi być i++ i j--, nie ma tutaj prawa zamienić tego na ++i, --j (niektórym się zdaje że to to samo)
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10211
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2359 razy

[C++] Pętla dla tablicy jednowymiarowej

Post autor: Dasio11 »

Gouranga pisze:

Kod: Zaznacz cały

while (i < j && arr[i++] == arr[j--]);
if (i < j) nie ma palindromów else są palindromy
Dla arr = "anka" program wypisze że to palindrom.
Gouranga
Użytkownik
Użytkownik
Posty: 1565
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 243 razy

[C++] Pętla dla tablicy jednowymiarowej

Post autor: Gouranga »

istotnie chwilowe zaćmienie umysłowe
należy zrobić i = -1, j=n (ew. j = n-1 jeśli ostatni element tablicy jest nullbajtem) i zrobić preinkrementację, umknęło mi, że postinkrementacja wykona się mimo niespełnienia warunku
czyli poprawiając mój kod:

Kod: Zaznacz cały

int n = 100;
char arr[n];
//zapełnienie tablicy
int i = -1, j=n-1; //j=n jeśli pomijamy "" na końcu słowa
while (++i < --j && arr[i] == arr[j]);
if (i < j) nie ma palindromów else są palindromy
teraz pyknie
ODPOWIEDZ