Algorytm jest ogólnie napisany poprawnie. Zmieniłbym jednak troszkę działanie funkcji symetryczna.
Moim zdaniem przejżyściej byłoby, gdyby symetryczna zwracała typ bool. I później na podstawie zwróconej wartości przez funkcję reagujesz w odpowiedni sposób (np. wypisujesz informację).
Poza tym u Ciebie funkcja uzupełnienie i symetryczna zwracają niepotrzebnie int. To jest taka mała pierdoła, ale lepiej od początku uczyć się pisać poprawne funkcje :-)
Jeżeli symetryczna zwracałaby true gdy tablica jest symetryczna i false gdy nie jest, to musiałbyś lekko przerobić implementację. Niepotrzebnie wprowadziłeś zmienną symetrycznosc. Za każdym razem, gdy kolejny element okaże się taki sam, to Ty inkrementujesz symetrycznosc. A po co. Przecież gdy znajdzie się JEDEN przypadek niesymetryczności, to już wiesz czy jest symetryczna czy nie.
Jeżeli prześlesz swojej funkcji tablicę z 1'000'000 elementami i pierwsze sprawdzenie wykaże nieparzystość, to Twoja funkcja nadal będzie porównywać... (bez sensu, prawda?).
Mój pomysł jest taki. Jeżeli jakaś para będzie nieparzysta, to niech funkcja zwróci false. Jeżeli sprawdzanie dobiegnie końca, to zwracamy true.
To jest mój sposób na uproszczenie, o które prosiłeś :-)
A teraz przerobiony kod:
#include<iostream>
using namespace std;
void uzupelnienie(float *tab,int rozmiar);
bool symetryczna(float *tab, int rozmiar);
int main()
{
int rozmiar;
cout << "Rozmiar tablicy: " << endl;
cin >> rozmiar;
float *tablica;
tablica = new float[rozmiar];
uzupelnienie(tablica,rozmiar);
if( symetryczna(tablica,rozmiar) )
cout << "Tablica jest symetryczna" << endl;
else
cout << "Tablica nie jest symetryczna" << endl;
delete[] tablica;
return 0;
}
void uzupelnienie(float *tab,int rozmiar)
{
for (int i = 0; i < rozmiar; i++)
{
cin >> tab[i];
}
}
bool symetryczna(float *tab, int rozmiar)
{
int r = rozmiar;
if (rozmiar % 2 == 0)
{
for (int i = 0; i < (r); i++)
{
if (tab[i] != tab[r - 1]) return false;
r--;
}
}
else // Ilosc elementow tablicy jest nieparzysta
return false;
return true;
}
Pozdrawiam ;-)