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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
#1

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

06.07.2013, 00:16. Просмотров 513. Ответов 19
Метки нет (Все метки)

Доброго всем времени суток!Если не трудно,разъясните мне пожалуйста,лучше просто на пальцах.В книжках все расписано для программистов слишком заумно для "чайников".В программе нужно выбрать числа в заданном интервале.Я написал несколько вариантов,все они работают.Приведу три варианта.
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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12495 / 7057 / 791
Регистрация: 27.09.2012
Сообщений: 17,436
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:18     Макрокоманда #2
имхо, лучше без рекурсии
но и макросы в плюсах не особо смотрятся так что inline функция без рекурсии либо и без inline
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
06.07.2013, 00:21     Макрокоманда #3
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
06.07.2013, 00:31  [ТС]     Макрокоманда #4
Спасибо!Не знал.Но это легко исправить.

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

Добавлено через 5 минут
Croessmah, А третий можно в архив?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12495 / 7057 / 791
Регистрация: 27.09.2012
Сообщений: 17,436
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:34     Макрокоманда #5
Цитата Сообщение от Genn55 Посмотреть сообщение
А третий можно в архив?
В смысле в архив? Он единственный без рекурсии.
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
06.07.2013, 00:34     Макрокоманда #6
Genn55, быстрее - ну может быть; "читабельность" одинаковая - что написать макрос ENTER, что функцию ENTER; зато функции статическую типизацию поддерживают - попробуйте понять, что сделали не так, если написали\вызвали не так макрос...
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
06.07.2013, 00:36  [ТС]     Макрокоманда #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Это мне известно инлайн это просто инструкция,абудет она исполняться или нет это выберет кампиллятор.Другое дело,что в рекурсии она не используется это я только что узнал.
ValeryS
Модератор
6446 / 4912 / 451
Регистрация: 14.02.2011
Сообщений: 16,283
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
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
06.07.2013, 00:41  [ТС]     Макрокоманда #9
Ага начинает проясняться.Я так понял,что если использовать макросы,то уж лучше для констант?
gray_fox
06.07.2013, 00:42
  #10

Не по теме:

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

Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12495 / 7057 / 791
Регистрация: 27.09.2012
Сообщений: 17,436
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:44     Макрокоманда #11
Цитата Сообщение от Genn55 Посмотреть сообщение
то уж лучше для констант?
для констант есть константы. Макросы достались от Си, в плюсах же свои механизмы
ValeryS
Модератор
6446 / 4912 / 451
Регистрация: 14.02.2011
Сообщений: 16,283
06.07.2013, 00:45     Макрокоманда #12
Цитата Сообщение от Genn55 Посмотреть сообщение
gray_fox, А в книжках пишут,чта с макросами программы быстрее работают и повышается читабельность!
"Все врут календари"
с макросами можно много горя хапнуть причем ошибки будут возникать не там где допущены
не зря попытались от них уйти в плюсах (inline const)
inline так же как макрос подставит свое тело на место вызова(шибко запутаные которые не инлайнятся в расчет не берем)
но у них есть контроль типов, чего начисто лишен макрос
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
06.07.2013, 00:48  [ТС]     Макрокоманда #13
Croessmah, ValeryS, Получается ,что в плюсах макросы вообще не нужны?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12495 / 7057 / 791
Регистрация: 27.09.2012
Сообщений: 17,436
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:49     Макрокоманда #14
Genn55, могут понадобиться, например, для обозначения уровня отладки
Genn55
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
06.07.2013, 00:50  [ТС]     Макрокоманда #15
Зря я с ними связался.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12495 / 7057 / 791
Регистрация: 27.09.2012
Сообщений: 17,436
Записей в блоге: 2
Завершенные тесты: 1
06.07.2013, 00:51     Макрокоманда #16
Вообще, вот очень хороший материал
http://www.cyberforum.ru/blogs/18334/blog100.html
ValeryS
Модератор
6446 / 4912 / 451
Регистрация: 14.02.2011
Сообщений: 16,283
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
342 / 189 / 37
Регистрация: 26.12.2012
Сообщений: 661
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     Макрокоманда
Еще ссылки по теме:

MS Access Макрокоманда ОтправитьОбъектБД
MS Access Макрокоманда ОтправитьОбъектБД. Вставка данных в поле "кому" из таблицы?
MS Access Почему макрокоманда ЗадатьСвойство приводит к ошибке?
MS Access макрокоманда НаЗапись: на кнопочку во второй форме, мы попадали на соответствующую страницу с записью в первой

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

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

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