Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Как создать свой сайт и заработать?" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование с нуля - это совсем просто! 54) Оператор выбора
Информационный Канал Subscribe.Ru |
Программирование с нуля - это совсем просто!54) Оператор выбора
Как много дел считались невозможными, пока они не были осуществлены. Поздравляю весь личный состав рассылки с Днем Советской Армии и Военно-Морского Флота! Вольно :)
"...Военному праздник — что свадьба кобыле: голова в бубенцах, а задница в мыле.
По поводу таймера. Задание немного усложняется. Семь цветных квадратиков надо во первых расположить так: у левого угла крупной надписи (где цвет пишем), над ней, у правого верхнего угла, слева у надписи посередине ее высоты, и справа, и у левого и правого нижнего углов. То есть по периметру надписи. Это надо для того, чтобы глазами шарить пошире, во всех направлениях во время поиска нужного цвета. Во-вторых, цвета в этих семи квадратиках надо менять случайно, на каждом шаге отгадывания - то есть чтобы не было, что в левом верхнем углу всегда красный, в внизу справа - всегда зеленый. А вообще идея этой програмы, если кому интересно, в первом приближении заключается в разгрузке кэша мозга, который постоянно забит всякой дрянью. См. на эту тему "Горе от ума" Евгения Золотова в "Компьютерре" http://www.computerra.ru/think/sentinel/37592/. Широкие движения глазами играют в этом процессе достаточно важную роль :) Перед экзаменами например кэш разгрузить очень полезно! Как написал один из подписчиков: 23 урок прочитал. Про задачу Энштейна. Увы, я решал шаблонно. А то я уже подумал, что гений )))
Двое общаются в чате: Анекдоты у нас сегодня из рассылки "Интернет для Delphi программиста" - полезной очень! Рекомендую. Подписчики мейлару, ищите ее сами :) http://subscribe.ru/catalog/comp.soft.prog.delphiinternet С лямзиками задача оказалась труднее значительно, чем мне показалось вначале. Ну кто решит, хорошо, а кто не решит - сделайте, чтобы программа выдавала хоть-какой то правильный результат.
Рассуждать всегда нужно как в жизни. Какой-то великий математик французский сказал, что дробям можно обучить только с
помощью яблок или пирога :) Анализ двуцветной колонии оформляем в виде отдельной процедуры с циклом while (когда два цвета, они уже всегда будут два или один - то есть два могут быть разные на каждом такте, но трехцветная колония из двухцветной не зародится). Таким образом мы получим как минимум один правильный ответ :) А вот интересно, как долго может продержаться трехцветная колония? Да и может ли она вообще не стать двуцветной дольше, чем за два шага (если спаривать цвета оптом, по минимальной численности одного из цветов)? С другой стороны, если спаривать оптом, это одно. А если по одному на один, лямзику, то будет и другой, третий цвет все же появляется в промежуточных контактах... Да. Сложно. Как бы я делал, если бы мне заплатили :) А знания у меня были бы на уровне 40-го упражнения. Определяем максимально возможное число лямзиков у заказчика. Например, 7. Описываем матрицу 7*7. В первой строке - наши лямзики, в произвольном порядке цветности. Берем из этой первой строки с N (N=7) лямзиками лямзика i и спариваем с одним из последующих лямзиков j - в двойном цикле. Каждый с каждым. Получается соответственно N-1 лямзиков на каждом проходе циклов. Новую комбинацию (без i-го и j-го из предыдущей строки, но с новым, другого цвета) записываем в следующую строку и ее точно так же анализируем, каждого с каждым состыковываем. В 7-й строке у нас останется ровно один лямзик - запоминаем его цвет. То есть делаем полный перебор - 7 двойных вложенных циклов :) . Для 7 лямзиков достаточно быстро должно работать, секунды или минуты наверное. А хочет заказчик больше - пусть нанимает математиков или покупает суперкомпьютер :) Точнее, так - предоставляем заказчику исходный код, где указываем, какое место (размер массива) редактировать в зависимости от реального числа лямзиков. Делать динамически это сложно, потому что массивы, которые мы изучили, должны быть описаны до начала компиляции. Существуют различные методы обхода этого, динамическое распределение памяти - на будущее. Есть также другой фундаментальный принцип, рекурсия так называемая, которую Таня решила использовать. С помощью рекурсии, собственно, можно практически любую задачу решить без циклов. Этот принцип управления логикой даже мощнее, чем циклы и условия, есть и языки, в которых все построено только на рекурсии (Лисп например). В искусственном интеллекте используются активно. В данном случае рекурсия подходит лучше всего безусловно. Да, наверно, в базовый курс ее надо будет включить. А Тане - очередные благодарности. Задачи решаю медленно, консультируюсь с Таней, за это огромное ей спасибо. Хочу также присоединиться к Олегу с выражением благодарности Тане, причём не только за то, что она взяла на себя труд разбираться в наших заморочках (а вникать в чужой код, на мой взгляд, раз в 10 труднее, чем с нуля написать собственный), за советы по оптимизации кода (можно сделать проще - гораздо ценнее, чем банальное выискивание ошибок, которые, в принципе, можно найти и самому), но и за то, что не отказывается вести разговор, пусть и касающийся программирования, но не относящийся непосредственно к тематике заданий.
У Тани дизайн обновлен, переделан, добавлены очень полезные разделы "Ссылки" и "Литература". Также, если у вас есть интересные ссылки на сайты по программированию, перекликающиеся по тематике с нами, присылайте их Тане и Александру на ящик AlexTRoy2005@yandex.ru. Для начала, вот несколько предложенных Александром ссылок:
http://gremlin.h12.ru/coding/pd/pdu.html - сайт, на котором можно
найти книги по Паскалю и по Delphi. Особенно мне понравилась книга
"22 урока на Паскале". А на легендарном (культовом :) сайте "Королевство Дельфи" http://www.delphikingdom.ru/ опубликована статья "Обход дерева каталогов с прерыванием и возобновлением или "Куда мы идем завтра?" Павла Звягинцева, одного из наших подписчиков: http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1097 * Что будет после базового курса? "Незаменимых людей нет" - любил поговаривать директор. Все боялись - и только один программист не мог спрятать кривую улыбку... Это действительно так. Мой хороший знакомый, в банке работает, рассказал, как у них проходит очередное сокращение. Сокращают все отделы, кроме программистов :) Программистов - набирают :) С учетом того, что Россия стремительно стареет, качество образования падает, спрос на программистов и зарплата будут только расти. В декабре я писал статью "Как я искал работу программиста", разместил выдуманное несложное резюме на джоб.ру, так мне пришло восемь предложений, и уже на втором я договорился на зарплату 1600 долларов :) И остальные предложения просто стер :) При этом в списке навыков я придумал самые простые - три года практики на C++ и базы данных, Microsoft SQL Server. Что касается послебазовой рассылки, то что-то будет точно :) Направлений много, но все их реализовать ресурсов у меня нету, буду думать, что самое оптимальное (для меня :). С одной стороны, можно сориентироваться на изучение наиболее востребованного набора умений, чтобы быстро устроиться на хорошую зарплату. Но мне это неинтересно, да еще и бесплатно об этом рассказывать - скучно :) С другой стороны, абстрактные вещи какие-то малополезны в практическом плане. В общем, буду думать, какая тема разовьет лично меня лучше всего. А заодно - и подписчиков :) Точно однако будет, для тех, кто захочет начать базовый курс после того, когда он закончится (а это уже скоро), любые консультации по базовому курсу будут только платные! В ходе переписки Андрей прислал дополнение к мифам, которое я опубликую после базового курса. Хочется дополнить
Вывод 11: Нет подходящих для твоей работы программ? Не ищи - пиши свои! Вот как раз Программист на мой взгляд - тот, который не наемный на должность "программист", кодирующий то, что скажут (а самому ему без разницы - отсюда и начинается равнодушие и низкое качество), а тот, кто сам применяет знания программирования к любимой области деятельности (к компьютерам в идеале отношения не имеющей)! Это и будет Правильный Программист :)
Некоторые, кстати, обрадовались идее и проектам свободно доступных и распространяемых программ, и хотят участвовать. Знаете, почему эта идея показалась заманчивой? Потому что поучаствовать в коммерческих проектах или продавать собственные творения сложнее и ответственность гораздо выше. Но мы не ищем легких путей!
* Я только начал изучать курс, и у меня возникла проблема: Окошко такое, CPU, с кучей странного кода. Вы сами можете его увидеть, когда запустите любую форму из Дельфи, затем в саму оболочку переключитесь и команду Run - Program Pause выполните. В принципе Pause предназначена для приостановки, если где-то в прикладном коде программа зациклилась, и надо ее прервать. Если же программа не выполняет непосредственно код, который программист в редакторе набрал, то она находится в состоянии ожидания (idle), ожидая от Windows сообщений. Вот в этот внутренний режим ожидания вы и попали, в пошаговый отладчик, но так как вашего кода (на Паскале) там нету, то Дельфи, умная среда, показывает команды процессора (код на ассемблере). Собственно, текст на Паскале вот в такой машинный код и переводится.
* после нескольких стартов подряд программа начала вылететь с аналогичным
сообщением "First chance exception at $004034E8. Exception class
EAccessViolation with message Access violation at address 00403E9A in
module PROJECT1.EXE. Read of address FFFFFFFB. Process Project1.exe При подготовке упражнений лучше так настроить свойства проекта: Project - Options - Compiler - обязательно поставить все флажки на поля в разделе Runtime errors, и Debugging. Это позволит отлавливать кучу ошибок, на которые другим способом много сил уйдет. В частности, Range check очень полезный, следит за неверным обращением к массиву, если индекс вышел за его границы. Вот в Си такого нету :) и там это типичная и трудно находимая ошибка. А в Дельфи сразу вам покажут, где нарушение. * У меня есть один вопрос. Можно-ли в массив запихнуть компоненты? Например, мне нужно сделать прогу, которая была бы многоязычная. В одном массиве я бы держал строки, а в другом - компоненты, лежащие на форме. Так я с помощью цикла мог бы компоненту присвоить новый Caption, который записан в массив со строками, под тем-же индексом. Можно так сделать? Или у меня глупые фантазии? :) Вопрос совершенно правильный :) Да и фантазии глупыми не бывают - на то ведь они и фантазии :) Я сам так делаю, когда много однотипных компонентов. Но для перевода массив компонентов не нужен. Просто выносите все текстовые константы в одно место файла:
const STR_PRIVET = ' Привет! ' ;
в обработчике создания формы присваиваете эти константы: Label1.Caption := STR_PRIVET; и держите копию этого кода, где константы описаны, на разных языках. При необходимости просто заменяете один на другой:
const STR_PRIVET = ' Hello! ' ;
Есть так называемые препроцессорные директивы, позволяющие этот процесс автоматизировать, со временем до них доберемся.
* Мы объявлем дробную в делфи как
real, а вот
преобразование его в строку почему то используется FloatToStr, ну а для строки в дробное STrToFloat, ну и я в
свою очередь,
по своей глупости объявил, переменную как float, хотя помнил, что это вроде из Basica, ну и понятное дело,
компилятор
ругался. Зато благодаря этому я начал смотреть help(Так как английским я владею очень неплохо хоть почти
самоучка, в
благодарность автору данной рассылки согласен переводить статьи абсолютно бесплатно, для базового курса, если
есть
интересные статьи на английском, для подписчиов базового курса а самому переводить их вам лень) делфи,
проверить как
все таки объявляются дробные переменные. Так, что и в этом был свой плюс. Да, в Дельфи почему-то функция FloatToStr(), а вот тип Real, я и сам не замечал! Надо же... Это наверно потому, что библиотеки обычно на Си пишутся, а там дробные - float. Насчет предложения перевода, спасибо за предложение! Но я как-то не очень люблю эксплуатировать чужое чувство благодарности :) Лучше сделайте что-то хорошее вашим окружающим - пусть это и будет маленькой платой :) Только сделайте обязательно! Это кстати ко всем относится! А то ведь многие, знаю очень хорошо, выучились программированию по нашей рассылке очень прилично, но даже одно слово благодарности не хотят написать, молчат как индюки и все. Но индюков и тюленей я прощаю :) В честь праздника! Насчет прощения. Последний фильм с Джеки Чаном, "Новая полицейская история", удивил своей необычной добротой. Как правило, плохишей в боевиках настигает ужасная месть :) а тут нехорошие товарищи вели себя просто зверски, но... * Когда я вводил значения к примеру 5.5 или 66.2 компилятор все время ругался. И я никак не мог понять причину, пока не догадлся вместо точки ставить запятую, а вы нас учили что запятые ставить нельзя, надо точки (хоть может я что-то пропустил). По поводу точек и запятых, точка - всегда разделитель в тексте программы (в тексте кода на Паскале или Си). Но после того, как исходный код переведен компилятором в исполнимый exe-файл, тот уже, как и любая прикладная программа, работает в соответствии с региональными настройками Windows - в русской версии по умолчанию считается, что в поля для чисел мы вводим именно запятую как разделитель. При желании это можно изменить через панель управления. * Часто спрашивают про "модуль числа"- что это такое. Модуль, abs() - это всего лишь выделение положительной части числа. То есть abs( +7 ) будет 7, и abs( -7 ) будет 7. Точнее, +7 в каждом случае. * Как узнать, перегружен ли таймер? Например, так (для XP) - жмете Ctrl + Alt +Del, вызывая диспетчер задач, и сворачиваете его. Если квадратик темно-зеленый, значит, процессор не нагружен. Если весь светло-салатовый - значит, процессор занят счетом. В любом случае надо, чтобы во время работы программы, которая постоянно что-то делает (по таймеру например), не было 100%-й перегрузки процессора. Вот такая проблема была у Лены: * Совсем ерунда получалась когда надо было цвет слова с образцом цвета сравнить. Не совпадают и всё тут. Я всё правильно жму, а он не хочет совпадать. Вывела на экран эти значения, чтоб хоть видно было какие числа выпадают. Во время работы таймера всё нормально, всё сходится, а в обработчике нажатия кнопки мыши ерунда происходит. В одном месте "х"(это цвет слова) одно значение, а в обработчике другое. Хорошо "караул" раньше времени кричать не стала. Посмотрела повнимательней, ведь в обработчике нажатия "х" это одна из координат!!!!!!! Вот и получалась ерунда, а я голову сломала, откуда двузначные числа берутся????!!!! Короче изменила "х" на "х1" и 1:0 в мою пользу! Да, это отличие между локальными и глобальными переменными. Если x определен вне любой подпрограммы (или например, в описании класса), а в подпрограмме он дополнительно объявлен как локальная в подпрограмме переменная, или параметр, то в Паскале всегда считается, что мы работаем с наиболее локальным вариантом паременной!
var x: Integer; или:
var x: Integer; Вот поэтому глобальные переменные вредны - могут возникать подобные накладки. Как минимум, желательно аккуратно разделять названия переменных, простые i,j,x,y использовать как локальные только, в виде счетчиков циклов, промежуточных расчетных значений итп. * Важное свойство плеера Wait - где взять? Если указать
MediaPlayer.Wait := true; то при выполнении MediaPlayer.Play программа остановится и будет ждать окончания воспроизведения файла с музыкой. Если же
MediaPlayer.Wait := false; то MediaPlayer.Play выполнится моментально, и программа пойдет дальше, а музыка уже будет играться в фоне, на фоне работы программы.
* Что будет, если применить or или and, предназначенные для логических данных, к целым числам?
если пишешь (abs(10 and 19)); то ответ 2 а при вводе нескольких чисел, ответ всегда 0.
я ещё понимаю (ближе к этой логике) что у чисел 10 и 1 абсолютное число будет 5 или 6, но у этого модуля, совсем
другая природа логики, которую я никак понять не могу, а это очень тормозит меня. Or и and к числам применять на самом деле можно :) Но я об этом никогда вроде не писал. or / and нужны прежде всего для работы с логическими величинами, тип Boolean, true/false. А при работе с числами здесь начинает работать так называемая двоичная логика. То есть сначала каждое число представляется в так называемом двоичном виде, а затем уже над ними выполняются действия or/and. Результат я даже затрудняюсь сказать :) Например если взять 10 и 19, - 10= 1010 (01010) в двоичной записи, 19 = 10011.
01010 and (1 and 0 = 0; 1 and 1 = 1)
* при переводе в доллары приходиться ответу присваивать тип Real => число отображается не так, как хотелось бы. Можно ли это исправить? Например, чтобы программа округляла ответ.
* Программа указала на ошибку в строке Tria:=Tria Round 9; round - это не операция типа +-*/ а функция. Ее надо указывать с параметром, она рассчитывает округленное целое значение. x := round( 3.33 ); в x запишется 3. x := round( 3.53 ); в x запишется 4. А вот mod надо использовать как символы + или - . Это просто такая запись, буквами, операции нахождения остатка. Аналоги +/- , которые так записываются и которые мы изучаем, только mod и div , остальные все как round() - функции с параметрами. mod - это целый остаток от деления. 100 mod 3 = 1 : 100/33 = 33 и 1 в остатке (33*3 = 99, 99 + 1(остаток) = 100). 100 mod 15 = 10 : 100/15 = 6 и 10 в остатке (15*6=90, 90+10(остаток) = 100) Остаток всегда должен быть меньше делителя. mod - в приниципе, это достаточно близко к операциям логического сдвига :) Да и в микрокалькуляторе МК, по-моему, была такая операция.
div - это определение целой части результата, дополнение mod. Вопросы от Артема: 1)Есть ли существенные отличия Object Pascal от Delphi? Object Pascal фактически то же самое, что Delphi, просто переименовали один язык в другой. Для единообразия :) * Можно использовать матрицу чтобы сделать игру "Сапёр". Складывание окружающих элементов можно представить как количество мин вокруг открытой клетки. Безусловно, и для Сапера и для любых двумерных игр, там матрицы - основа. Хранят ситуацию на игровой доске. 2)TrackBar, ProgressBar, Animate, Timer, Chart, Календарь, базы данных будут ли рассматриваться? По-моему это важно при изучении программирования. ProgressBar вроде был рассмотрен? И про Trackbar я упоминал, да и про Animate, по-моему. Базы данных, да, после базового курса, надеюсь. Выпадающий список, это ComboBox на Standard, стрелочками можно вводить значения в SpinEdit на панели Samples. На ней же есть и компонент Calendar. Сами разберетесь? ComboBox - как и ListBox, только элементы в нем показываются скрыто, сам список надо раскрыть. Его вид и способ показа задаются в свойстве Style. SpinEdit предназначен для ввода только целых числовых значений. Можно указывать минимально и максимально допустимые значения, MinValue, MaxValue, а также шаг увеличения при щелчке на стрелках - Increment.
procedure sMess(s:string);/// это я вставил в описание класса вручную
и вызываю, ошибка выдается:
procedure TForm1.Button1Click(Sender: TObject);
Ошибка выдается, потому что вы описали эту процедуру с параметром s, а вызываете без параметра. Вам пишется - не все параметры указаны.
* для того чтобы задать случайное, вернее псевдослучайное,
(rand()%6)+1;
А чтобы задать случайное от 1 до 6, надо уже использовать
#include <time.h> Имеется в виду, чтобы не повторялась одна и та же последовательность каждый раз. * Сейчас прикрепляла файлы .pas и .dfm и решила проверить как они работают(файлы). Если открыть .pas, то форма цепляется. А на исполнение она не запускается. Как вы-то это делаете? Да, конечно надо еще добавлять .dpr - файл, главный файл проекта. Это делается с помощью менеджера проектов, в последнем занятии о нем рассказывалось. Просто удалить форму Unit1, созданную по умолчанию, из проекта Project1, и вставить чужую (команда-кнопка Add). Просьба ко всем, кто прислыает примеры, и этот файл тоже включать.
* Как сделать программу независимой от местонахождения файла
Можно здесь указывать не абсолютный, а относительный адрес файла, относительно места запуска программы:
Memo1.Lines.LoadFromFile( '001.txt' ); тогда файл 001.txt будет искаться в том же каталоге, откуда программа пускается, когда у пользователя установлена. Это относится и ко всем другим операциям с файлами, где их имена используются!
Оператор выбора. Из нового, рассмотрим оператор выбора, удобное расширение условного оператора. Писать длинные цепочки типа
if x=1 then ... else не очень удобно, можно воспользоваться аналогом этой конструкции - оператором выбора. Записывается он так:
case выражение of
вариант-ответа: действие ;
end; Выражение - любое выражение Паскаля, значение которого - либо целое число, либо символ (тип Char). Вариант-ответа - одно из таких значений выражения. Действие - выполняется, если значение выражения равно данному варианту. Например,
n := 2; В данном случае выполнится команда write('n равно 3'), так как значение n+1 будет равно 3. Важно! После выполнения write('n равно 3') команда write('n равно 5'), предназначенная для другого условия, не выполняется! Эта форма записи эквивалентна такой:
n := 2; Отсюда понятно, почему выполняется только одна команда, а не все, следующие за ней. Если в каком-то условии надо выполнить две или более команд, их надо взять в "скобки" begin / end:
n := 2;
2: begin
3: write( ' n равно 3 ' );
5: begin
end; Каждый из вариантов-ответа может быть не только одним числом, но и перечисленным через запятую набором чисел:
case x of xxx напечатается, если x равен 2, 3 или 4. zzz - если 12 или 40. Нередко бывает, когда что-то надо сделать, если ни один из указанных вариантов не подошел. Тогда можно добавить ключевое слово else:
case x of
2,3,4: write( ' xxx ' );
12,40: write( ' zzz ' );
else write( ' ничего не подошло ' )
end; Группировать значения в варианте ответа можно не только через запятую, но и указывая диапазоны значений, как при объявлении диапазонов значений в массивах (начальное значение .. конечное значение). Их тоже можно указывать через запятые.
case T*2 of
5, 11..99, 201..500, 0, 138:
end;
Если однажды ты пpидя домой не сможешь войти в системy с админскими пpавами - значит дети yж выpосли... На прощание - присланная Виктором сказка.
Жил был молодец. (c) 2004-2005 Сергей Бобровский bobrovsky@russianenterprisesolutions.com
Школа программирования с нуля
|
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.prog.prognull |
Отписаться |
В избранное | ||