Szlifowanie instrukcji switch.

0

Witam, miałem takie zadanie: Napisz instrukcję switch, która wyznaczy i zwróci jako wartość ocenę na podstawie punktów na zasadzie:

0-10 jedynka
11-13 dwojka
14-16 trojka
17-18 czworka
#include <iostream>

using namespace std;

int punkty;

int main()
{
    cout << "Podaj liczbe punktow:";
    cin >> punkty;

    if (punkty<0||punkty>18)
        cout << "Podales niepoprawna liczbe punktow.";

    switch (punkty)
    {
    case 0:
        cout << "Twoja ocena to jedynka!";
        break;
    case 1:
        cout << "Twoja ocena to jedynka!";
        break;
    case 2:
        cout << "Twoja ocena to jedynka!";
        break;
    case 3:
        cout << "Twoja ocena to jedynka!";
        break;
    case 4:
        cout << "Twoja ocena to jedynka!";
        break;
    case 5:
        cout << "Twoja ocena to jedynka!";
        break;
    case 6:
        cout << "Twoja ocena to jedynka!";
        break;
    case 7:
        cout << "Twoja ocena to jedynka!";
        break;
    case 8:
        cout << "Twoja ocena to jedynka!";
        break;
    case 9:
        cout << "Twoja ocena to jedynka!";
        break;
    case 10:
        cout << "Twoja ocena to jedynka!";
        break;
    case 11:
        cout << "Twoja ocena to dwojka!";
        break;
    case 12:
        cout << "Twoja ocena to dwojka!";
        break;
    case 13:
        cout << "Twoja ocena to dwojka!";
        break;
    case 14:
        cout << "Twoja ocena to trojka!";
        break;
    case 15:
        cout << "Twoja ocena to trojka!";
        break;
    case 16:
        cout << "Twoja ocena to trojka!";
        break;
    case 17:
        cout << "Twoja ocena to czworka!";
        break;
    case 18:
        cout << "Twoja ocena to czworka!";
        break;
    }
}

Zastanawia mnie, czy jest jakiś sposób żeby zamiast do kazdej liczby pisac osobna instrukcje jest możliwość dania np: 0-10 cout << "Jedynka"; w switch'u? Bo w if"ach to wiem że można napisać.

0

Możesz na przykład przypisać rezultat do zmiennej. Kod nadal będzie zduplikowany, choć przynajmniej w mniejszym stopniu.

2

Nie dawaj break po case'ach, które mają identyczne zachowanie:

switch(ocena){
case 0:
case 1:
case 2:
//...
case 10: return 1;
}

Nowsze kompilatory mogą o to płakać, wtedy wypada użyć atrybutu [[fallthrough]] - http://en.cppreference.com/w/cpp/language/attributes

1

Ogólnie switch to raczej średnia praktyka, ja ich unikam, najczęściej zastępuję je arrayami, ifami albo polimorfizmem. Twoje zadanie, jeśli już muszę użyć tego switch to zrobiłbym:

    if (punkty < 0 || punkty > 18) {
        cout << "Podales niepoprawna liczbe punktow.";
    }

    int ocena = 1;
    if (punkty >= 11) ocena = 2;
    if (punkty >= 14) ocena = 3;
    if (punkty >= 17) ocena = 4;

    switch (ocena)
    {
    case 1:
        cout << "Twoja ocena to jedynka!";
        break;
    case 2:
        cout << "Twoja ocena to dwojka!";
        break;
    case 3:
        cout << "Twoja ocena to trojka!";
        break;
    case 4:
        cout << "Twoja ocena to czworka!";
        break;
    }
0

można by jeszcze wydzielić string "Twoja ocena to " do osobnej zmiennej, bo i tak jest niepotrzebna duplikacja.

0

Ale tak na prawdę powinno się zrobić

char* oceny[] = {
  "Twoja ocena to jedynka!", "Twoja ocena to dwójka!", "Twoja ocena to trójka", "Twoja ocena to czwórka!"
};
std::cout << oceny[ocena - 1];
1

Dziękuję wszystkim za tak liczne i szybkie odpowiedzi :)
@TomRiddle Dzięki twojemu rozwiązaniu (tego pierwszego) zdałem sobie sprawę, że wcale nie pomyślałem o takim sposobie jego rozwiązania, a sztywnie trzymałem się wzoru?
Pewien człowiek powiedział, że do najtrudniejszych zadań wyznacza najleniwsze osoby, widzę że warto sobie upraszczać programowanie :) Może ułatwianie sobie zadania przyjdzie wraz ze stażem? :)

1

@DoYeahBunny: Myślę że nie zastanowiłeś się nad zadaniem. Sam powiedziałeś że zadanie brzmiało tak, że musisz wypisać:

0-10 jedynka
11-13 dwojka
14-16 trojka
17-18 czworka

Cztery linijki, wiec ja tu widzę 4 ify. Od razu trafiło do mnie że te Twoje 18 switch-case'ów jest niepotrzebne. Jestem pewien że też byś na to wpadł, gdybyś przeanalizował czego wymaga program do działania.

0

@TomRiddle: Ja natomiast pomyślałem nie o ocenasz (1-4) tylko o punktach których jest prawie 5 razy więcej niż ocen :)
Do każdego następnego zadania będe się starał podchodzić myśląc najpierw jak je najlepiej rozwiązać. Mam nadzieję, że spotkamy się kiedyś jeszcze pod moim postem, tym razem z bardziej zaawansowanym zadaniem

1 użytkowników online, w tym zalogowanych: 0, gości: 1