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

Case switch и функции

25.10.2014, 15:11. Показов 3733. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется задание :
1. Сформировать динамический одномерный массив, заполнить его случайными числами и вывести на печать.
2. Выполнить указанное в варианте задание и вывести полученный массив на печать.
3. Сформировать динамический двумерный массив, заполнить его случайными числами и вывести на печать.
4. Выполнить указанное в варианте задание и вывести полученный массив на печать.

Сами функции вроде как слепил (пока только для двухмерного, часть кода нашел здесь же на форуме), но в задании есть небольшое уточнение - "Для реализации интерфейса использовать текстовое меню", т.е. через case - switch. Собрал все в кучу - получилось что-то вроде этого:

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "conio.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <time.h>
 
using namespace std;
 
int** new2DArray(const int size) //создание, заполнение вывод нового двумерного массива
{
    printf("enter size of array: ");
    scanf_s("%d", &size);
    int** arr = new int*[size];
 
    for (int i = 0; i < size; ++i)
        arr[i] = new int[size];
 
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            arr[i][j] = rand() % 10;
            std::cout << arr[i][j]<<' ';
        }
        std::cout << endl;
    }
    return arr;
}
 
void outputter(int** mtrx1, const int size)
{
        for (int i = 0; i < size; ++i)
        {
            for (int j = 0; j < size; ++j)
                std::cout << mtrx1[i][j];
            std::cout << '\n';
        }
        std::cout << '\n';
}
 
int** _adding(const int size, int** mtrx1)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int n = 0;
    int col = 0;
    int row = 0;
    int new_col = 0;
    int new_row = 0;
    int **matrix = 0;
    int **new_matrix = 0;
 
    printf("enter \"K\": ");
    scanf_s("%d", &k);
 
    printf("enter \"N\": ");
    scanf_s("%d", &n);
 
    new_row = row + k;
    new_col = col;
 
    if ((new_matrix = (int**)malloc(new_row * sizeof(int))) == NULL) {
        perror("memory allocated error");
        abort();
    }
 
    for (i = 0; i < new_row; ++i)
    {
        if ((new_matrix[i] = (int*)malloc(new_col * sizeof(int))) == NULL) {
            perror("memory allocated error");
            abort();
        }
    }
 
    for (i = 0; i < n; ++i)
        for (j = 0; j < col; ++j)
            new_matrix[i][j] = matrix[i][j];
 
    for (i = n; i < n + k; ++i)
        for (j = 0; j < new_col; ++j)
            new_matrix[i][j] = 0;
 
    for (i = n; i < row; ++i)
        for (j = 0; j < col; ++j)
            new_matrix[i + k][j] = matrix[i][j];
 
    printf("\nnew matrix\n");
    for (i = 0; i < new_row; ++i) {
        for (j = 0; j < new_col; ++j)
            printf("%d, ", new_matrix[i][j]);
        printf("\n");
    }
    printf("\n");
 
    for (i = 0; i < row; ++i)
        free(matrix[i]);
    free(matrix);
 
    for (i = 0; i < new_row; ++i)
        free(new_matrix[i]);
    free(new_matrix);
 
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    int i = 0;
    int j = 0;
    int k = 0;
    int size = 0;
    int *odd_arr = 0;
    do
    {
        cout << "1.Формирование массива\n";
        cout << "2.Печать массива\n";
        cout << "3.Добавление в массив\n";
        cout << "4.Выход\n";
        cin >> k;
        switch (k)
        {
        case 1: {int** new2DArray(const int size);
            int** mtrx1 = new2DArray(size);
            cout << "\nМассив сформирован!!\n\n";
            break; }
        case 2:{
            void outputter(int **mtrx1, const int size);
            break; }
        case 3: {int** _adding(const int size, int** mtrx1);
            break; }
        }
 
    }
    while (k < 4);
    system("pause");
    return 0;
}
Программа компилируется, меню появляется, но работает только пункт меню 1 - т.е. создание нового массива, при выборе остальных просто возвращается главное меню. В общем, запутался нереально. Пробовал в case уже кучу разных вариантов, но нет даже намека на прогресс - либо также не работает, либо просто не компилится.
Миниатюры
Case switch и функции   Case switch и функции  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2014, 15:11
Ответы с готовыми решениями:

Оптимальная конструкция switch-case-while / while-switch-case
Имеется конструкция типа: switch() { case 1: while() { ... }

косяк вызова функции через switch case
! кода по моим меркам много, если решитесь помочь, запаситесь терпением))) Итак. Имеется зародыш курсовой - игры пятнашки. делал в...

Switch case внутри switch case
Привет всем! Нужна помощь. Пишу калькулятор с консольным меню. Так вот, используется цикл while, внутри которого у меня switch...

4
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.10.2014, 16:01
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch (k)
        {
        case 1: {int** new2DArray(const int size);
            int** mtrx1 = new2DArray(size);
            cout << "\nМассив сформирован!!\n\n";
            break; }
        case 2:{
            void outputter(int **mtrx1, const int size);
            break; }
        case 3: {int** _adding(const int size, int** mtrx1);
            break; }
        }
Да, с синтаксисом у нас беда!
1. Вынеси декларацию int **mtrx1; в начало функции main. Он же у тебя больше нигде кроме блока case 1 не виден!
2.
C++
1
2
3
4
5
6
7
8
9
case 1: 
            mtrx1 = new2DArray(size);
            cout << "\nМассив сформирован!!\n\n";
            break; 
        case 2:{
            outputter(mtrx1,  size);
            break; }
        case 3: { _adding(size, mtrx1);
            break; }
