Zliczanie palindromów – wyjasnienie, dlaczego nie rozpoznaje żadnego

0

Witam, mam problem ze zrozumieniem tych calych palindromów... mam kod (podaje niżej) i jeśli ktoś by mi mógł wytłumaczyć dlaczego zlicza że nie ma żadnego to byłbym wdzięczny :)

#include<iostream>
#include<fstream>
#include<cstdio>

using namespace std;

int main(){
	
	int z=0, licz=0, niepalindrom=0;
	string x;
	
	ifstream in("liczby.txt");
	
	while(in.good()){
		in >>x;
		niepalindrom++;
		for(int i=0, j=x.length()-1; i<j; i++,j--){
			if(x[i] != x[j]){
				z = 1;
				break;
			}
		}
		if(z==0){
			cout <<x<<endl;
			licz+=1;
			niepalindrom--;
		}
	}
	cout <<"Sposrod tych liczb jest: "<<licz<<" palindromow, oraz "<<niepalindrom<<" niepalindromow!";icz
	return 0;
}

a tu plik który potrzebny jest do zadania (losowe liczby w których są palindromy..)
https://drive.google.com/open?id=1kzBnV8MgyNRLy-6Mb2IxkpCJX4pWq6qR

0

W forze ustawiasz z = 1, a potem tego nie czyścisz. W efekcie, każda liczba po 'niepalindromie' jest przetwarzana jako 'niepalindrom'

0

Wydziel funkcję sprawdzającą czyPalindrom, zwracającą wartość true lub false,
wtedy zostanie ci jedna pętla, pobierająca linię tekstu z pliku.
Wewnątrz pętli sprawdzasz co zwraca funkcja i albo zwiększasz palindrom lub niepalindrom.

0
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

int main()
{
	int not_palindrom {}, amount {};

	ifstream file;
	file.open("liczby.txt");

	while (file.good())
	{
		string line {};
		getline(file, line);
		++amount;
		for (int i=0; i!=line.length()/2; ++i)
		{
			if (line[i]!=line[line.length()-i-1])
			{
				++not_palindrom;
				break;
			}
		}
	}
	file.close();
	cout << "Sposrod tych liczb jest: " << amount-not_palindrom << " palindromow, oraz " << not_palindrom << " niepalindromow!";
	getchar();
	return 0;
}
0

Co będzie, gdy plik będzie zakończony znakiem nowej linii?

0

Dzięki za odpowiedzi, co do ostatniej skorzystałem - ale nasz profesorek sobie wymyślił ze mamy po prostu dodać co trzeba do jego kodu tzn.

in >>x;
        for(int i=0, j=x.length()-1; i<j; i++,j--){
            if(x[i] != x[j]){
                z = 1;
                break;
            }
        }

zeby działało :P ale już mam ;)

0

@YooSy:

cout << "Sposrod tych liczb jest: " << amount-not_palindrom << " palindromow, oraz " << --not_palindrom << " niepalindromow!";
0
YooSy napisał(a):

Co będzie, gdy plik będzie zakończony znakiem nowej linii?

A co będzie jeśli jednak nie?

Chodzi o to, że operacja w pętli wykonuje się niezależnie, czy udało się wczytać dane czy nie.
Trzeba to uwzględnić w warunku pętli lub sprawdzać po próbie pobrania danych z pliku.

0

@YooSy: Przynajmniej napisałem jakiś kod, a nie jak wszyscy na tym forum, co piszą odpowiedzi w stylu "learncpp.com"

0

OK. Nie mam nic do tego. Kod ma błędy, a uwagi mają nakierować na ich znalezienie.

2
#include<iostream>
#include<fstream>
#include<algorithm>
 
using namespace std;

bool isPalindrome(const std::string& s) {
     return std::equal(s.begin(), 
                       s.begin() + s.length()/2, 
                       s.rbegin());
}

void processStream(std::istream& input, std::ostream& output)
{
      auto count = 0;
      auto palindromeCount = 0;

      std::string s;
      while(input >> s) {
           ++count;
           if (isPalindrome(s))
                ++palindromeCount;
           output << s << '\n'; 
      }
     output <<"Sposrod tych wyrazów jest: " << palindromeCount 
         <<  " palindromow, oraz " << (count - palindromeCount)
         << " niepalindromow!" << std::endl;
}

int main(){
    ifstream in("liczby.txt");
    processStream(in, cout);
    return 0;
}

https://wandbox.org/permlink/aPL9GuxFeL0PMy2Y

0

@up
po co używasz std:: skoro używasz już wcześniej tej przestrzeni nazw?

1 użytkowników online, w tym zalogowanych: 0, gości: 1