Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
#1

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

06.07.2013, 00:16. Просмотров 570. Ответов 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 раз однозначно первый и совсем не обязательно было бы писать функцию.При многократном вызове я стал на распутье.Пожалуйста подскажите.Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2013, 00:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Макрокоманда (C++):

макрокоманда - MS Excel
всем доброго дня. у меня такая проблема имеется база , которая заполняется ежемесячно и в течении месяца, она заранее расчитана на 3...

Макрокоманда ОтправитьОбъектБД - MS Access
Как с помощью этой макрокоманды отправить почту? Выдается сообщение : * База данных доступна только для чтения или не была...

VBA макрокоманда - VBA
макрокоманда, выполняющую одновременно закрытие и удаление файла? пробовал это прописать ,но не срабатывает . Может есть другой...

Макрокоманда выборки из массива - Assembler
Доброго времени суток. Так как я, откровенно, не силен в Эссемблере, прошу проверить, то что я написал и по возможности указать на ошибки. ...

Отсутствует макрокоманда КомандыКлавиатуры в Access 2010 - MS Access
При создании макроса наткнулся на маленькую неприятность. В списке макрокоманд отсутствовала макрокоманда КомандыКлавиатуры, которая раньше...

Почему макрокоманда ЗадатьСвойство приводит к ошибке? - MS Access
Для скрытия Поля в Форме1 задаю в событии кнопки Формы2 макрокоманды ВыделитьОбъект (Форма1) и ЗадатьСвойство элемента управления (Поле)....

19
Croessmah
Пришел
Эксперт CЭксперт С++
13771 / 7852 / 894
Регистрация: 27.09.2012
Сообщений: 19,274
Записей в блоге: 3
Завершенные тесты: 1
06.07.2013, 00:18 #2
имхо, лучше без рекурсии
но и макросы в плюсах не особо смотрятся так что inline функция без рекурсии либо и без inline
1
gray_fox
What a waste!
1536 / 1241 / 71
Регистрация: 21.04.2012
Сообщений: 2,608
Завершенные тесты: 3
06.07.2013, 00:21 #3
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
0
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
06.07.2013, 00:31  [ТС] #4
Спасибо!Не знал.Но это легко исправить.

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

Добавлено через 5 минут
Croessmah, А третий можно в архив?
0
Croessmah
Пришел
Эксперт CЭксперт С++
13771 / 7852 / 894
Регистрация: 27.09.2012
Сообщений: 19,274
Записей в блоге: 3
Завершенные тесты: 1
06.07.2013, 00:34 #5
Цитата Сообщение от Genn55 Посмотреть сообщение
А третий можно в архив?
В смысле в архив? Он единственный без рекурсии.
0
gray_fox
What a waste!
1536 / 1241 / 71
Регистрация: 21.04.2012
Сообщений: 2,608
Завершенные тесты: 3
06.07.2013, 00:34 #6
Genn55, быстрее - ну может быть; "читабельность" одинаковая - что написать макрос ENTER, что функцию ENTER; зато функции статическую типизацию поддерживают - попробуйте понять, что сделали не так, если написали\вызвали не так макрос...
1
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
06.07.2013, 00:36  [ТС] #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Это мне известно инлайн это просто инструкция,абудет она исполняться или нет это выберет кампиллятор.Другое дело,что в рекурсии она не используется это я только что узнал.
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,459
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;
}
1
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
06.07.2013, 00:41  [ТС] #9
Ага начинает проясняться.Я так понял,что если использовать макросы,то уж лучше для констант?
0
gray_fox
06.07.2013, 00:42
  #10

Не по теме:

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

0
Croessmah
Пришел
Эксперт CЭксперт С++
13771 / 7852 / 894
Регистрация: 27.09.2012
Сообщений: 19,274
Записей в блоге: 3
Завершенные тесты: 1
06.07.2013, 00:44 #11
Цитата Сообщение от Genn55 Посмотреть сообщение
то уж лучше для констант?
для констант есть константы. Макросы достались от Си, в плюсах же свои механизмы
0
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,459
06.07.2013, 00:45 #12
Цитата Сообщение от Genn55 Посмотреть сообщение
gray_fox, А в книжках пишут,чта с макросами программы быстрее работают и повышается читабельность!
"Все врут календари"
с макросами можно много горя хапнуть причем ошибки будут возникать не там где допущены
не зря попытались от них уйти в плюсах (inline const)
inline так же как макрос подставит свое тело на место вызова(шибко запутаные которые не инлайнятся в расчет не берем)
но у них есть контроль типов, чего начисто лишен макрос
0
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
06.07.2013, 00:48  [ТС] #13
Croessmah, ValeryS, Получается ,что в плюсах макросы вообще не нужны?
0
Croessmah
Пришел
Эксперт CЭксперт С++
13771 / 7852 / 894
Регистрация: 27.09.2012
Сообщений: 19,274
Записей в блоге: 3
Завершенные тесты: 1
06.07.2013, 00:49 #14
Genn55, могут понадобиться, например, для обозначения уровня отладки
0
Genn55
375 / 222 / 41
Регистрация: 26.12.2012
Сообщений: 733
06.07.2013, 00:50  [ТС] #15
Зря я с ними связался.
0
06.07.2013, 00:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 00:50
Привет! Вот еще темы с ответами:

Макрокоманда рисует рядом столбец из sin от значений ячеек первого столбца - VBA
ексель 2003 Есть столбец. Макрокоманда рисует рядом столбец из sin от значений ячеек первого столбца, проверяя перед этим, что это...

макрокоманда НаЗапись: на кнопочку во второй форме, мы попадали на соответствующую страницу с записью в первой - MS Access
Дорогие форумчане, товарищи эксперты! Помогите, пожалуйста, зелёному разработчику! В моей базе данных одна форма построена на основе...

Макрокоманда ОтправитьОбъектБД. Вставка данных в поле "кому" из таблицы? - MS Access
Привет, народ! Вопрос в следующем. 1.Имеется таблица &quot;ЛЮДИ&quot; у которой есть email адреса. 2. Есть форма создающая отчет по...

Команда или макрокоманда "Обновить" в данное время недоступна - MS Access
При нажатие кнопки на форме обновить даные выскакивает ошибка &quot;Команда или макрокоманда &quot;Обновить&quot; в данное время недоступна &quot; что...


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

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

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