Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
 Пособие для студентов и школьников  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19768
Вопрос: Я студент и мне задали задачку. Помогут ли мне на этом форуме ее решить?

Ответ: В принципе, ответ – "Помогут". Но надо правильно подойти к вопросу.


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

Как правило, решить школьную/студенческую задачку для местного специалиста проблемой не является. Именно поэтому, решать он ее не будет. Почему? Потому что спецы сидят здесь не за зарплату, а потому что ему интересно решить какую-то сложную проблему, напрячься, разобрать нюансы, придумать красивый алгоритм, найти непонятно как возникающую ошибку, приобрести новый опыт от других специалистов, которые знают то, чего не знает он. А также потому, что его собственные опыт и знания могут пригодиться тому, кто эти знания хочет получить. Подчеркну – хочет. Это важный момент. Помогать приятно. Делиться знаниями приятно. А выполнять домашнее задание за нерадивого студента, который прогулял лекции, не счел нужным прочитать конспект и не делает никаких попыток разобраться в вопросе – бессмысленно. Специалист потратит время в пустоту, так как студенту это никак на пользу не пойдет.


Так что есть два пути, которыми можно пойти. Выберите один из них.

Путь 1. "Я не знаю, не умею и знать и уметь не хочу".
В этом случае не пишите "прошу помочь сделать задание". Ведь это не соответствует действительности. Помощь подразумевает то, что человек что-то делает, у него что-то не выходит, возможно, ему нужна просто подсказка. Пишите прямо: "сделайте задание за меня", а также озвучьте, как бы вы отблагодарили того, кто это сделает. Тогда всем будет понятно, никто не будет пытаться без пользы давать подсказки, ссылки и т.п. Просто найдется тот, кто сделает. Или не найдется.

Путь 2. "Я хочу разобраться и сделать это задание, и мне нужна помощь".
Этот подход подразумевает, что помимо условия задачи, будут опубликованы реальные попытки автора что-то сделать, конкретные вопросы, по коду, функциям, алгоритмам, а также прочитан материал, который дал преподаватель и/или изучены основы языка, которые даются на первых страницах любого учебника. А на ответы "вам поможет функция Split", вы не будете немедленно задавать вопрос "а что это такое?", а сначала почитаете Help по данной функции или материалы по ее использованию, во множестве доступные в Интернете.

P.S. Если вы учитесь в учебном заведении, вас же никто туда насильно не затаскивал. Вы платите за получение знаний или даже получаете стипендию от государства, так получайте же эти знания, иначе зачем учиться на такой специальности. Можно податься в строители, слесари, швеи, водители. Там никто программирование учить не заставляет. А если пришли учиться именно на такую специальность – будьте любезны соответствовать. Специалисты знают то что они знают потому, что хотели получить эти знания и мы все будем очень сильно расстроены, если из-за тех, кто не хочет учиться сейчас, мы получим в будущем очередной Чернобыль, СШГЭС, падение самолетов и т.п.

P.P.S. Эта статья научит вас эффективно задавать вопросы (если вы, конечно, хотите этого)


Успехов в учебе!
7 апр 12, 21:25    [12381461]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Пособие для студентов и школьников  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19768
Учиться... Учиться? Учиться!
Автор Евгений Матюшкин


Учитесь так, словно вы постоянно ощущаете нехватку своих знаний, и так, словно вы постоянно боитесь растерять свои знания.
Конфуций



Судьбы у людей очень разные. Программисты не исключение. Один в 40 лет стоит во главе преуспевающей компании, а другой в те же 40 лет остается простым разработчиком. Жалуется на возраст, на то, что с более молодыми тягаться непросто. Идти некуда. Жизнь не сложилась. И т.д. и т.п. Думаю, видели не раз. Отчего так происходит? От чего это зависит? Как этого избежать? Четкого ответа нет. Есть лишь некие мысли на тему, пища для размышления. Этими мыслями я и хочу поделиться.

* * *


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

Но факт – он и в Африке факт. Тягаться непросто. А значит – проигрывая в скорости мышления, не знаем тайной тропки. Почему? А вот это уже совсем другой вопрос! Как может получиться, что разработчик в 40 лет знает меньше, чем другой в 30? При том, что работает он существенно дольше. Где грабли? Именно об этом и пойдет речь.

* * *


