Witam :)
Mam program który wczytuje dni tygodnia wraz z wartoscią liczbową (ignoruje złe nazwy dnia, ale akceptuje skrócenia; przy złej liczbie wyrzuca błąd), i zapisuje ta wartosc do odpowiedniego vecotora. Wlasciwie to brzmi absolutnie prymitywnie, program napisany, działa, ale teraz mam napisac dokladnie to samo, używając z góry podanej "konstrukcji" klasy, oto ona:
class Name_values
{
public:
Name_values(); // Standardkonstruktor
Name_values( string, vector<int> ); // Konstruktor
void add_value( int ); // weiteren Wert speichern (zapisanie następnej wartości)
void print_all( ) const; //
string get_name( ) const; //
private:
string name;
vector<int> values;
};
Do tego program ma na koniec pokazac takze średnią arytmetyczna każdego dnia. (i na koniec pokazac ile było złych nazw dni).
No okey,program napisany, działa, ale jego wygląd...i ogólnie działanie..
-->konstruktor standardowy, nie mam pojęcia czy można tak robić, ale nie mam póki co (a nie zaczełam tego dziś) innych pomysłów
-->konstruktor ze string i vector<int> nie jest u mnie wgl używany
Oto plik main:
/*
* File: main.cpp
* Author: Paula
* Name_values, Tag und wert eingeben, durschnitt berechnen, alles zeigen
* Created on 6. Mai 2016, 22:47
*/
#include "headers.h"
#include "name_values.h"
int main()
try {
vector <Name_values> week{7}; //czy tak to zapisac?
string temp_day{"noday"};
int temp_value{0};
int bad_day_name{0};
bool found{0};//do sprawdzania poprawnosci nazwy dnia
while (cin >> temp_day && temp_day!="q" )
{
found=false;
cin >> temp_value;
is_number();
if(temp_day.size()==1) //do uniknięcia niejednoznacznych nazw dni np "P"
{
cout << "Zu kurzer Name!" << endl; //
bad_day_name++;
continue;
}
for (unsigned int i{0}; i<7; i++) //sprawdza podnay dzien z kazdym w klasie
if(confer(temp_day, week[i].get_name()))
{
week[i].add_value(temp_value); //jesli jakis był dobry to dodaje podana wartosc
found=true;
}
if(!found)
bad_day_name++;
}
for (unsigned int i{0}; i<7; i++)
week[i].print_all();
//pokazuje ile złych dni podano
if(bad_day_name)
{
if(bad_day_name==1)
cout <<endl << "Es wurde " << bad_day_name <<" Wert wegen unzulässigem Tag abgelehnten.";
else if (bad_day_name>1)
cout <<endl << "Es wurden " << bad_day_name <<" Werte wegen unzulässigem Tag abgelehnten.";
}
return 0;
}
catch( exception& e )
{
cerr << endl <<"FEHLER: " << e.what();
return -2;
}
void error ( string s ) {
throw std::runtime_error{ s };
}
void is_number()
{
if(cin.fail()) //method fail fuer cin
error("Eigegebener Wert ist keine Zahl");
}
bool confer(string temp, string name)
{
for (unsigned int i{0};i<temp.size(); i++)
{
if(temp[i]!=name[i])
return false;
}
return true;
}
klasa Name_values:
#include "name_values.h"
// wiec sobie pomyślałam, że będzie przecież ok, jak po prostu przy
// utworzeniu siedmiu objektów od razu każdy z nich dostanie odpowiednią nazwe dnia
Name_values::Name_values() : summe{0}
{
// values{};
static int i{1};
switch (i)
{
case 1: name="Montag"; break;
case 2: name="Dienstag"; break;
case 3: name="Mittwoch"; break;
case 4: name="Donnerstag"; break;
case 5: name="Freitag"; break;
case 6: name="Samstag"; break;
case 7: name="Sonntag"; break;
default: error("Name_values::Name_values(): Max 7 Tage!");
}
i++;
}
//dalej nie wiem czy go wgl potrzebuje, jeśli tak to do czego
Name_values::Name_values(string n, vector<int> v)
{
name=n;
values=v;
}
void Name_values::add_value(int value)
//nie jestem pewna czy jest to poprawne w tej funkcji od razu obliczac sumę,
//czy może lepsza byłąby nowa funkcja?
{
summe+=value;
values.push_back(value);
}
void Name_values::print_all() const
{
cout << endl << setw(10)<<name << " :";
for (unsigned int i{0}; i<values.size();i++)
cout << " " << values[i];
if (summe)
cout << " Durchschnitt: " <<summe/values.size();
}
string Name_values::get_name() const
{
return name;
}
Przykładowe działanie: