Dlaczego program nie zwraca wartości?

0

Treść zadania:

Cena doby hotelowej wynosi 150zl latem i zima, 120 wiosna, jesienia 100. Napisz funkcje, która dla parametru typu wyliczeniowego postaci enum poraRoku{WIOSNA,LATO,JESIEN,ZIMA}; zwróci poprawną cenę doby hotelowej.


#include <stdafx.h>
#include <iostream>
#include <conio.h>
using namespace std;
enum poraRoku{WIOSNA,LATO,JESIEN,ZIMA};

int main()
{	short poraRoku;
	cout<<"Podaj pore roku: ";
	cin>>poraRoku;
	
	switch(poraRoku)
	{
		case WIOSNA:
			cout<<"Cena za dobe hotelowa: 120zl.";
			break;
		case LATO: case ZIMA:
			cout<<"Cena za dobe hotelowa: 150zl.";
			break;
			case JESIEN:
				cout<<"Cena za dobe hotelowa: 100zl.";
				break;
			
	};
	return 0;
}

Dlaczego nie zwraca on przypisanej wartości?

0

Jak wpiszesz 0, 1, 2 lub 3 -- to powinine wyświetlać (nie zwracać)... :)

0

To jak w takim razie zrobić żeby np wpisując WIOSNA wyświetlił mi to co mam wpisane w case WIOSNA?

0

Zadeklaruj zmienną poraRoku jako string.

0

Już tego próbowałem, wtedy niby ze switch jest problem. I ogólnie dobry tok myślenia? Czy spróbować zapisać ten program inaczej?

0

Deklarujesz obiekt typu string. Do tego obiektu wczytujesz słowo za pomocą cin. Robisz warunek:: jeżeli obiekt typu string == "wiosna" to wartość zmiennej poryRoku ustaw na 0.

0

Zmienna w switchu musi być liczbą całkowitą.

0

Możesz użyć mapy

#include <iostream>
#include <cctype>
#include <unordered_map>
#include <algorithm>
#include <string>


int GetPrice(std::string& season)
{
   int price = -1;
   static std::unordered_map< std::string, int > seasons{ { "wiosna", 120 },{ "lato", 150 },{ "jesien", 100 },{ "zima", 150 } };
   std::transform( season.begin(), season.end(), season.begin(), std::tolower );
   auto iter = seasons.find( season );
   if (iter != seasons.cend()) {
      price = iter->second;
   }
   return price;
}


int main(int argc, char** argv)
{
   
   std::string input;
   std::cout << "podaj pore roku: ";
   std::cin >> input;
   std::cout << "Cena za dobe hotelowa: " << GetPrice( input ) << "\n";
   return 0;
}
0

Tylko, że to musi być ten typ wyliczeniowy enum i tego nie mogę zmienić bo tak jest w poleceniu zadania ;). W jaki sposób mam zapisać, żeby zmieniało mi wartość na 0? Próbowałem zrobić to tak:

string poraRoku;
cout<<"Podaj pore roku";
cin>>poraRoku;
if(poraRoku=="WIOSNA")
{
poraRoku=0;}
else if (poraRoku=="LATO"){ poraRoku=1;}
... itd.

