Как связать две структуры?

280
11 ноября 2021, 07:50

Сделал курсовую работу. Возникла трудность с одним пунктом из технического задания, он звучит так:

Создать структуру "акции", содержащую не менее 5 полей, одно из которых называется "рынок" и указывает, на какой бирже продают данные акции

Я добавил переменную char market. Преподаватель говорит, что нужно добавить поле структурного типа и так связать структуры. Вот так:

struct Stocks {
   char market[30]; //Рынок
   char name[30]; //Название акции
   char company[30]; //Акционерное общество
   int cost; //Цена акции
   int st_din; //Динамика акции
   Stock_exchange y; //Добавленное поле
};

Ещё, нужно вывести информацию о бирже на которой продаются введённые акции(вводятся с клавиатуры или с файла(функции inputdata и fileinput)).

Вывод информации реализован у меня с помощью функции void stockinfo(с использованием поля market из структуры Stocks).

Вопрос: что нужно делать после добавления поля 'y' в структуре Stocks (как реализовать всё выше описанное после этого изменения) ?

Мой код ниже:

#include <iostream>
#include <fstream>
using namespace std;
int n;
//Структура "фондовая биржа"
struct Stock_exchange {
    string country; //Страна рынка
    string owner; //Владелец рынка
    int circulation; //Оборот в год
};
//Структура "акции"
struct Stocks {
    char market[30]; //Рынок
    char name[30]; //Название акции
    char company[30]; //Акционерное общество
    int cost; //Цена акции
    int st_din; //Динамика акции
};
Stock_exchange MOEX, LSE;
int menu()
{
    int choice;
    cout << "Введите:\n";
    cout << "1 - для ввода данных\n";
    cout << "2 - для нахождения самой дорогой акции\n";
    cout << "3 - для нахождения суммы стоимостей акций ММВБ\n";
    cout << "4 - для нахождения суммы стоимостей акций LSE\n";
    cout << "5 - для нахождения общей суммы стоимостей всех акций\n";
    cout << "6 - для вывода акций\n";
    cout << "7 - для выхода\n";
    cin >> choice;
    return choice;
}
int count(string file){
    ifstream f(file);
    int k = 0;
    string tmp;
    while(getline(f,tmp)){
        k++;
    }
    k = k / 5;
    f.close();
    return k;
}
void show(Stocks *s,int n){
    cout << "-------------------------------------------------------------------------"
         << endl;
    for (int i = 0;i < n;i++){
        cout << "Биржа: " << s[i].market << endl;
        cout << "Название акции: " << s[i].name << endl;
        cout << "Акционерное общество: " << s[i].company << endl;
        cout << "Стоимость: " << s[i].cost << endl;
        cout << "Динамика: " << s[i].st_din << endl;
        cout << "-------------------------------------------------------------------------" << endl;
    }
}
void fileinput(Stocks *s , int k, string file){
    ifstream f(file);
    for (int i = 0;i < k; i++){
        f >> s[i].market;
        f >> s[i].name;
        f >> s[i].company;
        f >> s[i].cost;
        f >> s[i].st_din;
    }
    f.close();
}
void stockinfo(Stock_exchange EX)
{
    cout << "Информация о бирже" << endl;
    cout << "Страна: " << EX.country << endl <<
    "Владелец рынка: " << EX.owner << endl <<
    "Оборот в год: " << EX.circulation << "\n" << endl;
}
int summoex(Stocks *MX,int m) {
    int sum = 0;
    for (int i = 0; i<m; i++){
        sum += MX[i].cost;
    }
    return sum;
}
int sumlse(Stocks *LS,int l){
    int sum = 0;
    for (int i = 0; i<l; i++){
        sum += LS[i].cost;
    }
    return sum;
}
void maxcost(Stocks *MX, int m, Stocks *LS, int l) //Самая дорогая акция
{
    cout << "\nИнформация о самой дорогой акции  " << endl;
    int maxcost = 0, cost;
    string market,name,company;
    for (int i = 0; i < m; i++)
        if ((MX[i].cost) > maxcost) {
            maxcost = MX[i].cost;
            market = MX[i].market;
            name = MX[i].name;
            company = MX[i].company;
            cost = MX[i].cost;
        }
    for (int i = 0; i < l; i++)
        if ((LS[i].cost) > maxcost) {
            maxcost = LS[i].cost;
            market = LS[i].market;
            name = LS[i].name;
            company = LS[i].company;
            cost = LS[i].cost;
        }
    cout << "Биржа: " << market << endl <<
            "Акция: " << name << endl <<
            "Акционерное общество: " << company << endl <<
            "Цена: " << maxcost << endl;
}
void inputdata(int x, Stocks *s) {
    for (int i = 0; i < x; i++)
    {
        cout << "Введите биржу, название акции, акционерное общество, цену акции, и динамику акции" << endl;
        cin >> s[i].market;
        cin >> s[i].name;
        cin >> s[i].company;
        cin >> s[i].cost;
        cin >> s[i].st_din;
    }
}
int main()
{
    int m, l, method;
    cout << "Введите количество акций в <MOEX> и <LSE>" << endl;
    cin >> m >> l;
    //Создание динамических массивов
    Stocks *MX = new Stocks[m];
    Stocks *LS = new Stocks[l];
    //Заполнение сущностей
    MOEX.circulation = 53;
    MOEX.country = "Russia";
    MOEX.owner = "Yuri Denisov";
    LSE.circulation = 65;
    LSE.country = "United Kingdom";
    LSE.owner = "Donald Brydon";
    while (1)
    {
        switch (menu()){
        case 1: {
                cout << "Выберите способ ввода данных:" << endl << "1 - с клавиатуры, 2 - из файла" << endl;
                cin >> method;
                switch (method){
                    case 1: {
                                cout << "Введите данные об акциях в <MOEX>" << endl;
                                inputdata(m,MX);
                                cout << "Введите данные об акциях в <LSE>" << endl;
                                inputdata(l,LS);}break;
                    case 2: {
                                cout << "Считывание данных об акциях ММВБ " << endl;
                                fileinput(MX,count("moex.txt"),"moex.txt");
                                cout << "Считывание данных об акциях LSE " << endl;
                                fileinput(LS,count("lse.txt"),"lse.txt");
                            }
                            }
                }break;
        case 2: maxcost(MX,m,LS,l);break;
        case 3: cout << "Сумма стоимостей акций ММВБ: " << summoex(MX,m) << endl;break;
        case 4: cout << "Сумма стоимостей акций LSE: " << sumlse(LS,l) << endl;break;
        case 5: cout << "Сумма стоимостей всех акций:  " << summoex(MX,m) + sumlse(LS,l) << endl;break;
        case 6: show(MX,m);stockinfo(MOEX);show(LS,l);stockinfo(LSE);break;
        case 7: {delete[]MX; delete[]LS; return 0;}
        default: cout << "Ошибка!\n";
        }
    }
}
Answer 1

