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

PESEL - obiektowo

VPS Starter Arubacloud
0 głosów
424 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 393 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
1 odpowiedź 570 wizyt
pytanie zadane 29 sierpnia 2018 w SPOJ przez krawiecki Początkujący (490 p.)
0 głosów
1 odpowiedź 649 wizyt
pytanie zadane 25 lipca 2018 w SPOJ przez Deriquest Użytkownik (550 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...