0 / 0 / 0
Регистрация: 12.09.2018
Сообщений: 24
1

Проверка типа вводимых данных

26.10.2020, 19:17. Показов 1044. Ответов 5
Метки нет (Все метки)

Имеется код. Нужно выводить сообщение об ошибке или, на крайняк, завершать программу. Разрешено вводить только числа.
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
#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <bits/stdc++.h>
#include "Triangle.h"
 
using namespace std;
 
Triangle triangle{0, 0, 1, 1, 1, 2};
bool stop = true;
 
bool is_number(string& str)
{
    int i = 0;
    bool isdot = false;
    if (str[0] == '-') {
        i += 1;
        if (isdigit(str[1]))
            i += 1;
        else
            return false;
    }
    if (isdigit(str[str.size()]))
        return false;
    for (i; i < str.size(); i++) {
        if (!isdigit(str[i]) && (str[i] != '.'))
            return false;
        if (str[i] == '.' && !isdot)
            isdot = true;
        else if (str[i] == '.' && isdot)
            return false;
    }
    return true;
}
 
void execute(char command) {
    if (command == '1') {
        triangle.Input();
        cout << ">";
    } else if (command == '2') {
        triangle.Result();
        cout << ">";
    } else if (command == '3') {
        triangle.CheckType();
        cout << ">";
    } else if (command == '4') {
        triangle.Size();
        cout << ">";
    } else if (command == '5') {
        triangle.Move();
        cout << ">";
    } else if (command == '6') {
        triangle.Area();
        cout << ">";
    } else if (command == '7') {
        triangle.Perimeter();
        cout << ">";
    } else if (command == '0') {
        stop = false;
    }
}
 
 
int main() {
    setlocale(LC_ALL, "Russian");
    cout
            << "Треугольники \n Справка: \n 1 - Ввод данных \n 2 - Вывод \n 3 - Вид треугольника \n 4 - Изменение размера \n 5 - Переименование \n 6 - Площадь \n 7 - Периметр \n 0 - Выход \n"
            << endl;
    string commands;
    char command;
    cout << ">";
    while (stop) {
        cin >> commands;
        if (is_number(commands)) { //Если нормальное число:
            if (commands != NULL) {
                execute(commands);
            }
            commands = ' ';
        }
        else {
            cout << "Ошибка: Это не число!" << endl;
        }
        
           
    } 
 
}
Triangle.h
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
#ifndef UNTITLED1_TRIANGLE_H
#define UNTITLED1_TRIANGLE_H
 
 
class Triangle {
private:
    double x1, x2, y1, y2, x3, y3, dx{}, dy{}, r{};
public:
    // Конструктор с 4 параметрами
    Triangle(double _x1, double _y1, double _x2, double _y2, double _x3, double _y3) : x1(_x1), x2(_x2), x3(_x3),
                                                                                       y1(_y1), y2(_y2), y3(_y3) {}
 
    ~Triangle() = default; // Деструктор
 
    void Input(); // метод ввода с клавиатуры
    void Result() const; // метод вывода на экран
    void Move(); // перемещение
    void Size(); // изменение размера
    void Area(); // полощадь треугольника
    void Perimeter(); // периметр треугольника
    void CheckType(); // тип треугольника
};
 
void Triangle::Input() {
    cout << "Введите координату х для точки A" << endl;
    cin >> x1;
    cout << "Введите координату y для точки A" << endl;
    cin >> y1;
    cout << "Введите координату х для точки B" << endl;
    cin >> x2;
    cout << "Введите координату y для точки B" << endl;
    cin >> y2;
    cout << "Введите координату х для точки C" << endl;
    cin >> x3;
    cout << "Введите координату y для точки C" << endl;
    cin >> y3;
}
 
void Triangle::Result() const {
    cout << "Вы ввели следующие координаты треугольника:" << endl;
    cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
    cout << " B:" << "(" << x2 << "," << y2 << ")" << endl;
    cout << " C:" << "(" << x3 << "," << y3 << ")" << endl;
}
 
void Triangle::Move() {
    cout << "На сколько единиц вы хотите переместить треугольник по оси X ?" << endl;
    cin >> dx;
    x1 += r;
    x2 += r;
    x3 += r;
 
    cout << "На сколько единиц вы хотите переместить треугольник по оси Y ?" << endl;
    cin >> dy;
    y1 += r;
    y2 += r;
    y3 += r;
    cout << "Получились следующие координаты треугольника:" << endl;
    cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
    cout << " B:" << "(" << x2 << "," << y1 << ")" << endl;
    cout << " C:" << "(" << x3 << "," << y3 << ")" << endl;
}
 
void Triangle::Size() {
    cout << " Во сколько раз изменяем размер треугольника ?" << endl;
    cin >> r;
    cout << "Получились следующие координаты треугольника:" << endl;
    x1 *= r;
    x2 *= r;
    x3 *= r;
    y1 *= r;
    y2 *= r;
    y3 *= r;
    cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
    cout << " B:" << "(" << x2 << "," << y2 << ")" << endl;
    cout << " C:" << "(" << x2 << "," << y3 << ")" << endl;
}
 
void Triangle::Area() {
    double AB = sqrt(pow(x2 - x1, 2)) + pow(y2 - y1, 2);
    double BC = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));;
    double CA = sqrt(pow(x1 - x3, 2) + pow(y1 - y3, 2));;
 
    cout << "AB = " << AB << endl;
    cout << "BC = " << BC << endl;
    cout << "CA = " << CA << endl;
    double P = (AB + BC + CA) / 2.0;
    double S = sqrt(P * (P - AB) * (P - BC) * (P - CA));
    cout << "Площадь = " << S << endl;
}
 
void Triangle::Perimeter() {
    double AB = sqrt(pow(x2 - x1, 2)) + pow(y2 - y1, 2);
    double BC = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));;
    double CA = sqrt(pow(x1 - x3, 2) + pow(y1 - y3, 2));;
 
    cout << "AB = " << AB << endl;
    cout << "BC = " << BC << endl;
    cout << "CA = " << CA << endl;
    double P = (AB + BC + CA);
    cout << "Периметр = " << P << endl;
}
 
void Triangle::CheckType() {
    double a = sqrt(pow(x2 - x1, 2)) + pow(y2 - y1, 2);
    double b = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));;
    double c = sqrt(pow(x1 - x3, 2) + pow(y1 - y3, 2));;
 
    if ((a >= b + c) || (b >= a + c) || (c >= a + b))
    {
        cout << "Это не треугольник" << endl;
    }
    else if (a*a + b*b == c*c)
    {
        cout << "Это прямоугольный треугольник" << endl;
    }
    else if ((a*a + b*b > c*c) && (a*a + c*c > b*b) && (c*c + b*b > a*a))
    {
        cout << "Это остроугольный треугольник" << endl;
    }
    else
    {
        cout << "Это тупоугольный треугольник" << endl;
    }
}
 
#endif //UNTITLED1_TRIANGLE_H


Пытался сам что-то сделать, но не получилось. Видимо правильно мне мама говорила не начинать изучение ЯП с питона...
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2020, 19:17
Ответы с готовыми решениями:

Проверка типа вводимых данных.
Собственно,как осуществить ? К примеру,здесь: int main() { int x; int y; ...

Проверка вводимых данных на соответствие типа
Задание само очень простое - вычитание матриц, с помощью перегрузки функций (одна функция вычитает...

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

Проверка вводимых данных
Как сделать так, чтобы при вводе символов в строку года поступления на экран появлялось...

5
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
26.10.2020, 19:54 2
Лучший ответ Сообщение было отмечено d3f4u17 как решение

Решение

Цитата Сообщение от d3f4u17 Посмотреть сообщение
Проверка типа вводимых данных
C++
1
2
3
4
5
6
7
8
std::string s;
std::cin >> s;
char *end;
double x = strtod(s.c_str(), &end);
if (*end != 0)
    std::cout << "ERROR: " << s << std::endl;
else
    std::cout << "OK: " << x << std::endl;
1
0 / 0 / 0
Регистрация: 12.09.2018
Сообщений: 24
27.10.2020, 15:29  [ТС] 3
Спасибо! А можно ещё, если не сложно подсказать способ для вывода ошибки, если в вводе есть какие-нибудь символы (по типу "№;@# и прочих)?
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 15:35 4
Цитата Сообщение от d3f4u17 Посмотреть сообщение
Спасибо! А можно ещё, если не сложно подсказать способ для вывода ошибки, если в вводе есть какие-нибудь символы (по типу "№;@# и прочих)?
В смысле? Там на любой символ символ будет ошибка. Или тебе нужна какая-то специальная ошибка?
0
0 / 0 / 0
Регистрация: 12.09.2018
Сообщений: 24
27.10.2020, 15:39  [ТС] 5
Да, мне нужно что-то вроде фильтра. То есть разрешено вводить текст и числа, но на специально заданных символах должна быть ошибка. Но это уже так, для общего развития :3
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 15:44 6
Цитата Сообщение от d3f4u17 Посмотреть сообщение
Да, мне нужно что-то вроде фильтра. То есть разрешено вводить текст и числа, но на специально заданных символах должна быть ошибка. Но это уже так, для общего развития :3
Это надо пробегаться по строке и проверять, что введены только нужные символы
C++
1
2
3
4
5
6
7
8
bool CheckString(const std::string& str)
{
    for (char ch: str)
        if (ch == '%' || ch == '@' || ................)
            return false;
 
    return true;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2020, 15:44
Помогаю со студенческими работами здесь

Проверка вводимых данных
Подскажите, пожалуйста, как зациклить ввод данных до тех пор пока пользователь не введёт корректный...

Проверка вводимых данных
Доброго времени суток, форумчане. Я столкнулся с такой проблемой: при введении еденицы измерения,...

Проверка вводимых данных
#include &lt;iostream&gt; using namespace std; int main() { double a, b, c; cout &lt;&lt;...

Проверка вводимых данных
Вот часть программы int main(void) { int vop; setlocale(LC_ALL, &quot;Russian&quot;); int mas1,...

Определение типа вводимых данных
Здравствуйте. Мне, как новичку, нужна помощь. Я делаю программу для работ с функциями. В начале...

Определение типа вводимых данных
Здравствуйте! Можно ли при вводе данных с клавиатуры определять какой тип ввели int или double?...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru