Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2013, 23:30   #1
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
Восклицание Сложная задача. Тождество . Проверка пустого int

требуется написать программу, которая будет проверять тождества

пример

1+1=2

вывод: YES;

1+1=1

вывод: NO

1-1=

вывод должен быть ERROR (по условию задачи http://acmp.ru/index.asp?main=task&id_task=80), но у меня выводит YES, т.к пустота 0

Прошу помочь. Нужно сделать так, чтобы когда появилась пустота, писать ERROR, а когда 0, то уже считать и т.д

Пример:
1-1=0 YES
1-1= ERROR (а не YES)

То есть, подскажите, как проверить пустоту!!!! Причем не с помощью символов, а через int
RIKISHI007 вне форума Ответить с цитированием
Старый 11.07.2013, 00:34   #2
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

уаперьуихЪ - переменная пустой небывает. УаутарихЪ тебе нужно подсчитать количество цифр, наличие равно и там плюса минуса и т.д. и проверить наличие каждого символа в списке допустимых. УтретьихЪ чтобы проверить правильность результата вычисления используй sprintf().
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 11.07.2013, 00:34   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Обычно прошу наработки, но сейчас нету сил их ждать
Код:
    int a, c, e;
    char b, d;
    if (scanf("%d%c%d%c%d", &a, &b, &c, &d, &e) != 5 || d != '=') {
        printf("ERROR");
        return 0;
    }
    switch (b) {
        case '+':
            if (a + c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '-':
            if (a - c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '*':
            if (a * c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '/':
            if (c == 0 || a % c != 0 || a / c != e) {
                printf("NO");
                return 0;
            }
            break;
        default:
            printf("ERROR");
            return 0;
    }
    printf("YES");
    return 0;
Проходит все их 10 тестов (правда, не уверен, что она 100% правильно работает, просто так удачно могли тесты попасть).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.07.2013, 00:39   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от RIKISHI007 Посмотреть сообщение
требуется написать программу, которая будет проверять тождества

пример

1+1=2

вывод: YES;

1+1=1

вывод: NO

1-1=

вывод должен быть ERROR (по условию задачи http://acmp.ru/index.asp?main=task&id_task=80), но у меня выводит YES, т.к пустота 0

Прошу помочь. Нужно сделать так, чтобы когда появилась пустота, писать ERROR, а когда 0, то уже считать и т.д

Пример:
1-1=0 YES
1-1= ERROR (а не YES)

То есть, подскажите, как проверить пустоту!!!! Причем не с помощью символов, а через int
У тебя есть "операнды" - числа от 0 до 30000, которые участвуют в формировании выражения
И "операторы" - символы вида: /*+-

Совокупность операндов и операторов определяет "выражение".
Выражение может быть вида: операнд1+операнд2-операнд3, и тп.


Так же есть особый операнд вида: =, который делит всю арифметическую запись на левостоящее "выражение" и правостоящее "выражение".

Совокупность выражений определяет "арифметическую запись"

Твоя задача:
1. Получить из источника символьную строчку, содержащую "арифметическую запись"
2. Найти в ней оператор =, и получить левостоящее "выражение" и правостоящее "выражение".

В случае, если в записи отсутствует оператор =, результат работы ERROR
В случае, если отсутствует какое либо из этих двух выражение, результат работы ERROR

3. Анализ "выражения". По следующему алгоритму нужно проверить оба выражения:

3.1 Разбить выражение на список операндов и операторов.

3.2 Количество операндов должно быть на единицу больше, чем количество операторов. Если это не так, то результат работы ERROR

3.3 Проверить корректность содержимого "операндов". Символы, из которых состоят операнды должны составлять числа от нуля до 30000.
Если это не так, то результат работы ERROR

3.4 Проверить корректность содержимого "операторов". Это должны быть символы из допустимого набора вида "+-/*" (и тп, в зависимости от того, как операции над числами допустимы)
Если среди операторов окажется символ, которого нет в массиве доступных операторов, тогда результат работы ERROR

4. Рассчитать результат выражения (рассчитать нужно оба выражения)
4.1 Сохраняем в промежуточный результат значение первого операнда.
4.1 В цикле берем промежуточный, и следующий операнд, и применяем к ним операцию согласно символу оператора. Полученный результат сохраняем в промежуточный результат. И так до конца цикла.

5. Сравниваем результат расчета левостоящего и правостоящего выражения.
_Bers вне форума Ответить с цитированием
Старый 11.07.2013, 00:39   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

А ето я запомню.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 11.07.2013, 10:08   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Код:
scanf("%d%c%d%c%d", &a, &b, &c, &d, &e) != 5
Не знаю, насколько "вредные" там тесты и что в них считается числом, но вообще если перед числом будет пробел, то это вроде как неизвестный символ...
Somebody вне форума Ответить с цитированием
Старый 11.07.2013, 14:05   #7
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Констатация факта. Программа сводится к обычному интерпретатору.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.07.2013, 18:14   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Не знаю, насколько "вредные" там тесты и что в них считается числом, но вообще если перед числом будет пробел, то это вроде как неизвестный символ...
Абсолютно согласен. Программа выше может рассматриваться только как проходящая их тесты, но никак не коммерческое решение (полноценное решение нужно писать по совету _Bers, т.е. нормальный интерпретатор).
Но все же она рассчитана на не очень строгие тесты. А то вон в соседней теме вообще выбрасывали куски из программы, чтобы прошла только те тесты, которые в системе, зато оказалась в топе как можно выше.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.07.2013, 00:14   #9
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Обычно прошу наработки, но сейчас нету сил их ждать
Код:
    int a, c, e;
    char b, d;
    if (scanf("%d%c%d%c%d", &a, &b, &c, &d, &e) != 5 || d != '=') {
        printf("ERROR");
        return 0;
    }
    switch (b) {
        case '+':
            if (a + c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '-':
            if (a - c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '*':
            if (a * c != e) {
                printf("NO");
                return 0;
            }
            break;
        case '/':
            if (c == 0 || a % c != 0 || a / c != e) {
                printf("NO");
                return 0;
            }
            break;
        default:
            printf("ERROR");
            return 0;
    }
    printf("YES");
    return 0;
Проходит все их 10 тестов (правда, не уверен, что она 100% правильно работает, просто так удачно могли тесты попасть).
Спасибо большое! Вроде, я вашу программу ПОЛНОСТЬЮ понимаю, до меня не дошло только то, что ОКАЗЫВАЕТСЯ ТАКИ можно в "ифе" писать scanf и проверять) Чудно
RIKISHI007 вне форума Ответить с цитированием
Старый 12.07.2013, 00:34   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от RIKISHI007 Посмотреть сообщение
Спасибо большое! Вроде, я вашу программу ПОЛНОСТЬЮ понимаю, до меня не дошло только то, что ОКАЗЫВАЕТСЯ ТАКИ можно в "ифе" писать scanf и проверять) Чудно
в ифе можно много чудного написать.
например
Код:
if(c=getchar()=='e')
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложная задача! Pashok6 Паскаль, Turbo Pascal, PascalABC.NET 10 02.01.2012 00:03
Проверка в строки на число типа int Assemblerru Общие вопросы C/C++ 5 01.06.2011 13:32
функция float average(int arrray[],int from,int to) yuliyayuliya Помощь студентам 0 25.04.2011 21:55
сложная задача ugradvizhok Помощь студентам 1 30.03.2011 23:30
С++ Сложная задача sir.andrey Помощь студентам 12 26.10.2010 20:25