• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie, czy tablica posiada symetryczną zawartość

VPS Starter Arubacloud
0 głosów
2,759 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez agre Użytkownik (550 p.)

Napisałam funkcję, która ma sprawdzić, czy zawartość tablicy jest symetryczna.

#include<iostream>
using namespace std;
int uzupelnienie(float *tab,int rozmiar);
int symetryczna(float *tab, int rozmiar);

int main()
{
	int rozmiar;
	cout << "Rozmiar tablicy: " << endl;
	cin >> rozmiar;
	
	float *tablica;
	tablica = new float[rozmiar];

	uzupelnienie(tablica,rozmiar);

	symetryczna(tablica,rozmiar);

	delete[] tablica;

	return 0;
}

int uzupelnienie(float *tab,int rozmiar) 
{
	for (int i = 0; i < rozmiar; i++)
	{
		cin >> tab[i];
	}


	return 0;
}


int symetryczna(float *tab, int rozmiar)
{
	int symetrycznosc = 0;
	int r = rozmiar;

	if (rozmiar % 2 == 0)
	{
		for (int i = 0; i < (r); i++)
		{
			if (tab[i] == tab[r - 1]) symetrycznosc++;
			r--;
		}
	}
	if (symetrycznosc == (rozmiar / 2)) cout << "tablica symetryczna" << endl;

	return 0;
}

 

Co powiecie na takie rozwiązanie? Macie jakąś poradę, jak może to uprościć? 

1 odpowiedź

+2 głosów
odpowiedź 28 listopada 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
wybrane 28 listopada 2015 przez agre
 
Najlepsza

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 ;-)

komentarz 28 listopada 2015 przez agre Użytkownik (550 p.)

Czyli w momencie, kiedy warunek if jest spełniony wykonuje się return false. I dzięki temu przestaje być wykonywana cała funkcja bool symetryczna. 

Tak samo dla nieparzystego rozmiaru tablicy.

Rzeczywiście jest to o wiele bardziej zmyślne. Lepiej przerwać funkcję, zamiast wykonywać coś, co i tak na pewno nie zostanie już spełnione. 

Dziękuję za poświęcony czas na wytłumaczenie tego smiley

Podobne pytania

0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 29 lutego 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 176 wizyt
pytanie zadane 21 października 2016 w Systemy CMS przez lukaste Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 116 wizyt
pytanie zadane 2 listopada 2019 w C i C++ przez j4nsk Nowicjusz (160 p.)

92,963 zapytań

141,927 odpowiedzi

321,161 komentarzy

62,296 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...