3. Пойми разницу между объявлением-описанием функции и ее вызовом
ЗЫ. Смотрел только этот кусочек.
1
 Аватар для evelolka
2 / 2 / 0
Регистрация: 25.10.2013
Сообщений: 108
25.10.2014, 16:26
а зачем ты тонну библиотек подключаешь?)
тебе iostream нужно да и только)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.10.2014, 16:33
Цитата Сообщение от evelolka Посмотреть сообщение
а зачем ты тонну библиотек подключаешь?)
тебе iostream нужно да и только)
Ну, это не главная беда. Во всяком случае беды от этого не будет. Да, избыточности следует избегать, да, компилиться будет на 2 мск дольше, но это все такая чепухпа, по сравнению с тем, что ТС навалял в строках 118-134...
0
0 / 0 / 0
Регистрация: 15.04.2014
Сообщений: 2
25.10.2014, 17:19  [ТС]
Цитата Сообщение от evelolka Посмотреть сообщение
а зачем ты тонну библиотек подключаешь?)
тебе iostream нужно да и только)
Это я экспериментировал пока лепил программу.

Цитата Сообщение от Байт Посмотреть сообщение
Да, с синтаксисом у нас беда!
Знаю, пока только учусь, все с чего то начинали. Думаю впереди еще много проб и ошибок.
Декларацию вынес, теперь работают пункты 1 и немного 3. Пока сидел в отладчике - понял в чем дело, теперь не знаю как исправить - я переменную size проинициализировал нулем в main. Она нулем передается в функцию создания массива, но оттуда значение size в main не возвращается, т.е. при обращении к outputter и _adding значение size передается все тем же нулем и циклы заканчиваются в самом начале. Ниже переделанный код.

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "conio.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <time.h>
 
using namespace std;
 
int** new2DArray(const int size) //создание, заполнение вывод нового двумерного массива
{
    printf("enter size of array: ");
    scanf_s("%d", &size);
    int** arr = new int*[size];
 
    for (int i = 0; i < size; ++i)
        arr[i] = new int[size];
 
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            arr[i][j] = rand() % 10;
            std::cout << arr[i][j]<<' ';
        }
        std::cout << endl;
    }
    return arr;
}
 
void outputter(int** mtrx1, const int size)
{
        for (int i = 0; i < size; ++i)
        {
            for (int j = 0; j < size; ++j)
                std::cout << mtrx1[i][j];
            std::cout << '\n';
        }
        std::cout << '\n';
}
 
int** _adding(int** mtrx1, const int size)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int n = 0;
    int new_col = 0;
    int new_row = 0;
    int **new_matrix = 0;
 
    printf("enter \"K\": ");
    scanf_s("%d", &k);
 
    printf("enter \"N\": ");
    scanf_s("%d", &n);
 
    new_row = size + k;
    new_col = size;
 
    if ((new_matrix = (int**)malloc(new_row * sizeof(int))) == NULL) {
        perror("memory allocated error");
        abort();
    }
 
    for (i = 0; i < new_row; ++i)
    {
        if ((new_matrix[i] = (int*)malloc(new_col * sizeof(int))) == NULL) {
            perror("memory allocated error");
            abort();
        }
    }
 
    for (i = 0; i < n; ++i)
        for (j = 0; j < size; ++j)
            new_matrix[i][j] = mtrx1[i][j];
 
    for (i = n; i < n + k; ++i)
        for (j = 0; j < new_col; ++j)
            new_matrix[i][j] = 0;
 
    for (i = n; i < size; ++i)
        for (j = 0; j < size; ++j)
            new_matrix[i + k][j] = mtrx1[i][j];
 
    printf("\nnew matrix\n");
    for (i = 0; i < new_row; ++i) {
        for (j = 0; j < new_col; ++j)
            printf("%d, ", new_matrix[i][j]);
        printf("\n");
    }
    printf("\n");
 
    for (i = 0; i < size; ++i)
        free(mtrx1[i]);
    free(mtrx1);
 
    for (i = 0; i < new_row; ++i)
        free(new_matrix[i]);
    free(new_matrix);
 
    return 0;
}
 
int main()
 
{   
    int **mtrx1=0;
    setlocale(LC_ALL, "rus");
    int i = 0;
    int j = 0;
    int k = 0;
    int size=0;
    
    do
    {
        cout << "1.Формирование массива\n";
        cout << "2.Печать массива\n";
        cout << "3.Добавление в массив\n";
        cout << "4.Выход\n";
        cin >> k;
        switch (k)
        {
        case 1:{
            mtrx1 = new2DArray(size);
            cout << "\nМассив сформирован!!\n\n";
            break; }
        case 2:{ outputter(mtrx1, size);
            break; }
        case 3: { _adding(mtrx1, size);
            break; }
        
        }
 
    }
    while (k < 4);
 
    _getch();
 
    return 0;
}
Теперь мне главное понять как передать нормальную версию size обратно в main.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.10.2014, 17:19
Помогаю со студенческими работами здесь

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

Switch + case
Суть задания: Задан шифр книги из библиотеки в виде шестизначного целого числа. Определить к какому подразделу ...

switch и case
Пишет, что switch не содержит case, но судя по коду - это не так... как же заставить его видеть этот case? #include...

Switch - case
Обязательно с использованием классов Есть задача. Дан массив вещественных чисел. а) Ко всем отрицательным элементам прибавить элемент...

case-switch
Вот то задание что с case-switch надо сделать помогите знаю что задание дурное


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru