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

Макрокоманда - C++

Восстановить пароль Регистрация
 
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:16     Макрокоманда #1
Доброго всем времени суток!Если не трудно,разъясните мне пожалуйста,лучше просто на пальцах.В книжках все расписано для программистов слишком заумно для "чайников".В программе нужно выбрать числа в заданном интервале.Я написал несколько вариантов,все они работают.Приведу три варианта.
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
#include <iostream>
 
 inline float EnterN (float);
 
using namespace std;
 
int main()
{
 float m;
  cout << " Enter M"<<"\n";
  cin >>m;
  m=EnterN(m);
  cout << "   "<<m<< endl;
return 0;
}
 inline float EnterN (float n)
{
    if ((((n >=0.5)&&(n <= 1.0f))? true:false)==false)
       {
         cout << " Oshibka!!!  Re-Enter  M!!!"<<"\n";
         cin >>n;
         return EnterN(n);
       }
  else
  return n;
}
2.Тоже самое, но в функции использована макрокоманда.
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
#include <iostream>
#define ENTER(x) ((((x) >=0.5)&&((x) <= 1.0f))? true:false)
 
 float EnterN (float);
 
using namespace std;
 
int main()
{
 float m;
    cout << " Enter M"<<"\n";
    cin >>m;
    m=EnterN(m);
    cout << "   "<<m<< endl;
return 0;
}
  float EnterN (float n)
{
    if (ENTER(n)==false)
       {
         cout << " Oshibka!!!  Re-Enter  M!!!"<<"\n";
         cin >>n;
         return EnterN(n);
       }
  else
  return n;
}
3.Тоже,что и во втором,но вместо рекурсии цикл.
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
#include <iostream>
#define ENTER(x) ((((x) >=0.5)&&((x) <= 1.0f))? true:false)
 
 float EnterN (float);
 
using namespace std;
 
int main()
{
 float m;
    cout << " Enter M"<<"\n";
    cin >>m;
    m=EnterN(m);
    cout << "   "<<m<< endl;
return 0;
}
  float EnterN (float n)
{
  if (ENTER(n)==false)
    {
     for (;;)
        {
          cout << " Oshibka!!!  Re-Enter  M!!!"<<"\n";
          cin >>n;
            if (ENTER(n)==true)
            break;
        }
    }
  return n;
}
Все 3 варианта работают верно и примерно одинаково.Эти функции будут вызываться как внутри других функкций,так и самостоятельно.Вот у меня и стал вопрос какому варианту отдать предпочтение.Если бы ввод производился 1 раз однозначно первый и совсем не обязательно было бы писать функцию.При многократном вызове я стал на распутье.Пожалуйста подскажите.Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:18     Макрокоманда #2
имхо, лучше без рекурсии
но и макросы в плюсах не особо смотрятся так что inline функция без рекурсии либо и без inline
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.07.2013, 00:21     Макрокоманда #3
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:31  [ТС]     Макрокоманда #4
Спасибо!Не знал.Но это легко исправить.

Добавлено через 4 минуты
gray_fox, А в книжках пишут,чта с макросами программы быстрее работают и повышается читабельность!

Добавлено через 5 минут
Croessmah, А третий можно в архив?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:34     Макрокоманда #5
Цитата Сообщение от Genn55 Посмотреть сообщение
А третий можно в архив?
В смысле в архив? Он единственный без рекурсии.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.07.2013, 00:34     Макрокоманда #6
Genn55, быстрее - ну может быть; "читабельность" одинаковая - что написать макрос ENTER, что функцию ENTER; зато функции статическую типизацию поддерживают - попробуйте понять, что сделали не так, если написали\вызвали не так макрос...
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:36  [ТС]     Макрокоманда #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Это мне известно инлайн это просто инструкция,абудет она исполняться или нет это выберет кампиллятор.Другое дело,что в рекурсии она не используется это я только что узнал.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
06.07.2013, 00:40     Макрокоманда #8
Цитата Сообщение от Genn55 Посмотреть сообщение
if ((((n >=0.5)&&(n <= 1.0f))? true:false)==false)
вот здесь у тебя тавтология
попытаюсь объяснить
у тернарного оператора если выражение истина(true) то возвращается второй операнд ( у тебя true) если ложь(false) то третий( у тебя false) т.е возвращаешь то что выражении
следовательно он не нужен
упрощаем
C++
1
if (((n >=0.5)&&(n <= 1.0f))==false)
идем дальше
n >=0.5 и n <= 1.0f могут быть или false или true
общее (n >=0.5)&&(n <= 1.0f) true если оба true
но тебе нужен вариант когда один из них false тогда и общее false
но if срабатывает когда в скобках true
вспомним что false=! true(инверсия)
и еще упрощаем
C++
1
if (!((n >=0.5)&&(n <= 1.0f)))
теперь Булева алгебра
!(A&&B)=!A || !B

