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

Программирование с нуля - это совсем просто! 24) Условный оператор


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

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

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

24) Условный оператор

Сначала - часто задаваемые вопросы. И немножко ответов :)

Не получается всё так быстро, как хотелось бы (на себя только ночи остаются, благо, график работы позволяет).
Сегодня с 9 по 12урок только осилила, но всё равно…. медленно, но верно продвигаюсь.
Вы были правы, писать надо после каждого задания. Я пыталась пометки делать, чтобы потом в кучу всё собрать, но естественно половина мыслей испарилась. Пишу, что и как делала, по памяти, поэтому может быть немного сумбурно...

Вот-вот, писать надо после каждого задания ! Это ко всем без исключения относится. Напомню еще раз - это важный принцип занятий, и важная часть всех упражнений, - составление отчета. Мне ваши отчеты не нужны :) Они вам нужны. Но при этом надо, чтобы кто-то другой их обязательно прочитал. Чем я и занимаюсь, не сомневайтесь :) И если где-то надо, подсказываю, всегда. Если же вы все правильно сделали, то и отвечать нечего. Но это не значит, что я их не читаю!
Так что не ленитесь.

...Внизу окна редактора написано: ( Linker Fatal Error) Fatal: Expected a file name, это и (C++ Error) E2075 Incorrect project override option: \C++\Bin\Unit2.obj это. Как это понимать???!!! Что не так сделала, и что делать дальше???!!!
...В итоге даже подсматривать никуда не приходится, всё отложилось и по полочкам в голове разложилось. Но почему такая разница в записи ответов? (1. у Вас: 2,1627573Е+02, у меня:2,16275731056759Е+0002, в других то же самое).
По поводу С++:
1.Если одно число дробное, а другое целое; 2. если в сумме два дробных дают целое; 3 если выражение и с целыми, и с дробными числами, какую букву ставить: d или f? Остальное пока всё понятно.
Лена

Что-то уже у многих возникают такие проблемы с С++Билдером. Кто-нибудь может подсказать, в чем дело? У кого были такие проблемы, удалось справиться, и как? Помогите, пожалуйста.

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

В вычислениях - разве это разница? Если перевести в нормальный вид, получится

216,27573 и 216,275731056759

Мне просто лень было набирать последние цифры :)

1.Если одно число дробное, а другое целое;
Всегда дробное! Дробное число (дробного типа), входящее в любое выражение с целыми, превращает его в дробное.

2. если в сумме два дробных дают целое;
Всегда дробным будет. Как только вкралось с плавающей запятой, все, амба!

3 если выражение и с целыми, и с дробными числами, какую букву ставить: d или f? Остальное пока всё понятно.
f , потому-что дробного типа результат.

Отдельно надо сказать про понятие проекта. Мы его уже рассматривали ранее, только еще надо добавить, что помимо файла с исходными текстами в него входит немало других дополнительных файлов. Так, в Дельфи наряду с исходными текстами (файлы с расширением .pas, от "Паскаль") также важны файлы с описанием формы, которая в дизайнере спроектирована. Они хранятся с расширением .dfm. Бейсик - с расширением .bas, Си - с .c. Си++ - в виде .cpp. Кроме того, есть еще заголовочные файлы (с описанием подключаемых библиотек), для Си и Си++ они имеют расширение .h, и хотя для Си++ пытались ввести расширение .hpp, оно как-то не прижилось вроде.

После того, как проект создан новый, и нажата кнопочка Save, обычно система предлагает все файлы вместе сохранить.

Для каждого проекта отводите отдельный каталог!

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

окно редактора исходных текстов у меня белого цвета. Это принципиально (изначально оно было синего, как у Вас, но после переустановки программы, возникла необходимость, поменяло цвет)?

Цвет окна редактора исходных текстов можно в Дельфи 7 так изменить - в меню выбираете Tools - Editor Options - закладка Color и в списке Color Speed Set выбираете Tools - другое оформление окна.


Условный оператор

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

If логическое выражение Then 
  begin
  оператор 
  end;
Здесь слова If (если) и Then (то) - ключевые. Логическое выражение - это рассмотренный нами вид выражения, значением которого будут True или False. За ключевым словом Then, между парой ключевых слов begin и end - любая допустима команда Delphi (или последовательность команд, как в любом другом месте программы), которая будет выполнена, только если значение логического выражения равно True. Если оно равно False, то этот оператор (или группа операторов) выполнен не будет.

С учетом новой возможности перепишем нашу программу так:

var Years, Tria: Integer;
begin
    Years := 80;
    Tria := 100 - Years;
    Tria := Tria Mod 9;

    If Tria = 0 Then 
      begin
      Tria := 9;
      end;

    WriteLn(Tria);
    ReadLn;

End.

Если теперь в процессе вычисления мы получили остаток, равный нулю, то условный оператор проверит это, вызовет оператор присваивания, в котором значение переменной Tria будет откорректировано.
Выполним данную программу, и на экран будет выведено число 9.

А что, если в случае фиксации истинного значения требуется выполнить не один, а несколько операторов? Например, нам желательно не только исправить значение переменной Tria с 0 на 9, но и вывести об этом дополнительное информационное сообщение.

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

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

В группу команд, которая выполняется при истинности условия, можно добавить дополнительную команду, выводящую на экран сообщение пользователю о преобразовании:

...

If Tria = 0 Then
  begin
  writeln( ' Pereschet znacheniya! ' );
  Tria := 9;
  end;
...

Обе команды - и вывод строки, и оператор присваивания, выполнятся, только если Tria будет равно нулю. Для наглядности они выделяются отступами, это очень полезно! Посмотрел на код - и сразу видно, что когда работает.

Собственно, ВСЕ программирование начинается с условного оператора. Потому что, хоть и был изучен оператор присваивания, но логика работы, последовательность выполнения команд, оставалась последовательной, линейной, без извилин :)

А вот теперь сразу множество возможностей появляется. Потому как внутрь условного оператора можно другой условный оператор вставить, например!

Допустим, надо ввести число, и если оно больше 10, сообщить (куда надо :). А если больше 100, то еще раз сообщить :)

Вот как это можно записать:

var x: Integer;
begin
readln(x);
if x > 10 then
  begin
  writeln( ' Bolshe chem 10 ' );

  if x > 100 then
    begin
    writeln( ' Bolshe chem 100 ' );
    end;

  end;

end;
Наглядно с отступами, правда? Какой end какому begin-у соответствует, ясно?


Расширенный вариант условного оператора

А если нам так надо - ввести число, и если оно больше 10, сообщить одно. А если меньше, то сообщить все равно, но другое.

Или так:

Если число больше 10, то сообщить одно, иначе сообщить другое.

Для этого имеется расширенный вариант условного оператора. Он дополнен ключевым словом else (иначе :).

if условие then
  begin
  делаем, только если условие истинно
  end

else
  begin
  делаем, только если условие ложно
  end;
Обратите внимание, что перед else точка с запятой не ставится! Правило такое.
var x: Integer;
begin
readln(x);
if x > 10 then
  begin
  writeln( ' Bolshe chem 10 ' );
  end

else
  begin
  writeln( ' Menshe-ravno 10 ' );
  end;

end;


Логические операторы

Некоторые проверки с помощью условного оператора мы пока не сможем реализовать. Выполнить команду, если содержимое некоторой переменной x меньше или равно нулю, достаточно просто :

if x <= 0 then
 begin
  a := 1;
 end;
А вот записывать в качестве условного выражения не одну, а сразу несколько проверок мы пока не научились. Это надо будет, например, если надо выполнить группу операторов, когда x меньше или равно нулю, а y - больше 100.

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

And - Логическое И. Связывает два логических значения таким образом, что результат будет равен True, только если оба значения равны True

Or - Логическое ИЛИ. Связывает два логических значения таким образом, что результат будет равен True, если хотя бы одно из этих значений равно True

Существует еще один логический оператор - Not, который применяется по отношению не к двум, а к одному выражению. В этом он похож на оператор изменения знака числа "-" (минус). Not изменяет логическое значение на ему противоположное. Так как логических значений (тип Boolean) всего два, то результатом выражения Not True будет False, а результатом Not False будет True.

Чаще всего при составлении сложных логических выражений применяются операторы And и Or. По своему смыслу первый оператор можно трактовать как союз И. Значение логического выражения, связанного And, будет равно True, только если истинно значение каждого из входящих в него выражений - и правого , и левого. А оператор Or, который можно назвать ИЛИ , возвращает в качестве значения True, если хотя бы одна из составляющих логических величин (или правая , или левая) будет истинной.

Вот как можно записать проверку вышеупомянутую:

(x <= 0) and (y > 100)

if (x <= 0) and (y > 100) then ...


Приоритеты в логике

В некоторых логических проверках этого примера применяются сразу несколько разных логических операторов. При этом может возникнуть неоднозначность в трактовке порядка вычисления такого условия.

Например , в записи

(a = 4) or (a >= 6) and (a <= 11)

можно сначала рассчитать значение связки Or, а потом - And. А можно и наоборот. Но изменится ли от этого конечный результат? Конечно, он может сильно измениться - точно так же, как он меняется в ходе вычисления арифметических выражений, в которых четко задан приоритет операций умножения и деления . Возьмем выражение

True Or False And False

Если рассчитать его так:

(True Or False) And False

то получится

(True) And False = False

А если так:

True Or (False And False)

то получится

True Or (False) = True

Как видим , результат логического выражения не будет определен, пока мы не зададим приоритеты (старшинство) логических операторов . Поэтому практически во всех языках программирования принято, что прежде всего выполняется оператор логического отрицания Not, затем - оператор And, а в последнюю очередь - оператор Or.

Нередко логический оператор Not называют отрицанием - по аналогии с арифметическим минусом . Соответственно более приоритетный оператор And считается логическим умножением , а оператор Or - логическим сложением. Отсюда и их приоритеты, как в арифметике.

В реальных программах структура логических выражений бывает подчас очень запутанной, с многократным вложением одних логических операторов в другие. Потому для наглядности и исключения возможных ошибок последовательность таких вычислений лучше выделять с помощью круглых скобок. Впрочем, в Delphi явно требуется, чтобы выражения, связанные or или and, выделялись круглыми скобками. То есть вот так написать нельзя:

x <= 0 and y > 100

Обязательно надо в скобки брать левую и правую части and:

(x <= 0) and (y > 100)


В Си условный оператор записывается так:

if( условие ) {

команды-если-условие-истинно;

}

Здесь фигурные скобки ту же роль играют, что и begin / end в Паскале. Обратите внимание, что слово then в Си отсутствует (а в Паскале и Бейсике имеется).

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

if ( a > 5 ) then ...

а можно так:

if a > 5 then ...

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

if( a > 5 ) {
x = 10;
}

А без скобок - запрещено:
неверно! :

if a > 5 {
x = 10;
}

Расширенный вариант вот так выглядит:

if( условие ) {

команды-если-условие-истинно;

}

else {

команды-если-условие-ложно;

}

Операция отрицания записывается одним символом "!" :

! (a > 5)

Результат будет истинным, если a меньше или равно пяти.

Операция логического И (and) - двумя символами && обозначается, операция логического ИЛИ (or) - тоже двумя вертикальными черточками || (попробуйте их на клавиатуре найти :).

(x <= 0) && (y > 100)

if( (x <= 0) && (y > 100) ) {
printf("\n Pervuy poshel ! ");
} else {
printf("\n Vtoroy poshel ! ");
}


В Бейсике - так:

If условие Then

команды-если-условие-истинно

End If

Здесь начального begin как бы нету, а вот последний end есть, причем записываеся он двумя ключевыми словами.

Соответственно, расширенная форма:

If условие Then

команды-если-условие-истинно

Else

команды-если-условие-ложно

End If

Операторы связки логические - как и в Паскале, And, Or.

If (x = 5) And (y < 555) Then

a = 1

Else

a = 2

End If


Теперь задания. Цель наша такая сейчас. Сделать 100 простых программ. Потом останется десяток средних (на самом деле это все параллельно будет происходить конечно), и хороший уровень программирования будет достигнут!

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

Первая пятерка. По каждому заданию надо сделать отдельную оригинальную программу! Запустить, ввести числа, проверить.

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

1. Ввести два числа a и b и напечатать максимальное из них.
2. Ввести три числа x, y, z. Напечатать минимальное из них.
3. Ввести три числа x, y, z. Найти, что больше - их сумма или их произведение.
4. Ввести три числа x, y, z. Если x > y > z, то напечатать разность x-z, в противном случае - максимальное из трех.
5. Ввести два числа a и b. Если a > b, то изменить значение a на произведение a и b, в противном случае изменить значение b на сумму a и b.
Напечатать результирующие значения a и b.


Что касается заданий из прошлого выпуска (по чулкам :). Решения, как уже ранее говорилось неоднократно, должны содержать не цифирки типа "г) 99", а подробное описание хода ваших рассуждений.


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

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

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

А перекачать их одним архивом можно отсюда:
http://russianenterprisesolutions.com/sbo/download/sbo.zip (650 кб)
(вместе с картинками, только они в тексте с абсолютными адресами; вручную просматривать придется).

 

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

В избранное