Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285

Проверка правильности ввода для переменной типа short

16.09.2014, 23:35. Показов 3916. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как проверить, введённые числа в диапазоне Short или нет? Если я ввожу -32769, программа закрывается...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{   
    short a, b, x, o;
    cout<<"Input a,b:";
    std::cin >> a >> b ;
    if (a>32768*-1 && a<32767)
    {
        x = a-b;
    }
   cout<<x;
   cin>>a;
   return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2014, 23:35
Ответы с готовыми решениями:

Проверка правильности ввода имени файла для считывания
Здравствуйте, знатоки! Есть вопрос: как устроить проверку правильности имени файла для той ситуации, когда используется FileStream? ...

Проверка правильности ввода
Совсем запуталась.Надо ввести целое число. Как сделать так, чтобы при неправильном вводе(символ, буква), выдавалась ошибка?

Проверка правильности ввода
Подскажите, возможно ли осуществить в программе правильность ввода кода С++, т.е. иммется текстовое поле, пользователь вводит if(a=b);...

20
33 / 33 / 23
Регистрация: 16.04.2013
Сообщений: 212
16.09.2014, 23:48
не short применить, а int
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
16.09.2014, 23:52
Цитата Сообщение от Thypson Посмотреть сообщение
a>32768*-1
Думаешь, если умножить 32768 на -1 получится что-то отличное от -32768?
0
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285
17.09.2014, 00:00  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Думаешь, если умножить 32768 на -1 получится что-то отличное от -32768?
Там у меня почему-то эрор был DD
Изменил теперь)) Но вопрос остался такой же...
Цитата Сообщение от adsarc Посмотреть сообщение
не short применить, а int
Не могу, сказали Шорт юзать:
Разработать алгоритм и написать программу вычисления заданного целочисленного выражения для данных в формате 16 битов со знаком, используя оператор IF. Промежуточные вычисления могут проводиться с использованием любых типов данных (с обоснованием выбора типа данных), а тип результата Х - тоже должен быть 16 битов со знаком. Входные данные и результат вычислений должны быть проверены на область допустимых значений.
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
17.09.2014, 00:06
Цитата Сообщение от Thypson Посмотреть сообщение
Не могу, сказали Шорт юзать:
Ну так по заданию:
Цитата Сообщение от Thypson Посмотреть сообщение
Промежуточные вычисления могут проводиться с использованием любых типов данных
пользуй int.
0
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285
17.09.2014, 00:13  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
пользуй int.
Препод сказала брать Short, а разве в int такая проверка пройдёт, какая разница вообще какой тип переменной?)
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
17.09.2014, 00:21
Цитата Сообщение от Thypson Посмотреть сообщение
а разве в int такая проверка пройдёт, какая разница вообще какой тип переменной?
int более "масштабный" тип, чем short. Там можно ввести бОльшие, чем пределы short, числа и, соответсвенно, проверить.
Если же изначально использовать short, то при вводе числа вне диапазона будет просто происходить переполнение short (или ещё какая-то вариация "среза"), и вместо введённого числа в него запишется совершенно другое число, но вполне себе в диапазоне short.
0
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285
17.09.2014, 00:26  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
int более "масштабный" тип, чем short. Там можно ввести бОльшие, чем пределы short, числа и, соответсвенно, проверить.
Если же изначально использовать short, то при вводе числа вне диапазона будет просто происходить переполнение short (или ещё какая-то вариация "среза"), и вместо введённого числа в него запишется совершенно другое число, но вполне себе в диапазоне short.
Заменил на _int16 , та же байда....
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
17.09.2014, 00:31
Thypson, int - это int32, int32s и прочие вариации. int16 - это тот же short.
0
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285
17.09.2014, 00:53  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Thypson, int - это int32, int32s и прочие вариации. int16 - это тот же short.
я написал задание выше. внимательно прочитай его!
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
17.09.2014, 01:00
Цитата Сообщение от Thypson Посмотреть сообщение
я написал задание выше. внимательно прочитай его!
Наезд не понят, не принят, не прощён. Я твоё задание читал и даже цитировал. То, что "препод сказал" - это не задание, а то, как ты понял препода. Ещё чуть ранее я тебе объяснил, почему стоит использовать int (в задании разрешено). Про "ту же байду" тоже объяснил. Кто из нас должен внимательно читать?
0
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
17.09.2014, 01:10
Цитата Сообщение от Thypson Посмотреть сообщение
Разработать алгоритм и написать программу вычисления заданного целочисленного выражения для данных в формате 16 битов со знаком, используя оператор IF. Промежуточные вычисления могут проводиться с использованием любых типов данных (с обоснованием выбора типа данных), а тип результата Х - тоже должен быть 16 битов со знаком. Входные данные и результат вычислений должны быть проверены на область допустимых значений.
Для а используй int;
x будет short;

Чтобы проверить на 16 бит используй побитовые операции.

Задача решена.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.09.2014, 06:20
Как проверить, введённые числа в диапазоне Short или нет?
Трижды вознести молитвы богу RTFM-а и проверить cin.fail().
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
17.09.2014, 09:55
Думаю, вот такой вариант соответствует учебным целям поставленной задачи.
1. Тип long обязан быть вместительнее short.
2. Идет проверка не с пользовательскими костантами, а с константами, определяемыми компилятором.
3. Результат преобразуется к заданному типу с помощью приведения (short).
Ну а если еще написать short x=static_cast<short>(temp); То это будет выше крыши!


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <limits.h>
int main()
{   
    long a, b,temp;
    std::cout<<"Input a,b:";
    std::cin >> a >> b ;
    if (a>SHRT_MAX || a<SHRT_MIN)
        std::cout<<"Number "<<a<<" can't stored to short varible\n";
    if (b>SHRT_MAX || b<SHRT_MIN)
        std::cout<<"Number "<<b<<" can't stored to short varible\n";
    temp = a-b;
    if (temp>SHRT_MAX || temp<SHRT_MIN)
        std::cout<<"Result can't stored to short varible\n";
    else
    {
        short x=(short)temp;
        std::cout<<x;
    }
    system("pause");
    return 0;
}
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2014, 12:43
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
///////////////////////////////////////////////////////////////////////////////
//Разработать алгоритм и написать программу вычисления заданного целочисленного 
//выражения для данных в формате 16 битов со знаком, используя оператор IF. 
//Промежуточные вычисления могут проводиться с использованием любых типов данных 
//(с обоснованием выбора типа данных), а тип результата Х - тоже должен быть 
//16 битов со знаком. Входные данные и результат вычислений должны быть проверены 
//на область допустимых значений.
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <limits>
#include <stdint.h>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
typedef long long       T_big_int;
typedef int16_t         T_int;
///////////////////////////////////////////////////////////////////////////////
const   T_int   INT_16_MIN  =   std::numeric_limits< T_int >::min();
const   T_int   INT_16_MAX  =   std::numeric_limits< T_int >::max();
///////////////////////////////////////////////////////////////////////////////
bool    number_is_in_range_of_int16( T_big_int  big_val )
{
    return      INT_16_MIN  <=  big_val
            &&  big_val     <=  INT_16_MAX;
}
///////////////////////////////////////////////////////////////////////////////
void    print_prompt_and_input_value_in_range_of_int16
    (
        T_str   const   &   prompt,
        T_int           &   val
    )
{
    T_big_int   big_val     =   0;
 
    do
    {
        std::cout   <<  prompt;
        std::cin    >>  big_val;
    }
    while   (
                !number_is_in_range_of_int16( big_val )
            );
 
    val     =   static_cast< T_int >    ( big_val );
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout   <<  "Введите числа в диапазоне ("
                    <<  INT_16_MIN
                    <<  ".."
                    <<  INT_16_MAX
                    <<  "):"
                    <<  std::endl;
 
        T_int     a;
        T_int     b;
        print_prompt_and_input_value_in_range_of_int16( "a = ", a   );
        std::cout   <<  std::endl;
        print_prompt_and_input_value_in_range_of_int16( "b = ", b   );
        T_big_int   x   =   a - b;
 
        if  (
                number_is_in_range_of_int16( x )
            )
        {
            std::cout   <<  std::endl
                        <<  "x = "
                        <<  x
                        <<  std::endl;
        }
        else
        {
            std::cout   <<  "Результат вычислений находится вне допустимого диапазона."
                        <<  std::endl;
        }//else
        std::cout   <<  std::endl;
    }//for
}
0
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
17.09.2014, 20:31
Еще одно решение

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
/*
   Разработать алгоритм и написать программу вычисления заданного целочисленного
   выражения для данных в формате 16 битов со знаком, используя оператор IF.
   Промежуточные вычисления могут проводиться с использованием любых типов
   данных (с обоснованием выбора типа данных), а тип результата Х - тоже должен
   быть 16 битов со знаком. Входные данные и результат вычислений должны быть
   проверены на область допустимых значений.
   */
 
#include <iostream>
 
using namespace std;
 
bool isShort(int num){
    short x;
    x = num & 0xFFFF;
    return (x == num);
}
 
