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

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


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

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

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

36) Моделируем уруну

[ написал заголовок с опечаткой и не стал исправлять - так загадочнее :) ]

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

В результате код набран, в обработчике задается скопированный из рассылки оператор, затем программа компилируется, запускается, сразу, бездумно, нажимается кнопка - и естественно, что программа вылетает с ошибкой типа "Edit1 is not a valid integer value".

Голова-то для чего? :) Чтоб ею рассылку читать?

В задании было сказано ясно - "Запускаете, указываете сумму, жмете кнопку и получаете результат.". Указали вы курс - целое число - после запуска программы?

Говорилось уже, что после установки элемента на форму в дизайнере он получает начальное значение, которое обычно совпадает с его названием. Так, поле-надпись Label в главном своем свойстве Caption получит название Label1. Еще одно такое поле добавить - оно получит значение Label2. Кнопка Button обзовется Button1. Поле ввода Edit в главном своем свойстве Text получит значение Edit1.

Что происходит после нажатия на кнопку? Команда StrToInt( Edit1.Text ) преобразовывает строку из Edit1.Text в целое число. Но если вы не указали в Edit1 число, если там старая строка (по умолчанию которая) - "Edit1", как же она преобразуется в число? Вот и сообщается, что Edit1 не является, целым числом.

Между прочим, эту ошибку не сделал ни один из тех, кто регулярно пишет отчеты.

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

* В Си для целочисленного деления (int деленное на int) воспользуйтесь обычной операцией деления "/" (аналог Div в Дельфи), она также даст значение типа int, целую часть дроби.

* Не знаете, можно ли где-нибудь взять русификатор к компилятору C++ Builder или хотя бы русский хэлп к нему.
Владимир

Русификатора нет, насколько я знаю. В качестве хелпа - книжек по нему много :)

Вот этот сайт хороший например: http://www.buildercpp.net.ru/

* Мне все-таки немного жалко оператор GOTO, с его помощью можно было бы от пары IF избавится. Но нельзя, так нельзя….
Екатерина

Без goto поначалу трудновато действительно (хотя для выхода из нескольких вложеных циклов допустимо; но все равно ни в Java, ни в C# - goto уже нету :), но на больших объемах кода это все окупается!

* Кроме того, условные операторы IF лучше друг в друга сильно не вкладывать. Достаточно двух уровней вложений

ЕСЛИ ... ТО
  ЕСЛИ ... ТО

Глубже не надо, усложняется понимание программы, а любой алгоритм можно привести к виду вообще без вложенных условий.

* Если вы хотите вывести несколько строк в одном поле друг за другом.

Можно так:

  label1.caption := label1.caption + ^M + ' новый текст ' ;

Тогда новый текст на новой строчке покажется, ^M - это типа переход на новую строчку. Только надо поле надписи сделать побольше и в длину, и в ширину, и свойство wordwrap указать равным true (выравнивание слов).

Вопросов много еще разных, ну как будет возможность, так опубликую постепенно. Вот посмотрите, кстати, как красиво Наталья оформила программу поиска ответа корней в GUI:

http://russianenterprisesolutions.com/sbo/im/nata.gif

Пацаны до такого обычно не докатывают :)

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


Важно! Таня, слава ей, :) сделала подборку ваших вариантов решений 8-12 задания на сайте

begin.polubomu.ru :)

Запомните этот адрес как следует! :)

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

А самое главное, что Таня и комментарии оставляет к вашему коду! Так что, все туда! :)


Сегодня будут очередные задания. Главное из них продемонстрирует одну удобную функцию программирования при решении сложных задач.

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

Вот пример (задание 17). Из статьи "Математические развлечения в Сети" (Константин Кноп, "Компьютерра" №43 от 16 ноября 2004 года).

http://offline.computerra.ru/2004/567/36684/

Кстати, статья сама по себе замечательная (у Кнопа все такие :)

Ежемесячный конкурс университета Хемлайн
www.hamline.edu/~math/aguetter/pom/prob_of_month.html
По моим наблюдениям, авторы этого конкурса специально делают его с креном в сторону развлекательных задач и математических головоломок. Вот, например, первая из двух октябрьских задач:
Сузи, только что поступившую в университет Хемлайн, попросили помочь разобраться с урной, в которой находились 75 белых и 150 черных фишек. Сузи должна доставать фишки из корзины по две, и если хотя бы одна из двух взятых ею фишек черная, то ее она оставляет себе, но другая фишка немедленно должна быть возвращена в корзину. Если же обе взятые фишки белые, то они остаются у Сузи, однако взамен она должна положить в корзину одну черную фишку (для этого у нее имеется необходимый запас черных фишек). Так Сузи поступает до тех пор, пока в корзине не останется только одна фишка. Какого цвета она будет?

Эту задачу будем решать с помощью компьютера. Как ее решить в уме? Не представляю (может конечно, это я просто такой тупой :). Подозреваю, что можно найти ответ путем логических рассуждений, но я даже пробовать не стал, потому что есть (для меня) путь проще.

Можно просто смоделировать процесс - опишем в программе урну с фишками, и саму Сузи как действие по изъятию фишек. Это задание N 17 - сделайте его сами.

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

Так выполняем такты моделирования, пока в урне не останется одна фишка. Смотрим, какая она, и сообщаем :)

Самому интересно, какая :) Жду с нетерпением ваших решений (с исходными текстами!). Можете также попробовать решить в уме, а потом сравнить его с временем, затраченным на подготовку кода для решения.

Еще одно оригинальное (классическое вообще-то) задание N 18. Поменять местами значения двух переменных, не используя третью переменную. То есть есть две переменные x и y, если можно еще одну переменную z задействовать, то обмен значениями так будет выглядеть:

z := x;
x := y;
y := z;

А если надо только x и y обойтись, без z, как тогда быть?

И еще :) . N 19 будет. В переменных R и K хранится сумма в рублях и копейках. Надо выводить эту сумму, дополняя словами "рублей", "копеек" итд. То есть:

R=1 K=0 - должн быть напечатано "1 рубль 0 копеек"
R=3 K=62 - должн быть напечатано "3 рубля 62 копейки"
R=129 K=91 - должн быть напечатано "129 рублей 91 копейка"


(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
Отписаться

В избранное