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

Несколько раз выводится сообщениею. Не понимаю в чем ошибка!

20.02.2021, 19:31. Показов 1294. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код:
Кликните здесь для просмотра всего текста
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
// https://pastebin.com/3mDD4SX4
#include <iostream>
#include <string>
 
using namespace std;
int check(string, string); double toDec(string, int); void ofDec(double, int); int inputsystem(string, string); 
int outputsystem(string, string); string helps(int); void alphabet(); void transfer(string, string, string, string, string); 
void operations(string, string, string, string, string, string); int menu();
 
int main()
{
    setlocale(0, "");
    menu();
    return 0;
}
int menu()
{
    int i1;
    string str, help, help1 = "0123456789", incoming1, outgoing1, A1, B1, i;
    while (1)
    {
        cout << "Если хотите проверить символы входящие в алфавит, нажмите 1, " << endl;
        cout << "Если хотите перевести число из одной системы в другую, нажмите 2, " << endl;
        cout << "Если хотите провести операции между числами (+, -, *, /), нажмите 3, " << endl;
        cout << "Если хотите провести операции с обратным и дополнительным кодом, нажмите 4, " << endl;
        cout << "Если хотите построить ДДНК и ДКНФ, нажмите 5, " << endl;
        cout << "Если хотите завершить программу, нажмите 0: ";
        getline(cin, i); 
        check(i, "123450"); // Проверяет корректность ввода
        i1 = toDec(i, 10); // Переводит строку в число
        if (i1 < 0 || i1 > 5)
        {
            cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
            return 0;
        }
        if (i1 == 1) alphabet();
        else if (i1 == 2) transfer(A1, help, help1, incoming1, outgoing1);
        else if (i1 == 3) operations(B1, A1, help, help1, incoming1, outgoing1);
        else if (i1 == 4);
        else if (i1 == 5);
        else if (i1 == 0) return 0;
    }
    return 0;
}
int check(string str, string help) // Полная проверка корректности ввода
{
    int m = 0; // Удаление пробелов перед данными, если они есть
    while (str[m] == ' ' || str[m] == '\t') m++;
    if (m > 0) str.erase(str.begin(), str.begin() + m);
    m = str.size() - 1; // Удаление пробелов после данных, если они есть
    while (str[m] == ' ' || str[m] == '\t') m--;
    if (m < (str.size() - 1)) str.erase(str.begin() + m + 1, str.end());
    if (str[0] == '.') // Проверка на первый и второй элемент элемент
    {
        cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
        main();
        return 0;
    }
    else if (str[0] == '-' && str[1] == '.')
    {
        cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
        main();
        return 0;
    }
    int k = 0; // Проверка точек
    for (int i = 0; i < str.size(); i++) if (str[i] == '.') k++;
    if (k < 1 && k > 1)
    {
        cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
        main();
        return 0;
    }
    k = 0; // Проверка минусов
    for (int i = 0; i < str.size(); i++) if (str[i] == '-') k++;
    if (k < 1 && k > 1)
    {
        cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
        main();
        return 0;
    }
    k = 0; // Проверка, входят ли символы в список разрешенных
    for (int i = 0; i < str.size(); i++)
    {
        for (int j = 0; j < help.size(); j++)
        {
            if (str[i] == help[j]) k++;
        }
        if (k == 0)
        {
            cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n\n";
            main();
            return 0;
        }
        else k = 0;
    }
}
double toDec(string str, int incoming) // Перевод строки incoming системы в десятичное число
{
    double digit = 0;
    int point = 0, helpdigit = 0; // Перевод в десятичную систему
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] == '.') point = i;
    }
    if (point > 0)  // Если число не целое
    {
        for (int i = 0; i < point; i++) // До точки
        {
            if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i - 1);
            else
            {
                switch (str[i])
                {
                case'A':case'a': helpdigit = 10; break;
                case'B':case'b': helpdigit = 11; break;
                case'C':case'c': helpdigit = 12; break;
                case'D':case'd': helpdigit = 13; break;
                case'E':case'e': helpdigit = 15; break;
                case'F':case'f': helpdigit = 16; break;
                }
                digit += helpdigit * pow(incoming, point - i - 1);
            }
        }
        for (int i = point + 1; i < str.size(); i++) // После точки
        {
            if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i);
            else
            {
                switch (str[i])
                {
                case'A':case'a': helpdigit = 10; break;
                case'B':case'b': helpdigit = 11; break;
                case'C':case'c': helpdigit = 12; break;
                case'D':case'd': helpdigit = 13; break;
                case'E':case'e': helpdigit = 15; break;
                case'F':case'f': helpdigit = 16; break;
                }
                digit += helpdigit * pow(incoming, point - i);
            }
        }
    }
    else  // Если число целое
    {
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, str.size() - i - 1);
            else
            {
                switch (str[i])
                {
                case'A':case'a': helpdigit = 10; break;
                case'B':case'b': helpdigit = 11; break;
                case'C':case'c': helpdigit = 12; break;
                case'D':case'd': helpdigit = 13; break;
                case'E':case'e': helpdigit = 15; break;
                case'F':case'f': helpdigit = 16; break;
                }
                digit += helpdigit * pow(incoming, str.size() - i - 1);
            }
        }
    }
    return digit;
}

Функции, которые не учавствуют в том коде, я вырезал. В чем проблема ошибки: Если я ввожу некорректно, то потом несколько раз выводится сообщение, что оно некорректно.
Миниатюры
Несколько раз выводится сообщениею. Не понимаю в чем ошибка!  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2021, 19:31
Ответы с готовыми решениями:

Ошибка -is not a valid integer value (не является допустимым целым значением), не понимаю в чем ошибка
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...

Не понимаю, в чём ошибка
Пишу GUI-приложение на Qt под windows. Запускаю прогу в режиме отладки. Выводится окно, всё нормально, но при нажатии на любую кнопку, ещё...

Не понимаю в чем ошибка
задача заключается в том, чтобы ввести с клавы либо считать с файла двумерный массив вещественных чисел и вывести их на экран, так же нужно...

2
фрилансер
 Аватар для Алексей1153
6466 / 5684 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
20.02.2021, 20:38
kickebabs, ничего такого не ловится.

Возможно, неопределённое поведение из-за отсутствия return в конце функции int check(string str, string help)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2021, 21:48
Цитата Сообщение от kickebabs Посмотреть сообщение
В чем проблема ошибки: Если я ввожу некорректно, то потом несколько раз выводится сообщение, что оно некорректно. https://prnt.sc/1020ufl
Первая ошибка в том, что ты рекурсивно вызываешь main. Этого делать нельзя.
Ну и - рекурсия при проверке здесь вообще никакая не нужна. Воспользуйся циклом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2021, 21:48
Помогаю со студенческими работами здесь

Не понимаю в чем ошибка
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &quot;pch.h&quot; #include &lt;iostream&gt; const int N = 25; int writee(int a); int main() ...

Не понимаю, в чем ошибка
Я как бы что-то пытался, и вот что получилось, но не работает. #include &lt;iostream&gt; using namespace std; int factorial(int N) ...

Не понимаю в чем ошибка
Я только начал изучать WinAPI по книге Ламот &quot;Программирование игр для windows. Советы профессионала 2-е издание&quot;. В книге был...

Не понимаю в чем ошибка
Мне нужно вывести значение минимума и максимума в файл 2.txt, но при компиляции происходит ошибка. Помогите пожалуйста. Вот код: ...

Не понимаю в чем ошибка (
Решил создать свой первый класс, выбрал для этого матрицу, как объект и вот в первом же методе(ввод матрицы)он выкидывает из проги и пишет...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru