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

Инициализация переменной внутри ветвления

13.05.2022, 17:10. Показов 3578. Ответов 16

Студворк — интернет-сервис помощи студентам
Перевожу программу с Паскаля на С++. Столкнулась со следующей проблемой: инициализирую переменную n в первом ветвлении case, а в третьем это значение требуется для условия выполнения, программа компилируется, но при выполнении выскакивается сообщение о том, что переменная n не инициализирована. Как исправить данную ситуацию?
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
do
    {
        switch (k)
        {
        case 10:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the encryption key:" << endl;
            gotoxy(25, 16);
            SetConsoleTextAttribute(colors, 10);
            scanf("%d", &n);
            while (n%2 == 0)
            {
                kclean_p();
                gotoxy(20, 14);
                SetConsoleTextAttribute(colors, 12);
                cout << "Enter an odd number:" << endl;
                gotoxy(25, 16);
                SetConsoleTextAttribute(colors, 10);
                scanf("%d", &n);
            }
            kend_p();
            ex = true;
            break;
        case 12:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the signal:" << endl;
            gotoxy(20, 16);
            SetConsoleTextAttribute(colors, 10);
            scanf("%s", &S);
            kend_p();
            ex = true;
            break;
        case 14:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the maximum allowed" << endl;
            gotoxy(25, 15);
            cout << "number of errors" << endl;
            gotoxy(25, 17);
            SetConsoleTextAttribute(colors, 10);
            scanf("%d", &minmax);
            while (minmax > (n % 2) * strlen(S))
            {
                kclean_p();
                gotoxy(20, 11);
                SetConsoleTextAttribute(colors, 12);
                cout << "Invalid number of errors" << endl;
                gotoxy(20, 13);
                cout << "The number of errors should" << endl;
                gotoxy(20, 14);
                cout << "be no more" << (n % 2) * strlen(S) << endl;
                gotoxy(20, 16);
                cout << "Enter the number of errors" << endl;
                gotoxy(25, 18);
                SetConsoleTextAttribute(colors, 10);
                scanf("%d", &minmax);
            }
            kend_p();
            ex = true;
            break;
        }
    } 
    while (ex != true);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2022, 17:10
Ответы с готовыми решениями:

Инициализация переменной, которая определена внутри функции
В учебнике по которому учусь есть строка: Если вы не инициализируете переменную, которая определена внутри функции, то ее значение будет...

Неясное условие внутри команды ветвления
if(stricmp(nds.first, &quot;exit&quot;)==0) { return false; } Где nds - это экземпляр класса, а...

Инициализация массива внутри case
Подскажите, пожалуйста, как правильно инициализировать массив внутри оператора case? Или так делать нельзя? При компиляции вот этого кода...

16
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
13.05.2022, 17:37
Pryahiiina, код не полный, приведи полный.
Для case неплохо бы фигурные скобки расставить
0
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
13.05.2022, 18:04  [ТС]
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
 
int k, c;
 
using namespace std;
HANDLE colors;
 
void gotoxy(int xpos, int ypos)
{
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = xpos; scrn.Y = ypos;
    SetConsoleCursorPosition(hOuput, scrn);
}
 
void menu_2p()
{
    system("cls");
 
    colors = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(colors, 15);
    gotoxy(20, 4);
    cout << "----------------------" << endl;
    gotoxy(29, 6);
    cout << "MENU" << endl;
    gotoxy(20, 8);
    cout << "----------------------" << endl;
    gotoxy(20, 10);
    cout << "1) Encryption key" << endl;
    gotoxy(20, 12);
    cout << "2) Enter a message" << endl;
    gotoxy(20, 14);
    cout << "3) Encrypt the message" << endl;
    gotoxy(20, 16);
    cout << "4) Send a message" << endl;
    gotoxy(20, 18);
    cout << "5) Accept the message" << endl;
    gotoxy(20, 20);
    cout << "6) View the result" << endl;
    gotoxy(20, 22);
    cout << "----------------------" << endl;
    gotoxy(20, 24);
    SetConsoleTextAttribute(colors, 12);
    cout << "View the result to exit, press ESC" << endl;
}
 
void kend_p()
{
    char s;
    gotoxy(20, 24);
    SetConsoleTextAttribute(colors, 12);
    cout << "To exit, press ENTER" << endl;
    _getch();
}
 
void kclean_p()
{
    system("cls");
    SetConsoleTextAttribute(colors, 15);
    gotoxy(20, 8);
    cout << "----------------------" << endl;
    gotoxy(20, 22);
    cout << "----------------------" << endl;
}
 