Вызвать из функции show функцию stockinfo. stockinfo(s[i].y);

Answer 2
#include <iostream>
#include <fstream>
using namespace std;
int n;
struct Stock_exchange {
    string country; //Страна рынка
    string owner; //Владелец рынка
    int circulation; //Оборот в год
};
struct Stocks {
    char market[30]; //Рынок
    char name[30]; //Название акции
    char company[30]; //Акционерное общество
    int cost; //Цена акции
    int st_din; //Динамика акции
    Stock_exchange y;
};
Stock_exchange MOEX, LSE;
int menu()
{
    int choice;
    cout << "Введите:\n";
    cout << "1 - для ввода данных\n";
    cout << "2 - для нахождения самой дорогой акции\n";
    cout << "3 - для нахождения суммы стоимостей акций ММВБ\n";
    cout << "4 - для нахождения суммы стоимостей акций LSE\n";
    cout << "5 - для нахождения общей суммы стоимостей всех акций\n";
    cout << "6 - для вывода акций\n";
    cout << "7 - для выхода\n";
    cin >> choice;
    return choice;
}
int count(string file){
    ifstream f(file);
    int k = 0;
    string tmp;
    while(getline(f,tmp)){
        k++;
    }
    k = k / 5;
    f.close();
    return k;
}
void fileinput(Stocks *s , int k, string file){
    ifstream f(file);
    for (int i = 0;i < k; i++){
        f >> s[i].market;
        f >> s[i].name;
        f >> s[i].company;
        f >> s[i].cost;
        f >> s[i].st_din;
    }
    f.close();
}
void stockinfo(Stocks *s)
{
    cout << "Информация о бирже" << endl;
    cout << "Страна: " << s->y.country << endl <<
    "Владелец рынка: " << s->y.owner << endl <<
    "Оборот в год: " << s->y.circulation << "\n" << endl;
}
void show(Stocks *s,int n){
    cout << "-------------------------------------------------------------------------"
         << endl;
    for (int i = 0;i < n;i++){
        cout << "Биржа: " << s[i].market << endl;
        cout << "Название акции: " << s[i].name << endl;
        cout << "Акционерное общество: " << s[i].company << endl;
        cout << "Стоимость: " << s[i].cost << endl;
        cout << "Динамика: " << s[i].st_din << endl;
        cout << "------------------------------------------------------------------------" << endl;
    }
}
int summoex(Stocks *MX,int m) {
    int sum = 0;
    for (int i = 0; i<m; i++){
        sum += MX[i].cost;
    }
    return sum;
}
int sumlse(Stocks *LS,int l){
    int sum = 0;
    for (int i = 0; i<l; i++){
        sum += LS[i].cost;
    }
    return sum;
}
void maxcost(Stocks *MX, int m, Stocks *LS, int l) //Самая дорогая акция
{
    cout << "\nИнформация о самой дорогой акции  " << endl;
    int maxcost = 0, cost;
    string market,name,company;
    for (int i = 0; i < m; i++)
        if ((MX[i].cost) > maxcost) {
            maxcost = MX[i].cost;
            market = MX[i].market;
            name = MX[i].name;
            company = MX[i].company;
            cost = MX[i].cost;
        }
    for (int i = 0; i < l; i++)
        if ((LS[i].cost) > maxcost) {
            maxcost = LS[i].cost;
            market = LS[i].market;
            name = LS[i].name;
            company = LS[i].company;
            cost = LS[i].cost;
        }
    cout << "Биржа: " << market << endl <<
            "Акция: " << name << endl <<
            "Акционерное общество: " << company << endl <<
            "Цена: " << maxcost << endl;
}
void inputdata(int x, Stocks *s) {
    for (int i = 0; i < x; i++)
    {
        cout << "Введите биржу, название акции, акционерное общество, цену акции, и динамику акции" << endl;
        cin >> s[i].market;
        cin >> s[i].name;
        cin >> s[i].company;
        cin >> s[i].cost;
        cin >> s[i].st_din;
    }
}
int main()
{
    int m, l, method;
    cout << "Введите количество акций в <MOEX> и <LSE>" << endl;
    cin >> m >> l;
    //Создание динамических массивов
    Stocks *MX = new Stocks[m];
    Stocks *LS = new Stocks[l];
    //Заполнение сущностей
    MOEX.circulation = 53;
    MOEX.country = "Russia";
    MOEX.owner = "Yuri Denisov";
    LSE.circulation = 65;
    LSE.country = "United Kingdom";
    LSE.owner = "Donald Brydon";
    MX->y.owner = MOEX.owner;
    MX->y.country = MOEX.country;
    MX->y.circulation = MOEX.circulation;
    LS->y.owner = LSE.owner;
    LS->y.country = LSE.country;
    LS->y.circulation = LSE.circulation;
    while (1)
    {
        switch (menu()){
        case 1: {
                cout << "Выберите способ ввода данных:" << endl << "1 - с клавиатуры, 2 - из файла" << endl;
                cin >> method;
                switch (method){
                    case 1: {
                                cout << "Введите данные об акциях в <MOEX>" << endl;
                                inputdata(m,MX);
                                cout << "Введите данные об акциях в <LSE>" << endl;
                                inputdata(l,LS);}break;
                    case 2: {
                                cout << "Считывание данных об акциях ММВБ " << endl;
                                fileinput(MX,count("moex.txt"),"moex.txt");
                                cout << "Считывание данных об акциях LSE " << endl;
                                fileinput(LS,count("lse.txt"),"lse.txt");
                            }
                            }
                }break;
        case 2: maxcost(MX,m,LS,l);break;
        case 3: cout << "Сумма стоимостей акций ММВБ: " << summoex(MX,m) << endl;break;
        case 4: cout << "Сумма стоимостей акций LSE: " << sumlse(LS,l) << endl;break;
        case 5: cout << "Сумма стоимостей всех акций:  " << summoex(MX,m) + sumlse(LS,l) << endl;break;
        case 6: show(MX,m);stockinfo(MX);show(LS,l);stockinfo(LS);break;
        case 7: {delete[]MX; delete[]LS; return 0;}
        default: cout << "Ошибка!\n";
        }
    }
}
READ ALSO
static_cast&lt;int&gt;(abs(13200 / 1.1)) = 11999

static_cast<int>(abs(13200 / 1.1)) = 11999

Вопрос в том почему

76
Как из uint8 сделать QIcon?

Как из uint8 сделать QIcon?

У меня есть переменная типа uint8*, которая "заполнена" картинкойКак преобразовать её в QIcon? А вот функция, которая заполняет переменную типа...

195
Как такое реализуется

Как такое реализуется

Нужна помощь или совет как реализовать такую задачу:Надо отсортировать массив и вывести все этапы сортировкиМассивы я отсортировал и программа...

112
Каково состояние объектов стандартной библиотеки после перемещения?

Каково состояние объектов стандартной библиотеки после перемещения?

Скажите, пожалуйста, в каком состоянии находятся объекты стандартной библиотеки после перемещения? Можно ли продолжать их использовать?

79