Форум программистов, компьютерный форум CyberForum.ru

Вижал студио не воспринимает чар - C++

Восстановить пароль Регистрация
 
Hop
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 4
25.10.2013, 19:51     Вижал студио не воспринимает чар #1
Проблема с тем, что вижал студио не воспринимает мой ввод функций вычитания сложения и проч. Если сделать с помощью банального присваивания, все работает, что я делаю не так?
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
#include "stdafx.h"
#include "conio.h"
#include <limits.h>
#include <windows.h>
 
//Функция проверки корректности переменных
int proof (double x)
{
    int y;
    y=x;
    if ((x <= INT_MAX) & (x >= INT_MIN) & ((x-y)==0))
        y=1;
    else y=0;
        return y;
}
 
int main (void)
{
    double a,b,c;
    int ci;
    char z;
    go:
    //Ввод данных
                         a=2;
                         b=3;
                         scanf_s("%c",&z);
 
    //Начинается сам калькулятор
    if (b==0)
    {
        printf(" --> Delenie na 0 !!!!\n");
        goto go;
    }
    else 
    {
        if (proof(a)==0)
        {
            printf(" --> Pervoe chislo ne udovletvoriaet ogranicheniy INT!!!\n");
            goto go;
        }
        else 
        {
            if (proof(b)==0)
            {
                printf(" --> Vtoroe chislo ne udovletvoriaet ogranicheniy INT!!!\n");
                goto go;
            }
            else 
            {
                // Описываем операции
                switch (z)
                {
                    case '+':
                        c=a+b;
                    break;
                    case '-':
                        c=a-b;
                        break;
                    case '*':
                        c=a*b;
                    break;
                    case '/':
                        c=a/b;
                    break;
                    default:
                        {
                            printf (" --> Takoi operacii net!!!\n");
                            goto go;
                            break; 
                            
                        }
                }
            }
        }
    }
 
    if (proof(c)==0) { 
        printf(" --> Rezultat ne udovletvoriaet ogranicheniy INT!!!\n");
    }
    else
    {
        ci=c;
        printf("=%i\n",ci);
    }
    goto go;
 
    _getch();
    return(0);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений Буланов
6 / 6 / 4
Регистрация: 23.10.2013
Сообщений: 63
25.10.2013, 22:42     Вижал студио не воспринимает чар #2
Изначально, функция proof x - это даблб, y это инт... Вы писвоили, а потом проверяете больше оно или меньеше ИНТ_МАКС и ИНТ_МИН... но если вы в дабл вели слишком большое число или слишком маленькое.... проверьте сначала введеный дабл, а потом присваивайте его инту... Дальше что значит if(........&.....&......)? &<----Это знак побитового умножения.... Нужно использовать &&. Да и goto я бы не советовал... Вообщем сначала нужно синтаксис поправить...
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
25.10.2013, 23:03     Вижал студио не воспринимает чар #3
Цитата Сообщение от Hop Посмотреть сообщение
scanf_s("%c",&z);
используйте scanf

Добавлено через 1 минуту
Цитата Сообщение от Hop Посмотреть сообщение
if ((x <= INT_MAX) & (x >= INT_MIN) & ((x-y)==0))
INT_MAX _MIN это вообще что? я не вижу их типа, по таким штукам, компилятор вообще должен был вас на 3 буквы послать
Евгений Буланов
6 / 6 / 4
Регистрация: 23.10.2013
Сообщений: 63
25.10.2013, 23:09     Вижал студио не воспринимает чар #4
это константы
INT_MAX = 2147483647
INT_MIN = -2147483648
Hop
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 4
26.10.2013, 17:05  [ТС]     Вижал студио не воспринимает чар #5
Цитата Сообщение от MrGrig Посмотреть сообщение
используйте scanf
Я б с удовольствием, но вс настойчиво, очень настойчиво просит scanf_s. Прибавка _s означает secure - т.е. безопасная. Я особо не вникал, но эта лучше.

Цитата Сообщение от MrGrig Посмотреть сообщение
INT_MAX _MIN это вообще что?
Для этого я подключаю библиотеку, где лежат эти константы: #include <limits.h>.

Добавлено через 18 минут
Цитата Сообщение от Евгений Буланов Посмотреть сообщение
Изначально, функция proof x - это даблб, y это инт... Вы писвоили, а потом проверяете больше оно или меньеше ИНТ_МАКС и ИНТ_МИН... но если вы в дабл вели слишком большое число или слишком маленькое.... проверьте сначала введеный дабл, а потом присваивайте его инту... Дальше что значит if(........&.....&......)? &<----Это знак побитового умножения.... Нужно использовать &&. Да и goto я бы не советовал... Вообщем сначала нужно синтаксис поправить...
Ты просто особо не вникал, с интом конечно не кошерно немного, но все правильно.

Во-первых. Я присваиваю у значение x, для того чтобы вот так через 5 точку обрезать нули. По сути же я проверяю сначала x (вот тут if ((x <= INT_MAX) && (x >= INT_MIN) & ((x-y)==0))). Если х не подходит, дальше это не важно, ведь все должно выполняться в совокупности.

Во-вторых. За & спасибо, но, как не странно, оно и так работало отлично.

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

И в-четвертых, я же писал, что программа работает корректно, только с вводом знака через char не получается. Я вообще думал сделать через строку, но там столкнулся с похожей проблемой и не стал заморачиваться. Суть задачи сделать простой калькулятор на int, т.е. чтобы вводили и выводили только intовые значения, но с защитой от криворукого пользователя, поэтому и использую double.
IrineK
Заблокирован
26.10.2013, 19:05     Вижал студио не воспринимает чар #6
Ловушка для дурака при вводе long int:

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
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <locale.h>
 
int main()
{   setlocale(LC_ALL, "");
    
    long int a;
    char buffer[256], *end;
    
    while (fgets(buffer, sizeof(buffer), stdin))
    {   a = strtol(buffer, &end, 0);
 
        if(errno == ERANGE)
            printf("Выход за пределы long int\n");          
 
        if(*end != '\0' && !isspace(*end))
            printf("Обнаружены недопустимые символы\n");        
        else if (!errno)
        {   printf("Успешная попытка\n");
            break;
        }
 
        printf("Повторите ввод\n");
        errno = 0;
    }
    
    printf("Результат: %d", a); 
 
    getchar();
    return 0;
}
Yandex
Объявления
26.10.2013, 19:05     Вижал студио не воспринимает чар
Ответ Создать тему
Опции темы

Текущее время: 23:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru