Projektowanie algortmu przydziału uczniów – prośba o podpowiedź

0

Zastanawiam się jak podejść do tego podpowie ktoś?
Zaprojektuj algorytm przydziału uczniów w szkole językowej do grup językowych na podstawie wyniku testu wstępnego - zgodnie z poniższą tabelą. Wynik testu jest liczbą całkowitą, nieujemną.

Wynik testu     	Grupa
0-29	podstawowa
30-49	średniozaawansowana
50-70	zaawansowana

Podaj specyfikację problemu, zaś algorytm przedstaw w postaci schematu blokowego oraz w postaci programu w języku C++.

Przykłady:

Dane:

35

Wynik:

sredniozaawansowana

Dane:

15

Wynik:

podstawowa

Dane:

50

Wynik:

zaawansowana
1

Przyjmujesz wynik i sprawdzasz w którym zakresie się mieści, a następnie na tej podstawie przydzielasz grupę.

0

Po pierwsze piszesz testy, które opisują wymagania co do algorytmu.
Testy są najlepszą metodą opisu problemu, bo jest to napisane językiem sformalizowanym, więc opis ten automatem jest jednoznaczny.
Wszelkie niepewności oznaczają brak kolejnego testu.

Sam podział uczniów ze względu na jakie klasy uzyskali wynik to zdecydowanie za mało.
Na pewno są warunki brzegowe, które wymagają dodatkowych wymagań, typu:

  • grupa nie może być mniejsza niż
  • grupa nie może być większa niż
0

Tylko zastanawiam się w jaki sposob do tego podejsc

4

Jeśli rzecz się sprowadza do podania wyniku testu który będzie wyliczony oddzielnie to sprawa jest banalna - piszesz funkcję np taką:
(w tej implementacji jest @Nency Black: trochę hacków. Wyjaśnię w komentarzach)

std::string whichGroup(int testResult)
{
    if (testResult >= 50)//zaczynając porównanie >= od dolnego zakresu powoduję, że każdy rezultat testu jaki zostanie przesłany lepszy od 49 się załapie, nawet jakby było to 1000
    {
        return "Zaawansowana";//powrót z funkcji powoduje, że reszta warunków nie jest sprawdzana
    }

    if (testResult >= 30)//tutaj podobny hack jak wyżej, każda liczba od 30 do 49 się załapie. A dlaczego 50 nie, w końcu przecież 50 >= 30? Ponieważ 50 wpadnie w warunek wyżej, i do tego miejsca wykonywanie kodu nie dotrze
    {
        return "Średnio zaawansowana";
    }

//ostatni hack działa na zasadach podobnych do powyższych, ale czemu nie ma sprawdzania tylko od razu zwracanie? Z prostego powodu, jakby rezultat testu pasował do któregoś if-a to by funkcja zakończyła się wcześniej. Skoro kod dotarł tutaj to oznacza, że grupy zaawansowana i średnio zaawansowana nie pasowały, więc już nic innego niż początkująca nie pozostało.   
    return "Podstawowa"
}

i masz co chciałaś.
EDIT:
@kq mi w komentarzach marudził, że tak trochę niedydaktycznie to zapisane, więc proszę - wersja "przesadnie zgodnie z regułami sztuki" wyglądałaby następująco:

std::string whichGroup(unsigned int testResult)//tutaj maleńki hack uodparniający na przesłanie ujemnej wartości
{
   if (testResult >= 50 && testResult <= 70)
   {
      return "Zaawansowana";
   }
   else if (testResult >= 30 && testResult <= 49)
   {
      return "Średnio zaawansowana";
   }
   else if (testResult >= 0 && testResult <= 29)
   {
      return "Podstawowa";
   }
}
0

Okej już rozumiem
Wytłumaczycie jeszcze jak robić schematy blokowe do takich zadan? Bo dopiero uczę się sama tego wszystkiego

0

każdy if rysujesz jako rąb, każdą grupę instrukcji jako prostokąt.
łączysz strzałkami tak jak idzie przepływ logiki.
https://pl.wikipedia.org/wiki/Schemat_blokowy

1

Tak?

To wystarczy, że dam strzałki do stop czy muszę pod każdym pisać? A ta specyfikacja problemu to jak to wyjaśnić?

2

Masz @Nency Black mały błąd na diagramie, dotyczący warunku - powinno być >= żeby i 50 oraz 30 załapywał do wyższego przedziału.
Ale generalnie to całkiem zgrabny zapis mojego kodu w wersji uproszczonej hackami.

0

a w codeblocks
tak to zapisać , czy jak bo mi się jakiś błąd pojawia?

#include <iostream>

using namespace std;



    std::string whichGroup(unsigned int testResult)
{
   if (testResult >= 50 && testResult <= 70)
   {
      return "Zaawansowana";
   }
   else if (testResult >= 30 && testResult <= 49)
   {
      return "Średnio zaawansowana";
   }
   else if (testResult >= 0 && testResult <= 29)
   {
      return "Podstawowa";
   }
}
0

Taki bład

1

To najprościej będzie utworzyć nowy projekt, Windows32 Console Application, i jak Ci potworzy main.cpp który się będzie kompilował to przenieś do niego cały kod funkcji whichGroup()

0
#include <iostream>

using namespace std;
int main()
{

 std::string whichGroup(unsigned int testResult)
    {


   if (testResult >= 50 && testResult <= 70)
   {
      return "Zaawansowana";
   }
   else if (testResult >= 30 && testResult <= 49)
   {
      return "Œrednio zaawansowana";
   }
   else if (testResult >= 0 && testResult <= 29)
   {
      return "Podstawowa";
   }
}

}

to mam

main.cpp: In function ‘int main()’:
main.cpp:8:5: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
main.cpp:25:1: error: expected ‘}’ at end of input
 }
 ^
1

No już prawie dobrze. Popełniłaś błąd próbując definiować jedną funkcję we wnętrzu drugiej. Tak powinno to wyglądać:

#include <iostream> 
using namespace std;

string whichGroup(unsigned int testResult)//skoro jest using namespace std to można std::string zapisać jako samo string;
{ 
   if (testResult >= 50 && testResult <= 70)
   {
      return "Zaawansowana";
   }
   else if (testResult >= 30 && testResult <= 49)
   {
      return "Œrednio zaawansowana";
   }
   else if (testResult >= 0 && testResult <= 29)
   {
      return "Podstawowa";
   }
}

int main()
{
    int wynik = 31;
    cout << "Dla wyniku testu "<< wynik <<" właściwa grupa to " << whichGroup(wynik);

    return 0;
}

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