@marlaaa

При выводе на экран одна строка копирует другую, хотя они должны быть разные. Как исправить?

Проблема в том что people копирует s при выводе всего массива структур. Им заданы разные значения.
#include <iostream>
using namespace std;
enum stran {
    kanada, malasia, turciya,
};
union no {
    int people;
    int s : 10;
};
struct Gosvo
{
    no a;
    string name;
    string sity;
    stran b;
};

int main()
{
    setlocale(LC_ALL, "Russian");
    Gosvo f;
    f.a.people = 9;
    f.name = "Belarus";
    f.sity = "Minsk";
    f.a.s = 2;
    Gosvo k;
    k.a.people = 213;
    k.name = "Brasiliya";
    k.sity = "Brasilia";
    k.a.s = 8;
    Gosvo l;
    struct Gosvo* gs;
    gs = &l;
    gs->a.people = 83;
    gs->name = "Iran";
    gs->sity = "Tegeran";
    gs->a.s = 16;

    int n;
    cout << "Введите количество структур в массиве:";
    cin >> n;
  Gosvo *gosvos=new Gosvo[n];
    gosvos[0] = f;
    gosvos[1] = k;
    gosvos[2] = l;


    cout << "Что делать? Выберите цифру";
    cout << "1.Сортировка массива по алфавиту";
    cout << "2.Поиск элемента по номеру в массиве";
    cout << "3.Изменение массива структур";
    cout << "4.Удаление первого элемента массива структур";
    cout << "5.Вывод массива структур";
    int m;
    cin >> m;
  

   if (m == 1) {
        //сортировка по алфавиту
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j < n - 1; j++)
            {
                if (gosvos[j].name > gosvos[j + 1].name)
                {
                    string b = gosvos[j].name; // создали дополнительную переменную
                    gosvos[j].name = gosvos[j + 1].name; // меняем местами
                    gosvos[j + 1].name = b; // значения элементов
                }
            }
            cout << gosvos[i].name << endl; // выводим элементы массива
        }
    }
   
    else if (m == 2) {
        //найти элемент массива
        cout << "По какому параметру будем искать(name или sity)?" << endl;
        string parametr;
        cin >> parametr;
        if (parametr == "sity") {
            cout << "Найти по номеру элемента в массиве. Введите номер(0,1,2)" << endl;
            int nomber;
            cin >> nomber;
            cout << gosvos[nomber].sity;
        }
        else if (parametr == "name") {
            cout << "Найти по номеру элемента в массиве. Введите номер(0,1,2)" << endl;
            int number;
            cin >> number;
            cout << gosvos[number].name;
        }
        else {
            cout << "Нет параметра!";
        }
    }
    else if (m == 3) {
        cout << "Какой элемент будем изменять(name или sity)?" << endl;
        string element;
        cin >> element;
        if (element == "sity") {
            cout << "Номер элемента в массиве. Введите номер(0,1,2)" << endl;
            int nomber;
            cin >> nomber;
            cout << "На что меняем?";
            string smena;
            cin >> smena;
            gosvos[nomber].sity = smena;
        }
        else if (element == "name") {
            cout << "Найти по номеру элемента в массиве. Введите номер(0,1,2)" << endl;
            int nomber;
            cin >> nomber;
            cout << gosvos[nomber].name;
        }
        else {
            cout << "Нет такого!";
        }
    }
    else if (m == 4) {
        int r=n;
        Gosvo *arr = new Gosvo[--r];
        for (int i = 0; i < n - 1; i++) {
            arr[i] = gosvos[i];
        }
        delete[] gosvos;
        gosvos = arr;
        cout << "Элемент удалён";

    }
    else if (m == 5) {
        cout << gosvos[0].name << gosvos[1].name << gosvos[2].name << endl;
        cout << gosvos[0].sity << gosvos[1].sity << gosvos[2].sity << endl;
        cout << gosvos[0].a.people << gosvos[1].a.people << gosvos[2].a.people << endl;
        cout << gosvos[0].a.s << gosvos[1].a.s << gosvos[2].a.s << endl;
    }


    else {
        cout << "error";
    }
    
    return 0;
}
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
Не копирует.
У вас no - это объединение (union). В объединении все члены объединения занимают одну и ту же память, т.е. если вы посмотрите sizeof(no), то увидите 4 байта, т.е. память выделяется как для одного int, а у вас там 2 int. Т.е. то что вы написали в коде так оно и работает.
Т.е. операции, например:
f.a.people = 9;
f.a.s = 2;

перезаписывают одну и ту же область памяти. После этого f.a.people == 2, а не 9.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы