0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 10

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

03.06.2015, 17:38. Показов 4384. Ответов 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru