2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:06 
Заслуженный участник


19/07/08
1266
arseniiv в сообщении #259135 писал(а):
да и вызов функции затратен
Особенно он затратен если сделать функцию inline. :) Особенно если этим озаботится компилятор. Учитывая, что стоимость вызова функции обычно пренебрежимо мала и что оператор goto убивает блок предсказания ветвлений... :mrgreen:
Maslov в сообщении #259137 писал(а):
И тащим туда штук 20 параметров.
Ну, на фортране в таких случаях можно использовать common блок :lol:
Maslov в сообщении #259137 писал(а):
Кроме этого, на мой непросвещенный взгляд, return из тела внутреннего цикла - существенно большее безобразие, чем выход по goto из внутреннего цикла.
Мы обсуждаем сферического коня в вакууме. Приведите пожалуйста пример, когда выход из тела внутреннего цикла не обусловлен тем, что получен некий результат.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:40 
Заслуженный участник


27/04/09
28128
nestoklon в сообщении #259176 писал(а):
Особенно он затратен если сделать функцию inline. :) Особенно если этим озаботится компилятор.
Большую функцию inline не сделать!

nestoklon в сообщении #259176 писал(а):
Учитывая, что стоимость вызова функции обычно пренебрежимо мала
Запишите весь алгоритм вызова функции и возврата из неё.

Вы предлагаете практиковать разделение кода на функции не по смыслу. При этом одни функции будут делать слишком много, другие - слишком мало.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:42 
Заслуженный участник


04/05/09
4587
nestoklon в сообщении #259176 писал(а):
arseniiv в сообщении #259135 писал(а):
да и вызов функции затратен
Особенно он затратен если сделать функцию inline. :) Особенно если этим озаботится компилятор. Учитывая, что стоимость вызова функции обычно пренебрежимо мала и что оператор goto убивает блок предсказания ветвлений...
Вы не перепутали слова "блок предсказания ветвлений" и "конвейер"?
Предсказатель ветвлений, во-первых, как раз и предназначен для поддержания заполненности конвейера при ветвлениях, во-вторых в случае с goto безусловный переход вообще не влияет на конвейер.
К тому же, неужели вы думаете, что goto - единственный источник переходов в программе? :)

nestoklon в сообщении #259176 писал(а):
Maslov в сообщении #259137 писал(а):
И тащим туда штук 20 параметров.
Ну, на фортране в таких случаях можно использовать common блок :lol:
И эти люди запрещают нам ковыряться в носу! :)

nestoklon в сообщении #259176 писал(а):
Maslov в сообщении #259137 писал(а):
Кроме этого, на мой непросвещенный взгляд, return из тела внутреннего цикла - существенно большее безобразие, чем выход по goto из внутреннего цикла.
Мы обсуждаем сферического коня в вакууме. Приведите пожалуйста пример, когда выход из тела внутреннего цикла не обусловлен тем, что получен некий результат.
Замена одного значения другим в двумерном массиве. Да и вообще много разных действий с вложенными структурами данных.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:44 
Заслуженный участник


28/04/09
1933
arseniiv
arseniiv в сообщении #259194 писал(а):
Большую функцию inline не сделать!

Во-первых, почему?
Во-вторых, больших функций по-хорошему в природе существовать не должно. Большая функция - это бронтозябр-монструозус, нарушающий принципы структурного программирования и резко снижающий читабельность кода.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:50 
Заслуженный участник


27/04/09
28128
EtCetera в сообщении #259197 писал(а):
Во-первых, почему?
Практические ограничения самих компиляторов. Может, в вашем ограничения не будет, но в существующих их много, и по объективным причинам - т.к. из определения код вставляется прямо в точку "вызова", и это не шаблон препроцессора - там надо обрабатывать множество текущих адресов переменных и тому подобное.
EtCetera в сообщении #259197 писал(а):
Во-вторых, больших функций по-хорошему в природе существовать не должно. Большая функция - это бронтозябр-монструозус, нарушающий принципы структурного программирования и резко снижающий читабельность кода.
Всегда бывают исключения, что поделать. Компиляторы C++ даже "средние" функции иногда не "превращают" в inline-вид

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 20:54 
Заслуженный участник


09/08/09
3438
С.Петербург
nestoklon в сообщении #259176 писал(а):
Мы обсуждаем сферического коня в вакууме. Приведите пожалуйста пример, когда выход из тела внутреннего цикла не обусловлен тем, что получен некий результат.
Дело не в коне, а в том, что "программирование без goto" - это одна из составляющих подхода под названием "структурное программирование", который подразумевает примерно следующее
1. Вся программа строится из ограниченного набора элементарных управляющих конструкций (модуль (подпрограмма), условный оператор, цикл типа for, цикл типа while/until).
2. Каждая управляющая конструкция содержит один вход и один выход (например, вход в цикл осуществляется только через его заголовок, выход - по оператору конца цикла, работа подпрограммы завершается оператором return, находящимся в конце и т.п.).
3. Порядок управляющих конструкций в модуле соответствует порядку выполнения этого модуля (т.е., нет переходов назад).
4. Вводятся определенные правила форматирования кода программы и наименования переменных.
Весь подход был предложен для улучшения читаемости и "отлаживаемости" программ.
Так вот программирование без goto, рассматриваемое как часть структурного программирования, выглядит абсолютно естественным ограничением, но таким же ограничением является правило одного return'а в конце продпрограммы.
Сейчас термин "структурное программирование" практически не используется, и многие знают только, что Пророк (Кнут) когда-то назвал goto неприличным словом из четырех букв, и поэтому избегают его прямо-таки с религиозным фанатизмом (выступления типа "убил бы" как раз из этой серии :))

Ничего личного.

-- Пт ноя 06, 2009 20:56:39 --

Есть предложение, уж если развязалась такая драка, попросить модераторов выделить всю эту беседу в отдельную тему.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 22:17 
Заслуженный участник


11/05/08
32166
я чего-то не понимаю. Из-за чего сыр-бор-то?

Не знаю (не помню), что такое return. Но, скажем, break -- это попросту принудительный выброс из цикла на следующий за ним оператор. А это -- операция совершенно безобидная: уж каким бы там ни был компилятор, но собственно цикл и окружающие его инструкции он обязан жёстко разграничивать.

В чём достоинство конструкций типа break по сравнению с goto -- что они мобильнее. При дальнейших (неизбежных) перекройках программы не приходится задумываться о том, что, куда и нафига ссылается.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 22:24 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #259256 писал(а):
Не знаю (не помню), что такое return.

return - это типа
Используется синтаксис C
int find(int what, int *where, int len)
{
    for (int i = 0; i < len; i ++) {
        if (where[i] == what)
             return i;
    }
    return -1;
}
 


ewert в сообщении #259256 писал(а):
В чём достоинство конструкций типа break по сравнению с goto -- что они мобильнее. При дальнейших (неизбежных) перекройках программы не приходится задумываться о том, что, куда и нафига ссылается.
А также в том, что они сугубо локальны - goto может послать куда угодно, а break/continue - только недалеко.

-- Пт ноя 06, 2009 22:28:00 --

Хотя, Вы, вроде, об этом и говорили :)

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение06.11.2009, 23:19 
Заслуженный участник


19/07/08
1266
arseniiv в сообщении #259194 писал(а):
Вы предлагаете практиковать разделение кода на функции не по смыслу.
doch
EtCetera в сообщении #259197 писал(а):
Вы не перепутали слова "блок предсказания ветвлений" и "конвейер"?
Спасибо что поправили. Я перепутал слова "блок предсказания ветвлений" и "планировщик".
venco в сообщении #259195 писал(а):
И эти люди запрещают нам ковыряться в носу! :)
Ну, раз кто-то не понял, я поясню, что это был сарказм...
venco в сообщении #259195 писал(а):
Замена одного значения другим в двумерном массиве. Да и вообще много разных действий с вложенными структурами данных.
Эээ... А зачем тут цикл? С массивами обычно не возникает необходимости посреди работы выскакивать из цикла. Когда возникает, это логически как правило обусловлено тем, что результат уже получен. Если у вас другое мнение, приведите пример.
Maslov в сообщении #259206 писал(а):
Сейчас термин "структурное программирование" практически не используется, и многие знают только, что Пророк (Кнут) когда-то назвал goto неприличным словом из четырех букв, и поэтому избегают его прямо-таки с религиозным фанатизмом (выступления типа "убил бы" как раз из этой серии :))
Maslov, вы хамите или мне показалось?..
Что сказать-то хотели? Что можно писать хороший код с goto? Дык я в самом начале согласился. У меня и пруфлинк есть:
nestoklon в сообщении #259100 писал(а):
Maslov в сообщении #259079 писал(а):
Можно и с goto написать кристально ясную программу, и без goto нечто нечитаемое и неотлаживаемое.

Угу, только намного тяжелее.
Вот только практика (критерий истины), как бы говорит нам, что есть некоторая корреляция. =)

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 01:27 
Заслуженный участник


09/08/09
3438
С.Петербург
nestoklon в сообщении #259272 писал(а):
Maslov, вы хамите или мне показалось?..
Да упаси Бог! У меня и пруфлинк есть:
Maslov в сообщении #259206 писал(а):
Ничего личного.

Разногласия чисто эстетические - Вы считаете, что return из середины цикла в разы читабельнее выхода из цикла по goto, а я так не считаю. Вот и вся разница.

nestoklon в сообщении #259272 писал(а):
Вот только практика (критерий истины), как бы говорит нам, что есть некоторая корреляция. =)
Что касается практики, то Ваша как бы говорит Вам что-то одно, моя как бы говорит мне что-то другое, и вместе им не сойтись.

Но вообще-то прав arseniiv: с этим лучше на холиварс.ру - всё равно никто ни в чём никого не убедит.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 03:14 
Аватара пользователя


14/08/09
1140
Бейте меня. :twisted:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
int main(void)
{
int i,n,sum=0; //n - число до которого сумму квадратов мы хотим посчить
printf("Anastasiya1979, enter any number, please, please!!!\n");
scanf("%d",&n);  

for(i=1;i<=n;i++) sum+=i*i; // вот здесь-то и вся программа, собственно О_0
printf("The result is %d \n",sum);

system("PAUSE"); // для мастдая
return 0;

}

 

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 10:14 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #259258 писал(а):
А также в том, что они сугубо локальны - goto может послать куда угодно, а break/continue - только недалеко.

С другой стороны -- выскакивать из вложенных циклов break'ом несколько противно:

nestoklon в сообщении #259272 писал(а):
С массивами обычно не возникает необходимости посреди работы выскакивать из цикла. Когда возникает, это логически как правило обусловлено тем, что результат уже получен. Если у вас другое мнение, приведите пример.

Пример: проверить, есть ли среди элементов матрицы хоть один нулевой (что лично мне, например, приходится делать довольно часто). Выскакивание из цикла в этом случае -- вещь, необходимая для повышения эффективности. Но это, между прочим, как раз тот самый случай, когда goto было бы проще и читабельнее.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 16:21 
Заслуженный участник


27/04/09
28128
Mathusic в сообщении #259306 писал(а):
Бейте меня. :twisted:
Только за пробелы (вернее, не пробелы). А ещё printf и scanf вы могли вместе объединить в один scanf. :wink:
Maslov в сообщении #259296 писал(а):
Но вообще-то прав arseniiv: с этим лучше на холиварс.ру - всё равно никто ни в чём никого не убедит.
Вот-вот. Я запомниаю, какие темы лучше не трогать прелюдно, а делать всё по-своему :lol:

P.S. Кстати, а что делает функция
Код:
system(char *)
???

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 16:32 
Заслуженный участник


09/08/09
3438
С.Петербург
arseniiv в сообщении #259439 писал(а):
Mathusic в сообщении #259306 писал(а):
Бейте меня. :twisted:
Только за пробелы (вернее, не пробелы).
Ещё за публикацию готовых решений. Всё-таки наш форум ставит своей целью научить спрашивающих решать ту или иную задачу (а вовсе не предоставить участникам возможность продемонстрировать свои способности решать задачи для второго класса). Причём в остальных подфорумах с этим более-менее нормально, а программисты - ну никак не могут удержаться.

arseniiv в сообщении #259439 писал(а):
Кстати, а что делает функция
Код:
system(char *)
???
Исполняет команду операционной системы.

Код:
system("pause");
выводит "Press any key to continue..." и ждёт any key.

 Профиль  
                  
 
 Re: Помогите, пожалуйста решить задачу по с++
Сообщение07.11.2009, 19:18 
Заслуженный участник


19/07/08
1266
ewert в сообщении #259318 писал(а):
Пример: проверить, есть ли среди элементов матрицы хоть один нулевой (что лично мне, например, приходится делать довольно часто). Выскакивание из цикла в этом случае -- вещь, необходимая для повышения эффективности. Но это, между прочим, как раз тот самый случай, когда goto было бы проще и читабельнее.

Так это тот самый случай. Выход из цикла означает что результат получен.
Такая функция с говорящим названием несколько читабельнее чем цикл с комментариями. Впрочем, на вкус и цвет...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group