Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
#1

Использование директив препроцессора - C++

14.10.2016, 22:44. Просмотров 846. Ответов 17
Метки нет (Все метки)

Составить программу, использующую директивы препроцессора:

с помощью директивы #define вычислить x3 , при x = −2,−1,...,2
с помощью директив #if, #else, #elif осуществить выбор строк программы для вычисления либо 1/(a+b) , либо a-b.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2016, 22:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование директив препроцессора (C++):

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

Подключение директив препроцессора
Не могу найти подходящую информацию=( Даны директивы : A) #include...

Назначение директив препроцессора: #ifndef, #define, #endif
Объясните, что обозначают эти директивы? Заем это использовать в классах? ...

Вернуть значение типа int за счет директив препроцессора
основной текстовый документ. #include "mystring.h" #include <iostream> using...

Можно пример практического применения в приложениях директив препроцессора #if,#end,#error
Просто говорится,что это для выборочной компиляции. Я не могу предсттавить,где...

Использование препроцессора
Здравия желаю!:) Есть ли смысл в конструкции #ifdef - #endif в данном коде,...

17
alexcoder
1557 / 702 / 145
Регистрация: 03.06.2009
Сообщений: 4,029
Завершенные тесты: 1
15.10.2016, 13:30 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main()
{
#define x -2
#define y x*x*x
    cout << x << " " << y << endl;
#define x -1
    cout << x << " " << y << endl;
#define x 0
    cout << x << " " << y << endl;
#define x 1
    cout << x << " " << y << endl;
#define x 2
    cout << x << " " << y << endl;
    system("pause");
    return 0;
}
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
15.10.2016, 18:13  [ТС] #3
alexcoder, а второй подпункт под строки как реализовать? с выбором строк
0
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,446
Записей в блоге: 30
15.10.2016, 18:38 #4
alexcoder, я сильно подозреваю, что в первом варианте задание подразумевает другое. Т.е. что-то типа "define CUBE(x) ((x)*(x)*(x))"
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
15.10.2016, 18:45  [ТС] #5
Evg, а это тогда как??
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
30.10.2016, 20:40  [ТС] #6
Ребята, можете помочь?? Не вдупляю как это реализовать

Цитата Сообщение от NICK WILDE Посмотреть сообщение
Составить программу, использующую директивы препроцессора:
с помощью директивы #define вычислить x^3 , при x = −2,−1,...,2
с помощью директив #if, #else, #elif осуществить выбор строк программы для вычисления либо 1/(a+b) , либо a-b.
Добавлено через 2 часа 51 минуту
нашёл тут эти лабы 6-и летней давности, не такие, как у меня, но похожие. переделал под себя
с кубом всё понятно. а вот с #if #else трабл

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <stdio.h>
#define SUM
 
int main(int argc, char *argv[])
{
    setlocale(0, "rus");
    float a,b;
    printf("Введите a:");
    scanf("%f",&a);
    printf("Введите b:");
    scanf("%f",&b);
    #if defined(SUM)
    printf("1/(a+b)=%f\n",1/(a+b));
    #else
    printf("a-b=%f\n",a-b);
    #endif
    return 0;
}
всё время идёт по ветке, где 1/(a+b), а ветку a-b ни разу не выбрал. в чём проблема??
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
30.10.2016, 20:43 #7
Кто-то с Экспертов может подсказать - но разве re-define через define в одной единице трансляции - это UB.
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
30.10.2016, 20:55  [ТС] #8
rikimaru2013, вообще ничего не понял
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
30.10.2016, 20:57 #9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве re-define через define в одной единице трансляции - это UB
А где там re-define?
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
30.10.2016, 20:59  [ТС] #10
GbaLog-,
Цитата Сообщение от NICK WILDE Посмотреть сообщение
всё время идёт по ветке, где 1/(a+b), а ветку a-b ни разу не выбрал. в чём проблема??
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
30.10.2016, 21:01 #11
Цитата Сообщение от NICK WILDE Посмотреть сообщение
GbaLog-,
http://www.cyberforum.ru/blogs/18334/blog100.html
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
30.10.2016, 21:02 #12
GbaLog-, вы эксперт? и где там? В вопросе нету ссылок на код, что вы несёте?
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
30.10.2016, 21:04 #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы эксперт?
Вы моей подписи под ником не видите?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
и где там?
В коде, конечно, иначе зачем было это здесь оставлять?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что вы несёте?
То, что считаю нужным нести.
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
30.10.2016, 21:08  [ТС] #14
GbaLog-, там нет этому объяснения
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
30.10.2016, 21:11 #15
Цитата Сообщение от NICK WILDE Посмотреть сообщение
там нет этому объяснения
Есть, просто Вы увидели "многотекста" и не захотели читать и учить, а решили просто написать, что ничего там нет.
Если бы Вы прочли этот блог, то вопросы бы отпали сами собой.
0
NICK WILDE
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 42
30.10.2016, 21:18  [ТС] #16
GbaLog-,
Цитата Сообщение от GbaLog- Посмотреть сообщение
Есть, просто Вы увидели "многотекста" и не захотели читать и учить, а решили просто написать, что ничего там нет.
Если бы Вы прочли этот блог, то вопросы бы отпали сами собой.
Кликните здесь для просмотра всего текста
4.2. Директивы #if, #else, #elif, #endif

