我的第一个C ++类来自基本的Java类。该类是关于数据结构的更高级的C ++编程类。我不了解C ++的基础知识,只是Java的一些基础知识。
作业是:
-get 3个用户输入状态及其人口(已完成)。
- 获得人口最多(三个中最大的一个)并发布。 (1/2)
我能够得到最高的数字......但是我不确定如何使用相应的字符串(状态)发布它的语法。
我知道这是使用struct的某种数组,但我不知道如何发布st.title
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
struct states_t {
string statename;
int population;
} state[3];
int main()
{
string mystr;
int n;
for (n = 0; n<3; n++)
{
cout << "Enter state name: ";
getline(cin, state[n].statename);
cout << "Enter population: ";
getline(cin, mystr);
stringstream(mystr) >> state[n].population;
}
cout << "\nYou have entered these movies:\n";
for (n = 0; n < 3; n++)
cout << state[n].statename << "\n" << state[n].population << "\n";
return 0;
}
====最大人口的更新代码====
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
struct states_t {
string statename;
int population;
} state[3];
int main()
{
string mystr;
int n;
for (n = 0; n<3; n++)
{
cout << "Enter state name: ";
getline(cin, state[n].statename);
cout << "Enter population: ";
getline(cin, mystr);
stringstream(mystr) >> state[n].population;
}
cout << "\nYou have entered these states:\n";
for (n = 0; n < 3; n++)
cout << state[n].statename << " " << state[n].population << "\n" << "\n";
if ((state[0].population >= state[1].population) && (state[0].population >= state[2].population))
cout << "The most populous state you entered is: " << state[0].statename << " with a population of " << state[0].population << "\n";
else if ((state[1].population >= state[0].population) && (state[1].population >= state[2].population))
cout << "The most populous state you entered is: " << state[1].statename << " with a population of " << state[1].population << "\n";
else
cout << "The most populous state you entered is: " << state[2].statename << " with a population of " << state[2].population << "\n";
return 0;
}
答案 0 :(得分:1)
第一步是存储每个州及其人口的名称。如果您将title
更改为name
以使其更清楚变量的用途,将会有所帮助。如果您正确执行此操作,您很快就会发现不再需要mystr
。 (请注意,您应该始终使用有意义的变量名。像mystr
这样的通用名称通常意味着您不知道变量的用途。请继续考虑变量的用途,以便创建更有用的名称。 )
现在,一旦将状态数据输入到数组correclty中,您应该跟踪最少和人口最多的状态的数据,而不仅仅是人口。而不是
int mn, mx;
声明
state_t mn, mx;
然后在你的if语句中
mn = st[n];
,同样适用于mx
。
您必须更改if
条件才能访问结构中的值。然后,您可以直接从mn
和mx
打印值。
答案 1 :(得分:0)
您的代码旨在查找所有州的最高(和最低)人口。您也可能试图找出索引号是什么,具有最高总体的状态,并使用该数字索引状态数组以从中获得所需的数据。
答案 2 :(得分:0)
这是我将如何做到的:
我首先会创建两个int数组,一个对应于struct states_t
数组的索引值,然后一个对应于总体值,如下所示:
int index[3];
int pop[3];
for (int i = 0; i < 3; i++)
{
index[i] = i;
pop[i] = st[i].population;
}
接下来,对填充执行冒泡排序算法,并根据排序算法的操作移动对象的索引,如下所示:
int n = 3;
for (int i = 0 ; i < ( n - 1 ); i++)
{
for (int j = 0 ; j < n - i - 1; j++)
{
//if the population of the next element
//is higher than the current element, swap it
//perform the same operation for state indices
if (array[j] > array[j+1])
{
int swap = pop[j];
int swap2 = index[j];
pop[j] = pop[j+1];
index[j] = index[j+1];
pop[j+1] = swap;
index[j+1] = swap2;
}
}
}
现在要做的就是使用索引数组调用列表中的第一个对象,如下所示:
st[index[0]].title; //state with highest population
关于此方法最酷的部分是,您可以通过更改int n
的值,使任何个州的数据生效。
答案 3 :(得分:0)
虽然没有任何东西可以阻止你像在C中一样使用标准的 array-of-struct ,但是拥抱C ++ std::vector
可能会占用大量的单调乏味。使用struct-of-struct时,您可以获得保护数组边界手动索引和手动处理存储的好处,C ++长期以来一直试图帮助减轻或简化处理“事物”集合的手动方面(缺少更好的单词) )
std::vector容器是量身定制的,允许您使用简单的push_back
修饰符添加到一组事物中。基本上,您定义了struct
(比如说s_state_t
),保留了name
和pop
,就像您拥有的那样,然后声明并创建vector
的实例类型为<s_state_t>
(例如state
)。然后,向向量添加状态(例如s
),只需state.push_back(s)
,让std::vector
处理存储和索引。 (vector
还提供了许多其他有用的成员函数和修饰符,以帮助获取有关您的集合的信息)
然后,C ++管理states
集合的方法是创建额外的struct
或class
来操纵您的状态集合,添加,检查和跟踪最简单/最小群体等等。在一个非常简单的形式中,你可以创建一个类,它提供了那样做的成员函数,添加一个新状态,检查最大/最小值,然后提供一种输出内容的方法。你的收藏。例如,您可以执行以下操作:
#include <vector>
#include <string>
#include <iomanip>
#include <limits>
typedef struct { /* struct holding state name and population */
std::string name;
int pop;
} s_state_t;
class country { /* class country - a collection of states */
std::vector<s_state_t> state; /* declare vector for states */
s_state_t mx = { "", 0 }, /* declare structs for max min */
mn = { "", std::numeric_limits<int>::max() };
void chkmxmn (s_state_t s) { /* function to set max/min */
if (s.pop < mn.pop)
mn = s;
if (s.pop > mx.pop)
mx = s;
}
public:
void addstate (std::string name, int pop) { /* add a state */
s_state_t s = { name, pop }; /* struct for new state */
chkmxmn (s); /* update max and min */
state.push_back (s); /* push_back to vector */
}
void prnstates() { /* output saved states, max/min */
for (auto& i : state) /* loop over vector */
std::cout << std::setw(16) << std::left << i.name <<
std::setw(10) << std::right << i.pop << "\n";
std::cout << "\nminimum and maximum populations:\n" <<
std::setw(16) << std::left << mn.name <<
std::setw(10) << std::right << mn.pop << "\n" <<
std::setw(16) << std::left << mx.name <<
std::setw(10) << std::right << mx.pop << "\n";
}
};
int main (void) {
country us; /* instance of country */
us.addstate ("Texas", 25000000); /* add names/pops */
us.addstate ("Louisiana", 12000000);
us.addstate ("California", 50000000);
us.prnstates(); /* output results */
return 0;
}
(注意>您应该添加其他验证,以检查name
不是NULL
还是空,pop
是一个合理的数字 - 这是剩下的给你)
示例使用/输出
$ ./bin/vector_states
Texas 25000000
Louisiana 12000000
California 50000000
minimum and maximum populations:
Louisiana 12000000
California 50000000
注意:您还可以为新的typedef
类型创建vector
,以减少与指定类型的实例和参数相关联的类型,类似于:
typedef std::vector<s_state_t> state_t; /* typedef to cut down typing */
然后允许您简单地声明新实例或参数,例如:
state_t state; /* declare vector for states */
仔细看看。这两种方法都不是“对错”,但如果你要学习C ++而不是C语言,你可以继续使用它的好部分。