C ++ Структуры относительно корпоративных продаж - PullRequest
0 голосов
/ 15 декабря 2011

Эта программа использует структуру для хранения следующих данных о подразделении компании:

Название подразделения (например, Восток, Запад, Север или Юг)

Квартал (1, 2,3 или 4)

Квартальные продажи

У пользователя должны быть запрошены данные о продажах за четыре квартала для восточных, западных, северных и южных подразделений, а данные должны храниться вструктура.Пока это мой код, я не правильно понимаю концепцию:

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

struct Data{

    char *name;
    int quarter[4];
    int sales;

};

int _tmain(int argc, _TCHAR* argv[])
{
    Data division[4];
    int count;

    division[0].name = "East";
    division[1].name = "West";
    division[2].name = "North";
    division[3].name = "South";

    for(count = 0; count < 4; count++){

        cout << "Please enter the sales for the " << division[count].name << " for: " << endl;
        cout << "Quarter: " << count + 1 << ": " << endl;
        cin >> division[count].quarter[count].sales;


    }

    cin.get();
    return 0;
}

Кажется, мой цикл for вообще не работает, что-то не так с моим оператором cin, потому что `деление показывает красное подчеркивание.

Ответы [ 5 ]

2 голосов
/ 15 декабря 2011

Замените

cin >> division[count].quarter[count].sales;

на

cin >> division[count].sales;

Но структура вашего приложения ... по меньшей мере подозрительна.Какой смысл в массиве quarter?

0 голосов
/ 15 декабря 2011

У вас есть пара проблем с определенной вами структурой.

Во-первых, какой тип данных о продажах. Вы указываете целые числа, но на самом ли деле продажи - это десятичное число (многие примеры с наличными используют двойные числа для представления денег)?

Во-вторых, я немного подозрительно отношусь к постановке проблемы. В вашем примере структуры используется массив, но на полпути постановка задачи предполагает, что у каждой структуры будет один показатель того, какой квартал она представляет. Это сделало бы структуры больше похожими на записи базы данных.

Вот два возможных подхода:

typedef double money_t;

struct sales_datum {
    std::string division; // North, East, South, West
    int quarter; // 1, 2, 3, 4
    money_t sales;
};

Вышеупомянутый подход, кажется, больше соответствует постановке задачи. Каждая из этих структур будет содержать одну часть данных о продажах - для определенного подразделения для определенного квартала.

В качестве альтернативы,

struct sales_datum {
    std::string division; // North, East, South, West
    money_t sales_for_quarter[4]; 
};

Похоже, это больше похоже на то, что вы пробовали в исходном посте. Структура теперь содержит данные о продажах для одного подразделения за весь год (четыре квартала).

Использование второго типа приведет к тому, что ваш код будет двигаться в определенных направлениях - проще подумать о заполнении всей структуры, прежде чем переходить к другой, поэтому вам нужно будет собрать все данные за год для одного разделение, прежде чем перейти к следующему.

0 голосов
/ 15 декабря 2011

В вашем оригинале вы собираетесь переполнение ваш quarter массив ... Это опасное и неопределенное поведение, которое может привести к повреждению памяти, которое появится позже и испортит вашу программу,Как вы собираетесь переполниться?Хорошо, когда значение вашего счетчика становится равным «3», вы будете обращаться к массиву четвертей с помощью quarter[3+1] = quarter[4].Это на ОДИН больше, чем содержит массив (от 0 до> 3), и этот адрес памяти будет записан.Что в этом адресе?Мы не знаем.

Похоже, у вас должен быть вложенный цикл for для кварталов:

for(int div_i = 0; div_i < 4; ++div_i)
{
    for(int qt_i; st_i < 4; ++qt_i)
    {
        cout << "Please enter the sales for the " << division[div_i].name << " for: " << endl;
        cout << "Quarter: " << qt_i << ": " << endl;
        cin >> division[div_i].quarter[qt_i].sales;
    }
}

Это оставит вас с продажами за квартал для каждого подразделения.*


Также вы должны использовать const uint8 для размеров вашего массива:

const unsigned char _DIVISION_COUNT = 4;
const unsigned char _QUARTER_COUNT = 4;

// and your loops become:
for( int count = 0; count < _DIVISION_COUNT; ++count)...

Дает понять, кто будет использовать / поддерживать ваш код после того, как вы делаете.

0 голосов
/ 15 декабря 2011

Вы используете одну и ту же переменную для циклического разделения обоих подразделений и кварталов (оба раза count).

0 голосов
/ 15 декабря 2011

Структура - это очень простое определение класса. Думайте об этом как о классе без каких-либо методов, только с переменными экземпляра.

То, что вы там делаете, спрашивает для каждого подразделения, каковы продажи за каждый квартал.

Таким образом, в каждом подразделении у вас есть 4 разных продаж, относящихся к каждому кварталу. Они сохраняются в вашей структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...