x023.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "x022.h"
4 #include <string>
5 #include <utility>
6 #include <vector>
7 
8 namespace nmx::apps::x023 {
9 
14 class UserInput
15 {
16  using Value = std::pair<std::string, double>;
17 
18  //Zugriff auf die Eingabewerte
19  enum Idx { x0, v0, a, time };
20 
21 private:
22  //Eingabe (Name,Wert),...
23  std::vector<Value> _in;
24  //Ausgabe (Name,Wert),...
25  std::vector<Value> _out;
26 
27 protected:
33  double read(std::string &label) {
34  double val;
35  std::cout << label << "=?\t";
36  std::cin >> val;
37  //Fehler wenn val nicht vom Typ double ist
38  if (std::cin.fail()) {
39  throw std::invalid_argument(label);
40  }
41  return val;
42  }
43 
44 public:
48  inline UserInput() {
49  //Namen für Eingabevariablen werden initialisiert
50  for (const auto label : { "x0", "v0", "a", "t1" }) {
51  _in.push_back(Value{ label, 0 });
52  }
53  //Namen für Ausgabevariablen werden initialisiert
54  for (const auto &label : { "x", "v", "s", "vbar" }) {
55  _out.push_back(Value{ label, 0 });
56  }
57  }
58 
62  inline void calculate() {
63  //Komponente zur Berechnung der Ergebnisse
64  x022::Motion motion{ 1, _in[Idx::a].second, { _in[Idx::x0].second, _in[Idx::v0].second } };
65  //Wertezuweisung
66  double t1 = _in[Idx::time].second;
67  _out[0].second = motion.x(t1);
68  _out[1].second = motion.v(t1);
69  _out[2].second = motion.distance(t1);
70  _out[3].second = motion.vmean(t1);
71  }
72 
76  inline void input() {
77  for (auto &vals : _in) {
78  vals.second = read(vals.first);
79  }
80  //letzte Eingabe: Zeit
81  if (_in.back().second <= 0) {
82  throw std::domain_error("time must be >0");
83  }
84  }
85 
89  inline void output() {
90  std::cout << std::fixed << std::setprecision(2);
91  std::cout << "------------output-------" << std::endl;
92  //iteriere über Ausgabewerte (Name,Wert),...
93  for (const auto &[label, val] : _out) {
94  std::cout << label //
95  << "=" << val << std::setw(3) << "\t";
96  }
97  std::cout << std::endl;
98  }
99 
103  inline void ui() {
104  constexpr auto maxstreamsize = std::numeric_limits<std::streamsize>::max();
105  try {
106  // Eingabe -> Auswertung ->Ausgabe
107  input();
108  calculate();
109  output();
110  } catch (std::domain_error ex1) {
111  //wenn negative Zeiten eingegeben werden
112  //Fehlerbits werden zurückgesetzt,
113  // sonst kann cin nicht mehr genutzt werden
114  std::cin.clear();
115  //verwerfe alle Zeichen bis \n
116  std::cin.ignore(maxstreamsize, '\n');
117  std::cerr << "input error:" << ex1.what() << std::endl;
118  } catch (std::invalid_argument ex2) {
119  //wenn statt Zahlen Buchstaben eingegeben werden
120  std::cin.clear();
121  std::cin.ignore(maxstreamsize, '\n');
122  std::cerr << "input error for:" << ex2.what() << std::endl;
123  }
124  }
125 
129  inline void run() {
130  char cmd = 'y'; // die Schleife soll wiederholt werden
131  std::cout << "------------input-------------" << std::endl;
132  while (cmd == 'y') {
133  ui(); //starte Eingabe,Berechnung,Ausgabe
134  do {
135  std::cout << "new calculation? y[yes] / n[no]" << std::endl;
136  std::cin >> cmd;
137  } while (cmd != 'y' && cmd != 'n');
138  }
139  }
140 };
141 
146 inline void ex1() {
147  UserInput ui;
148  ui.run();
149 }
150 
151 } // namespace nmx::apps::x023
void input()
UserInput::user_input Eingabeaufforderung.
Definition: x023.h:76
void output()
output Ausgabe der Ergebnisse
Definition: x023.h:89
The Motion class Geradlinige Bewegung mit konstanter Beschleunigung.
Definition: x022.h:14
The UserInput class (Benutzerschnittstelle) Geradlinige Bewegung mit konstanter Beschleunigung.
Definition: x023.h:14
void run()
run Eingabe,Berechnung,Ausgabe
Definition: x023.h:129
UserInput()
UserInput::UserInput Standardkonstruktor.
Definition: x023.h:48
void ex1()
ex1 Beispielprogramm Geradlinige Bewegung mit konstanter Beschleunigung
Definition: x023.h:146
void ui()
ui Benutzerschnittstelle (ein Rechengang)
Definition: x023.h:103
double read(std::string &label)
UserInput::read.
Definition: x023.h:33
void calculate()
calculate Ergebnisse werden berechnet
Definition: x023.h:62
double x(double t) const
x Ortsfunktion
Definition: x022.h:40
void ex2()
Definition: cpp.h:18