Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 10

"Тру" и "не тру" программирование

03.06.2015, 17:38. Показов 4335. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Ниже два куска простейшего кода, которые по функция совершенно идентичны (проверка чисел на соответствие опр. параметру).
Первый:
C++
1
2
3
4
5
6
7
8
9
10
11
12
do
{
    cin >> m >> y;
 
    if ( (m != int(m)) || (y != int(y)) )
    {
        cout << "Сообщение";
        continue;
    }
    break;
}
while (true);
Второй:
C++
1
2
3
4
5
6
7
8
9
10
11
do
{
    cin >> m >> y;
 
    if ( (m != int(m)) || (y != int(y)) )
    {
        cout << "Сообщение";
    }
 
}
while ( (m != int(m)) || (y != int(y)) );
Вопросы: Почему первый вариант, по словам моего преподавателя, "не тру", а второй "тру"? И предпочтительнее ли, в таком случае, второй вариант?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2015, 17:38
Ответы с готовыми решениями:

GetPixel, почему первый иф равен тру, а второй - нет
Уважаемые знатоки, в первом GetPixel корды верхнего левого угла иконки поплавка (певая вкладка, опять таки вверху слева), а во втором...

Программа на Ваше обозревание, что можно еще добавить? Тру критика
Всех приветствую! Уважаемое сообщество КФ, я тут новичок, но хотел бы вступить в ваши ряды, возможно даже стать больше чем серой...

Расскажите про "тру" метод парсинга строки
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет проблем((( Код void GetDirList(const char *Target) { ...

63
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
03.06.2015, 23:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nefton Посмотреть сообщение
do //Делать
{
* * cin >> m >> y; //Ввести m затем y
if ( (m != int(m)) || (y != int(y)) ) //Если m не целое или y не целое
* * {
* * * * cout << "Сообщение"; //Вывести сообщение
* * }
}
while ( (m != int(m)) || (y != int(y)) ); //Делать от это всё пока либо m не целое либо y не целое
2 проверки в одной итерации. Лучше так

C#
1
2
3
4
5
6
cin >> m >> y; //Ввести m затем y
while ( (m != int(m)) || (y != int(y)) )  //зайти и работать пока либо m не целое либо y не целое
{
     cout << "Сообщение"; //Выругаться 
     cin >> m >> y; //Ввести m затем y   
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.06.2015, 23:47
Забавная штука)
Я бы так написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
using namespace std;
int main()
{
    float m,n;
        int err_no=0;
 
    do
    {
if(err_no++)cout<<"Heh..."<<endl;
cin>>m>>n;//если хоть одно с дробной частью будет вздыхать )
    }while(m!=int(m) || n!=int(n));
 
cout<<m<<" "<<n<<endl;
system("pause");
return 0;
}
А про тру ничего не знаю.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
04.06.2015, 07:23
Цитата Сообщение от Panic Посмотреть сообщение
Дело оказалось именно в неприятии им break и continue.
Мне кажется, вы поторопились с выводом.
Это задача на структурное программирование.
Циклы бывают следующие:
1) С проверкой в начале итерации:
C++
1
2
3
4
while( условие выхода не выполняется )
{
    //Операторы
}
2) С проверкой в конце итерации (в случае, когда первая итерация должна выполняться безусловно):
C++
1
2
3
4
5
do
{
    //Операторы
}
while( условие выхода не выполняется )
3) С проверкой в середине итерации (в случае, когда первая часть итерации должна выполняться безусловно)
C++
1
2
3
4
5
6
7
8
9
for(;;)
{
    //Операторы
    if(условие выхода выполняется)
    {
        break;
    }
    //Операторы
}
Как видим, этот вариант без break написать невозможно, иначе придется код дублировать, как в вашем втором варианте, а это недопустимо.

В вашей задаче ввод данных должен выполняться безусловно в каждой итерации, а сообщение о плохих данных выводиться только в случае, когда ввод необходимо повторить, т.е. имеем третий вариант, в котором вам необходимо использовать break по логике вещей, независимо от образованности и смышлености вашего преподавателя.
Оператор continue может использоваться во всех трех вариантах, если иногда нам нужно выполнить итерацию, не до конца, т.е. это просто замена оператора if, чтобы лишний отступ не делать. В вашем первом варианте это лишнее.
1
04.06.2015, 08:53

Не по теме:

Цитата Сообщение от nefton Посмотреть сообщение
Язык с++ ... это чтото среднее между русским и ассемблером
The best definition of C++ Language, ever!

0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.06.2015, 11:07
C++
1
m!=int(m)
Это какая-то хрень, а не проверка. float или double может легко не влезть в int. Поэтому надо пользоваться std::rint.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.06.2015, 11:13
Вот чего ещё можно для весу понаписать:
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> 
using namespace std;
int main()
{
    float m,n;
              int bad_n=0,
         bad_m=0,
         is_bad_n=0,
         is_bad_m=0,
         is_somethind_bad;
 
    do
    {
cout << "type n (spase) m"<<endl;
cin>>n>>m;
is_bad_n= n!=int(n);
is_bad_m=m!=int(m);
is_somethind_bad=is_bad_n || is_bad_m;
if(is_bad_n)bad_n++;
if(is_bad_m)bad_m++;
 
if(is_bad_n)cout<<"bad n at "<<bad_n<<"-th time at from "<<bad_n+bad_m<<" tries"<<endl;
if(is_bad_m)cout<<"bad m at "<<bad_m<<"-th time at from "<<bad_n+bad_m<<" tries"<<endl;
if(is_bad_n && is_bad_m)cout<<"bad n and m at "<<bad_n+bad_m<<" tries"<<endl;
    }while( is_somethind_bad );
 
cout<<m<<" "<<n<<endl;
system("pause");
return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.06.2015, 12:29
Цитата Сообщение от ct0r Посмотреть сообщение
float или double может легко не влезть в int. Поэтому надо пользоваться std::rint.
Здравое замечание. Но в учебных примерах (начального уровня) таким не заморачиваются.
По реализации цикла, соглашусь с версией DrOffset. Максимально лаконично, без дублирования кода, не do-while.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.06.2015, 13:50
Цитата Сообщение от ct0r Посмотреть сообщение
Это какая-то хрень, а не проверка. float или double может легко не влезть в int
Товарищи в институте осваивают тру-программирование. То бишь, что круче: break или continue. Про такие вещи, как представление плавающих им пока задумываться не положено. А если преп про то сам не знает, то вообще задумываться про это карается смертной казнью
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.06.2015, 14:04
Цитата Сообщение от Evg Посмотреть сообщение
то вообще задумываться про это карается смертной казнью
и досрочным уходом в армию
0
04.06.2015, 14:06

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
и досрочным уходом в армию
MrGluck вот доигрался недавно :D
Уезжаю в отпуск 2 июня на год. Никто кроме нас!

0
04.06.2015, 14:08

Не по теме:

Tulosba, кажись вектор использовал в задании для первого курса :D

0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 14:25
Тему не читал, сразу отвечал.
Первый кусок это индусня, второй тредонебезопасный.
Поясняю.
Первый: действия по выходу или продолжению цикла раскиданы аж в 3 местах, а именно в while(true), break и continue.
Второй: первая проверка окей, а вторая может уже к этому времени измениться. Тут надо решение по проверке использовать одно, вычислив его лишь раз.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.06.2015, 15:07
Цитата Сообщение от Enno Посмотреть сообщение
второй тредонебезопасный
Цитата Сообщение от Enno Посмотреть сообщение
Второй: первая проверка окей, а вторая может уже к этому времени измениться. Тут надо решение по проверке использовать одно, вычислив его лишь раз.
Эмм... А расшифровать, чтобы все поняли? И причем тут потоки (а я так подозреваю, что речь о системных потоках) вообще?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 15:25
Цитата Сообщение от ct0r Посмотреть сообщение
И причем тут потоки (а я так подозреваю, что речь о системных потоках) вообще?
После первой проверки поток, выполняющий приведённый код, может быть прерван другим потоком, который может изменить значение переменных, а потом первый поток произведёт проверку вновь и результаты проверки могут отличаться.
0
04.06.2015, 15:29

Не по теме:

Это хорошо еще в тему адепты флагов не зашли. Х)

0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.06.2015, 15:34
Enno,
Тут вообще не надо задумываться об этом. Никакой речи о многопоточной среде не шло.
И я не понял: ты хочешь сказать, что первый вариант thread-safe?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 15:39
Цитата Сообщение от ct0r Посмотреть сообщение
ты хочешь сказать, что первый вариант thread-safe?
Разумеется, проверка-то одна. То что введённые числа могут не соответствовать проверяемым не так важно, главное проверка одна и случай, когда выведется более одного сообщения, исключён.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.06.2015, 15:41
Цитата Сообщение от Enno Посмотреть сообщение
второй тредонебезопасный.
А первый безопасный что ли? Поднасрать из другого потока в m,y можно например пока первый поток находится где-то в 4ой строке.
Имхо, присовокуплять в текущее обсуждение ещё и потокобезопасность кода довольно абсурдно.
Так как в нормальной функции подобного плана переменные живут на стеке, который у каждого потока выполнения свой.

Добавлено через 46 секунд

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
адепты флагов
Шелдон Купер?

0
Заблокирован
04.06.2015, 15:43
Почему первый вариант, по словам моего преподавателя, "не тру", а второй "тру"?
Тяжело учиться там, где преподы - ЧСВшные ватники, которые считают тебя куском несвежего и просто молча тыкают тебя в ошибку, ничего не объясняя. Вот с нашим преподом можно обсудить тонкости реализации, с ним даже можно немного перетереть за функциональное программирование. Наверно, дело в том, что он всего на 7-8 лет старше нас, а другой препод тоже любит делиться опытом.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 15:49

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, присовокуплять в текущее обсуждение ещё и потокобезопасность кода довольно абсурдно
Мой первый пост в сей теме был 32 по счёту. Растягивать такую эту тему до 31 сообщения, вот что абсурдно. Проехали.


Цитата Сообщение от Tulosba Посмотреть сообщение
Так как в нормальной функции подобного плана переменные живут на стеке, который у каждого потока выполнения свой.
Доступ к любому стеку есть у любого потока процесса (это ж просто кусок памяти), если мы windows обсуждаем. И вообще там не функция, не видно кто где создаётся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2015, 15:49

Тру настройка MVS2012
Всем привет! Хотел бы поинтересоваться следующим: Может ли кто-нибудь подсказать каким образом можно сделать хоткей на действие...

Кто Тру?
Дана задача ((x-1)(x-3)(x-5)...(x-63))/((x-2)(x-4)(x-6)...(x-64)) Взял одно решение из интернета, а второе написал сам. Можете сказать...

Только я знаю про тру наследование!
Это зависит от того, как использовать. Их можно использовать для выражения отношения &quot;является&quot;, а то что там в теории можно...

Правильное использование конструкции тру-финали
Как правильно? 1. var lst: TStringList; begin lst:= TStringList.Create; try lst.CommaText:=...

Нужно посоветоваться с тру фулстек-программистом
Думаю, из названия темы всё понятно. P.S. тема создана не в том разделе, администрация, перекиньте чуть-что туда - куда нужно ( я не...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru