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

C++ stephan prata ocena kodu

VPS Starter Arubacloud
0 głosów
264 wizyt
pytanie zadane 20 września 2020 w C i C++ przez Dynamic Bywalec (2,910 p.)

witam, mam takie zadanie z książki, prosiłbym o ocene i ewentualne wskazówki :

Kiedy przyłączasz się do Zakonu Programistów Dobrej Woli, na spotkaniach ZPDW możesz występować pod swoim prawdziwym imieniem, ukrytym stanowiskiem służbowym lub pod tajnym pseudonimem ZPDW. Napisz program pokazujący członków zakonu według ich imion, stanowisk służbowych, pseudonimów lub według wyboru samych członków. Program ma być oparty na strukturze: <Tutaj struktura> UWAGA: int preferencje W programie stwórz niewielką tablicę takich struktur i zainicjalizuj ją odpowiednimi wartościami. Program ma działać w pętli, umożliwiając wybranie jednej z czterech operacji: <tutaj a'la menu> Zauważ, że lista wg preferencji nie oznacza pokazania liczby z pola preferencje, ale pokaznie tego pola, które wynika z preferencji danego członka zakonu. Jeśli na przykład pole preferencje ma wartość 1, wybór opcji d (to z menu preferencja) spowoduje pokazanie stanowiska danego programisty.

 

kod:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::cin;

using std::endl;


int main()
{
	const int strsize = 20;
	struct zpdw
	{
		char imie[strsize];
		char pseldonim[strsize];
		char stanowisko[strsize];
		int pref;
	};
	char ch;
	bool a=1;

	zpdw tab[3]
	{
		{"michal", "koniu", "robotnik", 0},
		{"tomek", "kotek", "sprzedawca", 1},
		{"piotrek", "poter", "kierowca", 2}
	};
	cout << "a- imiona, b-pseldonimy, c-funkcje d-preferencje, q-koniec" << endl;
	cout << "Wybierz jedna z opcji: ";
	cin >> ch;
	while (a==1)
	{
		if (ch != 'a' && ch != 'b' && ch != 'c' && ch != 'd' && ch != 'q')
		{
			cout << "Wybierz jedna z opcji: ";
			cin >> ch;
		}
		else
		{
			switch (ch)
			{
			case 'a':
				for (int i = 0; i < 3; i++)
				{
					cout << tab[i].imie << endl;
				}
					ch = 'v';
					break;
			case 'b':
				for (int i = 0; i < 3; i++)
				{
					cout << tab[i].pseldonim << endl;
				}
					ch = 'v';
					break;
			case 'c':
				for (int i = 0; i < 3; i++)
				{
					cout << tab[i].stanowisko << endl;
				}
				ch = 'v';
				break;
			case 'd':
				for (int i = 0; i < 3; i++)
				{
					if (tab[i].pref == 0)
					{
						cout << tab[i].imie << endl;
					}
					else if (tab[i].pref == 1)
					{
						cout << tab[i].pseldonim<<endl;
					}
					else if (tab[i].pref == 3)
					{
						cout << tab[i].stanowisko<<endl;
					}
				}
				ch = 'v';
				break;
			case 'q':
				cout << "do zobaczenia!";
				a = 0;
				break;
			}
		}
	}
	return 0;
}

 

komentarz 21 września 2020 przez j23 Mędrzec (194,920 p.)

Kod wygląda w miarę OK.

Wybór opcji zrobiłbym tak:


char askForOption()
{
    const char* msg = "a - imiona, b - pseldonimy, c - funkcje d - preferencje, q - koniec\nWybierz jedna z opcji: ";
    char ch;

    while (cout << msg, cin >> ch) {
        if (strchr("abcdq", ch)) return ch;
    }
    return 'q';
}
...



char ch;

while ((ch = askForOption()) != 'q') {
    switch (ch) {
    case 'a':
        for (int i = 0; i < 3; i++) {
            cout << tab[i].imie << endl;
        }
        break;

...

Staraj się rozbijać kod na funkcję, bo to na prawdę potrafi uprościć kod i poprawić jego czytelność.

komentarz 21 września 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
edycja 21 września 2020 przez Whiskey_Taster
Sam przerabiam ową książkę i funkcje (te bardziej skomplikowane) są omawiane troszkę później niż podane zadanie, dlatego lepiej - moim zdaniem - robić według tego, co było, a nie korzystać z tego, co dopiero będzie.

1 odpowiedź

0 głosów
odpowiedź 21 września 2020 przez Whiskey_Taster Pasjonat (15,610 p.)

Aktualnie sam przerabiam książkę, ten dział oraz zadanie mam za sobą, więc co nieco mogę powiedzieć, co mi się nie podoba. 
1. Według książki, a więc według nabytej przeze mnie wiedzy struktury powinny być deklarowane poza funkcją main(). Tak więc na Twoim miejscu wywaliłbym całą definicję struktury przed funkcję main(). 
2. Zmienna logiczna 'a' nic nam nie mówi o tym, do czego służy. Trzeba się domyślić jej przeznaczenia, a to trochę niedobrze, zwłaszcza przy rozbudowanych projektach. 
3. Zrezygnowałbym ze zmiennej typu logicznego i zamiast tego w warunku pętli while wstawiłbym ch != 'q'. Dzięki temu po przekazaniu wartości q po prostu kończylibyśmy program. Komunikat "do zobaczenia!" można wstawić po prostu za pętlę while i w ten sposób pozbywasz się całego case 'q'.  

Ogółem wkleję Ci swój kod: 
 

#include <iostream>

const int strsize = 80;
const int iniSize = 3;

void menu();

struct zpdw
{
    char imie[strsize];
    char stanowisko[strsize];
    char pseudozpdw[strsize];
    int preferencje;
};

int main()
{
    using namespace std;

    zpdw inicjuj[iniSize] =
    {
        {"Wimp Macho", "Programista", "Maki", 2},
        {"Raki Rhodes", "Szkoleniowiec analitykow", "Maka Paka", 1},
        {"Hoppy Hipman", "Grafik", "Graffi", 0}
    };

    menu();
    char ch;
    cout << "Wybierz jedna z opcji: ";
    cin >> ch;
    while (ch != 'q')
    {

        switch (ch)
        {
            case 'a':
            {
                for (int i = 0; i < iniSize; i++)
                    cout << inicjuj[i].imie << endl;
                break;
            }
            case 'b':
            {
                for (int i = 0; i < iniSize; i++)
                    cout << inicjuj[i].stanowisko << endl;
                break;
            }
            case 'c':
            {
                for (int i = 0; i < iniSize; i++)
                    cout << inicjuj[i].pseudozpdw << endl;
                break;
            }
            case 'd':
            {
                for (int i = 0; i < iniSize; i++)
                {
                    switch (inicjuj[i].preferencje)
                    {
                        case 0: cout << inicjuj[i].imie << endl;
                                break;
                        case 1: cout << inicjuj[i].stanowisko << endl;
                                break;
                        case 2: cout << inicjuj[i].pseudozpdw << endl;
                                break;
                    }
                }
                break;
            }
        }
        if (ch == 'q')
            break;
        cout << "Wybierz jedna z opcji: ";
        cin >> ch;
    }
    cout << "Do zobaczenia!";



    return 0;
}

void menu()
{
    std::cout << "a. lista wg imion \t b. lista wg stanowisk \n";
    std::cout << "c. lista wg pseudonimow  d. lista wg preferencji \n";
    std::cout << "q. koniec \n";
}

 

komentarz 21 września 2020 przez tkz Nałogowiec (42,000 p.)

1. Według książki, a więc według nabytej przeze mnie wiedzy struktury powinny być deklarowane poza funkcją main(). Tak więc na Twoim miejscu wywaliłbym całą definicję struktury przed funkcję main(). 

A jakie będą z tego korzyści?

 

komentarz 21 września 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
Zakładam, że chodzi o większą przejrzystość w kodzie, gdy definicje struktur są w jednym miejscu, a nie rozrzucone po całym programie. Wydaje mi się to dosyć dobrym argumentem, ale mogę się mylić.
komentarz 21 września 2020 przez tkz Nałogowiec (42,000 p.)
Chodzi bardziej o ich zasięg, nie widzę sensu, by była dostępna globalnie, tak samo jak rozmiary. Dobrą praktyką jest maksymalne zawężenie widoczności zmiennych.
komentarz 21 września 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
Okej, rozumiem. Czyli w zasadzie wszystko rozchodzi się o to, czy użyjemy danych obiektów w innych miejscach.
komentarz 21 września 2020 przez mokrowski Mędrzec (155,460 p.)
main() dalej ma zbyt szeroką odpowiedzialność. "Gra, śpiewa i krawaty wiąże" :)
komentarz 22 września 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
Tak, wiem, teraz bym to trochę inaczej zrobił, przeniósłbym switch'a do jakiejś funkcji i tam rozważał przypadki.
Dodatkowo mam zbędną instrukcję if w 71 linii, w zasadzie nie robi zbyt wiele.

Podobne pytania

0 głosów
2 odpowiedzi 695 wizyt
pytanie zadane 18 listopada 2018 w C i C++ przez Rosol Kuba Początkujący (380 p.)
0 głosów
1 odpowiedź 369 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez look Użytkownik (520 p.)
0 głosów
0 odpowiedzi 486 wizyt
pytanie zadane 11 listopada 2019 w C i C++ przez CleaverMan Nowicjusz (140 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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!

...