Там очень много не так с вашим кодом.По какой-то причине вы дублировали имена переменных, ваш цикл ввода никогда не завершается, и вы задали вопрос о названии звезды внутри цикла ввода.Я бы сказал, что вы спешите в кодирование, не задумываясь о том, что вы делаете, или не зная, куда вы идете.
Давайте возьмем по одной штуке за раз.
Первое, что у вас естьэто набор связанных данных о звездах, имени, имени, расстоянии и т. д. Итак, давайте выразим этот факт, сгруппировав связанные данные в структуру
struct StarData
{
string name;
string properName;
string hrN;
string hdN;
double distance;
};
Теперь давайте напишем цикл, который читает эти данные и, что важно,завершается, когда данных больше нет
StarData data;
// loop until no more data
while (getline(fin, data.name, '~') && getline(fin, data.properName, '~') &&
getline(fin, data.hrN, '~') && getline(fin, data.hdN, '~') &&
(fin >> data.distance))
{
}
Таким образом, этот цикл считывает данные звезды, по одной звезде за раз, в переменную data
.Но пока что ничего не делает с этими данными.
Существуют различные способы хранения данных, чтобы они были доступны для поиска, это очень распространенная вещь, которую нужно делать, поэтому C ++ выполняет большую часть работыдля тебя.Я собираюсь использовать нечто под названием std::map
, которое представляет собой структуру данных, которая очень хорошо хранит данные, поэтому их можно искать.Давайте изменим цикл выше
#include <map>
std::map<string, StarData> star_database;
StarData data;
// loop until no more data
while (getline(fin, data.name, '~') && getline(fin, data.properName, '~') &&
getline(fin, data.hrN, '~') && getline(fin, data.hdN, '~') &&
(fin >> data.distance))
{
// add star data to database using proper name as the key
star_database[data.properName] = data;
}
Этот код сохраняет данные звезды в переменной с именем star_database
.В частности, потому что мы набрали карту с правильным именем, т.е. потому что мы сказали star_database[data.properName] = data;
позже, мы сможем использовать правильное имя для поиска данных о звезде.
Теперь мы сделали цикл while, давайте зададим вопрос о звезде, чтобы посмотреть, помните, что это происходит после цикла while выше, а не внутри него.
cout << "Enter a proper star name:";
string pN1;
cin >> pN1;
Теперь мы выполним поиск
auto answer = star_database.find(pN1); // lookup the proper name in the database
if (answer == star_database.end()) // did we find it?
{
cout << "No star with the proper name "<< pN1 <<" was found"<< endl;
}
else
{
cout << "Star : "<< "proper name: "<< pN1 <<
" distance: "<< answer->second.distance << " light years" <<
" HD num: "<< answer->second.hdN <<
" HR num: "<< answer->second.hrN <<
" common name: "<< answer->second.name << endl;
}
Я пропустил довольно много деталей (я могу только так много объяснить), но, надеюсь, у вас есть основная идея и вы можете исследовать остальное самостоятельно.
Всекод не проверен, заранее извиняюсь за любые опечатки.