2012-02-10 2 views
1

У меня был лабораторный класс, в этом и был вопрос, может ли кто-то исправить эту программу/она работает корректно, но когда ее выход ошибочен. Это в основном должно напечатать наименьшее из трех условий, вот вопрос:Макрос Rookie Programmer

Напишите программу, которая определяет макросы minimum2 для определения меньшего из двух числовых значений. Затем используйте минимум два, чтобы сравнить третий макрос, который должен определяться именем минимум три, чтобы определить наименьшее число.

Это код, который я написал, он имеет две ошибки кода не имеет никакого эффекта и e это присвоить значение, которое никогда не используется:

#include <stdio.h> 
#include <conio.h> 

#define minimum2(a,b)(a < b)?a:b 
#define minimum3(a,b,c) minimum2(a,b) < c? minimum2(a,b):c 

int main() 
{ 
    int c = 3, d = 4, e = 2; 
    minimum3(c, d, e); 
    getch(); 
    return 0; 
} 

Пожалуйста, помогите мне, у меня есть тест в ближайшее время и будет благодарен за это.

+2

Пожалуйста, отформатируйте свой код. На странице редактирования есть инструкции и кнопка '{}'. –

+0

Вы не сохраняете результат своего макроса в любом месте ... –

+0

'(a

ответ

5
  1. Вам нужно больше скобок в определениях макросов.
  2. Вам необходимо использовать результат вашего действия minimum3.
-2
#define minimum2(a,b)((a) < (b))?(a):(b) 
#define minimum3(a,b,c) minimum2((a),(b)) < (c)? minimum2((a),(b)):(c) 

и наш курс вы должны вывести свои результаты:

printf("m3:%d\n", minimum3(c, d, e)); 
+0

Ваш код не работает. –

+1

Скотти! Нам нужно больше скобок! Capt'n, я получаю все, что у меня есть !!! –

+0

@MichaelDorgan: Спасибо. Эпический комментарий эпический: D – LihO

2

minimum2(a,b) заменяется на (a < b) ? a : b, который означает, что вы должны:

  • поместить в скобки в определении первого макрос вот так:
    #define minimum2(a,b) ((a < b) ? a : b)

  • или положить их везде вы называете minimum2 как это:
    #define minimum3(a,b,c) (minimum2(a,b)) < c ? (minimum2(a,b)) : c

Это первый упомянутый вариант и работает отлично:

#include <stdio.h> 

#define minimum2(a,b) ((a < b) ? a : b) 
#define minimum3(a,b,c) minimum2(a,b) < c ? minimum2(a,b) : c 

int main() 
{ 
    printf("%d\n", minimum3(2, 3, 4)); 
    printf("%d\n", minimum3(3, 4, 2)); 
    return 0; 
} 

выход:

2 
2 
+0

Это определенно не работает нормально. Попробуйте 'minimum (3, 4, 2)'. –

+0

@CarlNorum: Спасибо, не заметил этого. Я обновил свой ответ. – LihO

+0

Теперь выглядит хорошо. Тем не менее, я предлагаю полностью скопировать оба макроса. –

0

Во-первых, макросы а не функции, они являются текстовыми заменами. Если макрос должен вывести min из двух числовых значений, он должен вывести числовое значение, а не некоторое выражение на C++.

Во-вторых, самый простой способ сделать это состоит в использовании Boost.Preprocessor:

#define minimum2(a,b) BOOST_PP_IF(BOOST_PP_LESS(a,b), a, b) 
#define minimum3(a,b,c) minimum2(minimum2(a,b), c) 

Это будет принимать буквальное число от 0 до 256. Это не будет принимать переменные. Макросы не понимают переменные. Вы должны написать функции C++ для принятия переменных.

Смежные вопросы