int main()
{
    setlocale(0, "");
 
    short  x;
    int a, b, temp;
 
    cout << "Input a: ";
    cin >> a;
 
    while (!isShort(a)) {
        cout << "Введенное число не 16-ти битовое " << endl;
        cin >> a;
    }
 
    cout << "Input b: ";
    cin >> b;
 
    while (!isShort(b)) {
        cout << "Введенное число не 16-ти битовое " << endl;
        cin >> b;
    }
 
    temp = a - b;       // выражение
 
    if (isShort(temp)) {
        x = static_cast<short>(temp);  // можно не преобразовать
        cout << "Результат: a - b = " << x;
    }
    else
        cout << "Результат получился не 16-ти битовое " << temp;
 
    return 0;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2014, 20:56
Не очень понятно почему все говорят о типе short и применяют его, когда ни в задании о нем не сказано, ни в стандарте не сказано, что этот тип имеет размер 16 бит.
0
 Аватар для Thypson
21 / 21 / 19
Регистрация: 10.09.2013
Сообщений: 285
17.09.2014, 21:34  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Думаю, вот такой вариант соответствует учебным целям поставленной задачи.
Вводимые данные a,b мне нужно уже ввести в short;_int16
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
17.09.2014, 21:48
Цитата Сообщение от Thypson Посмотреть сообщение
уже ввести в short;_int16
Если категорически нельзя использовать long, то можете ввести в строку.
Потом посчитать количество цифр в строке.
Если их больше 5
или 5, но первая больше 3
или 5, но первая равна 3, а вторая больше 2
или 5, но первая равна 3, вторая равна 2, третья больше 7
или 5, но первая равна 3, вторая равна 2, третья равна 7, четвертая больше 6
или 5, но первая равна 3, вторая равна 2, третья равна 7, четвертая равна 6, а 5-я равна 9
то вывести сообщение об ошибке,
в противном случае преобразовать в short.

Но, мне кажется, так писать - уж очень большое извращение.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
18.09.2014, 12:29
Цитата Сообщение от Thypson Посмотреть сообщение
Вводимые данные a,b мне нужно уже ввести в short;_int16
Ну, тогда вот так, здесь я кроме 16-битных никаких других целых вообще не использую:
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
///////////////////////////////////////////////////////////////////////////////
//Разработать алгоритм и написать программу вычисления заданного целочисленного 
//выражения для данных в формате 16 битов со знаком, используя оператор IF. 
//Промежуточные вычисления могут проводиться с использованием любых типов данных 
//(с обоснованием выбора типа данных), а тип результата Х - тоже должен быть 
//16 битов со знаком. Входные данные и результат вычислений должны быть проверены 
//на область допустимых значений.
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <limits>
#include <stdint.h>
#include <sstream>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
typedef int16_t         T_int;
///////////////////////////////////////////////////////////////////////////////
const   T_int   INT_16_MIN  =   std::numeric_limits< T_int >::min();
const   T_int   INT_16_MAX  =   std::numeric_limits< T_int >::max();
///////////////////////////////////////////////////////////////////////////////
void    print_prompt_and_input_value_in_range_of_int16
    (
        T_str   const   &   prompt,
        T_int           &   val
    )
{
    do
    {
        std::cin.clear();
        std::cout   <<  prompt;
    }
    while   (
                !( std::cin    >>  val )
            );
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout   <<  "Введите числа в диапазоне ("
                    <<  INT_16_MIN
                    <<  ".."
                    <<  INT_16_MAX
                    <<  "):"
                    <<  std::endl;
 
        T_int     a;
        T_int     b;
        print_prompt_and_input_value_in_range_of_int16( "a = ", a   );
        std::cout   <<  std::endl;
        print_prompt_and_input_value_in_range_of_int16( "b = ", b   );
 
        std::stringstream   sstream;
        sstream     <<  a - b;
        T_int   x   =   0;
 
        if  (
                sstream     >>  x
            )
        {
            std::cout   <<  std::endl
                        <<  "x = "
                        <<  x
                        <<  std::endl;
        }
        else
        {
            std::cout   <<  "Результат вычислений находится вне допустимого диапазона."
                        <<  std::endl;
        }//else
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }//for
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2014, 12:29
Помогаю со студенческими работами здесь

проверка правильности ввода
Как проверить что Edit введено положительное число, а не буква или другие символы?

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

Проверка правильности ввода
Есть два текстбокса и кнопка, нужно разрешить ввод только положительных цифр и одной запятой, для этого использую событие textchanged,...

Проверка правильности ввода
Доброго времени суток. Как, в приведенном ниже коде, сделать так, что бы при вводе отрицательного числа выводилось не &quot;сколько минут...

Проверка правильности ввода
Пишу программу С++ в консоле в RAD Studio. Программа представляет собой задачу. Пользователь вводит число, а программа решает. Мне нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru