Mam do napisania program, który wczytuje imiona i pyta użytkownika ile te osoby mają lat a następnie drukuje wynik. Problem polega na tym, że po wczytaniu imion do wektora program nie pyta użytkownika o imiona tylko wsadza głupie wartości do zmiennych double.
Kod:
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;
inline void error(const string& errmsg) {
throw runtime_error(errmsg);
}
class Name_pairs {
public:
void read_names();
void read_ages();
void print() const;
void sort();
private:
vector<string> names;
vector<double> ages;
};
void Name_pairs::read_names() {
cout << "Podaj imiona: ";
string name;
while (cin >> name) {
names.push_back(name);
}
}
void Name_pairs::read_ages() {
for (int i = 0; i < names.size(); ++i) {
cout << "Podaj wiek dla imienia " << names[i] << ": ";
double age;
cin >> age;
ages.push_back(age);
}
}
void Name_pairs::print() const {
if (names.size() != ages.size()) {
error("wektory names i ages muszą być równe");
}
for (int i = 0; i < names.size(); ++i) {
cout << names[i] << " -> " << ages[i] << '\n';
}
}
void Name_pairs::sort() {
if (names.size() != ages.size()) {
error("wektory names i ages muszą być równe");
}
vector<string> names_copy(names);
vector<double> ages_copy(ages);
std::sort(names.begin(), names.end());
for (int i = 0; i < names.size(); ++i) {
for (int j = 0; j < names.size(); ++j) {
if (names[i] == names_copy[j]) {
ages[i] = ages_copy[j];
}
}
}
}
int main() {
Name_pairs pairs;
pairs.read_names();
pairs.read_ages();
pairs.print();
pairs.sort();
pairs.print();
return 0;
}
Wynik:
Podaj imiona: Marta Helena Alina
Podaj wiek dla imienia Marta: Podaj wiek dla imienia Helena: Podaj wiek dla imienia Alina: Marta -> 6.95279e-310
Helena -> 6.95279e-310
Alina -> 6.95279e-310
Alina -> 6.95279e-310
Helena -> 6.95279e-310
Marta -> 6.95279e-310
Próbowałem użyć wywołania cin.clear() i cin.ignore(numeric_limits<streamsize>::max(), '\n') przed double age; cin >> age; ale to nic nie dało.