С сегодняшнего урока мы начинаем рассмотрение группы управляющих конструкций. Из названия понятно, что это конструкции, предназначены для управления программой. До этого мы разбирали простейшие программки, в которых все записанные операторы выполняются последовательно друг за другом. Такие программы называются линейными.
Но часто, то, как программа должна работать зависит от каких-либо условий. Если условие выполняется, то надо действовать так, если не выполняется – иначе. Вспомните любую игру с ветвящимся сюжетом, когда если вы беретесь за выполнение задания, то вы обязательно наткнетесь на что-то, а если нет, то ничего не будет. Именно для этого используется управляющие конструкции, об одной из которых и будет вестись сегодня речь.
Операторы соотношений и логические выражения.
Помимо арифметических операторов, рассматриваемых в прошлом уроке, в Си есть и операторы соотношений. К ним относятся следующие операторы:
> — больше
>= — больше либо равно
— меньше
— меньше либо равно
== — равно
!= — не равно
Уроки Python / Конструкция if elif else — если то иначе — Условная инструкция
Они используются в логических выражениях. Например:
Листинг 5.1
int a=4, b=10 ;
Любое выражение либо истинно, либо ложно. В нашем примере, первое выражение ложь ( false ) второе истина ( true ). Еще часто, когда условие ложно подразумевают 0, когда истинно подразумевают 1. Это очень удобно, для компьютера ведь для него двоичная система счисления является основной. В электронике, например, под истиной подразумевается «есть ток», под ложью — «нет тока» . Рассмотрим пример :
Листинг 5.2
int main( void )
int a=4, b=10, c, d;
printf( «pervoe virazenie %d nvtoroe virazenie %d n» ,c,d);
С помощью него вы можете убедиться, что ложным выражениям соответствует значение ноль, истинным единица. Вообще, любое число, не равное 0 является истиной, а 0 это ложь.
Теперь, когда с истинностью и ложностью условий мы разобрались, переходим к рассмотрению первого управляющей конструкции.
Управляющая конструкция if — else .
Конструкция if — else используется для принятия решения. Вспомните развилку дорог, когда вы можете пойти либо так, либо иначе. Для наглядности рассмотри её работу на простой программе. Пусть пользователь вводит два целых числа, и программа должна вывести большее из них.
Листинг 5.3
int main( void )
printf( «Vvedite dva celih chisla:»);
printf( «%d naibolshee chislon» , a);
printf( «%d naibolshee chislon» , b);
Теперь разберемся с синтаксисом конструкции if — else .
Сначала идет ключевое слово if (с английского «если») далее в скобочках записано условие, которое проверяется (в нашем случае а больше b ). Следом записан ОДИН оператор, который должен выполняться, если условие истинно (в нашем случае printf ( «% d naibolshee chislo n » , a ); ) , потом ключевое слово else и следом за ним, ОДИН оператор, который должен выполняться, если условие ложно (в нашем случае printf ( «% d naibolshee chislo n » , b ); ) .
Решение задачи «Соревнования 3»
Формально синтаксис конструкции if — else выглядит так:
Листинг 5.4
if (логическое выражение) оператор1; else оператор 2;
Он работает следующим образом. Сначала вычисляется логическое выражение. Если оно истинно (т. е. отлично от нуля), выполняется оператор1. Если выражение ложно (т. е. его значение равно нулю), то выполняется оператор2.
Кстати, блок else может и отсутствовать. Такая запись наывается сокращенной записью, или неполной конструкцией ветвления.
Листинг 5.5
if (логическое выражение) оператор1;
В данном случае, если условие будет ложным программа ничего делать не будет. А просто продолжит своё выполнение.
Теперь остановимся на на оговорке об одном операторе. Это оговорка очень существенна. Иначе конструкция if будет работать неправильно. Для того, чтобы выполнить несколько операторов, используется составной оператор. Это обычные фигурные скобки <> записанная между ними группа операторов, воспринимается компилятором как один.
Листинг 5.6
if (логическое выражение)
После закрывающей скобки, точку с запятой ставить не надо. Кстати, как вы уже могли заметить тело любой функции тоже заключено в составной оператор <>
Из опыта, я вам настоятельно советую всегда использовать фигурные скобки, даже если внутри них будет один оператор. Это еще одна небольшая хитрость, используемая при написании программ. Очень часто это позволяет избежать глупых ошибок.
По своей сути, оператор if проверяет в условии числовое выражение. Т.е. либо ноль ( т.е. ложь), либо не ноль (т.е. истинна). Поэтому вместо условия ( a != 0), можно просто писать ( a ). Но пользоваться такой записью надо осторожно, часто бывает она затрудняет понимание программы.
Внутри управляющей конструкций if — else можно использовать любые конструкции языка, в том числе и еще саму конструкцию if — else . Если опять вспомнить пример с развилкой дорог, получается, что после одной развилки появляется другая развилка.
Отсутствие else-части в одной из вложенных друг в друга if-конструкций может привести к неправильному понимаю записи. Для разрешения этой проблемы, используется простое правило:
«else относится к ближайшему if, у которого нет своего else.»
Для примера:
Листинг 5.7
В данном случае else относится к внутреннему (второму) if , а если нам надо чтобы else относился к внешнему (первому) if , то необходимо расставить соответствующим образом фигурные скобки.
Листинг 5.8
Кстати, конструкция if является одним оператором, и для неё одной в принципе скобки не нужны, но как я уже упоминал, лучше всегда использовать фигурные скобки, дабы избежать случаев неправильного толкования записи. Потому что искать такие ошибки в программах очень тяжело. Еще, советую использовать отступы, для показания того, что и к чему относится. Это относится к стилю оформления кода. Как я уже обещал в комментариях к одному из уроков, я посвящу в будущем этой теме отдельный пост.
Теперь немного о типичных ошибках. Для проверки равенства двух чисел используется оператор «==» два знака равно. Очень часто из-за невнимательности, в условиях вместо ( a == b ) пишут ( a = b ). И программа работает не так как нужно. С точки зрения компилятора, когда написано выражение a = b истинно всегда, кроме случаев, когда b равно нулю.
Мы, фактически, присваиваем переменной а значение b . Если оно не ноль, то выражение истинно, если 0 ложно. А нам-то нужно сравнить их значения. Поэтому будьте внимательны. Вот пример, с ошибкой:
Листинг 5.9
int main( void )
printf( «Vvedite dva celih chisla:» );
printf( «a i b ravnin» );
printf( «a i b ne ravnin» );
Логические операторы. Сложные условия.
В предыдущих программах, мы рассматривали простейшие условия, состоящие из одного оператора отношения. Теперь, давайте рассмотрим программу, которая проверяет, принадлежит ли точка с координатой х, заданному промежутку оси х (-10; 10].
Листинг 5.10
int main( void )
printf( «Vvedite x» );
printf( «x prinadlegit promegytkun» );
printf( «x ne prinadlegit promegytkun» );
printf( «x ne prinadlegit promegytkun» );
Эта программа состоит из двух вложенных условий. Для того, чтобы точка находилась в промежутке (-10;10] она должна быть больше -10, и меньше или равна 10. В нашей программе мы использовали два вложенных условия. Но ту же задачу можно решить и с помощью одной конструкции if . Для этого, для записи сложного условия, нужно применить логические операторы. Их всего несколько:
!(условие) – оператор логическое НЕ. Отрицает условие. Если условие было истина, оно становится ложным, если было ложным становится истинным.
(условие1) (условие2) — оператор логическое И. Возвращает истину если оба условия истинны. Иначе возвращает ложь.
(условие1) || (условие2) — оператор логическое ИЛИ. Возвращает истину, если хотя бы одно из условий истинно или оба сразу истинны. Иначе ложь.
А нашем случае есть два условия ( x >-10) ( x И второе, то точка попадает в промежуток, иначе нет.
Если использовать логический оператор, то программу можно переписать следующим образом:
Листинг 5.11
int main( void )
printf( «Vvedite x» );
if ((x>-10) (x<=10))
printf( «x prinadlegit promegytkun» );
printf( «x ne prinadlegit promegytkun» );
Как видите, запись программы стала более компактна и легче для понимания.
Приоритет логических операций.
Как и арифметические операции логические операции имеют тоже различный приоритет.
- Операции в скобках
- Логическая операция НЕ
- Логические отношения
- Логическая операция И
- Логическая операция ИЛИ
Так же как и для арифметических операций, скобками можно изменить порядок выполненияю
Как видите, приоритет операций логических соотношений выше, чем приоритет логических операций И и ИЛИ. Поэтому, в принципе, в программе Листинг 5.11 можно было бы условие записать ( x >-10 x <=10). Но опять же, чтобы не запутаться в более сложных условиях, я советую вам всегда явно указывать приоритет с помощью скобок, дабы избежать досадных ошибок.
Ну вот на этом и закончим сегодняшнее занятие.
Резюме урока:
- Узнали и научились использовать составной оператор
- Разобрались с логическими операциями соотношений и логическими выражениями
- Ознакомились с управляющей конструкцией if-else и научились её пользоваться
- Узнали про логические операторы НЕ, И, ИЛИ
- Выяснили приоритет логических операторов
Задание для практической работы:
- Напишите программу которая по вводимому числу выводит его модуль, не используя функцию fabs(). Программа должна считать вещественное число с клавиатуры, и вывести на экран модуль этого числа.
- Напишите программу для решения уравнения ax = b относительно х в целых числах. Учтите, что a может принимать любые значения, в том числе и 0. На вход программе подаются целые числа a, b, по модулю не превосходящие 30000. Требуется вывести целый корень уравнения, если он существует и единственный. Если уравнение не имеет корней, то вывести no solution. Если уравнение имеет больше одного целого корня, то вывести many solutions.
- Поле шахматной доски определяется парой чисел (a, b), каждое от 1 до 8, первое число задает номер столбца, второе – номер строки. Заданы две клетки. Определите, может ли шахматная ладья попасть с первой клетки на вторую за один ход. Входные данные: 4 целых числа от 1 до 8 каждое, первые два задают начальную клетку, вторые два задают конечную клетку. Начальные и конечные клетки не совпадают. Программа должна вывести YES, если из первой клетки ходом ладьи можно попасть во вторую или NO в противном случае.
- Даны вещественные числа a, b, c. Найдите все решения квадратного уравнения ax2+bx+c=0. Формат входных данных: три вещественных числа. Формат выходных данных: два вещественных числа, если уравнение имеет два корня, одно действительное число – при наличии одного корня. При отсутствии действительных корней программа выводит no solution.
- По данному числу n
213 комментариев:
Самостоятельная практическая работа.
Решение квадратных уравнений.
#include «stdio.h»
#include «math.h»
int main(void)
int a,b,c,D;
float x1,x2,x;
printf(«Vvedite a b c 4erez probeln Primer 3x*x-6x+3n a=3 b=-6 c=3n»);
scanf(«%d %d %d»,b,
printf(«a=%d,b=%d,c=%dn»,a,b,c);
double pow(double x,double y);
double sqrt(double x);
D=pow(b,2)-4*a*c;
if (D>0)
x1=(-b+sqrt(D))/2*a;
x2=(-b-sqrt(D))/2*a;
printf(«x1=%f,x2=%fn»,x1,x2);
>
else
x=-b/(2*a);
printf(«x=%fn»,x);
>
return(0);
>
Программа вроде работает.
Только не смог сделать что бы программа выводила на экран «Комплексные числа или решения нет» когда D
Добрый день Камиль. Программа по вычислению корней квадратного уравнения — показательная, вероятнее всего она будет и в домашнем задании.
Начнем разбор.
1) Почему вы решили что, коэффициенты квадратного уравнения обязательно целые числа? Ну предположим это ваше условие, тогда поговорим о дискриминанте. Рассмотрим выражение для его вычисления.
pow(b,2)-4*a*c;
pow(b,2)- вернет тип double. 4*a*c — будет целого типа, так как все переменные целые. Получится вы будете складывать double + int. в этом ничего плохого нет, результат получится типа double, потому что тип double больше (главнее). Если говорить на языке математики, то все целые числа являются подмножеством всех вещественных чисел.
Это немножко затрагивает тему преобразования типов, о которой будем говорить позже. А теперь ошибка, мы присваиваем тип double переменной D типа int. В нашем случае число будет тоже целое, потому как a,b,c целые, НО представьте если бы они были вещественные и тогда дискриминант получился бы равным, например, 4.3.
4.3 Преобразовалась бы к типу int и осталось бы всего 4. получился бы дискриминант равный 4. И программа считала бы корни с ошибкой. Так делать не стоит. За этим надо следить. Вот порядок типов int < float < double. Если присваивать меньший тип большему, то ничего особенного не случился, но если присваивать больший тип, меньшему может произойти потеря точности вычислений.
2. Если мы подключаем библиотеку с какой либо функцией то нам в программе не следует опять писать её описание. Т.е. вот эти строчки
double pow(double x,double y);
double sqrt(double x);
не нужны.
3. Зачем объявлять дополнительную переменную x? Ведь можно сохранять и в x1 или x2. У нас ведь либо одна ветка выполняется, либо другая. Это конечно не ошибка, но нерациональное использование памяти.
4. Теперь по поводу условий. Разберем условие:
если D>=0 то 2 корня или 1 корень
иначе Dнет.
Если первое условие выполнится, то понадобится еще один выбор, чтобы определить сколько корней будет, значит добавится еще одно условие вложенное.
Теперь попробуйте написать программу, с учетом этих замечаний. Удалить
Источник: www.youngcoder.net
Основные конструкции языка. Условные операторы. Операторы циклов. Вложенные арифметические циклы.
Оператор условия используется для программирования разветвляющихся процессов, когда дальнейший процесс вычисления зависит от выполнения или невыполнения какого-либо условия.
Оператор условия может работать в 2 формах: полная и сокращенная.
Полная форма предполагает наличие операторов как в секции then, так и в секции else. В некоторых случаях в секции then или else используется еще один или несколько вложенных операторов условия.
Сокращенная форма предполагает наличие только секции then.
При использовании вложенных операторов предпочтительнее использовать схему else if, так как при этом происходит вложение во внешнюю ветку. При использовании then if возможны трудности восприятия кода программы. Связано это с тем, что предложение else всегда связывается с ближайшим if, поэтому схема then if является трудночитаемой.
Оператор выбора (case):
В ряде случаев необходимо оценить не соблюдение-несоблюдение некоторого условия, а выбрать порядок действий, зависящий от некоторого значения. Для этой цели используется оператор выбора.
1 часть – выражение-селектор. В качестве такого выражения может быть представлено любое выражение порядкового типа.
2 часть – список выполняемых операторов, которые определяют, при каком значении селектора нужно запускать один из предопределенных вычислительных процессов. В качестве оператора может использоваться как простой оператор, так и составной оператор, но только один.
case Var of // Var – выражение-селектор
else; // оператор по умолчанию
end;
Сначала вычисляется значение селектора; затем оно сравнивается со множеством значений, представленных в списке. Каждое выражение внутри такой конструкции просматривается последовательно, и выбирается первое подходящее. Если же такого выражения не было найдено, то выполняется оператор по умолчанию из строки else. Если такая строка не предусмотрена, выполняется пустой оператор.
Операторы цикла.
Цикл – последовательность операторов, которая может выполняться более 1 раза. Для того, чтобы определить номер прохода цикла, используется переменная цикла (переменная-счетчик), значение которой определяет момент начала и завершения цикла.
Набор операторов, выполняющийся в цикле, является телом цикла.
В языке Pascal существуют 3 вида циклов: цикл с параметром (с известным числом повторений), цикл с постусловием, цикл с предусловием.
Цикл с параметром:
for Счетчик:= Начальное значение to Конечное значение do
Используется в программе, когда заранее известно число повторений тела цикла, при этом каждое повторение цикла приводит к увеличению или уменьшению счетчика цикла. Счетчик – переменная, имеющая начальное и конечное значение.
В качестве счетчика используется переменная целочисленного типа.
Изменение счетчика происходит автоматически после завершения тела цикла.
Возможно использование ключевого слова downto, тогда счетчик цикла будет уменьшаться.
Цикл с предусловием:
while < логическое выражение >do
Выход из цикла происходит, когда логическое выражение равно False.
Такой цикл выполняется тогда, когда число повторений не определено, и возможная ситуация, что тело цикла не выполнится ни один раз. В таком цикле сначала проверяется условие входа в цикл, и если оно истинно, то выполняется тело цикла; в противном случае, управление передается оператору, стоящему после тела цикла.
Обязательное требование – в теле цикла должна происходить модификация переменной, которая влияет на логическое выражение, определяющее возможность входа в цикл.
Цикл с постусловием:
Repeat
Выход из цикла происходит, когда логическое выражение равно True.
Цикл с постусловием предполагает выполнение операторов тела цикла, число повторений которого заранее не известно, но цикл должен выполниться хотя бы один раз. Для этого проверка логического условия продолжения или завершения цикла осуществляется после выполнения тела цикла.
Обязательное требование – в теле цикла должна происходить модификация переменной, которая влияет на логическое выражение.
Вложенный арифметический цикл.
Под вложенным арифметическим циклом понимают такую алгоритмическую структуру, при которой в тело одного цикла с параметром включен другой цикл с параметром.
for I:= 1 to 10 do
for J:= 1 to 2 do
Вложенный цикл позволяет считывать параметр-счетчик внешнего цикла (но не наоборот). Допускается выход из любого уровня вложенности на один из предыдущих уровней с помощью оператора goto, хотя такая конструкция не рекомендуется к применению.
Возможно до трех десятков вложенностей.
При выходе из цикла значение параметра цикла становится неопределенным.
К основным конструкциям языка относятся: идентификаторы, зарезервированные слова и символы, выражения, операторы, группы операторов и т.д.
Организация циклических вычислительных процессов, использующих рекуррентные зависимости при решении различных задач.
Рекуррентное соотношение – соотношение, связывающее одни и те же функции, но с различными аргументами.
Правильное рекуррентное соотношение – соотношение, у которого количество или значения аргументов у функций в правой части меньше количества или значений аргументов функций в левой части соотношения. Если аргументов несколько, то достаточно уменьшения одного из аргументов.
В ряде случаев вычисление некоторого выражения осуществляется на основе значений ранее вычисленных выражений или выражений меньшего порядка. Такие вычисления носят название рекуррентных зависимостей. В общем случае формулу рекуррентных вычислений можно определить следующим образом:
Yi = F(Yi-1, Yi-2, …, Yi-k),
т.е. для вычисления i-го члена последовательности используются k предыдущих членов последовательности.
Использование рекуррентных формул позволяет сократить текст программы и, в некоторых случаях, время ее выполнения, однако требуются дополнительные вычисления для подготовки вычислительной функции. Для того, чтобы использовать рекуррентную формулу, нужно найти такое выражение, модификация с помощью которого преобразует предыдущее значение в следующее.
Признак рекуррентной формулы – присутствие общего члена бесконечного ряда.
С помощью рекуррентных формул часто вычисляют значения бесконечных рядов.
Работа с одномерными и двумерными массивами. Понятие массива, размерность массива, индекс массива. Размещение массивов в памяти. Способы инициализации массивов. Открытые массивы.
Массив – последовательность логически связанных элементов одного типа, которым присвоено одно имя. Также массив – это структурированный тип данных, состоящий из фиксированного числа элементов одного и того же типа.
Основные характеристики: тип данных и размерность.
Размерность массива – количество индексов у каждого элемента массива. Существуют одномерные, двумерные и n-мерные массивы.
Положение элемента в массиве однозначно определено его индексом.
Type
TArray = array [1..10] of Integer;
Var
B: array [1..5] of Integer;
Возможно также описание массива без предварительного определения собственного типа, однако при этом следует помнить о возможном нарушении правил соответствия и эквивалентности.
Массивы могут быть одномерными, многомерными и открытыми.
При задании многомерных массивов следует учитывать, что максимально быстро изменяется самый последний индекс.
В качестве индекса может использоваться порядковый тип без знака.
В памяти массив представлен как линейная последовательность элементов определенного размера.
Статические массивы.
При объявлении границы массива могут быть заданы выражениями. Если в массиве все элементы являются константными выражениями, то число элементов в массиве определено и под массив отводится память фиксированного размера. Такие массивы называют статическими.
Основное преимущество использования массивов состоит в том, что его элементы не имеют отдельных имен. Достаточно описать имя всего массива целиком; обращение к элементам будет осуществляться по индексу.
var A: array [0..5, 1..15] of Byte;
A[1, 10] – элемент на 2 строчке, 10 столбце
Никаких ограничений на типы элементов массива не накладывается. Элемент массива может быть как простым, так и составным типом. Возможна ситуация, когда в качестве элементов массива будет использоваться еще один массив; однако, нельзя создавать массивы файлов.
Элементы массива располагаются в оперативной памяти последовательно. Каждый элемент занимает столько памяти, сколько отводится под тип, который указан в описании массива. Тогда размер массива – общее количество элементов в массиве или объем памяти, занимаемый всеми элементами массива в сумме.
Чтобы узнать объем памяти, выделенный массиву в программе, используется функция SizeOf, а в качестве параметра используется имя переменной или имя типа массива. Для того, чтобы определить адрес конкретного элемента в массиве, можно воспользоваться следующим правилом: адрес всякого элемента может быть получен путем смещения относительно начала массива на количество байт, равных произведению индекса элемента на размер этого элемента.
Addr(C[I]) = Addr(C) + I * SizeOf(Char)
Инициализация массива может осуществляться 3 способами:
— Если значения элементов массива определены до начала работы программы:
const A: array [1..3] of Integer = (1, 2, 3);
— Если исходные данные необходимо внести с клавиатуры в процессе выполнения программы
for I:= 1 to 2 do
for J:= 1 to 3 do
— Прямое присвоение в теле программы значений элементам массива
Для обнуления массива используется процедура FillChar.
При выполнении инженерных и математических расчетов часто используют многомерные массивы, однако, многомерное описание необходимо лишь для удобства программиста. Реально в памяти многомерный массив представлен в виде одномерной последовательности.
Для того, чтобы определить реальный адрес элемента двумерного массива, необходимо воспользоваться правилом:
Addr(A[I, J]) = Addr(A) + (J * Cols + I) * SizeOf(Integer)
Всякий массив можно создать несколькими способами:
— Создание массива путем определения типа с перечислением возможных значений индексов. Транслятор будет интерпретировать имя индекса в его местоположение в перечисляемом типе.
— В качестве индексов массива могут быть заданы ранее определенные константы.
— Сам массив может быть определен как набор констант, при этом каждая строка массива будет указана в виде отдельной скобочной формулы.
Динамические массивы.
В ряде случаев приходится работать с наборами элементов, количество которых однозначно не определено на этапе разработки программы. Описание открытого массива содержит только его имя и тип переменных без указания размерности.
A2: array of Integer;
Таким образом получаются безразмерные массивы, реальный размер которых задается и изменяется в ходе работы программы. Такие массивы принято считать динамическими.
Особенность таких массивов – их индексы всегда начинаются с нулевого элемента.
SetLength(var A, Count): принимает имя переменной открытого массива и устанавливаемое количество элементов.
До тех пор, пока не выполнена установка длины массива, обращаться к его элементам нельзя.
High – возвращает индексный номер последнего элемента массива.
Чтобы освободить память, выделенную под открытый массив, необходимо присвоить переменной массива значение nil. Это означает, что ссылка на данный массив будет недействительной, а сам массив – безразмерно пустым.
Обычно открытые массивы используются в качестве параметров при вызове подпрограмм, что позволяет с помощь одной подпрограммы обрабатывать массивы различной длины.
Пустой открытый массив занимает столько же памяти, сколько и нетипизированный указатель (на 32-битных платформах – 4 байта).
Источник: infopedia.su
Если решение задачи зависит от некоторого условия (структура ветвление), то в программе используется следующая конструкция Укажите правильный вариант ответа:
for . to . do
write . readln
begin . end
If . then . else
while . do
Надо,! напишите процедуру, которая вычисляет площадь произвольного прямоугольника с длинами сторон a и b, где a и b€r.
Информатика, 20.05.2019 00:34
Нужно написать программу на pascale
Информатика, 20.05.2019 10:54
Можно полное решение 17 и 19 вопроса?
Информатика, 21.05.2019 12:10
Напишіть алгоритм створення руху об’єкта на площині з перешкодою
Информатика, 21.05.2019 15:48
Объясните как решать,. в программе «: =» обозначает оператор присваивания, знаки «+», «–», «*» и «/» – соответственно операции сложения, вычитания, умножения и деления. правила выполнения операций и порядок действий соответствует правилам арифметики. определите значение переменной a после выполнения алгоритма: a : = 30 b : = 2 a : = 2- 24/b b : = a-b/3 в ответе укажите одно целое число – значение переменной a.
Источник: otvetovik.com