Czy cyfry liczby tworzą palindrom

0

Cześć. Czy mógłby ktoś wytłumaczyć mi moje błędy ? Program ma sprawdzać, czy liczba wpisana przez użytkownika tworzy palindrom.

#include <iostream>
#include <iomanip>

using namespace std;

const int MAX=9;

int dzielnacyfry(long int liczba, int TC[]);
void piszCyfry(int T[], int n);
bool czy_palindrom(int T[], int pierwszy_wyraz, int ostatni_wyraz, int ile_cyfr);


int main()
{
long int liczba;
int TC[MAX];

    cout<<"Podaj liczbe: ";
    cin >>liczba;
    int n=dzielnacyfry(liczba,TC);
    piszCyfry(TC, n);
    if(czy_palindrom(TC, 0, n-1, dzielnacyfry))
        cout<<"Liczba tworzy palindrom";
    else cout<<"Liczba nie tworzy palindromu";

    return 0;
}

//*********************************
int dzielnacyfry(long int liczba, int TC[])
{
int ile_cyfr=0;

    while(liczba>0)
    {
        TC[ile_cyfr]=liczba%10;
        liczba=liczba/10;
        ile_cyfr++;
    }
    return ile_cyfr;
}
//*********************************

//*********************************
void piszCyfry(int T[], int n )
{
    for(int i = n-1; i>=0; i--)
        cout<<setw(5)<<T[i];
    cout<<endl;
}
//*********************************

//*********************************
bool czy_palindrom(int T[], int pierwszy_wyraz, int ostatni_wyraz, int ile_cyfr)
{
    for(int i=0; i<(ostatni_wyraz-1); i++)
        if((T[i]==T[(ile_cyfr-1)-i])
           return true;
        else return false;
}
1

Kod wygląda nie aż tak źle (np. zastosowano sensowny podział na funkcje), pomijając że jest napisany w C, a nie w C++, ale błędy są tak trywialne że mam wrażenie że nie pisała go ta sama osoba.

Na screenshocie widać, że kompilator wszystko mówi:
if(czy_palindrom(TC, 0, n-1, dzielnacyfry))
Co oznacza tutaj dzielnacyfry?

if((T[i]==T[(ile_cyfr-1)-i])

Zwykły brakujący nawias.

Ogółem, cały problem można rozwiązać w jednej linijce (albo w kilkuset), ale jeśli chcesz się trzymać tego rozwiązania to i tak zacząłbym od użycia C++ i zauważenia, że liczba jest palindromem wtedy i tylko wtedy gdy string ją reprezentujący jest palindromem. A to jest trywialne do sprawdzenia.

0

Napisałem dzielnacyfry, bo chciałem uzyskać to, co zwraca funkcja dzielnacyfry. To jest zadanie z podstaw programowania na pierwszym semestrze studiów, niektóre rzeczy napisałem inaczej. Raczej nie powinniśmy używać stringów. I ogólnie programujemy w c++. W rozwiązaniu jest podane coś takiego:

#include <iostream>
#include <iomanip>
using namespace std;
const int MAX_C = 9; // maksymalna ilość cyfr
// --- funkcja tworzy podzial liczby na cyfry, zapisujac je do tablicy TC;
// przyjumuje wartosc rowna ilosci cyfr
int dzielNaCyfry( long int liczba, int TC[] )
{
 int ile_cyfr = 0;
 while(liczba > 0) {
 TC[ile_cyfr++] = liczba % 10;
 liczba = liczba / 10;
 }
 return ile_cyfr;
} 
// cyfry wyswietlamy w kolejnosci odwrotnej do kolejnosci wyodrebniania
// ich przez funkcje dzielNaCyfry
void piszCyfry( int T[], int n )
{
 for(int i = 0; i < n; i++)
 cout << setw(6) << T[n-i-1];
 cout << endl;
}
bool palindrom( int T[], int pocz, int kon ) // --- podpunkt a)
{
 for( int i = 0; i < (kon-pocz+1)/2; i++)
 if( T[pocz+i] != T[kon-i] ) return false;
 return true;
} 
int main()
{
 int TC[MAX_C];
 cout << "Podaj liczbe: ";
 long int liczba;
 cin >> liczba;
 int n = dzielNaCyfry( liczba, TC );
 piszCyfry( TC, n);

 if( palindrom( TC, 0, n-1))
 cout << "Cyfry tworza palindrom " << endl;
 else
 cout << "Cyfry nie tworza palindromu " << endl;

0

@kq: Masz rację, błąd trywialny. Program już działa, dzięki

1

Wg mnie podane wyżej rozwiązanie to typowe zwycięstwo technologii nad zdrowym rozsądkiem, przecież to liczba!

#include <iostream>
using namespace std;

bool palindrom(int value)
{
	long long ret=0,save=value;
	for(int next;value;value=next) ret=ret*10+(value-(next=value/10)*10);
	return (ret==save);
}

int main()
{
	for(int n=0;n<1000000;++n) if(palindrom(n)) cout<<n<<endl;
	return 0;
}
0

@_13th_Dragon: Oj, dla mnie to jeszcze trochę niezrozumiały kod.

1

A w takim zapisie:

bool palindrom(int value)
{
	long long ret=0,save=value;
	for(int next;value;value=next)
	{
		next=value/10;
		int digit=value-next*10;
		ret=ret*10+digit;	
	} 
	return (ret==save);
}

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