Вы находитесь на странице: 1из 14

Лабораторная работа № 1

Программирование алгоритмов линейной, ветвящейся


и циклической структуры

Цель и задача работы: научиться использовать стандартные функции и


арифметические операторы; изучить операторы отношения и присваивания, логические
операции, условный оператор и оператор-переключатель; научиться использовать в
программах операторы цикла. Написать программы на изученные темы.

Теоретические положения

Алгоритмом линейной структуры называется алгоритм, который состоит из


последовательно (один за другим) выполняющихся операторов и функций.
Операторы предназначены для описания действий, которые будут выполнены при
реализации алгоритма. В программе операторы отделяются друг от друга символом
«;».Точка с запятой не является частью оператора, это разделитель операторов.
Операция присваивания – это операция, которая состоит из идентификатора
переменной, символа присваивания «=» и выражения.
Выполнение операции присваивания приводит к вычислению значения,
определяемого выражением, и присваивания этого значения переменной, стоящей слева
от символа присваивания.
Операндом называется то, над чем производится действие.
Комбинация знаков операций и операндов, результатом которой является
отдельное значение, называется выражением. Знаки операций определяют действия,
которые должны быть выполнены над операндами. Операнды могут быть представлены
выражениями.
Выражение в программировании служат для определения действий, которые в
математике обычно описываются формулами. По количеству операндов операции в
языке С делятся на унарные, бинарные и тернарные. Унарные операции имеют только
один операнд, перед которым располагается символ операции.
Например: -(-9). Результат этого выражения: 9.
Большинство операций являются бинарными и содержат два операнда между
которыми ставится знак операции.
Например: 5+7 . Результат этого выражения: 12.
1
В языке программирования С предусмотрено две категории арифметических
операций : мультипликативные (*,/,%) и аддитивные (+,-).

Операции над числами:

Операции над числами сведены в следующую таблицу:

- - вычитание
+ - сложение
/ - деление
* - умножение
% - взятие остатка от деления (только над целыми
числами )

Операции отношения

Операции отношения представлены в следующей таблице:

< - меньше
> - больше
<= - меньше или равно
>= - больше или равно
== - равно
!= - не равно

Приоритет операций

Приоритет операций учитывается как:

1. Выражения в скобках;
2. Унарные операции;
3. Мультипликативные операции;
4. Аддитивные операции.

Некоторые стандартные функции

Приведем список некоторых стандартных функций языка Си:

2
#include<math.h> /*Библиотека, в которой описываются математические функции */

Нижеописанные функции требуют подключения в программу этой библиотеки.

Возведение значения х в степень y


/* Возвращает значение типа double (аргумент также
double pow(double x, double y);
должен иметь тип double) */
Извлечение квадратного корня из x
/* Возвращает значение типа double (аргумент также
double sqrt(double x);
должен иметь тип double) */
Вычисление тригонометрических функций
double sin(double x);
/* Возвращают значение типа double (аргумент также
double cos(double x);
должен иметь тип double) */
double tan(double x);
Вычисление обратных тригонометрических функций
double asin(double x);
/*Возвращают значение типа double (аргумент также
double аcos(double x);
должен иметь тип double) */
double atan(double x);

Вычисление логарифмических функций


double log(double x); /* натуральный логарифм(по основанию e) */
/* десятичный логарифм(по основанию 10).
double log10(double x) Возвращают значение типа double (аргумент также должен
иметь тип double) */
Вычисление экспоненты
/* Вычисляет значение функции ех. Возвращают значение
double exp(double x); типа double (аргумент также должен иметь тип double)
*/
Вычисление абсолютного значения
/* Библиотека, где описываются функции вычисляющие
#include<stdlib.h>
абсолютное значение аргумента */
/* Возвращает значение типа int (аргумент также должен
int abs(int x);
иметь тип int ) */
/* Возвращает значение типа double (аргумент также
double fabs(double x);
должен иметь тип double) */
/* Возвращает значение типа long(аргумент также должен
long labs(long x);
иметь тип long) */

3
Операторы присваивания и отношения

Для работы с логическими переменными в языке программирования С


определены логические операции (! – логическое НЕ, && – логическое И , || –
логическое ИЛИ) и операции отношения.
Результатом логической операции является либо 0 (ЛОЖЬ), либо 1 (вообще говоря
любое значение не равное 0) (ИСТИНА). Так как в языке программирования С нет
логических переменных, то тип результата – int.

Таблица истинности для логических операций с операндами А и В.

А В !A !B A&&B A || B
1 1 0 0 1 1
1 0 0 1 0 1
0 1 1 0 0 1
0 0 1 1 0 0

Операции отношения сравнивают первый операнд со вторым и вырабатывают


значение 1 (ИСТИНА) или 0 (ЛОЖЬ). Результат имеет тип int.
Различают следующие операторы отношения:
< Первый операнд меньше, чем второй операнд
> Первый операнд больше, чем второй операнд
<= Первый операнд меньше или равен второму операнду
>= Первый операнд больше или равен второму операнду
== Первый операнд равен второму операнду
!= Первый операнд не равен второму операнду

Операнды операций отношения (как и операнды логических операций) могут


иметь целый тип, тип чисел с плавающей точкой, либо быть указателями. Типы первого
и второго операндов могут различаться. Над ними выполняются преобразования по
умолчанию.(Над операндами логических операций преобразования по умолчанию не
производятся).
В языке программирования Си используют также поразрядные (побитовые)
операции, выполняющие над разрядами своих операндов логические функции И (&),
включающее ИЛИ ( | ) и исключающее ИЛИ (^ ). Операнды поразрядных операций
должны иметь целый тип, но бит знака, если он есть, также участвует в операции. Над
операндами выполняются преобразования по умолчанию. Тип результата определяется
типом операндов после преобразования. Таблица значений для поразрядных операций
4
X Y X|Y X&Y X^Y
0 0 0 0 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0

В языке Си имеются следующие операции присваивания:


= Простое присваивание
*= Умножение с присваиванием
/= Деление с присваиванием
%= Остаток от деления с присваиванием
+= Сложение с присваиванием
-= Вычитание с присваиванием
<< = Сдвиг влево с присваиванием
>> = Сдвиг вправо с присваиванием
&= Поразрядное И с присваиванием
| = Поразрядное включающее ИЛИ с присваиванием
^= Поразрядное исключающее ИЛИ с присваиванием

При присваивании тип правого операнда преобразуется к типу левого операнда. В


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

Операции инкремента (++) и декремента (--)

Эти операции являются унарными операциями присваивания. Они соответственно


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

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

В разветвляющихся вычислительных процессах отдельные этапы вычисления


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

5
Формат оператора:

if( < выражение > )


<оператор 1>
[else
<оператор 2> ]

Тело условного оператора if выполняется в зависимости от значения


<выражения>. Сначала вычисляется <выражение>. Если его значение истинно (не
равно нулю), то выполняется <оператор 1>. Если же это значение ложно, то
выполняется <оператор 2>, непосредственно следующий за ключевым словом else. Если
значение <выражения> ложно, но конструкция else опущена, то управление передается
на оператор, следующий в программе за оператором if. В этом случае условный оператор
является сокращенным.
Оператор if может быть вложен в <оператор 1> или < оператор 2> другого
оператора if. При вложении операторов if рекомендуется для ясности группирования
операторов использовать фигурные скобки, ограничивающие <оператор 1> и
<оператор 2>. Если фигурные скобки отсутствуют, то компилятор ассоциирует каждое
ключевое слово else с ближайшим оператором if .

Примеры:

/* пример со скобками */ /* пример без скобок */


if (i >0) if ( i >0 )
{ if ( j > i )
if ( j > i ) x = j;
x = j; else
} x = i;
else
x = i;

В первом случае при i <=0 переменной х присвоится значение i, во втором случае


ей ничего не присваивается.
Имеется одна тернарная операция – условная. Она имеет следующий синтаксис:

<операнд 1> ? <операнд 2> : <операнд 3>

Выражение <операнд 1> вычисляется и сравнивается с нулем. Оно может иметь


целый, действительнозначный тип, либо быть указателем. Если <операнд 1> имеет
ненулевое значение, то вычисляется <операнд 2> и результатом условной операции
6
является его значение. Если же <операнд 1> равен нулю, то вычисляется <операнд > и
результатом является его значение.
В любом случае вычисляется только один из операндов, <операнд 2> или
<операнд 3>, но не оба.

Пример:

j = ( i < 0 ) ? ( -i ) : ( i );

В примере j присваивается абсолютное значение i. Если i меньше нуля, то j


присваивается –i. Если i больше или равно нулю, то j присваивается i .

Оператор переключатель

В некоторых случаях вместо условного оператора if более удобно использовать


оператор-переключатель switch , предназначенный для выбора одного из нескольких
альтернативных путей выполнения программы. Его формат имеет следующий вид:

switch ( <выражение> )
{
[ <объявление> ]
...
[case <константное выражение>:]
[ <оператор> ]
...
[case <константное выражение>:]
[ <оператор> ]
...
...
[default:
< оператор> ]
}

В теле переключателя содержатся конструкции case < константное выражение>:,


которые синтаксически представляют собой метки операторов. Выполнение оператора
начинается с вычисления значения <выражения>. Управление передается тому
оператору, значение константного выражения (константы варианта ) которого совпадает
со значением выражения константы оператора .Если ни одна из констант варианта не
равна значению выражения переключателя, то выполняется оператор, следующий за

7
ключевым словом default. Когда данное слово опущено, ни один оператор в теле
переключателя не выполняется, и управление передается на оператор, следующий за
переключателем в программе.
Такие компоненты оператора switch, как case и default существенны только при
начальной проверке, когда выбирается оператор для выполнения в теле переключателя.
Все операторы, следующие за выбранным выполняются последовательно, пока какой-
либо из них не передаст управление за пределы оператора switch. Для выхода из тела
переключателя обычно используют оператор разрыва break.
Пример:
switch ( i )
{
case -1:
n++;
break;
case 0:
z++;
break;
case 1:
p++;
}

В примере при i , равном -1, переменная n инкрементируется. Оператор break,


следующий за оператором n++, вызывает передачу управления за пределы тела
переключателя, минуя остающиеся операторы. Аналогично, при i=0 инкрементируется
только переменная z.

Оператор for

Оператор цикла for имеет следующий формат:

for ([ выражение инициализации ]; [ условное выражение ];[ выражение


итерации ])
{
оператор;
...
}

Выражение инициализации используется для установки начального значения


переменных, управляющих циклом. Условное выражение – это выражение,
определяющее условие, при котором операторы цикла будут выполняться. Выражение
8
итерации определяет изменения переменных, управляющих циклом после каждого его
выполнения.

Схема выполнения оператора for:


1. Вычисляется выражение инициализации;
2. Вычисляется условное выражение;
3. Если значение условного выражения равно 1 (истина), выполняются
операторы цикла. Операторы могут быть либо пустыми, либо простыми,
либо составными;
4. Вычисляется выражение итерации;
5. Вновь вычисляется условное выражение;
6. Как только условное выражение становится равным нулю (ложным),
управление передается на оператор, следующий за оператором for.

Пример:
#include<stdio.h>
main( )
{
int i;
for (i=0;i<10;i++)
printf(“ квадрат числа %d =%d\n”, i, i*i);
}

В этой программе вычисляются квадраты чисел от 0 до 9.


Существенно то, что проверка условия всегда выполняется в начале цикла. Это
означает, что цикл может ни разу не выполниться, если условное выражение сразу
окажется ложным.
Допускаются некоторые варианты оператора for. Можно использовать несколько
переменных управляющих циклом.
Например:
for (int i=0; j=100; i<j; i++, j--);
{
оператор;
...
}

9
Этот цикл будет выполняться до тех пор, пока i<j.
Другим вариантом использования оператора for является бесконечный цикл. Для
организации бесконечного цикла можно использовать пустое условное выражение в
заголовке оператора for.
Пример простейшего бесконечного цикла:

for (;;) {операторы}

Для выхода из такого цикла обычно используется оператор break.


Так как по синтаксису языка Си оператор может быть пустым, тело оператора for
также может быть пустым. Такой формат оператора может использоваться для
организации задержки выполнения.
Например:
for (i=0; i<100000; i++);

Оператор while

Оператор цикла while имеет следующий формат:

while ( выражение )
{
оператор;
...
}

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


Схема выполнения оператора while:
1. Вычисляется выражение;
2. Если выражение ложно (равно нулю), то тело оператора while не
выполняется, а управление передается на следующий за while оператор;
3. Если выражение истинно (1), то тело оператора while выполняется;
4. Процесс повторяется с пункта 1.

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

10
Оператор do…while

Оператор цикла do используется в тех случаях, когда тело цикла должно


выполниться хотя бы один раз.
Формат оператора do:

do
{
оператор;
...
}
while ( выражение );

Схема выполнения оператора do:


1. Выполняется оператор.
2. Вычисляется выражение.
3. Если выражение не равно нулю (истинно), то выполнение продолжается с
пункта 1. Если выражение ложно, то управление передается следующему
после while оператору программы.

Преждевременный выход из цикла может осуществляться при помощи оператора


break. После использования оператора break управление передается следующему после
цикла оператору программы. Оператор continue, в отличие от break, передает
управление на следующую итерацию цикла.
Циклическая структура может быть реализована при помощи операторов if и goto.
Однако этого делать нежелательно, так как используя оператор goto можно очень сильно
запутать программу.

Варианты заданий

1. Задания по теме «Алгоритмы линейной структуры»

1. В заданном целом числе записать цифры в обратном порядке.


2. Вычислить дробную часть среднего арифметического двух заданных
положительных вещественных чисел.
3. Вычислить периметр, площадь и гипотенузу прямоугольного треугольника по
11
заданной длине одного из катетов и противолежащему ему углу (в градусах).
4. По длине двух сторон треугольника и углу между ними (в градусах) найти длину
третьей стороны и площадь этого треугольника.
5. Вычислить периметр и площадь правильного n- угольника, вписанного в
окружность радиуса R (n - целого типа, R - вещественного типа).
6. Представить комплексное число z=a+bi (a, b вещественные) в геометрической
форме.
7. Задан вектор с координатами (x1,y1) и (x2,y2). Определить угол наклона вектора к
оси OX
8. Для заданного x вычислить значение функции y=ctg x , где x (0, 2 ).
9. Вычислить значение функции y=tg x , где x(0, 2π) в заданной точке x.
10. Окружность вписана в квадрат (задана площадь этого квадрата) найти площадь
квадрата, вписанного в эту окружность, во сколько раз площадь уменьшилась.
11. Вычислить расстояние между двумя точками с заданными координатами (x1,y1) и
(x2,y2). Определить угол наклона прямой, проходящей через эти точки, к оси OY.
12. Заданы два вектора с координатами (x1,y1,z1) и (x2,y2,z2).Определить угол между
векторами.

2. Задания по теме: «Ветвящиеся алгоритмы»

1. По координатам трех вершин треугольника найти его площадь и периметр, если


такой треугольник может существовать.
2. Решить уравнение ax2+bx+c=0 (a,b,c - заданные коэффициенты) в области
действительных чисел (без использования теор. Виета).
3. Решить уравнение ax2+bx+c=0 (a,b,c - заданные коэффициенты) в области
действительных чисел (с использованием теор. Виета).
4. Для заданных вещественных чисел a и b определить максимальное и минимальное
число.
5. Определить, равна ли сумма двух первых разрядов заданного четырехзначного
целого числа, сумме двух его последних разрядов.
6. Определить, есть ли среди цифр заданного n - значного целого числа одинаковые
цифры .
7. Даны три произвольных вещественных числа. Требуется определить, можно ли
построить треугольник с такими длинами сторон.
8. Даны координаты (целого типа от 1 до 8) двух полей шахматной доски.
12
Определить, может ли конь за один ход перейти с одного из этих полей на другое.
9. Определить, есть ли среди первых n цифр заданного целого числа цифра k.
10. Вычислить значение функции от двух аргументов:
 y = x * sin t , x  0

 y = x * cos t , x  0
 y = 5, x = 0

причем х, t – вводятся с клавиатуры.
11. Определить сколько корней имеет уравнение квадратного трехчлена вида
ax 2 + bx + c = 0 , причем коэффициенты a,b,c вводятся с клавиатуры.
12. Определить максимальное и минимальное число из трех введенных пользователем
чисел.

3. Задания по теме: "Циклические алгоритмы"

1. Вычислить первые n чисел ряда Фибоначчи (ряд Фибоначчи - это числа равные
сумме двух предыдущих чисел: 1,1,2,3,5,8,13,...)
2. Определить, сколько цифр содержит заданное целое число и имеются ли в нем
повторяющиеся цифры.
3. Вычислить f =n!, в программе описать тремя вариантами циклов.
4. Найти два числа Фибоначчи, удовлетворяющие условию при заданном m:
ф(i)<m<ф(i+1), вывести эти числа и их порядковые номера.
5. Не используя стандартные функции, вычислить с точностью e >0
y(x) =ln(1+x)=x-x2/2+x3/3-...+(-1)nxn/n (0<x<1).
6. Не используя стандартные функции, вычислить с точностью e >0 y(x)=cos x =1-
x2/2!+x4/4!-...+(-1)nx2n/(2n)!, (0<x<1).
7. Вычислить количество точек с целочисленными координатами, находящихся в
круге радиуса r (r>0) с центром в точке A(x, y).
8. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи
которых нет одинаковых цифр (операцию деления не использовать).
9. Вычислить k-тое число последовательности целых простых чисел (где k>1).
10.Найти сумму четных чисел в интервале от m до n. Числа m и n задаются при
вводе.
11. Вывести на экран факториал четных чисел в промежутке от 1 до n, при заданном
n.
12. Вывести на экран все буквы алфавита, коды, которых кратны пяти.

13
Таблица для выбора номера задания по теме
в соответствии с номером варианта, заданным преподавателем

Номер задания в теме Номер задания в теме


№ вар. № вар.
1 2 3 1 2 3
1 9 1 4 16 7 11 3
2 2 6 6 17 10 11 10
3 8 5 2 18 5 10 11
4 7 1 4 19 7 9 6
5 10 3 10 20 6 11 10
6 11 3 9 21 5 6 5
7 9 7 11 22 1 1 5
8 2 10 11 23 3 11 11
9 6 7 2 24 10 9 7
10 9 6 10 25 2 11 9
11 3 11 2 26 10 2 10
12 11 8 1 27 2 11 3
13 5 11 9 28 4 1 7
14 1 5 4 29 2 1 5
15 1 2 11 30 3 9 10

14