ale mi nie działa ;(

0

Wartosc w ifie nadajesz zmiennej typu int ktora masz w switchu.

0

A nie mogę tego zapisać w tej postaci?

#include <iostream>
using namespace std;
enum poraRoku{WIOSNA=120,LATO=150,JESIEN=100,ZIMA=150};

int main()
{
    poraRoku cena = WIOSNA;
    cout<<"Cena za dobe hotelowa wiosna: " <<cena <<"zl"<<endl;
    cena = LATO;
    cout<<"Cena za dobe hotelowa latem: " <<cena <<"zl"<<endl;
    cena = JESIEN;
    cout<<"Cena za dobe hotelowa jesienia " <<cena <<"zl"<<endl;
    cena = ZIMA;
    cout<<"Cena za dobe hotelowa zima " <<cena <<"zl"<<endl;
    getchar();
}
0

Wg mnie to powinno być jakoś tak:

#include <iostream>
#include <string>
#include <map>

enum class Season { winter, spring, summer, autumn };

int GetPrice(Season season) 
{
  switch (season) {
  case Season::winter:
  case Season::summer:
    return 150;
  case Season::spring:
    return 120;
  case Season::autumn:
    return 100;
  default:
    std::cerr << "Nieznana wartosc!\n";
    return -1;
  }
}

int main() 
{
  std::map<std::string, Season> seasonalPrices{
     {"zima", Season::winter},
     {"wiosna", Season::spring},
     {"lato", Season::summer},
     {"jesien", Season::autumn}
   };
  for (auto const &seasonPrice : seasonalPrices) {
    std::cout << "Cena w sezonie " << seasonPrice.first << " wynosi "
              << GetPrice(seasonPrice.second) << '\n';
  }
}

https://ideone.com/mHBPpa

0

Raczej nie powinno być tak, to jest zadanie na egzamin :D a my nie przerabialiśmy map :) Ma ktoś jeszcze jakieś inne pomysły?

0

Zamiast mapy możesz użyć struktury i tablicy struktur.

Napisz funkcje, która dla parametru typu wyliczeniowego postaci enum ... zwróci poprawną cenę doby hotelowej.

Funkcja GetPrice spełnia wymagania zadania. Funkcja główna jest napisana tylko dla testu i możesz napisać ją po swojemu.
Nie widzę żadnego problemu.

0
#include <iostream>
#include <string>

enum poryRoku{WIOSNA=120,LATO=150,JESIEN=100,ZIMA=150};

poryRoku pobierzCene(std::string a)
{
    if(a=="wiosna")
        return WIOSNA;
    if(a=="lato")
        return LATO;
    if(a=="jesien")
        return JESIEN;
    if(a=="zima")
        return ZIMA;
}

int main()
{
    std::string pory;
    std::cout << "Podaj pore roku: ";
    std::cin >> pory;
    std::cout << "Cena doby hotelowej wynosi: " << pobierzCene(pory) << " zlotych";
    return 0;
}
0

A gdzie jest zawarte w tym kodzie

Napisz funkcje, która dla parametru typu wyliczeniowego postaci enum

?

0

Nic innego mi nie przychodzi do głowy:

#include <iostream>
#include <string>

enum poraRoku{WIOSNA,LATO,JESIEN,ZIMA};

int pobierzCene(poraRoku a)
{
    int b;
    switch(a)
    {
    case WIOSNA:
        b=120;
        break;
    case LATO:
        b=150;
        break;
    case JESIEN:
        b=100;
        break;
    case ZIMA:
        b=150;
        break;
    }
    return b;
}

int main()
{
    std::string wybor;
    std::cout << "Podaj pore roku: ";
    std::cin >> wybor;
    poraRoku pora;
    if(wybor=="wiosna")
        pora=WIOSNA;
    if(wybor=="lato")
        pora=LATO;
    if(wybor=="jesien")
        pora=JESIEN;
    if(wybor=="zima")
        pora=ZIMA;

    std::cout << "Cena doby hotelowej wynosi: " << pobierzCene(pora)<< " zlotych";
    return 0;
}
1
int pobierzCene(poraRoku a)
{
    int b;
    switch(a)
    {
    case WIOSNA:
        b=120;
        break;
    case LATO:
        b=150;
        break;
    case JESIEN:
        b=100;
        break;
    case ZIMA:
        b=150;
        break;
    }
    return b;
}

Zmienna b w ogóle nie jest potrzebna – można o wiele prościej i krócej:

int pobierzCene(poraRoku a)
{
  switch(a)
  {
    case WIOSNA: return 120;
    case LATO:   return 150;
    case JESIEN: return 100;
    case ZIMA:   return 150;
  }
}
0

Próbowałem tak i nie kompilował mi się program. A to dlatego, że funkcje napisałem typu poraRoku, a dopiero później zmieniłem na int.

0

Dzięki za pomoc ;)

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