C++
1
if (!(n >=0.5)||!(n <= 1.0f))
а что такое !(n >=0.5) это n<0.5
! (n <= 1.0f) n>1.0
переписываем
C++
1
if(n<0.5 || n>1.0)
видишь насколько упростилось

теперь тело
Цитата Сообщение от Genn55 Посмотреть сообщение
{
* * * * *cout << " Oshibka!!! *Re-Enter *M!!!"<<"\n";
* * * * *cin >>n;
* * * * *return EnterN(n);
* * * *}
если ты сто раз введешь неправильно го какая глубина рекурсии????

вот тебе с циклом while никакой рекурсии
C++
1
2
3
4
5
6
7
8
9
float EnterN (float n)
{
while((n<0.5 || n>1.0)
       {
         cout << " Oshibka!!!  Re-Enter  M!!!"<<"\n";
         cin >>n;
       }
 return n;
}
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:41  [ТС]     Макрокоманда #9
Ага начинает проясняться.Я так понял,что если использовать макросы,то уж лучше для констант?
gray_fox
06.07.2013, 00:42
  #10

Не по теме:

Genn55, кстати, неплохая "задачка" на тему "функции vs макросы": написать рекурсивный макрос.

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:44     Макрокоманда #11
Цитата Сообщение от Genn55 Посмотреть сообщение
то уж лучше для констант?
для констант есть константы. Макросы достались от Си, в плюсах же свои механизмы
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
06.07.2013, 00:45     Макрокоманда #12
Цитата Сообщение от Genn55 Посмотреть сообщение
gray_fox, А в книжках пишут,чта с макросами программы быстрее работают и повышается читабельность!
"Все врут календари"
с макросами можно много горя хапнуть причем ошибки будут возникать не там где допущены
не зря попытались от них уйти в плюсах (inline const)
inline так же как макрос подставит свое тело на место вызова(шибко запутаные которые не инлайнятся в расчет не берем)
но у них есть контроль типов, чего начисто лишен макрос
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:48  [ТС]     Макрокоманда #13
Croessmah, ValeryS, Получается ,что в плюсах макросы вообще не нужны?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:49     Макрокоманда #14
Genn55, могут понадобиться, например, для обозначения уровня отладки
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 00:50  [ТС]     Макрокоманда #15
Зря я с ними связался.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:51     Макрокоманда #16
Вообще, вот очень хороший материал
http://www.cyberforum.ru/blogs/18334/blog100.html
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
06.07.2013, 00:56     Макрокоманда #17
Цитата Сообщение от Genn55 Посмотреть сообщение
Получается ,что в плюсах макросы вообще не нужны?
ну как тебе сказать
например нужны для условной компиляции
C++
1
2
3
4
5
6
7
8
#define BLOC 1
#if BLOC==1
............
// этот код будет компилится если макрос BLOC 1
#else
..........
// этот код будет компилится в остальных случаях
#endif
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 01:28  [ТС]     Макрокоманда #18
Это пока не для меня.Самостоятельно очень трудно разобраться когда даже посоветоваться не с кем.А лекции для меня в далеком прошлом.Пока буду разбираться с этим.Всем огромное спасибо.

Добавлено через 24 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение

Не по теме:

Genn55, кстати, неплохая "задачка" на тему "функции vs макросы": написать рекурсивный макрос.

Ума не приложу,если макрос по сути текст и ничего не возвращает, как можно сделать его рекурсию.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
06.07.2013, 01:56     Макрокоманда #19
Цитата Сообщение от Genn55 Посмотреть сообщение
Ума не приложу,если макрос по сути текст и ничего не возвращает, как можно сделать его рекурсию.
http://www.opennet.ru/docs/RUS/cpp/cpp-5.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 02:28     Макрокоманда
Еще ссылки по теме:

Отсутствует макрокоманда КомандыКлавиатуры в Access 2010 MS Access
VBA VBA макрокоманда
MS Access Макрокоманда ОтправитьОбъектБД

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

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.07.2013, 02:28  [ТС]     Макрокоманда #20
Все равно это подстановка и что из этого получится,проку наверное мало.Но почему бы и не попробовать?При моих скудных познаниях может что и получится.
Yandex
Объявления
06.07.2013, 02:28     Макрокоманда
Ответ Создать тему
Опции темы

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