Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.02.2016
Сообщений: 21

Ввод размерности динамического массива

23.01.2020, 23:47. Показов 1317. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу никак справиться c вводом размерности массива из switch'а

Вот изначальный код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int n = 0;
    cout << "Число рейсов: "; cin >> n;
    AEROFLOT* mas = new AEROFLOT[n]; // массив из n записей
 
 
 
 
    int m = 0;
    while (m != 4)
 
    {
        m = Menu();
        switch (m)
        
        {
        case 1:
            
            Add(mas, n); // добавляем данные
            system("pause");
            break;

Вот код после которого не работает, ввод поставлен в case 1, почему не работает - вроде понимаю.
Но не понимаю как исправить

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    int n = 0;
 
    AEROFLOT* mas = new AEROFLOT[n]; // массив из n записей
 
 
 
 
    int m = 0;
    while (m != 4)
 
    {
        m = Menu();
        switch (m)
        
        {
        case 1:
            cout << "Число рейсов: "; cin >> n;
            Add(mas, n); // добавляем данные
            system("pause");
            break;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2020, 23:47
Ответы с готовыми решениями:

Ввод двумерного массива, ввод размерности массива, заполнение массива случайными числами
#include &quot;stdafx.h&quot; #include &quot;locale.h&quot; #include &quot;stdlib.h&quot; #include &quot;math.h&quot; void main() { setlocale(LC_ALL,&quot;rus&quot;); int...

Изменения размерности динамического массива
недавно задался вопросом, а можно как-то изменить размерность динамического массива ну например есть такой массив int n; n=5; int...

Увеличение размерности динамического массива
У меня есть простейший рабочий пример заполнения массива и известным количеством выделяемой памяти class tmp{ private: int...

8
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
24.01.2020, 07:34
Lighet1337, полный код приведите и обрамите тегами (вверху окна редактирования)
0
0 / 0 / 0
Регистрация: 21.02.2016
Сообщений: 21
24.01.2020, 09:02  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
   #include<iostream>
#include<iomanip>
#include<string>
#include <windows.h>
using namespace std;
 
struct AEROFLOT // структура AEROFLOT
{
    string punkt; // название пункта назначения рейса
    int number; // номер рейса
    string type; // тип самолета
};
 
int Menu() // функция меню
{
    int m;
    cout << "Меню:" << endl;
cout << "1 - заполнение списка" << endl;
cout << "2 - просмотр списка" << endl;
cout << "3 - поиск по пункту назначения" << endl;
    cout << "4 - выход" << endl;
cin >> m;
    return m;
}
 
// функция заполнения
static void Add(AEROFLOT *mas, int n)
{
    for (int i = 0; i < n; i++){
    // вводим данные
cout << "Пункт назначения: ";
    cin >> mas[i].punkt;
cout << "Номер: ";
cin >> mas[i].number;
cout << "Тип самолета: ";
    cin >> mas[i].type;
}
}
 
// функция вывода содержимого на экран
void Print(AEROFLOT *mas, int n)
{
    // выводим данные
cout << "Пункт назначения Номер Тип самолета" << endl;
    for (int i = 0; i < n; i++)
cout << setw(10) << mas[i].punkt << setw(10) << mas[i].number << setw(17) << mas[i].type << endl;
}
 
 
// функция поиска по пункту назначения
static void search(AEROFLOT* mas, int n)
{
    string line;
    bool check = false; // переменная проверки - найден ли рейс
cout << "Искомый рейс: ";
cin >> line; // вводим какой рейс ищем
cout << "Пункт назначения Номер Тип самолета" << endl;
    for (int i = 0; i < n; i++) // проходим по массиву данных
{
    if (mas[i].punkt == line) // если рейс найден
{
cout << setw(10) << mas[i].punkt << setw(10) << mas[i].number << setw(17) << mas[i].type << endl;
check = true; // рейс найден
}
}
    if (!check) // если не рейс найден
cout << "Не найдено" << endl;
}
 
 
int main() {
    //setlocale(LC_ALL, "Russian"); // вывод русского языка
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
    int n = 0;
cout << "Число рейсов: "; cin >> n;
    AEROFLOT* mas = new AEROFLOT[n]; // массив из n записей
    int m = 0;
    while (m != 4)
{
m = Menu();
    switch (m)
{
    case 1:
Add(mas, n); // добавляем данные
system("pause");
    break;
    case 2:
Print(mas, n); // выводим данные
system("pause");
    break;
    case 3:
search(mas, n); // поиск
system("pause");
    break;
    default:
cout << "Завершение работы" << endl;
system("pause");
    return 0;
    break;
}
system("cls");
    }
    return 0;
}
0
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
24.01.2020, 09:29
Lighet1337, и что не работает? вроде все в порядке
0
0 / 0 / 0
Регистрация: 21.02.2016
Сообщений: 21
24.01.2020, 11:19  [ТС]
Мне нужно сделать ввод размерности массива из 1 кейса
0
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
24.01.2020, 11:26
а что делать если вы 2 раза выберете первый case ?
0
11 / 1 / 0
Регистрация: 07.01.2020
Сообщений: 8
24.01.2020, 14:19
Не совсем всё в порядке.... Количество рейсов фиксировано вводится в самом начале программы, поэтому при попытке добавить новые рейсы в "базу" переписываются уже существующие.
1) вводить число новых рейсов при выборе соответствующего пункта меню (1);
2) функция Add() должна выделять новый массив с учётом новых данных, копировать в него данные из существующего, а потом добавлять в него новые рейсы с индекса, следующего за текущим последним; ну и возвращать функция будет не void, а указатель на новый массив данных;
3) количество записей хранить отдельно.
Логично сделать ввод количества новых записей (cin >> new_count) внутри функции Add. А с самого начала количество записей будет нулевым.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
AEROFLOT* Add(AEROFLOT* old_array, int& base_size)
{
    int new_count;
    cout << "Число новых рейсов: ";
    cin >> new_count;
    AEROFLOT* new_array = new AEROFLOT[base_size + new_count];
    // скопировать старые данные в новый массив
    memcpy(new_array, old_array, sizeof(AEROFLOT) * base_size);
    // добавить новые данные
    for (auto i = base_size; i < base_size + new_count; ++i)
    {
        cout << "Пункт назначения: ";
        cin >> new_array[i].punkt;
        cout << "Номер: ";
        cin >> new_array[i].number;
        cout << "Тип самолета: ";
        cin >> new_array[i].type;
    }
    // обновить количество записей
    base_size = base_size + new_count;
    // так как создан новый массив, старую память надо освободить
    delete[] old_array;
    return new_array;
}
 
int main() {
    AEROFLOT* mas = nullptr;
    int records_count = 0;
    while (true)
    {
        int m = Menu();
        switch (m)
        {
            case 1:
                mas = Add(mas, records_count);
                break;
            case 2:
                Print(mas, records_count);
                break;
            case 3:
                search(mas, records_count);
                break;
            case 4:
                cout << "Завершение работы" << endl;
                return 0;
            default:
        }
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 21.02.2016
Сообщений: 21
24.01.2020, 17:42  [ТС]
Цитата Сообщение от xoxlov Посмотреть сообщение
0;
Вроде бы понял, соль.
Но пишет неоднозначный вызов перегруженной функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "pch.h"
#include<iostream>
#include<iomanip>
#include<string>
#include <windows.h>
using namespace std;
 
struct AEROFLOT // структура  AEROFLOT
{
    string punkt; // название пункта назначения рейса
    int number; // номер рейса
    string type; // тип самолета
};
 
int Menu() // функция меню
{
    int m;
    cout << "Меню:" << endl;
    cout << "1 - заполнение списка" << endl;
    cout << "2 - просмотр списка" << endl;
    cout << "3 - поиск по пункту назначения" << endl;
    cout << "4 - выход" << endl;
    cin >> m;
    return m;
}
 
// функция заполнения
static void Add(AEROFLOT *mas, int n)
{
    for (int i = 0; i < n; i++) {
        // вводим данные
        cout << "Пункт назначения: ";
        cin >> mas[i].punkt;
        cout << "Номер: ";
        cin >> mas[i].number;
        cout << "Тип самолета: ";
        cin >> mas[i].type;
    }
}
 
// функция вывода содержимого на экран
void Print(AEROFLOT *mas, int n)
{
    // выводим данные
    cout << "Пункт назначения Номер   Тип самолета" << endl;
    for (int i = 0; i < n; i++)
        cout << setw(10) << mas[i].punkt << setw(10) << mas[i].number << setw(17) << mas[i].type << endl;
}
 
 
// функция поиска по пункту назначения
static void search(AEROFLOT* mas, int n)
{
    string line;
    bool check = false; // переменная проверки - найден ли рейс
    cout << "Искомый рейс: ";
    cin >> line; // вводим какой рейс ищем
    cout << "Пункт назначения Номер   Тип самолета" << endl;
    for (int i = 0; i < n; i++) // проходим по массиву данных
    {
        if (mas[i].punkt == line) // если рейс найден
        {
            cout << setw(10) << mas[i].punkt << setw(10) << mas[i].number << setw(17) << mas[i].type << endl;
            check = true; // рейс найден
        }
    }
    if (!check) // если не рейс найден
        cout << "Не найдено" << endl;
}
 
 
AEROFLOT* Add(AEROFLOT* old_array, int& base_size)
{
    int new_count;
    cout << "Число новых рейсов: ";
    cin >> new_count;
    AEROFLOT* new_array = new AEROFLOT[base_size + new_count];
    // скопировать старые данные в новый массив
    memcpy(new_array, old_array, sizeof(AEROFLOT) * base_size);
    // добавить новые данные
    for (auto i = base_size; i < base_size + new_count; ++i)
    {
        cout << "Пункт назначения: ";
        cin >> new_array[i].punkt;
        cout << "Номер: ";
        cin >> new_array[i].number;
        cout << "Тип самолета: ";
        cin >> new_array[i].type;
    }
    // обновить количество записей
    base_size = base_size + new_count;
    // так как создан новый массив, старую память надо освободить
    delete[] old_array;
    return new_array;
}
 
int main() {
    //setlocale(LC_ALL, "Russian"); // вывод русского языка
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    AEROFLOT* mas = nullptr;
    int records_count = 0;
    while (true)
    {
        int m = Menu();
        switch (m)
        {
        case 1:
            mas = Add(mas, records_count);
            break;
        case 2:
            Print(mas, records_count);
            break;
        case 3:
            search(mas, records_count);
            break;
        case 4:
            cout << "Завершение работы" << endl;
            return 0;
        default:
        }
    }
    return 0;
}
0
11 / 1 / 0
Регистрация: 07.01.2020
Сообщений: 8
24.01.2020, 18:09
Ну так на минуточку - я же изменил существующую функцию, а не добавил ещё одну. То есть надо заменить текст "старой" функции на текст "обновлённой"
Почему пишет про неоднозначный вызов перегруженной функции - потому что получилось две функции с одинаковым набором параметров и с разным типов возвращаемого значения. Получается, что компилятор при выборе нужного варианта перегруженной функции попадает в тупик и не знает, что выбрать при соответствующем вызове.... Подробнее - книжка Липпман, Лажойе, Му "Язык программирования С++. Базовый курс", параграф "6.6 Подбор функции".

Добавлено через 6 минут
Кстати да, я использовал memcpy для копирования данных, но это работало только потому, что данные я вводил "финтифлюшные", по-хорошему - там надо конструктор копирования сделать для структуры, но попроще - можно и в простом цикле, что-то вроде:
C++
1
2
3
4
5
for (auto i = 0; i < base_size; ++i)
{
    new_array[i].punkt = old_array[i].punkt;
    ... // аналогично для всех полей
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2020, 18:09
Помогаю со студенческими работами здесь

Содание динамического массива известной размерности
Доброго времени суток. Возник вопрос. Возможно ли создать такой массив (аналог динамического), когда его размерность определяется в...

Ввод вручную размерности двумерного массива
Здравствуйте уважаемые форумчане. Такая небольшая проблема. У нас есть двумерный массив, размерность n на n. С помощью #define n 5...

ввод динамического символьного массива
Моя задача в том, чтобы написать интерфейс к работе с базой данных на турбо с++. Посоветуйте как решить проблему ввода, например,...

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

Ввод-вывод двумерного динамического массива
Здраствуйте. Задана задача, в ходе которой нужно ввести динамический массив(каждый елемент с новой строчки), а затем вывести его уже как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru