zamiana liczb

0

Program ma zamieniać oceny cyfrowe na słowne.

P.S

zaraz dodam kod.

0
//program zamienia oceny cyfrowe na słowne

#include <iostream>
using namespace std;

int main()
{
    double ocena;
    cout << "Podaj ocene: ";
    cin >> ocena;

             if (ocena < 1.5)
             {
                 cout << "niedostateczny\n\n";
                 if (ocena > 1.5)
                 {
                         cout << "Dopuszczajacy\n\n";
                         if (ocena < 3.5)
                         { 
                               cout << "Dostateczny\n\n";
                               if (ocena < 4.5)
                               {
                                         cout << "Dobry\n\n";
                                          if (ocena < 5.5)
                                          {
                                                cout << "Bardzo dobry\n\n";
                                                if (ocena > 5.5)
                                                {
                                                           cout << "Celujacy\n\n";  
                                                }   

                                          }
                               }
                         }
                 }
              }

    system("pause");
    return 0;
}

Co jest nie tak? że dobrze wyświetla mi tylko dla ocen <= 1.4..?

1

W podstawowej wersji brakuje ci znajomości else.
W trochę lepszej wersji brakuje ci znajomości map<>
Zresztą widzisz chyba po sformatowanym kodzie jak przelatuje sterowanie. Do pierwszego ifa wchodzisz jak masz ocenę mniejszą od 1.5 i zapewniam cię że do drugiego ifa juz nie wejdziesz bo skoro ocena jest mniejsza od 1.5 to nie jest większa.

0

nie wkladaj ifa w ifa.

0

Można to wykonać bez ifów.

#include <iostream>

using namespace std;

int main(void)
 {
  double ocena;
  cin>>ocena;
  switch(int(ocena)+((ocena-int(ocena))>0.5))//Powinno starczyć switch(int(ocena)), ale ja sie nie znam na dzisiejszej edukacji
   {
    case 1  : cout << "niedostateczne\n"; break;
    case 2  : cout << "dopuszczajace\n"; break;
    case 3  : cout << "poprawne\n"; break;
    case 4  : cout << "dobre\n"; break;
    case 5  : cout << "bardzo dobre\n"; break;
    case 6  : cout << "celujace\n"; break;
    default : cout << "Ocena poza zakresem!\n";
   }
  return 0;
 }

Edit: dopiero teraz doczytałem o dziwnych wymogach, w nie nie bede sie bawil. Ogólnie zaokraglanie jest dziwne, sa oceny typu 2.53? Raczej nie, wiec zwykle zaokrąglenie do int'a i powinno być dobrze.
Edit 2:
Lepsze rozwiązanie:

#include <iostream>

using namespace std;

int main(void)
 {
  string oceny[7]={"Poza zakresem","niedostateczna","dopuszczajaca","poprawna","dobra","bardzo dobra","wzorowa"};
  double ocena;
  cin>>ocena;
  cout<< oceny[int((int(ocena)+((ocena-int(ocena))>0.5)) * ((ocena>=1)&&(ocena<=6)) )] <<'\n';

 return 0;
 }

Poprawione zgodnie z sugestią @Endrju

0

mozna po prostu zrobic ze switchami

0

można jeszcze inaczej do tego podejść coś na zasadzie obiektowej(raczej będę pisał samą idee niż całą uruchamialną implementację). Wiem że nie ma przekazywanie przez referencje itd. Takie coś na szybko.

class RangedRateAndDescription{
public:
  RangedRateAndDescription(int begin,int end,string OutRate) {/*...*/}
  string description;
  double begin;
  double end;
}; 

class WriteRangedRate{
private:
  vector<RangedRateAndDescription> rangRateAndDesc;

public:
  WriteRangedRate(vector<RangedRateAndDescription> rangRateAndDesc){/*...*/}
  void WriteRate(double rate)
  {
    for (int i = 0 ; i < rangRateAndDesc.size() ; i++)
    { 
       if (rangRateAndDesc[i].begin < rate)
         if(rangRateAndDesc[i].end > rate)
         {
           cout << rangRateAndDesc[i].description;
           break;
        }
    }
    cout << "Brak takiej oceny";
  }
};

użycie tego chyba raczej widoczne. Tworzymy wektor RangedRateAndDescription uzupełniamy go danymi jakimi chcemy. Następnie tworzymy obiekt WriteRangedRate na podstawie tego vectora i na WriteRangedRate wywołujemy WriteRate.

Zapewne można tą koncepcje lepiej zrobić ;)

edit. Nie wiem czy std::map może być zakresowa.

1

@fasadin mysle, ze nie ma sensu zaprzegac wektora do stalych wartosci ;)
Cos prostszego:

#include <iostream>
#include <string>
using namespace std;

struct ocena {
    string nazwa;
    double min;
    double max;
};

int main() {
    const ocena oceny[6] = {
        {"ndt", 0.0, 1.49},
        {"dop", 1.5, 2.49},
        {"dst", 2.5, 3.49},
        {"dbr", 3.5, 4.49},
        {"bdb", 4.5, 5.49},
        {"cel", 5.5, 6.00}
    };

    double o;
    cin >> o;

    for(size_t i = 0; i < 6; ++i) {
        if(o >= oceny[i].min && o <= oceny[i].max) {
            cout << oceny[i].nazwa << endl;
        }
    }

    return 0;
}
3

Przebijam wszystkich:
Wersja z precyzją do dwóch liczb po przecinku: http://pastebin.com/inmSzcNB
Wersja z precyzją do trzech liczb: http://pastebin.com/aXWNTCGk
Wersja dla 4 liczb po przecinku zajmuje już 4 MB, więc nie będę wrzucał, a 5 liczb po przecinku skutkuje kodem o milionie i 22 linijkach kodu oraz rozmiarze 37 MB ;P

Program użyty do generacji tego (jakby ktoś chciał się pobawić):
http://pastebin.com/FxHx9jRi

;]


Edit - wprowadziłem nieco zmian.

Generator:
http://pastebin.com/nzUrrJ9J

Wypluty kod:
http://pastebin.com/QbvWgnFJ


Disclaimer:
Oczywiście jest to jedynie przykład dodany w ramach żartu i pod żadnym pozorem nie należy takiego kodu 'w rzeczywistości' pisać!

0

I nikt nie podał żadnego sensownego podejścia:

#include <iostream>
using namespace std;

const char *toText(double value)
  {
   static const struct { const char *text; double max; } data[]= // zakresy, teksty oraz ilość można zmieniać ile wlezie, nić więcej nie trzeba zmianiać
      { // jedyne ograniczenie - mają stanowić ciąg wzrastający
       {"<<<", 0.0},
       {"ndt", 1.5},
       {"dop", 2.5},
       {"dst", 3.5},
       {"dbr", 4.5},
       {"bdb", 5.5},
       {"cel", 6.0},
       {">>>", 0.0} // tu (w ostatnim) wartość może być dowolna
      };
   size_t min=0,max=sizeof(data)/sizeof(*data)-1;
   while(min<max)
     {
      size_t mid=(max+min)>>1;
      if(data[mid].max<value) min=mid+1;
      else max=mid;
     }
   return data[min].text;
  }

int main()
  {
   double pt;
   while(cin>>pt) cout<<pt<<" -> "<<toText(pt)<<endl;
   return 0;
  }

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