void start()
{
    menu_2p();
    k = 10;
    gotoxy(18, k);
    SetConsoleTextAttribute(colors, 10);
    cout << "*" << endl;
}
 
int mistake(int k)
{
    int n, minmax;
    char S[256], S2[256];
    bool ex;
 
    ex = false;
    do
    {
        switch (k)
        {
        case 10:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the encryption key:" << endl;
            gotoxy(25, 16);
            SetConsoleTextAttribute(colors, 10);
            scanf("%d", &n);
            while (n%2 == 0)
            {
                kclean_p();
                gotoxy(20, 14);
                SetConsoleTextAttribute(colors, 12);
                cout << "Enter an odd number:" << endl;
                gotoxy(25, 16);
                SetConsoleTextAttribute(colors, 10);
                scanf("%d", &n);
            }
            kend_p();
            ex = true;
            break;
        case 12:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the signal:" << endl;
            gotoxy(20, 16);
            SetConsoleTextAttribute(colors, 10);
            scanf("%s", &S);
            kend_p();
            ex = true;
            break;
        case 14:
            kclean_p();
            gotoxy(20, 14);
            cout << "Enter the maximum allowed" << endl;
            gotoxy(25, 15);
            cout << "number of errors" << endl;
            gotoxy(25, 17);
            SetConsoleTextAttribute(colors, 10);
            scanf("%d", &minmax);
            while (minmax > (n % 2) * strlen(S))
            {
                kclean_p();
                gotoxy(20, 11);
                SetConsoleTextAttribute(colors, 12);
                cout << "Invalid number of errors" << endl;
                gotoxy(20, 13);
                cout << "The number of errors should" << endl;
                gotoxy(20, 14);
                cout << "be no more" << (n % 2) * strlen(S) << endl;
                gotoxy(20, 16);
                cout << "Enter the number of errors" << endl;
                gotoxy(25, 18);
                SetConsoleTextAttribute(colors, 10);
                scanf("%d", &minmax);
            }
            kend_p();
            ex = true;
            break;
        }
    } 
    while (ex != true);
    return 0;
}
 
int main()
{
    system("cls");
    start();
    do {
        c = _getch();
        switch (c) 
        {
        case 72: 
            k = k - 2;
            gotoxy(18, k + 2); 
            printf(" \n");
            gotoxy(18, k);
            if (k > 8)
            {
                SetConsoleTextAttribute(colors, 10);
                cout << "*" << endl;
            }
            else
            {
                if (k == 8)
                {
                    k = 20;
                    gotoxy(18, 8);
                    printf(" \n");
                    gotoxy(18, k);
                    SetConsoleTextAttribute(colors, 10);
                    cout << "*" << endl;
                }
            }
            break;
        case 80:
            k = k + 2;
            gotoxy(18, k - 2);
            printf(" \n");
            gotoxy(18, k);
            SetConsoleTextAttribute(colors, 10);
            cout << "*" << endl;
            if (k == 22)
            {
                k = 10;
                gotoxy(18, 22);
                printf(" \n");
                gotoxy(18, k);
                SetConsoleTextAttribute(colors, 10);
                cout << "*" << endl;
            }
            break;
        case 13:
            mistake(k);
            start();
        }
    } while (c != 27); 
}

Добавлено через 1 минуту
Алексей1153, в каком месте следует добавить скобки, вы думаете проблема в них?
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
13.05.2022, 18:27
Pryahiiina, компилятор не смог удостовериться что в процессе исполнения программы [case 10] всегда будет вызван перед [case 14]. Поэтому вам сообщение: внимание, возможна ситуация где переменная n может быть использована без инициализации.
1
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
13.05.2022, 18:55  [ТС]
QueryMonkey, то есть если я вызову case 10 перед case 14, в памяти будет значение n, которое я ввела?
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
13.05.2022, 19:04
Лучший ответ Сообщение было отмечено Pryahiiina как решение

Решение

Цитата Сообщение от Pryahiiina Посмотреть сообщение
QueryMonkey, то есть если я вызову case 10 перед case 14, в памяти будет значение n, которое я ввела?
Да. Однако, компилятору не смог в этом удостовериться.

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

вместо
C++
1
   int n;
напишите
C++
1
int n = 0;
1
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
13.05.2022, 20:18
Pryahiiina, в данном случае проблема не в скобках, а в отсутствии инициализации переменных. Но скобки тоже не помешают, к этому нужно сразу привыкать

case .... :
{
}
break;
1
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
13.05.2022, 20:22  [ТС]
QueryMonkey, Это решило проблему с вылетающим сообщением, но в почему-то в памяти хранится значение n=0, а не вводимое с клавиатуры.
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
13.05.2022, 21:43
Лучший ответ Сообщение было отмечено Pryahiiina как решение

Решение

Если переменная объявлена в цикле, то она и инициализируется в цикле, многократно.

Вынесите ее вверх, за цикл.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
16.05.2022, 22:06
Цитата Сообщение от Pryahiiina Посмотреть сообщение
Столкнулась со следующей проблемой: инициализирую переменную n в первом ветвлении case, а в третьем это значение требуется для условия выполнения, программа компилируется, но при выполнении выскакивается сообщение о том, что переменная n не инициализирована.
Ну значит так и есть. Очевидно, что первая ветка case не выполнялась перед третьей и переменная не инициализировалась.

Цитата Сообщение от Pryahiiina Посмотреть сообщение
Как исправить данную ситуацию?
Зависит от того, что вы хотели получить. Если вы хотели, чтобы первая ветка case инициализировала переменную, так выполняте ее сперва. Не будете выполнять - не будет иницализировать. Что тут непонятного?

Я не пойму, что вы вообще пытались сделать в этой функции. Значение k там нигде не меняется, то есть вызывается всегда только одна ветка case. То есть если вызывается третья, то вызова первой не будет и переменная n не будет инициализирована. Что и происходит в вашем случае. Поэтому не ясно, зачем вы нам тут рассказываете про первую ветку case. При чем здесь она вообще?

И в чем смысл вот этого цикла

C++
1
2
3
4
5
    ex = false;
    do
    {
      ...
    } while (ex != true);
Этот цикл либо сразу завершается (если сработал какой-то case), либо не завершается никогда, а просто молча зависает в бесконечности. В чем тут замысел? В чем назначение такого цикла?
0
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
16.05.2022, 22:49  [ТС]
TheCalligrapher, k это координаты нахождения курсора относительно меню. Поэтому в зависимость от значения k меняется алгоритм действий. Моя проблема состояла в том, что даже при последовательном захождении в пункты case nне инициализировалась. Нужно было вынести эту переменную как глобальную.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
16.05.2022, 22:53
Цитата Сообщение от Pryahiiina Посмотреть сообщение
Моя проблема состояла в том, что даже при последовательном захождении в пункты case nне инициализировалась.
??? О каком "последовательном захождении в пункты case" вы ведете речь? Каждый вызов int mistake(int k) заходит только в один case только один раз. Откуда может взяться "последовательное захождении в пункты case"? О чем речь?
0
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
16.05.2022, 22:59  [ТС]
TheCalligrapher, k меняется в основной программе int main(), это значение перндается в int mistake(int k) и согласно с эти значением выполняются пункты case.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
16.05.2022, 23:00
Цитата Сообщение от Pryahiiina Посмотреть сообщение
k меняется в основной программе int main(), это значение перндается в int mistake(int k) и согласно с эти значением выполняются пункты case.
Но при каждом захождении в int mistake(int k) в ней будет создаваться своя перемнная n, не имеющая никакого отношения к переменной n из предыдущих вызовов.
0
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
16.05.2022, 23:02  [ТС]
Я знаю, именно об этом я вам и написала в первом сообщении. Я вынесла n, как глобальную переменную.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
16.05.2022, 23:03
Тем не менее, еще раз: в чем смысл вот этого цикла в int mistake(int k)

C++
1
2
3
4
5
    ex = false;
    do
    {
      ...
    } while (ex != true);
Этот цикл либо сразу завершается (если сработал какой-то case), либо не завершается никогда, а просто молча зависает в бесконечности. В чем тут замысел? В чем назначение такого цикла?
0
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45
16.05.2022, 23:10  [ТС]
[color="grey"]Добавлено через 59 секунд[/color]
TheCalligrapher, согласна, над этим я просто не подумала, стоит убрать спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2022, 23:10
Помогаю со студенческими работами здесь

Инициализация обьекта внутри другого класса
Всем привет. Вообщем проблема такая. Есть несколько классов class WeaponType { }; class Swords : public WeaponType { }; ...

Инициализация массива внутри структурированнного типа
Добрый день! Прошу помочь разобраться. Компилятор ругается &quot; Unit1.cpp(204): E2188 Expression syntax&quot; при присвоении значений...

Инициализация массива строк внутри класса
Доброго времени суток! Есть такая проблема... Дан класс, в нем есть массив строк и мне нужно в конструкторе ему задать начальное значение,...

Инициализация переменной
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; struct Chisla { int chislo; Chisla* next; }; Chisla*...

Инициализация переменной
class cRectangle{ public: cRectangle(); ~cRectangle(); void Rect(char h_symb, char v_symb, int init_x, int init_y,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru