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

Pierwszy mini program

42 Warsaw Coding Academy
0 głosów
448 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez Mr. Satan Początkujący (390 p.)

No, po kilku próbach w końcu co nieco podłapałem i zrobiłem to: 

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <windows.h>
#include <stdio.h>

using namespace std;

int wybor, wynik;
string odp_0;


int main()
{
    for (;;)
{
        cout << "MENU GLOWNE"<<endl;
        cout << "-----------"<<endl;
        cout << "1. START"<<endl;
        cout << "2. WYJSCIE"<<endl;
        cout << "3. ZASADY"<<endl << endl;
        wybor = getch();
    switch (wybor){
    case '1':
        break;
    case '2':
        cout << "Moze innym razem!";
        exit (0);
        break;
    case '3':
       {cout << "Klikaj tylko numery odpowiadajace przyciskom, inaczej przegrasz!" <<endl << endl;
        continue;}}
    wybor = 0;
    cout << "A wiec zaczynajmy!"<<endl;

    for (int p=0; p<=2; p++){
        cout << "\a";
        Sleep (1000);}
    cout << endl<< "Pytanie nr 1. Co to jest pamiec RAM? "<<endl;
    cout << endl << "ODPOWIEDZI" << endl << "-----------"<<endl;
    cout << "1. Pamiec lotna komputera" << endl;
    cout << "2. Pamiec stala komputera" << endl << endl;
    wybor = getch();

    switch (wybor){
    case '1':
        {wynik++;
        cout << "Dobrze! Czy chcesz grac dalej?: ";
        cin >> odp_0;
        if (!((odp_0=="Tak")||(odp_0=="tak")))
        {
            cout << "W takim razie koniec! Twoj wynik wynosi: " << wynik;
            exit(0);
        }break;}
    case '2':
        {
            cout << "Zla odpowiedz! Konczysz gre! Twoj wynik: "<<wynik << endl;
            Sleep (1000);
            cout << "Czy chcesz zagrac jeszcze raz?: ";
            cin >> odp_0;
            if ((odp_0=="Tak")||(odp_0=="tak")){
                Sleep (1000);
                system("cls");
                continue;}
                else
                {
                    cout << "Moze innym razem!";
                    exit(0);
                }break;}
    default:{
        cerr << "To nie jest zadna z odpowiedzi, a wiec przegrywasz! " << endl;
        Sleep (1000);
        cout << "Chcesz sprobowac jeszcze raz?: ";
        cin >> odp_0;
        if (!((odp_0=="Tak")||(odp_0=="tak"))){
            cout << "Moze innym razem! Twoj wynik: " << wynik;
            exit(0);
        }break;}}
    cout << "Pytanie nr 2. Podnoszac liczbe -10 do trzeciej potegi otrzymamy: "<<endl;
    cout << endl << "ODPOWIEDZI" << endl << "-----------"<<endl;
    cout << "1. 1000" << endl;
    cout << "2. -1000" << endl;
    cout << "3. 100" << endl;
    cout << "4. -100" << endl;
    wybor = getch();

    switch (wybor){
    case '2':{
    wynik++;
    cout << "Poprawna odpowiedz! Chcesz grac dalej?: ";
    cin >> odp_0;
        if (!((odp_0=="Tak")||(odp_0=="tak")))
        {
            cout << "W takim razie koniec! Twoj wynik wynosi: " << wynik;
            exit(0);
        }break;}
    case '1':
    case '3':
    case '4':
        {
            cout << "Zla odpowiedz! Przegrywasz! Twoj wynik: "<<wynik<<endl;
            Sleep (1000);
            cout << "Chcesz zagrac jeszcze raz?: ";
            cin >> odp_0;
            if (!((odp_0=="Tak")||(odp_0=="tak"))){
            cout << "Moze innym razem! Twoj wynik: " << wynik;
            exit(0);}
            else{system("cls"); continue;} break;}
    default:{
        cerr << "To nie jest zadna z odpowiedzi, a wiec przegrywasz! " << endl;
        Sleep (1000);
        cout << "Chcesz sprobowac jeszcze raz?: ";
        cin >> odp_0;
        if (!((odp_0=="Tak")||(odp_0=="tak"))){
            cout << "Moze innym razem! Twoj wynik: " << wynik;
            exit(0);
        }
        else{system("cls"); continue; }
             break;}}
wynik=0;
}
return 0;
}

Co sądzicie na temat powyższego kodu? Jest w miarę ładnie zapisany? Co byście zmienili, by go bardziej uprościć? :) Wszystkie opcje powinny działać, ale jak ktoś coś zauważy niechaj da znać. Wszelka krytyka mile widziana. 

3 odpowiedzi

+2 głosów
odpowiedź 7 listopada 2015 przez niezalogowany
wybrane 8 listopada 2015 przez Mr. Satan
 
Najlepsza
Czy jest ładnie napisany? Jeny, przecież to okropnie wygląda! Nieczytelne, brzydko postawione klamry w wcięcia, nawiasów w cholerę... Mam to poprawić na ładniejsze, żebyś zobaczył jak jest dobrze?
komentarz 7 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Poproszę laugh

Dzięki temu będę wiedział na co uważać w przyszłości i jak to porządnie wykonać ^^ 

komentarz 7 listopada 2015 przez niezalogowany
No i o to chodzi ;) Poczekaj tylko chwilkę :)
komentarz 7 listopada 2015 przez niezalogowany
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <windows.h>
#include <stdio.h>

using namespace std;

int wybor, wynik;
string odp_0;

int main()
{
    for (;;)
    {
        cout << "MENU GLOWNE"<<endl;
        cout << "-----------"<<endl;
        cout << "1. START"<<endl;
        cout << "2. WYJSCIE"<<endl;
        cout << "3. ZASADY"<<endl << endl;

        wybor = getch();
        switch (wybor)
        {
        case '1':
            break;
        case '2':
            cout << "Moze innym razem!";
            exit (0);
            break;
        case '3':
            cout << "Klikaj tylko numery odpowiadajace przyciskom, inaczej przegrasz!" <<endl << endl;
            continue;
        }
        wybor = 0;
        cout << "A wiec zaczynajmy!"<<endl;

        for (int p=0; p<=2; p++)
        {
            cout << "\a";
            Sleep (1000);
        }

        cout << endl<< "Pytanie nr 1. Co to jest pamiec RAM? "<<endl;
        cout << endl << "ODPOWIEDZI" << endl << "-----------"<<endl;
        cout << "1. Pamiec lotna komputera" << endl;
        cout << "2. Pamiec stala komputera" << endl << endl;

        wybor = getch();

        switch (wybor)
        {
        case '1':
            wynik++;
            cout << "Dobrze! Czy chcesz grac dalej?: ";
            cin >> odp_0;

            if (!(odp_0=="Tak"||odp_0=="tak"))
            {
                cout << "W takim razie koniec! Twoj wynik wynosi: " << wynik;
                exit(0);
            }
            break;
        case '2':
            cout << "Zla odpowiedz! Konczysz gre! Twoj wynik: "<<wynik << endl;
            Sleep (1000);

            cout << "Czy chcesz zagrac jeszcze raz?: ";
            cin >> odp_0;

            if (odp_0=="Tak"||odp_0=="tak")
            {
                Sleep (1000);
                system("cls");
                continue;
            }
            else
            {
                cout << "Moze innym razem!";
                exit(0);
            }
            break;
        default:
            cerr << "To nie jest zadna z odpowiedzi, a wiec przegrywasz! " << endl;
            Sleep (1000);

            cout << "Chcesz sprobowac jeszcze raz?: ";
            cin >> odp_0;
            if (!(odp_0=="Tak"||odp_0=="tak"))
            {
                cout << "Moze innym razem! Twoj wynik: " << wynik;
                exit(0);
            }
            break;
        }
        cout << "Pytanie nr 2. Podnoszac liczbe -10 do trzeciej potegi otrzymamy: "<<endl;
        cout << endl << "ODPOWIEDZI" << endl << "-----------"<<endl;
        cout << "1. 1000" << endl;
        cout << "2. -1000" << endl;
        cout << "3. 100" << endl;
        cout << "4. -100" << endl;

        wybor = getch();

        switch (wybor)
        {
        case '2':
            wynik++;
            cout << "Poprawna odpowiedz! Chcesz grac dalej?: ";
            cin >> odp_0;

            if (!(odp_0=="Tak"||odp_0=="tak"))
            {
                cout << "W takim razie koniec! Twoj wynik wynosi: " << wynik;
                exit(0);
            }
            break;
        case '1':
        case '3':
        case '4':
            cout << "Zla odpowiedz! Przegrywasz! Twoj wynik: "<<wynik<<endl;
            Sleep (1000);

            cout << "Chcesz zagrac jeszcze raz?: ";
            cin >> odp_0;

            if (!(odp_0=="Tak"||odp_0=="tak"))
            {
                cout << "Moze innym razem! Twoj wynik: " << wynik;
                exit(0);
            }
            else
            {
                system("cls");
                continue;
            }
            break;
        default:
            cerr << "To nie jest zadna z odpowiedzi, a wiec przegrywasz! " << endl;
            Sleep (1000);

            cout << "Chcesz sprobowac jeszcze raz?: ";
            cin >> odp_0;

            if (!(odp_0=="Tak"||odp_0=="tak"))
            {
                cout << "Moze innym razem! Twoj wynik: " << wynik;
                exit(0);
            }
            else
            {
                system("cls");
                continue;
            }
            break;
        }
        wynik=0;
    }
    return 0;
}

 

komentarz 7 listopada 2015 przez niezalogowany

Ufff, dobra, to jest poprawiony kod. Porównaj go sobie ze swoim i zagraj w ,,znajdź różnice" ;) Jest parę uwag:

  • Nie używaj tylu klamer. Na przykład w switchu wystarczy zrobić tak:
case '1':
    cout << "Czesc :)" << endl;
    break;

case '1':
{ //nie potrzeba tej klamry
    cout << "Czesc :)" << endl;
    break;
} //i tej tez
  • Nie używaj tylu nawiasów:
if(imie=="Jan"&&nazwisko=="Kowalski")
{
    cout << imie << " " << nazwisko << " lubi placki." << endl;
    getchar();
}

if((imie=="Jan")&&(nazwisko=="Kowalski")) //nie potrzeba az tylu nawiasow
{
    cout << imie << " " << nazwisko << " lubi placki." << endl;
    getchar();
}
  • Rób wcięcia i uporządkowuj klamry, dzięki którym widać gdzie co się gdzie kończy:
for(int i=0;i<10;i++)
{
    for(int j=0;j<20;j++)
    {
        for(int k=0;k<30;k++)
        {
            switch(i)
            {
                case j:
                    cout << "i jest rowne j" << endl;
                    break;
                case k:
                    cout << "i jest rowne k" << endl;
                    break;
            }
        }
    }
}

for(int i=0;i<10;i++){
    for(int j=0;j<20;j++){
        for(int k=0;k<30;k++){
            switch(i){
                case j:
                cout << "i jest rowne j" << endl;
                break;
                case k:
                cout << "i jest rowne k" << endl;
                break;
        }
        }
      }
}
  • Rób ogólnie więcej linii wolnych, wtedy te linijki kodu nie są ze sobą takie sklejone, kod wygląda przejrzyściej.

No, to chyba tyle ;)

komentarz 7 listopada 2015 przez niezalogowany
Aha! I pamiętaj, że w Code::Blocks'ie możesz poprawić wcięcia (tylko wcięcia, więc lepiej po prostu porządnie pisać) wciskając Prawy Przycisk Myszy > Format use AStyle ;)
komentarz 7 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Wow, to wygląda naprawdę o niebo lepiej laugh Czyli generalnie muszę wszystko bardziej uporządkowywać, i mnie, i innym (sprawdzającym) będzie łatwiej :) 

Jeszcze mam pytanie, ale tutaj już odnośnie continue oraz tablic. Continue tutaj to najlepsze rozwiązanie, czy są jakieś lepsze? :P 

 

A z tablicami sprawa trudniejsza, bo powiedzmy miałbym tablicę z pięcioma miejscami, a w nich zagadki. I chciałbym, by były losowo powtarzane i nie powtarzały się, czyli po wylosowaniu 0, później 3, i znów 0 było ponowione losowanie. Da się zrobić, ale nie za bardzo wiem jak. Ponadto mógłbyś mi podrzucić jakiś dobry link, do czego służy bool? 

 

I generalnie wielkie dziękuję za pomoc wink

komentarz 7 listopada 2015 przez Rogargol Pasjonat (16,610 p.)
Moglbys zrobic jeszcze jedna tablice wlasnie typu bool (ten typ przechowuje tylko dwa mozliwe stany, prawda lub fałsz 0 lub 1) i po wylosowaniu np pytania nr 3 w tablicy bool w polu 3 wstawialbys sobie wartosc true. Wtedy losujac odpowiedz moglbys sprawdzic czy pod tym numerem w tablicy bool jest true (wtedy losowalbys jeszcze raz), czy false i mozesz wyswietlic to pytanie.
komentarz 7 listopada 2015 przez niezalogowany
Hm, nie jestem pewien czy jest coś bardziej odpowiedniego niż continue (może break?), ale to raczej dobre rozwiązanie.

Rogargol był szybszy i myślę, że dobrze to wytłumaczył :)
komentarz 8 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Dziękuję Wam, teraz tylko douczyć się i zobaczyć jak mniej więcej wygląda bool oraz jego zastosowanie, i do roboty smiley I przede wszystkim dziękuję za cenne rady, teraz będzie mi łatwiej robić bardziej porządnie wyglądający kod :) 

+1 głos
odpowiedź 7 listopada 2015 przez Damian11131 Stary wyjadacz (13,490 p.)
Wcięcia są źle zrobione i klamry stawiasz na 2 sposoby, używaj jednego.
komentarz 7 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Racja, celna uwaga. Klamry mogłem bardziej posegregować laugh

Co do wcięć, jakiś pomysł jak je układać, by było to wszystko bardziej czytelne? :) 

komentarz 7 listopada 2015 przez Michał628496 Pasjonat (17,340 p.)

np tak:

while(warunek)
{
    if(warunek2)
    {
        cout<<"Hello World";

    }

}

 

komentarz 7 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Tak, zdecydowanie czytelniejsze, tylko wtedy jest ciut więcej linii kodu. Ale myślę, że tak będzie lepiej, choćby z 200 linii zrobiłoby się 300 smiley

komentarz 7 listopada 2015 przez Damian11131 Stary wyjadacz (13,490 p.)

Po rozpoczęciu nowego bloku instrukcji za klamrą postaw enter i w każdej linii stawiaj po JEDNYM wcięciu, zawsze tego się trzymaj, ale co ja będę ci mówić, spójrz na przykład :) 

#include <iostream>

using namespace std;

int main()
{
    char jakasLitera;
    for(;;)
    {
        cout<<"Wpisz jakas litere: ";
        cin>>jakasLitera;
        switch(jakasLitera)
        {
            case 'a':
                cout<<"Wpisales litere a!\n";
            break;
            case 'b':
                cout<<"Wpisales litere b!\n";
            break;
            case 'c':
                cout<<"Wpisales litere c!\n";
            break;
            default:
                for(unsigned short i=0;i<10;i++)
                {
                    cout<<"Wpisales cos innego!\n";
                    cout<<"i= "<<i<<endl;
                    if(i==5)
                    {
                        cout<<"Jestem w polowie obiegu petli!\n";
                        cout<<"Cos pisze\n";
                    }
                    else
                    {
                        cout<<"i jest rozne od 5!\n";
                        cout<<"Cos pisze\n";
                    }
                }
            break;
        }
    }
    return 0;
}

 

komentarz 7 listopada 2015 przez Mr. Satan Początkujący (390 p.)

Oj zdecydowanie lepiej ;) Długa droga przede mną, przede wszystkim muszę wszystko spobie ładnie porządkować laugh

komentarz 7 listopada 2015 przez Damian11131 Stary wyjadacz (13,490 p.)
Naprawdę warto pilnować porządku w kodzie, znacznie ułatwia to jego interpretację zarówno tobie, jak i innemu programiście.
+1 głos
odpowiedź 8 listopada 2015 przez krzemionskyy Użytkownik (630 p.)

Oprócz tego o czym mówili poprzednicy, wywaliłbym te wszystkie pytania i odpowiedzi do pliku tekstowego , i przy pomocy pętli lub switcha wczytywał do programu. Kod byłby krótszy o conajmniej połowę, i łatwo skalowalny (wystarczyło by dodawać pytania i odpowiedzi w pliku .txt i zwiększyć liczbę przebiegów pętli lub switchów).

Poczytaj sobie o tym tutaj: http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305

Pozdrawiam.

komentarz 10 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Pomysł dobry, aczkolwiek idę tokiem nauczania z kanału pana Mirka, więc nie chcę wyprzedzać ;) Ale dziękuję za link, taki zabieg pozwoliłby mi na skrócenie kodu.

Podobne pytania

0 głosów
1 odpowiedź 458 wizyt
pytanie zadane 2 lutego 2016 w C i C++ przez dkarski Obywatel (1,610 p.)
+2 głosów
2 odpowiedzi 520 wizyt
pytanie zadane 24 grudnia 2015 w Inne języki przez hubertgz Użytkownik (510 p.)
0 głosów
2 odpowiedzi 226 wizyt
pytanie zadane 20 listopada 2015 w Nasze projekty przez RoXoR Początkujący (280 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,740 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...