enum, tablica i zamiana warunku if na for

0

Czy mógłby mnie ktoś uświadomić, czy jest możliwość zamiany warunków if na pętle for w takim kodzie:

#include<iostream>
#include<cstdio>
#include<conio.h>
#include<cstdlib>
using namespace std;
int main()
{
	system("chcp 1250");
	system("cls");
	string dzien;
		enum WeekDays{
			Poniedzialek, Wtorek, Sroda,Czwartek, Piatek, Sobota, Niedziela
		};
		int ArrayWeek[]={1, 2, 3, 4, 5, 6, 7};
		cout<<"Podaj dzien tygodnia: Poniedzialek, Wtorek, Sroda,Czwartek, Piatek, Sobota lub Niedziela\n";
		cin>>dzien;
		if(dzien=="Poniedzialek"){
			cout<<"Poniedziałek to "<<ArrayWeek[Poniedzialek]<<" dzień tygodnia";
		}
		if(dzien=="Wtorek"){
			cout<<"Wtorek to "<<ArrayWeek[Wtorek]<<" dzień tygodnia";
		}
		if(dzien=="Sroda"){
			cout<<"Środa to "<<ArrayWeek[Sroda]<<" dzień tygodnia";
		}
		if(dzien=="Czwartek"){
			cout<<"Czwartek to "<<ArrayWeek[Czwartek]<<" dzień tygodnia";
		}
		if(dzien=="Piatek"){
			cout<<"Piątek to "<<ArrayWeek[Piatek]<<" dzień tygodnia";
		}
		if(dzien=="Sobota"){
			cout<<"Sobota to"<<ArrayWeek[Sobota]<<" dzień tygodnia";
		}
		if(dzien=="Niedziela"){
			cout<<"Niedziela to "<<ArrayWeek[Niedziela]<<" dzień tygodnia";
		}
	getch();
	return 0;
}

Do tego trzeba by użyć wskaźników?
Podejrzewam, że dałoby się zrobić coś takiego, bo przecież gdybym miał w enumie więcej zmiennych, i w tablicy więcej elementów, to ciężko by było pisać ifa na okrągło. Niestety do wskaźników jeszcze mi daleko.

2

http://www.cplusplus.com/reference/map/map/

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

int main ()
{
  std::map<std::string,int> mymap;

  mymap["Poniedzialek"]=1;
  mymap["Wtorek"]=2;


  std::cout << "mymap[\"Poniedzialek\"] to " << mymap["Poniedzialek"] << " dzien tygodnia.";
  return 0;
}

Ew możesz zrobić tablicę stringów

std::string dzien = "Wtorek";
std::string tablica = { "Poniedzialek", "Wtorek", "Sroda"};
for(int i=0; i<7; ++i)
{
  if( dzien == tablica [i] )
  {
    std::cout << dzien << " to " << ++i << "dzien tygodnia"; //indeksujemy od zera
    break;
  }
}
0

I jeszcze jeden problem. Chodzi o ten kod z książki:

#include<iostream>
#include<cstdio>
#include<conio.h>
#include<cstdlib>
using namespace std;
int main()
{
	system("chcp 1250");
	system("cls");
		enum WeekDays{
			Sun, Mon, Tue,Wed, Thu, Fri, Sat
		};
		int ArrayWeek[DaysInWeek]={10, 20, 30, 40, 50, 60, 70};
		cout<<"Wartością Wtorku jest: "<<ArrayWeek[Tue];
	getch();
	return 0;
}

DaysInWeek nie jest zadeklarowane, więc jeżeli zadeklaruje najpierw DaysInWeek jako int to wyskakuje mi błąd inicjalizacji tablicy ArrayWeek, jak zainicjalizuje DaysInWeek jako int o wartości 7, to i tak jest ten sam błąd. Jak wykasuję DaysInWeek to działa program. Aczkolwiek rozchodzi mi się o to co jest nie tak z tą zmienną DaysInWeek.

0

@adrian.widzew jak to "co jest z nią nie tak"? NIE MA JEJ. To jest z nią "nie tak"...
Jeśli deklarujesz tablicę i podajesz coś w [] to musi to być rozmiar tej tablicy. Jeśli nic tam nie podasz, ale masz listę inicjalizacyjną tej tablicy to kompilator sobie policzy ile masz tam mieć elementów.
Co więcej, standard C++ nie przewiduje "variable length array" więc rozmiar tablicy to musi być stała.
http://ideone.com/BATGcH

kosmetyka: nie nazywaj zmiennych dużymi literami ;)

1

http://www.cplusplus.com/doc/tutorial/arrays/
Wielkość tablicy musi być znana już przed uruchomieniem programu, więc wartość którą tam podajesz musi być stała. Ew możesz skorzystać też z tablicy alokowanej dynamicznie http://www.cplusplus.com/doc/tutorial/dynamic/

0

Albo ustalać rozmiar tablicy później:

int ArrayWeek[]={10, 20, 30, 40, 50, 60, 70};
const int DaysInWeek=sizeof(ArrayWeek)/sizeof(*ArrayWeek);
0

To nie wystarczy napisać int DaysInWeek=7; zanim dojdzie się do tablicy?

0
adrian.widzew napisał(a):

To nie wystarczy napisać int DaysInWeek=7; zanim dojdzie się do tablicy?

Dla dni tygodnia const int DaysInWeek=7; będzie ok.
Ale wyobraź sobie że masz jakieś kategorii wewnątrz programu:

const char *Category[]={"mały", "średni", "duży"};
const int CategoryCount=sizeof(Category)/sizeof(*Category);

owszem można to zapisać jako:

const char *Category[]={"mały", "średni", "duży"};
const int CategoryCount=3;

Ale jeżeli będziesz zmuszony dodać kategorie "gigantyczny" (co jest częstym zjawiskiem w przypadku rozbudowywanych aplikacji), to w pierwszym przypadku musisz zrobić tylko jedną zmianę:

const char *Category[]={"mały", "średni", "duży", "gigantyczny"};
const int CategoryCount=sizeof(Category)/sizeof(*Category);

zaś w drugim przypadku konieczne są dwie zmiany:

const char *Category[]={"mały", "średni", "duży", "gigantyczny"};
const int CategoryCount=4;

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