Синтаксис директивы "#if" очень простой и по большому счёту совпадает с операциями условного исполнения в языке. Как-то особенно на этом останавливаться не буду, просто покажу все варианты использования. Единственное, что нужно отметить - обязательно должен быть "#endif", потому как без него препроцессор не сможет понять, в каком месте заканчивается директива "#if"

C
Выделить код

1
2
3



#if <условие>
...
#endif

C
Выделить код

1
2
3
4
5



#if <условие>
...
#else
...
#endif

C
Выделить код

1
2
3
4
5
6
7
8
9



#if <условие>
...
#elif <условие>
...
#elif <условие>
...
#else
...
#endif

Что касается условия, то хочется ещё раз отметить, что препроцессирование делается отдельно от компиляции, а потому в условии директивы "#if" НЕ могут использоваться никакие переменные из программы. В условии могут использоваться только целочисленные константные значения (которые могут быть значениями других макросов). Над этими константами можно выполнять операции сравнения "==", "!=", "<", "<=", ">", ">=". В условии могут использоваться логические операции "&&", "||", "!", круглые скобки, а так же некая конструкция "defined <macro_name>", значение которой истинно, если макрос <macro_name> определён, в противном случае значение ложно. Препроцессорные "#if'ы", так же, как и языковые, могут быть вложены друг в друга. В строках с директивами можно использовать комментарии

Если обратиться к примерам из предыдущего раздела и скомбинировать их, то можно продемонстрировать один из примеров использования. Ситуация следующая: в программе была найдена ошибка, но аккуратное её исправление требует много времени, а исправить надо быстро. Поэтому пока делаем в виде затычки.

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



/* Пользовательская ошибка N1234. На текущий момент она не исправлена, т.к.
* это требует много времени, а потому под этим макросом пока сделаем затычки
* для обхода ошибки */
#define BUG1234
...

void func1 (void)
{
...
/* Пишем затычку. В случае наличия или отсутствия отладочных печатей код
* затычки выглядит по разному */
#if defined BUG1234
#if DEBUG == 1
/* Код затычки в отладочной сборке */
...
#else /* DEBUG */
/* Код затычки в пользовательской сборке */
...
#endif /* DEBUG */
#endif /* BUG1234 */
...
}
...
void func2 (void)
{
...
/* Здесь ошибка проявляется только в MEDIUM сборке */
#if (defined BUG1234) && (BUILD == BUILD_MEDIUM)
/* Код затычки */
...
#endif
...
}

Таким образом мы исправляем программу, тестируем и отдаём пользователю. Далее спокойно исправляем ошибку. После чего закомментируем макрос BUG1234 и тестируем в режиме с выкинутыми затычками. Важно, что это управляется всего в одной строке. Если что-то не срослось - макрос возвращаем на место. Если всё нормально, то работаем с отключенным макросом, но код какое-то время оставляем, чтобы всё устаканилось и более тщательно оттестировалось. После чего ищем все места, где использовался макрос BUG1234 и удаляем их

Жизнь показала, что не всем понятно, что такое "затычка" по своей сути. Здесь приведён хороший пример с пояснением. Пример основан на реальной ошибке в коде


Я всё это прочитал и не нашёл конкретно ответа на свою задачу. Если вы такой умный, что скидываете просто материал и говорите, что там это есть, то укажите где именно ответ на мой вопрос и как его исправить
0
nonedark2008
1022 / 762 / 210
Регистрация: 28.07.2012
Сообщений: 2,118
30.10.2016, 21:22 #17
Цитата Сообщение от NICK WILDE Посмотреть сообщение
а ветку a-b ни разу не выбрал
А как ты считаешь, когда он должен эту "ветку" выбирать?
Закомментируй
Цитата Сообщение от NICK WILDE Посмотреть сообщение
#define SUM
, и программа начнем выполнять твою вторую "ветку".
1
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
30.10.2016, 21:23 #18
Цитата Сообщение от NICK WILDE Посмотреть сообщение
то укажите где именно ответ на мой вопрос и как его исправить
Ответ на Ваш вопрос в Вашем коде из этого поста в строке 3.
0
30.10.2016, 21:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2016, 21:23
Привет! Вот еще темы с решениями:

Использование препроцессора для генерации строк
Здрям! Грубо говоря, есть макрос, например: #define COUNT 8 И есть строка,...

Заполнить 2 двухмерных массива символами. Написать функцию которая ставит символ пробела в старшем и младшем...(Использование директив)
Задание: Заполнить 2 двухмерных массива разной длины символами. Написать...

Директивы препроцессора Составить программу, использующую директивы препроцессора
1) Задать константы M1,M2,...,M5 и вычислить M1+ 2M2 + 3M3 + 4M4 + 5M5 2) С...

объявление директив
здравствуйте, что будет если два раза одинаково объявить директиву? Допустим ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru