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

Программирование с нуля - это совсем просто! 54) Оператор выбора


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

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

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

54) Оператор выбора

Как много дел считались невозможными, пока они не были осуществлены.
Плиний Старший

Товарищи Подписчики!
Поздравляю весь личный состав рассылки с Днем Советской Армии и Военно-Морского Флота!

Вольно :)

"...Военному праздник — что свадьба кобыле: голова в бубенцах, а задница в мыле.
Маленькая Пахмутова, предусмотрительно одетая в брюки, спустилась по трапу в центральный пост новенького атомохода довольно ловко. Высокий Добронравов немного застопорился, но тоже умудрился спуститься живым..."
Продолжение байки - на http://economics.pravda.ru/economics/2005/7/23/333/19166_PODLODKA.html


По поводу таймера. Задание немного усложняется. Семь цветных квадратиков надо во первых расположить так: у левого угла крупной надписи (где цвет пишем), над ней, у правого верхнего угла, слева у надписи посередине ее высоты, и справа, и у левого и правого нижнего углов. То есть по периметру надписи.

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

А вообще идея этой програмы, если кому интересно, в первом приближении заключается в разгрузке кэша мозга, который постоянно забит всякой дрянью. См. на эту тему "Горе от ума" Евгения Золотова в "Компьютерре" http://www.computerra.ru/think/sentinel/37592/.

Широкие движения глазами играют в этом процессе достаточно важную роль :)

Перед экзаменами например кэш разгрузить очень полезно!

Как написал один из подписчиков:

23 урок прочитал. Про задачу Энштейна. Увы, я решал шаблонно. А то я уже подумал, что гений )))


Двое общаются в чате:
Он:
- Ты, наверное, очень красивая.
Она:
- (кокетливо) Почему ты так думаешь?
Он:
- Только так природа могла компенсировать такую тупость.

Анекдоты у нас сегодня из рассылки "Интернет для Delphi программиста" - полезной очень! Рекомендую. Подписчики мейлару, ищите ее сами :)

http://subscribe.ru/catalog/comp.soft.prog.delphiinternet

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

Рассуждать всегда нужно как в жизни. Какой-то великий математик французский сказал, что дробям можно обучить только с помощью яблок или пирога :)
Я вот так предлагаю - сводим три цвета сначала к двум, и там уже все просто. А вначале берем лямзиков, которых меньше всего, и спариваем с самыми многочисленными лямзиками. Например - Зел 10, Син 6, Красн 8. Берем все синие и 10 зеленых, получаем на выходе 6 (+8 уже существующих=14) красных, и 4 оставшихся зеленых.
Вроде не ошибся :)

Анализ двуцветной колонии оформляем в виде отдельной процедуры с циклом while (когда два цвета, они уже всегда будут два или один - то есть два могут быть разные на каждом такте, но трехцветная колония из двухцветной не зародится).

Таким образом мы получим как минимум один правильный ответ :)

А вот интересно, как долго может продержаться трехцветная колония? Да и может ли она вообще не стать двуцветной дольше, чем за два шага (если спаривать цвета оптом, по минимальной численности одного из цветов)?

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

Да. Сложно.

Как бы я делал, если бы мне заплатили :) А знания у меня были бы на уровне 40-го упражнения. Определяем максимально возможное число лямзиков у заказчика. Например, 7. Описываем матрицу 7*7. В первой строке - наши лямзики, в произвольном порядке цветности.

Берем из этой первой строки с N (N=7) лямзиками лямзика i и спариваем с одним из последующих лямзиков j - в двойном цикле. Каждый с каждым.

Получается соответственно N-1 лямзиков на каждом проходе циклов. Новую комбинацию (без i-го и j-го из предыдущей строки, но с новым, другого цвета) записываем в следующую строку и ее точно так же анализируем, каждого с каждым состыковываем. В 7-й строке у нас останется ровно один лямзик - запоминаем его цвет.

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

Точнее, так - предоставляем заказчику исходный код, где указываем, какое место (размер массива) редактировать в зависимости от реального числа лямзиков. Делать динамически это сложно, потому что массивы, которые мы изучили, должны быть описаны до начала компиляции. Существуют различные методы обхода этого, динамическое распределение памяти - на будущее.

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

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


А Тане - очередные благодарности.

Задачи решаю медленно, консультируюсь с Таней, за это огромное ей спасибо.

Хочу также присоединиться к Олегу с выражением благодарности Тане, причём не только за то, что она взяла на себя труд разбираться в наших заморочках (а вникать в чужой код, на мой взгляд, раз в 10 труднее, чем с нуля написать собственный), за советы по оптимизации кода (можно сделать проще - гораздо ценнее, чем банальное выискивание ошибок, которые, в принципе, можно найти и самому), но и за то, что не отказывается вести разговор, пусть и касающийся программирования, но не относящийся непосредственно к тематике заданий.

У Тани дизайн обновлен, переделан, добавлены очень полезные разделы "Ссылки" и "Литература".
http://begin.polubomu.ru/

Также, если у вас есть интересные ссылки на сайты по программированию, перекликающиеся по тематике с нами, присылайте их Тане и Александру на ящик AlexTRoy2005@yandex.ru.

Для начала, вот несколько предложенных Александром ссылок:

http://gremlin.h12.ru/coding/pd/pdu.html - сайт, на котором можно найти книги по Паскалю и по Delphi. Особенно мне понравилась книга "22 урока на Паскале".
http://www.exler.ru/novels/wife.htm - может быть вы уже читали этот рассказ, но все-же. Называется "Записки невесты программиста" . В нем около 200 страниц. Я за сегодня прочитал 50.

А на легендарном (культовом :) сайте "Королевство Дельфи" http://www.delphikingdom.ru/ опубликована статья "Обход дерева каталогов с прерыванием и возобновлением или "Куда мы идем завтра?" Павла Звягинцева, одного из наших подписчиков:

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1097

* Что будет после базового курса?

"Незаменимых людей нет" - любил поговаривать директор. Все боялись - и только один программист не мог спрятать кривую улыбку...

Это действительно так. Мой хороший знакомый, в банке работает, рассказал, как у них проходит очередное сокращение. Сокращают все отделы, кроме программистов :) Программистов - набирают :)

С учетом того, что Россия стремительно стареет, качество образования падает, спрос на программистов и зарплата будут только расти. В декабре я писал статью "Как я искал работу программиста", разместил выдуманное несложное резюме на джоб.ру, так мне пришло восемь предложений, и уже на втором я договорился на зарплату 1600 долларов :) И остальные предложения просто стер :) При этом в списке навыков я придумал самые простые - три года практики на C++ и базы данных, Microsoft SQL Server.

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

С другой стороны, абстрактные вещи какие-то малополезны в практическом плане.

В общем, буду думать, какая тема разовьет лично меня лучше всего. А заодно - и подписчиков :)

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


В ходе переписки Андрей прислал дополнение к мифам, которое я опубликую после базового курса. Хочется дополнить

Вывод 11: Нет подходящих для твоей работы программ? Не ищи - пиши свои!
Что ж, программистом я так и не стал. Да и не стремился к этому. Мне нравится медицина и свою работу я не променяю ни на какую другую. Но всё же каждый вечер мне хочется открыть UltraEdit и набрать #include... Что ж, в этом удовольствии я себе не отказываю.

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

Некоторые, кстати, обрадовались идее и проектам свободно доступных и распространяемых программ, и хотят участвовать. Знаете, почему эта идея показалась заманчивой? Потому что поучаствовать в коммерческих проектах или продавать собственные творения сложнее и ответственность гораздо выше. Но мы не ищем легких путей!
Мы ищем простые пути :) И правильные :)


* Я только начал изучать курс, и у меня возникла проблема:
В Delphi7 после остановки (Pause) любой запущенной программы (даже пустой) вылазит вот это окошко (во вложении) а если его закрыть исчезает окошко "Form".

Окошко такое, 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;
  ...
  x := 1;
  ...
  procedure A;
  var x: Integer; // это новая переменная x, локальная, только в
  пределах A "видна"!
  begin
  x := 5; // x-локальный! глобальная переменная x здесь не
  затрагивается!
  end;

или:

  var x: Integer;
  ...
  x := 1;
  ...
  procedure A(x: Integer);
  begin
  x := 5; // x-параметр! глобальная переменная x здесь не
  затрагивается!
  end;

Вот поэтому глобальные переменные вредны - могут возникать подобные накладки. Как минимум, желательно аккуратно разделять названия переменных, простые i,j,x,y использовать как локальные только, в виде счетчиков циклов, промежуточных расчетных значений итп.

* Важное свойство плеера Wait - где взять?

Если указать

MediaPlayer.Wait := true;
MediaPlayer.Play;

то при выполнении MediaPlayer.Play программа остановится и будет ждать окончания воспроизведения файла с музыкой. Если же

MediaPlayer.Wait := false;
MediaPlayer.Play;

то MediaPlayer.Play выполнится моментально, и программа пойдет дальше, а музыка уже будет играться в фоне, на фоне работы программы.

* Что будет, если применить or или and, предназначенные для логических данных, к целым числам?
В модуле "ABS"если пишешь (abs(10 or 19));, то ответ будет 27
если 10 or 10 To 10
a если 10 or 1 то 11

если пишешь (abs(10 and 19)); то ответ 2
если 10 and 10 To 10
a если 10 and 1 то 0

а при вводе нескольких чисел, ответ всегда 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)
10011
-----
00010 = 2 десятичное.

* при переводе в доллары приходиться ответу присваивать тип Real => число отображается не так, как хотелось бы. Можно ли это исправить? Например, чтобы программа округляла ответ.

* Программа указала на ошибку в строке Tria:=Tria Round 9;
Я хотел получить только целую часть. Когда заменил на Mod – все встало на свои места. Почему? Ведь Mod – это определение после остатка. И он, что? заменяет деление?
Еще один момент непонятен. Почему стоит Integer? Ведь Tria – это дробная часть. Поэтому я и поставил Real.
Владимир

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.
100 div 3 = 33. 100 div 15 = 6.

Вопросы от Артема:

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);
  begin
      sMess;
  end;

Ошибка выдается, потому что вы описали эту процедуру с параметром s, а вызываете без параметра. Вам пишется - не все параметры указаны.

  * для того чтобы задать случайное, вернее псевдослучайное,
  число от 1 до 6, в Visual Studio.NET надо записать:

  (rand()%6)+1;

  А чтобы задать случайное от 1 до 6, надо уже использовать
  служебное время:

  #include <time.h>
  void main{
  srand((unsigned)time(NULL));
  cout << (rand()%6)+1;
  Сергей

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

* Сейчас прикрепляла файлы .pas и .dfm и решила проверить как они работают(файлы). Если открыть .pas, то форма цепляется. А на исполнение она не запускается. Как вы-то это делаете?

Да, конечно надо еще добавлять .dpr - файл, главный файл проекта. Это делается с помощью менеджера проектов, в последнем занятии о нем рассказывалось. Просто удалить форму Unit1, созданную по умолчанию, из проекта Project1, и вставить чужую (команда-кнопка Add).

Просьба ко всем, кто прислыает примеры, и этот файл тоже включать.

  * Как сделать программу независимой от местонахождения файла
  Memo1.Lines.LoadFromFile( ' C:\Documents and   Settings\Alex\Desktop\Проба\ 001.txt ' );
  Программа открывает файл, который записан на диске.
  Но при переносе программы на другой компьютер придется и их
  переносить. Что можно здесь сделать.

Можно здесь указывать не абсолютный, а относительный адрес файла, относительно места запуска программы:

  Memo1.Lines.LoadFromFile( '001.txt' );

тогда файл 001.txt будет искаться в том же каталоге, откуда программа пускается, когда у пользователя установлена.

Это относится и ко всем другим операциям с файлами, где их имена используются!


Оператор выбора.

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

  if x=1 then ... else
  if x=3 then ... else
  if x=5 then ... else
  if x=8 then ... else
  ...

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

  case выражение of

    вариант-ответа: действие ;
    вариант-ответа: действие ;
    вариант-ответа: действие ;
    ...

  end;

Выражение - любое выражение Паскаля, значение которого - либо целое число, либо символ (тип Char). Вариант-ответа - одно из таких значений выражения. Действие - выполняется, если значение выражения равно данному варианту. Например,

  n := 2;
  case n+1 of
    2: write( ' n равно 2 ' );
    3: write( ' n равно 3 ' );
    5: write( ' n равно 5 ' );
  end;

В данном случае выполнится команда write('n равно 3'), так как значение n+1 будет равно 3.

Важно! После выполнения write('n равно 3') команда write('n равно 5'), предназначенная для другого условия, не выполняется!

Эта форма записи эквивалентна такой:

  n := 2;
  if n+1 = 2 then write( ' n равно 2 ' ) else
  if n+1 = 3 then write( ' n равно 3 ' ) else
  if n+1 = 5 then write( ' n равно 5 ' );

Отсюда понятно, почему выполняется только одна команда, а не все, следующие за ней. Если в каком-то условии надо выполнить две или более команд, их надо взять в "скобки" begin / end:

  n := 2;
  case n+1 of

    2: begin
  x := 5;
  write( ' n равно 2 ' );
  end;

    3: write( ' n равно 3 ' );

    5: begin
  x := 2;
  write( ' n равно 5 ' );
  end;

  end;

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

  case x of
    2,3,4: write( ' xxx ' );
    12,40: write( ' zzz ' );
  end;

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:
      begin
  // этот блок выполнится, только если значение T*2 равно 0,
  5, 138, или находится в диапазонах от 11 до 99 или от 201 до 500.
  end;

  end;


Если однажды ты пpидя домой не сможешь войти в системy с админскими пpавами - значит дети yж выpосли...


На прощание - присланная Виктором сказка.

Жил был молодец.
Не глупый был , хоть и Ваней звали.( для Вань большой пардон - сказка ведь). Добротой большой не отличался , но крепкий был , высокий , хотя и богатырем не был. Все необходимое у него было , только не радовался он этому - денег больших хотелось аж морда трусилась (еще один пардон но иначе точнее+ точно не скажешь). Как деньги большие увидит , так ему мозги и клинит - ничего не соображает и совсем другой человек получается. Ну это с людьми часто такое бывает, дело не удивительное. Видно поэтому- то Бог ему денег больших и не давал. А хотелось то как+ И днем и ночью + И приснился ему как-то на этой почве сон вещий . Что живет в соседнем доме Баба-Яга , что обратиться к ней надо , и в беде его она точно поможет. Проснулся Ваня , думает бред -то какой . Умылся , побрился, даже позавтракал , то есть как обычно . А денег то хочется!!! Как подумал про деньги как вспомнил про сон и побежал со всех ног в соседний дом. Стучится , а ему в ответ - "Заходи - открыто! Уж заждалась я тебя касатик! Е-mail мой ночью получил ? А идти не торопишся+" Зашел Ваня. Посмотрел на обстановку на женщину и подумал с уважением - "Обстановочка богатенькая + ух ты - кот с цепью золотой +а женщина !... взгляд такой демонический+ничего так+ а надо - же Баба-Яга!!!" А она ему и отвечает - " Спасибо Ваня за комплимант , но давай быстрей перейдем к делу . Работы срочной у меня много." И рассказала она ему что живет на окраине города в особняке с охраной Змей Горыныч . Старый очень. Богатств не меряно , а здоровья нет, и жить ему поэтому уж очень сильно надоело. ( Увы , бывает такое). А висит над ним заклятие страшное - за то что в детстве съел свою родную бабушку. Что умереть он сможет только от руки программиста. Жестоко ,ведь ребенок голодный был , а бабушка недосмотела+ Но заклятие есть заклятие , потому-то он и живет так долго. То программистов с компьютерами на свете не было , а сейчас , когда они есть их от компьютера не оттянешь. Много работают. А кто много работает , тому некогда деньги зарабатывать. А Змей завещаньице оставил , что кто программочку составит найти какое число больше, А или В , и таким образом дверку из темницы откроет, тому после смерти (Горыныча конечно) все богатства и отойдут. А к дверке веревочку привяжет , другой стороной веревки привяжет фиксатор для меча-кладенца+ Сам под ним спать уляжется+ Да он так уже сто лет так спать ложится !!! Охрана в случае чего подтвердит+ Открываешь дверку - и багатенький Буратино! Грех на душу не возьмешь - ты просто дверку открыл. Уголовной ответственности тоже - , "несчастный случай в результате неосторожного обращения с оружием". "Так что если согласен , Ванюша , вот тебе ноутбук последней модели , подключись к интернету , не жадничай , и подпишись на рассылку Сергея Бобровского , адреса в ноутбуке прилагаются". Так он и сделал. Не знаю, писал ли отчеты , наверное нет ,- хотел от жадности время не терять -, дошел до места , где пишется , что он теперь уже плохонький , но программист , и отправился к Змею Горынычу. Там ему Змей Горыныч баньку истопил , пивом угостил и не только пивом , а вообще принял как родного, и учел все пожелания молодого организма. "А теперь - говорит- , Ванюша ты слишком много знаешь. И мне как злодею положено запереть тебя в темнице на веки вечные." Что и сделал , согласия Ваниного уже и не спрашивая . Съел пол-мешка димедрола от бессонницы и спать под мечом улегся , как обычно+ Проснулся через три месяца+ Темницу открыл - Ваню уже мухи доедают+ На компьютере програмка правильно составленная и табличка "Runtime error 105 at 00403B00 . Не повезло старику+ Похоронил остатки Ванюшки Змей Горыныч с почестями у себя во дворе. На памятник раскошелился. А на плите могильной , кроме всего прочего что обычно пишут , написал Программист !!! Не стирай { $ APPTYPE CONSOLE} - ОПАСНО ДЛЯ ЖИЗНИ!!!
А у вас нет знакомой Бабы-Яги ???
Вот и сказке конец . Кто прочитает и сделает выводы , тот и молодец.


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

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

 

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

В избранное