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

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

13.05.2022, 17:10. Показов 3556. Ответов 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
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
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
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,031
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
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
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
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
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
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
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
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
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. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru