C ++数据结构:不能显示与最大数字对应的字符串

时间:2018-02-17 03:29:37

标签: c++

我的第一个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;


}

4 个答案:

答案 0 :(得分:1)

第一步是存储每个州及其人口的名称。如果您将title更改为name以使其更清楚变量的用途,将会有所帮助。如果您正确执行此操作,您很快就会发现不再需要mystr。 (请注意,您应该始终使用有意义的变量名。像mystr这样的通用名称通常意味着您不知道变量的用途。请继续考虑变量的用途,以便创建更有用的名称。 )

现在,一旦将状态数据输入到数组correclty中,您应该跟踪最少和人口最多的状态的数据,而不仅仅是人口。而不是

int mn, mx;

声明

state_t mn, mx;

然后在你的if语句中

mn = st[n];

,同样适用于mx

您必须更改if条件才能访问结构中的值。然后,您可以直接从mnmx打印值。

答案 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),保留了namepop,就像您拥有的那样,然后声明并创建vector的实例类型为<s_state_t>(例如state)。然后,向向量添加状态(例如s),只需state.push_back(s),让std::vector处理存储和索引。 (vector还提供了许多其他有用的成员函数和修饰符,以帮助获取有关您的集合的信息)

然后,C ++管理states集合的方法是创建额外的structclass来操纵您的状态集合,添加,检查和跟踪最简单/最小群体等等。在一个非常简单的形式中,你可以创建一个类,它提供了那样做的成员函数,添加一个新状态,检查最大/最小值,然后提供一种输出内容的方法。你的收藏。例如,您可以执行以下操作:

#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语言,你可以继续使用它的好部分。