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

PESEL - obiektowo

0 głosów
574 wizyt
pytanie zadane 22 stycznia 2018 w SPOJ przez Maciej3206 Użytkownik (570 p.)
edycja 22 stycznia 2018 przez Patrycjerz
#include <iostream>

using namespace std;

int main()
{
    int ile_prob;
    cin>>ile_prob;
    long long int *tab_p;
    tab_p=new long long int [ile_prob];
        for (int j=0; j<ile_prob; j++)
        {
            cin>>tab_p[j];
        }
    int **tab;
    tab=new int*[ile_prob];
    for (int j=0;j<ile_prob;j++)
    {
        tab[j]=new int [12];
        for (int i=10; i>=0; i--)
        {
            tab[j][i]=tab_p[j]%10;
            tab_p[j]=(tab_p[j]-tab[j][i])/10;
        }
        tab[j][11]=(tab[j][0]+tab[j][1]*3+tab[j][2]*7+tab[j][3]*9+tab[j][4]+tab[j][5]*3+tab[j][6]*7+tab[j][7]*9+tab[j][8]+tab[j][9]*3+tab[j][10]);//%10;
    }
    for (int j=0; j<ile_prob; j++)
    {
        if (tab[j][11]>0)
        {
            if (tab[j][11]%10==0)
                cout<<"D"<<endl;
                else
                cout<<"N"<<endl;
        }
        else
        {
        cout<<"N"<<endl;
        }
    }
    return 0;
}

napisałem kod rozwiązujący zadanie "PESEL" z platformy SPOJ. Kod w pierwszej kolejności wczytuje pesele dla wszystkich prób, a następnie zwraca ich ocenę. Na przykładzie tego zadania chciałbym proszę o wyjaśnienie programowania obiektowego. Czytałem o tym, ale nie potrafię zastosować tego podejścia w swoich programach (jestem początkujący - i to pewnie dlatego). 

P.S. wszystkie zadania SPOJ interpretuję dokłądnie z opisem i program najpierw przechowuje dane, a następnie po kolei generuje wyniki. Przechowywanie danych wykonuję poprzez dynamiczne deklarowanie tablic jedno lub dwuwymiarowych, ale z treści komentarzy i zamieszczonych rozwiązań wynika, że takie podejście nie jest wymagane przez "sędziego" SPOJ-a. Dziękuję za czas poświecony przy udzielaniu odpowiedzi.

1 odpowiedź

+1 głos
odpowiedź 22 stycznia 2018 przez niezalogowany

To co masz w postscriptum jest ważne. SPOJ odróżnia INPUT od OUTPUT. Jeżeli oba nie są związane to nie stosując się do tego robisz sobie sam krzywdę:

  1. Marnujesz swój czas na stworzenie tablic, osobnych pętli czy pisanie nawiasów []
  2. W przypadku trudniejszych zadać kod może zostać od razu odrzucony, bo chwilowo zaalokowana pamięć przekroczyła dostępny limit

Poza tym pamiętaj o zasadzie DRY (Don't Repeat Yourself). Takie coś jest bez sensu:

tab[j][11]=(tab[j][0]+tab[j][1]*3+tab[j][2]*7+tab[j][3]*9+tab[j][4]+tab[j][5]*3+tab[j][6]*7+tab[j][7]*9+tab[j][8]+tab[j][9]*3+tab[j][10]);//%10;

Lepiej zrobić to za pomocą pętli i tablicy - ja zrobiłem to kiedyś tak:

#include <iostream>
#include <cmath>
#include <string>

int main()
{
	const size_t pesel_size = 11;
	int model_validation[pesel_size] = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1 };

	int count;
	std::cin >> count;

	while (count--)
	{
		std::string str_pesel;
		std::cin >> str_pesel;

		int sum = 0;
		for (size_t j = 0; j < pesel_size; j++)
		{
			sum += (str_pesel[j] - '0') * model_validation[j];
		}

		std::cout << (sum % 10 == 0 ? "D" : "N") << "\n";
	}
}

Tutaj jest niewiele kodu, który można by ładnie wydzielić. Zazwyczaj chodzi o to by kod dzielić na funkcje i użyteczne klasy, aby móc łatwo podzielić sobie pracę na paczki. W ten sposób możesz łatwo planować zadania i naprawiać błędy. Od razu wiadomo gdzie szukać błędu, a main może wtedy służyć po prostu jako szkielet (spis treści). Na tym zadaniu tak średnio widać zalety programowania obiektowego (mało kodu, mało funkcji o różnych zadaniach można wydzielić). 

Tutaj właściwie jedyne co można by zrobić to stworzenie klasy pesel, która będzie miała operator >> i metodę sprawdzającą poprawność. Przykładowy schemat:

#include <iostream>
#include <cmath>
#include <string>

class Pesel
{
private:
	const static size_t size = 11;
	const static int model_validation[size];

	std::string m_data;
public:

	bool is_good();
	friend std::istream& operator>> (std::istream& in, Pesel& pesel);
};

const int Pesel::model_validation[]{ 1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1 };

int main()
{
	int count;
	std::cin >> count;

	while (count--)
	{
		Pesel pesel;
		std::cin >> pesel;
		std::cout << (pesel.is_good() ? "D" : "N") << "\n";
	}
}

Podobne pytania

0 głosów
0 odpowiedzi 706 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
1 odpowiedź 758 wizyt
pytanie zadane 29 sierpnia 2018 w SPOJ przez krawiecki Początkujący (490 p.)
0 głosów
1 odpowiedź 1,060 wizyt
pytanie zadane 25 lipca 2018 w SPOJ przez Deriquest Użytkownik (550 p.)

93,720 zapytań

142,648 odpowiedzi

323,266 komentarzy

63,270 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...