С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787

Макрокоманда

06.07.2013, 00:16. Показов 1259. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2013, 00:16
Ответы с готовыми решениями:

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

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

Макрокоманда КомандыКлавиатуры
Подскажите, пожалуйста, как пользоваться макрокомандой &quot;КомандыКлавиатуры&quot;. В поле &quot;клавиши&quot; как вводить функциональные клавиши,...

19
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.07.2013, 00:18
имхо, лучше без рекурсии
но и макросы в плюсах не особо смотрятся так что inline функция без рекурсии либо и без inline
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
06.07.2013, 00:21
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 00:31  [ТС]
Спасибо!Не знал.Но это легко исправить.

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

Добавлено через 5 минут
Croessmah, А третий можно в архив?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.07.2013, 00:34
Цитата Сообщение от Genn55 Посмотреть сообщение
А третий можно в архив?
В смысле в архив? Он единственный без рекурсии.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
06.07.2013, 00:34
Genn55, быстрее - ну может быть; "читабельность" одинаковая - что написать макрос ENTER, что функцию ENTER; зато функции статическую типизацию поддерживают - попробуйте понять, что сделали не так, если написали\вызвали не так макрос...
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 00:36  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Genn55, я бы выбрал первый вариант - просто потому что не макрос - с функциями проще... )
Но, не факт что функция заинлайнится (если это интересует), тогда как макрос - просто подстановка текста по сути
Это мне известно инлайн это просто инструкция,абудет она исполняться или нет это выберет кампиллятор.Другое дело,что в рекурсии она не используется это я только что узнал.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
06.07.2013, 00:40
Цитата Сообщение от 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
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 00:41  [ТС]
Ага начинает проясняться.Я так понял,что если использовать макросы,то уж лучше для констант?
0
06.07.2013, 00:42

Не по теме:

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

0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.07.2013, 00:44
Цитата Сообщение от Genn55 Посмотреть сообщение
то уж лучше для констант?
для констант есть константы. Макросы достались от Си, в плюсах же свои механизмы
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
06.07.2013, 00:45
Цитата Сообщение от Genn55 Посмотреть сообщение
gray_fox, А в книжках пишут,чта с макросами программы быстрее работают и повышается читабельность!
"Все врут календари"
с макросами можно много горя хапнуть причем ошибки будут возникать не там где допущены
не зря попытались от них уйти в плюсах (inline const)
inline так же как макрос подставит свое тело на место вызова(шибко запутаные которые не инлайнятся в расчет не берем)
но у них есть контроль типов, чего начисто лишен макрос
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 00:48  [ТС]
Croessmah, ValeryS, Получается ,что в плюсах макросы вообще не нужны?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.07.2013, 00:49
Genn55, могут понадобиться, например, для обозначения уровня отладки
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 00:50  [ТС]
Зря я с ними связался.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.07.2013, 00:51
Вообще, вот очень хороший материал
https://www.cyberforum.ru/blogs/18334/blog100.html
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
06.07.2013, 00:56
Цитата Сообщение от Genn55 Посмотреть сообщение
Получается ,что в плюсах макросы вообще не нужны?
ну как тебе сказать
например нужны для условной компиляции
C++
1
2
3
4
5
6
7
8
#define BLOC 1
#if BLOC==1
............
// этот код будет компилится если макрос BLOC 1
#else
..........
// этот код будет компилится в остальных случаях
#endif
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 01:28  [ТС]
Это пока не для меня.Самостоятельно очень трудно разобраться когда даже посоветоваться не с кем.А лекции для меня в далеком прошлом.Пока буду разбираться с этим.Всем огромное спасибо.

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

Не по теме:

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

Ума не приложу,если макрос по сути текст и ничего не возвращает, как можно сделать его рекурсию.
0
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
06.07.2013, 01:56
Цитата Сообщение от Genn55 Посмотреть сообщение
Ума не приложу,если макрос по сути текст и ничего не возвращает, как можно сделать его рекурсию.
http://www.opennet.ru/docs/RUS/cpp/cpp-5.html
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
06.07.2013, 02:28  [ТС]
Все равно это подстановка и что из этого получится,проку наверное мало.Но почему бы и не попробовать?При моих скудных познаниях может что и получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2013, 02:28
Помогаю со студенческими работами здесь

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

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

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

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

Макрокоманда обнуления ячеек с адресами POINT1-POINT2
Написать макрокоманду обнуления ячеек с адресами POINT1-POINT2. Скиньте пожалуйста решение или пример с чем то похожим)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru