Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 38) Безжалостные разборки по понятиям :)


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

38) Безжалостные разборки по понятиям :)

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

У многих в решении про уруну проблема с пунктом

надо "взять" две фишки (с учетом пропорции, если N белых и M черных, то с помощью генератора случайных чисел решаем, с вероятностью N/(N+M) это будет белая и M/(N+M) - черная).

В качестве образца - ответ уже знакомой многим Тани

Заинтересовала вот меня задачка про урну=)
Интересная, но не сложная=)
Алгоритм за несколько минут накидала на листочке, потом сделала простенькую программку на паскале:

  var W,B, f1,f2: integer;
    x, wer: real;
  begin
  randomize;
  W:=75;
  B:=150;
  while W+B<>1 do
   begin
    wer:=W/(W+B);
    x:=random;
    if (x>=0) and (x<wer) then f1:=0 else f1:=1;
    x:=random;
    if (x>=wer) and (x<=1) then f2:=1 else f2:=0;
    if (W=1) or (B=1) then begin f1:=1; f2:=0; end;
    if (f1=1) or (f2=1) then B:=B-1;
    if (f1=0) and (f2=0) then begin W:=W-2; B:=B+1; end;
   end;
  if W=1 then writeln( ' white ' );
  if B=1 then writeln( ' black ' );
   readln;
  end.

ответ: Белая=)
Но самое интересное, что по ходу написания программы у меня родилось очень легкое устоное решение этой задачки!=)
Так вот, белых у нас нечетное количество, а вынимаем мы их всегда по две, значит, в конечном итоге останется только одна, ну и сколько-то там черных, а вот одну белую мы извлечь никак не сможем=)
Так что, в уме решить можно и совсем не сложно!=)

Об этом , кстати, многие пишут, вот Катерина например:

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

И Алексей:

Вчера на работе совершенно не собираясь ,неожиданно для себя решил в уме эту задачу.Сейчас проверил на компьютере = все правильно :
Решение лежит на поверхности.Белые уменьшаются сразу на две !
Поэтому при их нечетном количестве рано или поздно остается одна белая фишка,которая "выбивает" из корзины все остальные.
А при четном + белые "самоликвидируются" !

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

Функция random, когда без параметра, выдает случайное дробное в диапазоне от 0 до 1.

Некоторые делали, просто беря фишки без учета их числа, но ведь если 100 черных и одна белая, то вероятность вытащить белую фишку очень мала, она не может быть равной вероятность вытащить черную, причем вероятности эти постоянно плавают в ходе опустошения уруны :)

* Подсказка по представлению денежек. Там достаточно взять последнюю цифру суммы, и все. Зачем вы начинаете строки анализировать, выделять из них символы? До этого мы не добирались пока, вполне можно обойтись тем, что уже изучено! Всегда из этого исходите, предлагаемые задания решаются ТОЛЬКО на базе того, что пройдено!

Для рублей и копеек - последняя цифра числа определяется с помощью нахождения целого остатка от деления на 10:

Rubli MOD 10

("Rubli % 10" в Си).

Другие вопросы.

У меня при проверке выскакивает:
Build: 1 succeeded, 0 failed, 0 skipped,
Я понял, что это фигня, то есть не ошибка,
но всё же скажите в чем моя ошибка?
Евгений

А это не ошибка! Вам дословно так пишется:

"В ходе строительства программы: 1 создана успешно, 0 неудачно, 0 пропущено,"

То есть это сообщение как раз об успехе.

У меня возник вопрос: можно ли сделать так, чтобы кнопка «Пуск» была запрещена до тех пор, пока не введены какие-либо значения?

Кнопку можно делать доступной/недоступной, меняя ее свойство Enabled на true/false.

И еще: в каком месте нужно размещать подпрограмму в BorlandC++?

В Си-программах чем выше в исходном коде, тем лучше :)

В Си есть способ выделения описаний подпрограмм в отдельные файлы (заголовочные называются, с расширением .h), со временем это изучим.

* Ломаю голову над 37 уроком. Все понятно до дополнения функции параметром.
Теперь добавим функции Dice параметр, характеризующий количество граней нашего кубика. Он будет иметь тип Integer - целое число.
Function Dice (Sides: Integer): Integer;
Параметр Sides это же переменная ?. Где же её задать ? В функции или в процедуре ?
Пробовал задать и там и там
Я указываю переменную Sides, что я введу туда данные через Edit1
Компилятор выводит строку " ОШИБКА --- НЕ ДОСТАТОЧНО ФАКТИЧЕСКИХ ПАРАМЕТРОВ"

Sides уже задается самим описанием в параметре:

function Dice(Sides: Integer): Integer;

После такого описания внутри фунцкии сразу можно обращаться к Sides, специально не надо ее описывать.

"Недостаточно параметров" выдается, если вы описали Dice с параметром, а обращаетесь к ней по старому, без параметра:

dice;

а надо

dice(6) например. Это значение 6 занесется в параметр (типа локальной переменной) Sides.

Кстати, в Си++ Visual Studio .NET обнаружились проблемы, оказывается так просто там функции типа Str() преобразования числа в строку не проходят. ЭТо же .NET , я забыл совсем, там ориентация на Бейсик и C#, а вот как с Си++, даже и не знаю. Кто подскажет, как в Visual C++ .NET со строками работать и преобразовывать строка - число ?


Часто спрашивают:

* Все исходники отправлять Татьяне на проверку? или можно так-же Вам?
* Вам присылать их нужно? И нужно ли посылать их Тане в обязательном порядке?

Я уже отвечал :)

Ваши исходники я НЕ проверяю и правильные решения на задания я НЕ знаю.

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

Механизм нашего взаимодействия такой. По каждому заданию вы составляете отчет, в котором в несколько, 5-7 строк, описываете своими словами, что из урока поняли, а что нет. "Оператор присваиваивания - это ...". Если вы не поняли теорию, то я ее обычно стараюсь объяснить в личной переписке, что-то в рассылку влючаю, если сам плохо объяснил, и у многих проблемы появились.

Но практические задания вам надо делать самим. Я не беру на себя ответственность за их правильность :)

Сами пишете код и сами ПРОВЕРЯЕТЕ его с помощью тестов и пошагового отладчика. Если все работает, присылаете исходный код мне, я его или в рассылку включаю, или передаю Тане, а она его публикует на сайте, с комментариями.

Если же не работает, разбирайтесь самостоятельно. Ничего сложного в этом нету, просто надо посидеть подольше, проверить каждую запятую, по шагам разные варианты выполнить, и все получится. Я, что-ли, за вас должен это делать?

Но, еще раз говорю, НЕ НАДО слать мне непроверенный код со словами "вот гляньте, сам не понял, что написал" или "не работает, не пойму никак вроде все правильно".

Ваши исходные тексты я НЕ ПРОВЕРЯЮ! Готовых ответов на задания у меня НЕТУ. Я публикую ваш собственный код и нужен он прежде всего для того, чтобы те, у которых что-то не выходит, могли посмотреть, как это делают другие, и понять, что сами сделали неправильно. Это самое важное в нашем курсе, ВЗАИМОПОМОЩЬ, неужели не понятно!

Впрочем, многие присылают замечательные отчеты, и всем тем, кто помогает нашей рассылке, БЛАГОДАРНОСТЬ :) Это реально ВАЖНО - ваш код, ваши ответы! Я здесь в основном только как координатор :)

Если уж совсем не можете справиться, отсылаете Тане - о ее творчестве кстати самые позитивные отклики приходят.

В каком виде присылать код. Когда мы перешли на графический дизайн, в дополнение к .pas или .cpp файлам (unit.pas) надо также включить файл с расширением .DFM (это описание формы). Это ясно? ДВА файла надо.

Но НЕ НАДО архивировать весь каталог вашего проекта вместе со всеми файлами одним куском и запуливать его на мой почтовый ящик.

Если в вашем архиве будут файлы, отличные от pas/cpp и dfm, я такие письма впредь сразу буду удалять, не читая.

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

Только еще одно - по умолчанию Delphi создает копии редактируемых файлов с расширением, в начале которого стоит знак "тильда", "~". Чтобы этого не было, можно в настройках Tools - Editor Options - вкладка Display - снять флажок "Create backup file". А то некоторые :) присылают мне архивы с файлами типа unit1.~pas :)

Также, иногда приходят письма типе "чё то, я не врубаюсь в переменные, помогите!".

Видимо, принципы обучения на базовом курсе придется ужесточать :) Да, так и делаем. Переходим к безжалостному :) режиму обучения. Потому что те, кто реально занимается и старается, не должны и не будут страдать из-за тех, кто бездельничает и только отнимает время пустыми вопросами.

Если вы что-то явно не понимаете, значит вы что-то неявно не поняли РАНЬШЕ. Если вы не разобрались с переменными, скорее всего вы раньше не поняли типы данных. Если вы не понимаете условный оператор, скорее всего вы плохо разобрались с арифметическими выражениями. Итд.

Вот поэтому я настаиваю на отчетах по занятиям (И по теории И по практике!). Вы изучили тему, после чего коротенько, несколькими фразами описываете, что ВЫ поняли. И добавляете проверенный исходный текст программ. По вашему отчету я определяю, правильно или нет вы поняли. И вы получаете обратную связь.

А если, как уже говорилось, человек занятия просто просматривает, отчеты не пишет и код не делает, считая, что он уже самый умный, то и получается, что в конце концов теория становится без практики неясна. Это-то как раз нормально, так будет всегда - рано или поздно без практики обязательно возникнут неясности!

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

Присылали отчеты, начиная с первого занятия? Нет? Тогда и не пишите мне с жалобами, что не поняли что-то.

Это к тем, кто регулярно код и отчеты присылает, не относится :)
Только к тем, кто вдруг пишет в первый раз и в панике по какому-нибудь двадцатому занятию. Типа, раньше молчал, но больше не могу.

Да, жаловаться также разрешается всем особям женского пола :) Ибо женщины пока-то самые трудолюбивые. А пацаны ноют и ноют. Не стыдно?

СНАЧАЛА начните! По шагам. Не торопясь. И пишите отчеты, начиная с первого занятия. Лень? Времени не было? Да и мне лень вам отвечать, и просто так пообщаться ни малейшего желания не имею, и нету у меня времени на обучение бесплодных - все равно не выйдет ничего с наплевательским отношением. Вот такой у меня в школе принцип будет.
Безжалостный :)

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

Книгами , самоучителями, все завалено. Вот их покупайте и читайте. А хотите заниматься на моем курсе - или занимайтесь по моим правилам, или справляйтесь своими силами, раз такие умные.

Как встретили что-то, что не ясно, так сообщаете в отчете, а я объясняю. Если поняли, пишете, что конкретно поняли, потому что вполне возможно, что вы неправильно поняли :) А с этого все и начинается.

Резюмируем.

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

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

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

Присылаете мне только текст, никаких скриншотов!

На письма с вопросами по курсу от тех, кто отчеты регулярно не присылает, причем строго в указанной выше форме (комментарии по программе и не менее семи результатов тестирования), я больше отвечать НЕ БУДУ. Все. Буду заниматься ТОЛЬКО с теми, кто реально хочет стать Программистом, и готов потрарить на это значительную часть своего времени. О времени, пониже еще будет.

Другое дело, что никто не заставляет вас делать задания в темпе рассылки. Делаете так, как вам удобно. Сделали 5, 15, 25, 35 - прекрасно. Не значит, что надо все свободное время стараться сделать в первые два дня после выхода очередного выпуска, но с никудышным качеством. Не нужны никому плохие отчеты!

Я просто ориентируюсь на самых шустрых (или самых свободных :) , но каждый занимается в удобном для него темпе. Только если с 25 по 35 занятия вы не делали, то и не надо задавать вопросы по 37-му. Разберитесь сначала с предыдущими.


Конечно, программирование - это все же трудно в том плане, что здесь приходится думать (само по себе программирование-кодирование - ерунда, три оператора и все :).

Жизнь наша такова, что думать нас никто и ничто вокруг не стимулирует. Даже наоборот.

То есть не получится , просто читая выпуски, ожидать, что понимание придет само собой. Не придет!


Тесты.

В дополнение к 27 занятию про тестирование - заключительные принципы тестирования:

8. Тестирование повторяем при внесении изменений в программу.
9. Проверять одни и те же места разными дублирующими методами (например, по шагам и набором тестовых значений).
10. Испытывать при граничных значениях параметров. Если разрешено входному параметру принимать значения от 1 до 10, посмотреть обязательно и при 1, и при 10.
11. Проверять на нулевых значениях (нули, пустые строки).
12. Проверять при отсутствии вводимой информации :)
13. Проверять при значениях вне границ, вне области определения (очень важно!).


Меню.

Добавляем меню в нашу программу. С панели Standard берем компонент MainMenu и кидаем на форму в любое место. Этот компонент - так называемый невизуальный, то есть если кнопка как сделана в дизайнере, так и будет выглядеть, то меню - это целый конструктор, который в таком виде, как сейчас (квадратик на форме) в работающей программе не будет виден. Он просто обозначает наличие меню у формы.

На нем надо дважды щелкнуть, и покажется окно, в котором визуально и проектируется наше будущее меню. Изначально окно пустое, клавишами Ins и Del можете добавлять и удалять пункты меню, стрелочками - перемещаться по ним. При этом в инспекторе объектов автоматически показывается текущий выделенный пункт меню, достаточно указать в свойстве Caption название пункта и все.

Чтобы создать подменю, вложенное в уже существующие пункты, надо из локального меню пункта (для него надо ввести уже название какое-то в свойстве Caption) выбрать пункт Create Submenu. Тогда к пункту добавится еще один пункт сбоку. ИТд.

Чтобы создать обработчик выбора пункта меню, надо просто дважды щелкнуть на нем мышкой, и будет автоматически сгенерирован соответствующий код (как для нажатия на кнопку). Все связывание меню с программой и обработчиками выпонится автоматически!


О времени.

Что-то мне катастрофически не хватает 24-и часов в сутках!!!!!!
Ничего не успеваю. Вот и сейчас пишу перед работой. Убегать скоро.....
Лена

Попробую как-то найти время для программирования (а то все на работу и сон уходит!).
Алексей

Как уже писал выше катастрофически не хватает времени, (хотя кто то там говорил, что успевает все делать тот, кто никуда не спешит). Но почему то иногда это утверждение не срабатывает.
Олег

Насчет времени - вот не поленитесь прочитать Гранина:

http://www.omenus.ru/philosophy/time/life.html

Про Любищева, уникальный ученый, разработал систему управления временем, такой своеобразный тайм-менеджмент.


В отдел технического обслуживания позвонила женщина, которая сказала , что не может запустить свой компьютер. "Я все нажимаюна ножную педаль , а ничего не выходит", - сказала она технику .
- На ножную педаль ?
- Да , -ответила она .- Такая маленькая белая ножная педаль .
Этой педалью оказалась мыша.


(c) 2004 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное