#c
#c
Вопрос:
Итак, я получил этот проект, который дал мне мой учитель, и я довольно новичок, поэтому я столкнулся с небольшой проблемой. В принципе, мне нужно ввести несколько городов и их население, и мне нужно вывести их в порядке от того, в котором больше всего людей, к тому, в котором меньше всего людей. Я использовал структуры для хранения информации о каждом городе, и теперь я не знаю, как я могу своего рода «подключить» население к каждому городу, если вы понимаете, что я имею в виду. Спасибо!
Вот как это выглядит, и для людей, которые не поняли вопроса, я получил население города и отсортировал его от самого высокого к самому низкому, и теперь я хочу отобразить название города с его населением рядом с ним, но я не знаю, как я могу теперь сложить их вместе.
struct city
{
string name;
int population;
}cityVar[10];
int main()
{
// Input
for (int i = 0; i < 5; i )
{
cin >> cityVar[i].name;
cin >> cityVar[i].population;
}
int i, j;
int temp;
for (i = 0; i < 5; i )
{
for (j = i 1; j < 5; j )
{
if (cityVar[i].population < cityVar[j].population)
{
temp = cityVar[i].population;
cityVar[i].population = cityVar[j].population;
cityVar[j].population = temp;
}
}
}
for (i = 0; i < 5; i )
{
cout << cityVar[i].population << " ";
}
}
Комментарии:
1. Stack overflow — это не домашняя работа. Пожалуйста, предоставьте код, который у вас уже есть, поскольку он более единообразен, чем текст на английском
2. Не уверен, что я понял ваш вопрос, но вы, возможно, ищете
std::unordered_map
илиstd::map
.3. Либо вы копаетесь в
std::map
, либо ищетеstd::sort
.4. Если вы не сохранили совокупность в определенной вами структуре, где вы ее сохранили? Если бы вы это сделали, решение, которое вы ищете, — отсортировать ваши города по населению, а не «соединять» их.
5. Небольшой совет: в следующий раз, когда вы зададите здесь вопрос, покажите нам свою попытку сделать это в форме компилируемого кода. Удачи!
Ответ №1:
Вы не соединяете две переменные. Вы группируете их вместе, когда они принадлежат к одной концепции.
В этом конкретном случае я предлагаю вам создать абстракцию для a city
путем создания struct
и проинструктировать его о том, как сравнивать себя с другими городами, основываясь исключительно (в данном случае) на численности населения.
Вы можете сделать это, реализовав operator<
struct city{
unsigned population
bool operator<(const cityamp; c1){
return this.population < c1.population;
}
};
Затем вы можете добавить свой элемент в массив или, что еще лучше, в std::vector
и отсортировать их с помощью std::sort
.
Поскольку это звучит как домашнее задание, я оставлю остальное вам. Вы должны быть в состоянии продолжить самостоятельно отсюда.
Комментарии:
1. не совсем тот способ, которым рекомендуется инкапсуляция данных, но я постараюсь
2. @skratchi.at это самый простой и интуитивно понятный способ, который я могу придумать на данный момент.
3. @skratchi.at абсолютно без обид =)
Ответ №2:
Вы потеряли «соединение», потому что поменяли местами только населенные пункты, когда должны были поменять местами целые города:
city temp = cityVar[i];
cityVar[i] = cityVar[j];
cityVar[j] = temp;
Или, как мы часто это пишем
std::swap(cityVar[i], cityVar[j]);
Ответ №3:
Вам нужно поменять местами весь объект, есть много способов сделать это, но в зависимости от того, чему вас научили, вам нужно быть осторожным с тем, какой метод вы используете. Это ни в коем случае не исчерпывающий список, я показал только самое простое, что пришло мне в голову….
Самый простой метод (но требует еще двух строк) и зависит от структуры данных, поэтому используйте temp city вместо temp int.
struct city temp;
:
:
:
if (cityVar[i].population < cityVar[j].population)
{
temp.population = cityVar[i].population;
temp.name = cityVar[i].name;
cityVar[i].population = cityVar[j].population;
cityVar[i].name = cityVar[j].name;
cityVar[j].population = temp.population;
cityVar[j].name = temp.name;
}
Другим методом было бы использовать список указателей для отсортированного списка
int main()
{
struct city *cityVarSorted[10];
for (int i = 0; i < 5; i ) // initialise list to point to current structs
{
cityVarSorted[i] = amp;cityVar[i];
}
:
:
struct city *temp;
:
if (cityVarSorted[i]->population < cityVarSorted[j]->population)
{
temp = cityVarSorted[i]; // we're swapping the pointer now and not the individual members
cityVarSorted[i] = cityVarSorted[j];
cityVarSorted[j] = temp;
}
}
конечно, это если вас учили указателям. Вам нужно знать, как это работает, чтобы вы могли это объяснить