Представьте себе ситуацию: вам надо что-то сделать, но вы не знаете, как. Как вы поступите – спросите у кого-то или начнете разбираться сами? Как часто вы поступаете первым способом? Как часто вторым?

Большая, если не большая часть тем в форумах по программированию, как правило, сводится к вопросу "как... ?". Как сделать это? Как реализовать это? Как? Как? Как?.. Причем зачастую для ответа на этот вопрос достаточно всего лишь прочитать пару страниц документации. Не нужно ничего сверхъестественного. И тем не менее – вопросы появляются с завидной регулярностью.

Иногда я спрашиваю: а почему вы задаете вопрос? Почему не найдете сами? Ответы самые разнообразные. Однако практически все из них сводятся к одному фундаменту. Приведу один из ответов, наиболее полно описывающий мотивацию вопросов:

А зачем мне копаться самому, если я могу спросить "гуру" и получить ответ гораздо быстрее?


К сожалению, это произнес один из моих коллег. Почему "к сожалению"? Потому что, по моему мнению, эта практика порочна. Чем именно? Читайте дальше.

Вот возник вопрос. Как сделать ...? Копаться и самому искать – долго. Да и лениво, если честно. А тут сидит "гуру". У него можно получить ответ легко и быстро. Дай-ка спрошу?!

Спросил. Действительно, не отрываясь от дела "гуру" выдал решение. То, что нужно. Вопрос. Как я поступлю в следующий раз?

А точно так же. Спрошу у "гуру". Раз, два, десять, сто... Чем больше раз я получу то, что мне нужно, тем больше вероятность того, что в следующий раз я поступлю так же. Чем больше я буду спрашивать, тем больше я буду знать. Хорошо! Хорошо ли?..

Почему "гуру" так легко отвечает на вопросы? Он сталкивался с этими случаями в практике? Совсем не факт. С частью – возможно. В остальных ситуациях – он просто знает принципы, на основании которых делает выводы для частных случаев.

Вопрос. Что буду знать Я, после того, как получу ответ на вопрос? А буду я знать... ответ для одного частного случая. Не более. Разве что мне объяснят и откуда ноги растут, но это, во-первых, может потребовать много времени, а во-вторых – быстро надоест самому "гуру".

Здесь надо поместить картинку. Жаль, у меня такой нет. Холмик свежей земли, воткнутая в него лопата и табличка со стрелкой вниз: "Собака". Ибо тут она и зарыта. До тех пор, пока я задаю вопросы, я знаю только ответы для частных случаев. Иногда я смогу вывести общие принципы, но это скорее исключение, нежели правило. А следовательно – я обречен спрашивать снова.

Ситуация подобна трясине. Чем больше мы спрашиваем, тем больше привыкаем к этому. Чем больше привыкаем, тем больше спрашиваем. Замкнутый круг. И сколько же времени будем спрашивать? Год? Два?.. Десять... А в 40 лет остается только жаловаться. С молодыми тягаться трудно... Жизнь не сложилась...

Что же получается? А получается, что любимая многими практика задавать вопросы – она выигрышна только в очень ближней перспективе. Сэкономили немного времени. А что было бы, если бы попытались искать самостоятельно?

Кажущийся минус – это отняло бы больше времени. Но вот отняло ли? Я бы сказал – заняло. Ибо за время поиска, во-первых, вы получите гарантированно больше информации, нежели задав вопрос "гуру". Просто потому, что до того момента, как вы найдете то, что вам нужно, вам придется прочитать много другого, не относящегося к проблеме напрямую. А, во-вторых, докопавшись, наконец, вы скорее всего найдете именно общий принцип. Знание которого и делает "гуру" – "гуру". И это – существенный плюс. Ибо в следующей сходной ситуации вы уже не будете тратить время на поиск решения. Более того, знание принципов дает возможность успешно применять их в совсем других областях. Это то, что называется "фундаментальность подхода".

Приведу пример такого подхода. В волновой оптике есть закон, если мне не изменяет память, Гюйгенса-Френеля. Он гласит, что при распространении волны каждая точка вторичного фронта является источником волны. Применяя этот, казалось бы, чисто физический закон, можно реализовать алгоритм поиска связной области на изображении, что нужно, скажем, для реализации заливки. Это показательный случай применения в одной области принципа, взятого из другой области.

Итак, в долгосрочной перспективе получается, что искать самому выгоднее. И именно поэтому мне жаль, что кто-то из моих коллег считает иначе. Тем самым он лишает себя возможности стать "гуру". А следовательно – подвергает себя риску наткнуться на проблемы, когда, откровенно говоря, делать что-то будет уже поздно.

* * *


Из любого правила есть исключения. Из того – тоже. Я вовсе не призываю рассчитывать только на себя. Безусловно, "гуру" существуют для того, чтобы к ним обращаться. Только делать это надо с умом. Как я уже показал выше, беготня к "гуру" с любым вопросом может не довести до добра. Однако, безусловно стоит обращаться за помощью в том случае, когда самому заниматься решением проблемы – нерационально. Скажем, когда для решения проблемы требуются знания, получение которых в данный момент займет неоправданно много времени.

Приведу пример. Как и большинство разработчиков я в некоторой степени знаю SQL. Могу спроектировать несложную базу с внешними ключами, каскадными изменениями и т.п. Могу писать несложные запросы. Но любой навороченный update с несколькими условиями, вложенными запросами, упорядочиванием записей и т.п. намного превосходит мои знания в этой области. Безусловно, я могу найти все, что мне надо. Я тешу себя надеждой, что моего интеллекта таки хватит, чтобы разобраться с этими вещами. Но сколько это займет времени? День? Два? Неделю? Весьма вероятно. Учитывая, что я буду идти, фактически, вслепую, ибо не знаю предметной области настолько, чтобы выбрать направление сразу. И, главное, – это все-таки за пределами МОЕЙ предметной области. Я Java-разработчик, с SQL я имею дело постольку-поскольку. И потому – совсем не факт, что мне в будущем понадобятся эти знания настолько, чтобы сейчас потратить кучу времени. Вот это – повод идти к "гуру". Хотя и тут я лично сначала попытаюсь что-то сделать сам. И в любом случае изучу предложенное "гуру" решение, на будущее.

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

Есть также ситуации, когда самому получить знания очень сложно, ибо они происходят из опыта. Классический случай – архитектура приложения. Никто и никогда не скажет, как нужно проектировать, ибо в каждом случае необходимо принимать свое решение. Да, есть такое явление, как шаблоны проектирования. Однако они, во-первых, тоже не панацея, а во-вторых – иногда могут дать и обратный эффект. То, что хорошо в одном случае, может быть плохо в другом. Да и сами шаблоны могут быть реализованы ОЧЕНЬ по-разному. В зависимости от конкретной ситуации необходимо выбрать наиболее подходящее решение. В качестве примера – почитайте статью Реализация шаблона Singleton. Даже такой простой шаблон может быть реализован сильно отличающимися способами. И я еще привел не все способы реализации!

В любом случае, при обращении к "гуру" я бы прежде всего просил показать направление, в котором копать. И только потом, если не получилось – спрашивал бы насчет решения.

* * *


Подведем итоги. Личные достижения в области разработки программного обеспечения, как правило, связаны с уровнем профессионализма. Следовательно, если мы не хотим попасть в ситуацию, когда нас будут обходить более молодые – необходимо набирать опыт. Постоянно. Только так можно быть всегда на шаг впереди и оставаться "гуру". А наиболее рациональный (с прицелом на далекое будущее) способ набирать знания – искать ответы самостоятельно. В разумных пределах, разумеется. Если же затраты на поиски неоправданно велики – стоит обратиться к "гуру". Но и это делать с умом.

Надеюсь, суть мыслей ясна. Выбирает же каждый для себя. Сам. И только он отвечает за конечный результат.

* * *


Напоследок хочу сказать вот о чем. Недавно в одной из тем в форуме мне был задан вопрос – "если ты такой умный, то что ты тут делаешь?". Отвлекаясь от несколько некорректного тона вопроса, я хотел бы все-таки на него ответить.

Основная цель моего присутствия в форуме – отвечать на вопросы. Зачем? Очень просто. Моя текущая работа охватывает далеко не все области. И если я буду ограничиваться только тем, чем занимаюсь с 10 до 19, то во всем остальном безнадежно отстану. А я все-таки хочу быть профессионалом. Форум же хорош тем, что там всплывают вопросы из ОЧЕНЬ разных областей. И КАЖДЫЙ из этих вопросов становится темой для исследования. Почитать документацию. Закопаться в исходный код. Написать несколько тестов. И, даже ответив на вопрос, можно не останавливаться, а поискать еще и вокруг, раз уж все равно коснулся темы.

Хороший пример. Потребовалось кому-то узнать, как получить доступ к определенной точке изображения. В смысле, прочитать значение пикселя. Сначала я выдал несколько способов. Потом понял, что, собственно говоря, человеку НЕ НУЖНО получать значения, у него изначально неверный подход. Объяснил, как стоит подойти к решению его задачи. И тем не менее – на ближайшую неделю закопался в Java 2D Guide. Зато теперь я знаю, что такое цветовые профили, как представляются изображения и много чего другого.

Таким образом, ответ достаточно прост. Я постоянно отвечаю на вопросы в форуме потому, что таким образом узнаю что-то новое для себя. И именно это позволяет мне быть профессионалом и отвечать на вопросы. Круг замкнулся.

То же самое можно сказать и про материалы сайта. Каждая статья приводит к тому, что я начинаю исследования. Ибо в процессе написания неизбежно встают вопросы, о которых не задумывался раньше. И потому – это полезно прежде всего мне. Даже несмотря на то, что внешне это выглядит наоборот.

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

* * *


На этом все. Очень надеюсь, что я заставил многих задуматься. Еще раз повторю: каждый выбирает для себя. И только он отвечает за то, к чему приведет его этот выбор.


================== 8< ====================
(c) Евгений Матюшкин aka Skipy
Статья опубликована с согласия автора.
23 ноя 13, 17:18    [15179108]     Ответить | Цитировать Сообщить модератору
 Re: Пособие для студентов и школьников  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19768
Автор: AndreTM

Посвящается, в основном, незабвенным ЦЭ и BZ.

Наблюдая за попытками сообщества указывать правильное направление некоторым "вопрошающим" (RTFM и Гугл, а не то, о чём вы подумали ), я решил показать, как можно работать над собственным алгоритмом. В качестве примера - задачка про "счастливые билеты". Вспоминается, что эта задача была одной из тех первых, с которых я начал изучать программирование вообще. Хочу заметить, что (а это был 87-й год) никакого разговора при решении не могло идти об ООП (а зачем), фреймворках, или Java, Delphi, C++... Стандартный структурный ЯП - три основных структуры, никаких GoTo, возможно использование подпрограмм. Но это я отвлекаюсь... Итак:
Номер билета состоит из шести десятичных цифр. Таким образом, всего имеется миллион билетов с номерами от 000000 до 999999. Билет называется "счастливым", если сумма первых трех цифр равна сумме трех последних цифр. Например, 128722 - "счастливый", а 490126 - нет. Найти общее количество "счастливых" билетов.

Для простоты картины я взял VBA (естественно, используя в самом алгоритме расчета только структурные возможности). Кстати, даже учитывая интерпретацию, рекомендую запускать тестирование на достаточно медленных машинах (или использовать "многопроходность", т.е. запуск алгоритма несколько раз), иначе разница во времени на современных процах просто не будет заметна. С другой стороны, увеличьте порядок множества (например, возьмите не 6 цифр, а 8) - и увидите, как "притормозится" даже самый супер-пуперный CPU . В тестовом файле - Алг.№12 как раз и реализует такой перебор...

Итак, берем и "разрабатываем" самый простой алгоритм, решающий задачу "в лоб": просто перебираем все возможные варианты номеров, проверяя "счастливость". Замечу, что переменные nIter/nIterZ предназначены для подсчета количества "итераций" циклов, а nSum - суммирует нужный нам результат - количество "счастливых" билетов
+
+ '2 - "Прямой" полный перебор всех 6 цифр

    For z1 = 0 To 9
        For z2 = 0 To 9
            For z3 = 0 To 9
                
                For z4 = 0 To 9
                    For z5 = 0 To 9
                        For z6 = 0 To 9
                            nIter = nIter + 1
                            If z1 + z2 + z3 = z4 + z5 + z6 Then
                                nSum = nSum + 1
                            End If
                        Next
                    Next
                Next
            
            Next
        Next
    Next
В результате получаем nIter=1000000 и nSum=55252. Вот от этого и будем отталкиваться, оптимизируя наш алгоритм.

Что же, для начала заметим, что сумма первых трех цифр постоянно пересчитывается внутри последнего результирующего цикла, хотя она неизменна уже внутри FOR z3. Так что вынесем её за "внутренние" циклы z4-z5-z6
+
+ '3 - Выносим расчет суммы первых трех цифр за "внутренние" циклы

    For z1 = 0 To 9
        For z2 = 0 To 9
            For z3 = 0 To 9
                
                z123 = z1 + z2 + z3
                For z4 = 0 To 9
                    For z5 = 0 To 9
                        For z6 = 0 To 9
                            nIter = nIter + 1
                            If z123 = z4 + z5 + z6 Then
                                nSum = nSum + 1
                            End If
                        Next
                    Next
                Next
            
            Next
        Next
    Next
nIter=1000000 - это понятно, ведь структуру циклов мы не меняли.

Далее можно увидеть, что полный перебор цифр в шестом цикле - излишен. Действительно, если "зафиксированы" первые пять цифр в z1-..-z5, то для совпадения сумм цифр достаточно сразу выставить z6 = z123 - z4 - z5, естественно, убедившись затем, что результат - действительно "цифра"
+
+ '4 - Избавляемся от перебора для шестой цифры

    For z1 = 0 To 9
        For z2 = 0 To 9
            For z3 = 0 To 9
                
                z123 = z1 + z2 + z3
                For z4 = 0 To 9
                    For z5 = 0 To 9
                        'For z6 = 0 To 9
                            nIter = nIter + 1
                            z6 = z123 - z4 - z5
                            If z6 >= 0 And z6 <= 9 Then
                                nSum = nSum + 1
                            End If
                        'Next
                    Next
                Next
            
            Next
        Next
    Next
nIter=100000 - количество итераций уменьшилось на порядок, что сразу же дает выигрыш по времени алгоритма.

Следующие "улучшения" не сразу становятся очевидны, но, если вы действительно разобрались с предыдущим пунктом, то наверняка обратили внимание на следующее: при вычислении z6 мы получали и "нецифровые" значения (<0 и >9), которые затем отбрасывали. С другой стороны, если подумать, то что означает, например z6<0? - то, что z4 и z5 принимали значения, в сумме заведомо дающие больше, чем z123 !. Ну так и избавимся от "лишних" телодвижений циклов, рассчитав заранее пределы для 4 и 5 цифр
+
+ '5 - Ограничиваем перебор для 4 и 5 цифр "сверху"

    For z1 = 0 To 9
        For z2 = 0 To 9
            For z3 = 0 To 9
                
                z123 = z1 + z2 + z3
                z4max = IIf(z123 < 9, z123, 9)
                For z4 = 0 To z4max
                    z5max = z123 - z4
                    z5max = IIf(z5max < 9, z5max, 9)
                    For z5 = 0 To z5max
                            nIter = nIter + 1
                            If z123 - z4 - z5 < 10 Then
                                nSum = nSum + 1
                            End If
                    Next
                Next
            
            Next
        Next
    Next
nIter=77626 - количество итераций еще уменьшилось.

Продолжим предыдущие рассуждения, теперь рассмотрев, что означает z6>9, - это то, что наоборот, z4 и z5 принимали слишком "малые" значения, так что их сумма отличалась от z123 больше, чем на 9. Что же, немного помыслим - и рассчитаем другие пределы. Заодно обращаю внимание, что внутри цикла проверять никакое условие уже не понадобится, поскольку все уже проверено до этого
+
+ '6 - Ограничиваем перебор для 4 и 5 цифр "снизу"

    For z1 = 0 To 9
        For z2 = 0 To 9
            For z3 = 0 To 9
                
                z123 = z1 + z2 + z3
                z4max = IIf(z123 < 9, z123, 9)
                z4min = IIf(z123 > 18, z123 - 18, 0)
                For z4 = z4min To z4max
                    z5max = z123 - z4
                    z5max = IIf(z5max < 9, z5max, 9)
                    z5min = z123 - z4
                    z5min = IIf(z5min > 9, z5min - 9, 0)
                    For z5 = z5min To z5max
                            nIter = nIter + 1
                            'nSum = nSum + 1
                    Next
                Next
            
            Next
        Next
    Next
    nSum = nIter
nIter=55252=nSum. Наконец, мы "упёрлись" в предел для счетчика... Теперь у нас цикл исполняется ровно так, что перебирает только необходимые нам номера. Так что с "чистой" итерацией можно заканчивать.

По идее, далее нужно переходить к анализу и математическим методам (той же комбинаторике и т.п.). НО! Давайте попробуем еще порассуждать, глядя на наш алгоритм, и не залезая пока в дебри теории.
До сих пор мы пытались оптимизировать только "внутренний" набор циклов (z4-z5), позабыв про "внешний". А ведь хорошо видно, что z1-..-z3 нам нужен только для одной цели - сформировать сумму z123. При этом понятно, что эта сумма может принимать только 28 значений - от 0 до 27; другое дело, что мы не знаем "количества" сумм для каждого значения (например, для S=0 сумма будет одна - 000...; для S=1 сумм будет три - 001..., 010..., 100..., и т.д.). Вот только не знаем ли? Если вы поняли смысл пояснения к предыдущему пункту - то наш "внутренний" цикл z4-z5 как раз теперь и исполняется ровно столько раз, сколько имеется определенных "сумм". Так что нам достаточно просчитать количество итераций "внутреннего" цикла для каждого из значений z123=0..27, и просуммировать квадраты этих "количеств". Почему надо возвести в квадрат? - судите сами: например, если "слева" (в первых трех цифрах) сумма=3 встречается 10 раз, и "справа" (в последних трех) - то же самое, то всего комбинаций из этих сумм будет 10*10=102
+
+ '8 - Избавляемся от "внешних" циклов

    For z123 = 0 To 27
     
                nIterZ = 0
                z4max = IIf(z123 < 9, z123, 9)
                z4min = IIf(z123 > 18, z123 - 18, 0)
                For z4 = z4min To z4max
                    z5max = z123 - z4
                    z5max = IIf(z5max < 9, z5max, 9)
                    z5min = z123 - z4
                    z5min = IIf(z5min > 9, z5min - 9, 0)
                    For z5 = z5min To z5max
                            nIterZ = nIterZ + 1
                    Next
                Next
                
        nSum = nSum + nIterZ ^ 2
        nIter = nIter + nIterZ
    Next
nIter=1000 - что же, одним этим шагом мы сразу отыграли время алгоритма почти на два порядка. И если первоначальный алгоритм был O(n2) (1000 вариантов "слева" и 1000 - "справа", 1000*1000 = O(10002), то теперь он уже не то что O(n*ln(n))~6908, а вообще O(n).

Дальнейший анализ еще может показать, что распределение сумм "симметрично", т.е. количество сумм с 0 по 13 соответствует количеству сумм с 27 до 14... Так что можно ещё вдвое уменьшить количество итераций цикла расчетов, а затем удвоить результат.

Ну и примерно как нужно вообще анализировать, а также реализация приведенного алгоритма:
+
+ Пример
...
    For z123 = 0 To 13
        nIter = nIter + 1
        nSum = nSum + T(z123) ^ 2
    Next
    nSum = nSum * 2
...
Function T(ByVal i)
    T = (i + 1) * (i + 2) / 2
    If i > 9 Then
        i = i - 10
        T = T - 3 * (i + 1) * (i + 2) / 2
    End If
End Function
nIter=14. Помнится, первый раз я увидел эту задачку в сборнике городских олимпиад по информатике в Питере, издание вроде 86 года... Там как раз решение было с 14 итерациями

Успехов в изучении!

P.S. Да, и ещё...
Если от вас (студиозусов) требуется программирование в старом формате (VB6, VBA в Офисе до 2003, C, Cpp на уровне до второго курса университета/института - ставьте себе соответстсвующие программные средства. Любой Офис до 2003, любую VisualStudio до 6.0...
В случае же изначального программирования на .Net (Офис, начиная с 2007; VB, начиная с 7; C++, начиная с 8, etc...) - помните, что вы работаете с совершенно другой оболочкой (IDE) и совершенно другой объектной моделью, ибо там уже имеется нормальная реализацмя ООП...

К сообщению приложен файл (Lucky.xls - 63Kb) cкачать
23 ноя 13, 17:23    [15179128]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Пособие для студентов и школьников  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72675
Методичка о том, как составлять ТЗ (на основе ГОСТов):

http://www.studfiles.ru/preview/1504961/
HTML кривоват, там же есть ссылка на красивый pdf.

Очень полезный материал
2 июн 15, 16:59    [17721467]     Ответить | Цитировать Сообщить модератору
Все форумы / Visual Basic Ответить