Основы программирования

Содержание

Слайд 2

4.2. Унарные Оператор побитового отрицания – «~». Пример 21. int x=6;

4.2. Унарные

Оператор побитового отрицания – «~».

Пример 21.

int x=6; /* 0110

*/
int y=x&~3; /* 0110&~0011=0110&1100=0100 */
Слайд 3

5. Операторы присваивания Простейший оператор присваивания: = - переменная - выражение

5. Операторы присваивания

Простейший оператор присваивания:
=

- переменная
- выражение

Оператор

присваивания – бинарный, инфиксный.

Семантика: значение выражения, в которое входит присваивание, является значением левого операнда после присваивания.

Пример 22.

b=a;
a=b=c=0; // многократное присваивание
// (a=(b=(c=0)))

Слайд 4

Остальные операторы присваивания имеют следующий вид: = - бинарный оператор: +,

Остальные операторы присваивания имеют следующий вид:
=

- бинарный оператор: +,

-, /, *, %, &, |, ^, <<, >>.

Выполнение:
=

Значки операторов присваивания: +=, /=, *=, -=, %=, <<=, >>=, |=, ^=, &=.

Пример 23.

int x=6, y=10;
y*=x; //y=60

модифицируется с помощью оператора и и записывается в .

Слайд 5

int z, x8, y8, z8; x=15; x8=015; y=8; y8=07; z=5; z8=05;

int z, x8, y8, z8;
x=15; x8=015;
y=8; y8=07;
z=5; z8=05;
x+=2; /*x=17*/
y-=7; /*y=1*/
z*=4; /*z=20*/
z/=2; /*z=10*/
z%=3; /*z=1*/
x8<<=2; /*x8=064*/
y8>>=1; /*y8=3*/
x8|=03; /*x8=067*/
x8^=07; /*x8=060*/

Слайд 6

!!! Все операторы присваивания правоассоциативные. x/=a+b ? x=x/(a+b) 6. Инкрементные и

!!! Все операторы присваивания правоассоциативные.

x/=a+b ? x=x/(a+b)

6. Инкрементные и декрементные

операторы

Инкрементный – «++»: добавляет 1 к операнду.

Декрементный – «--»: вычитает 1 из операнда.

Префиксный «++» («--») увеличивает (уменьшает) операнд до его использования.

Постфиксный «++» («--») увеличивает (уменьшает) операнд после его использования.

prio(=) < prio(всех ранее рассмотренных операторов).

Слайд 7

Пример 24. int x=2, y, z; y=x++; //1) y=x; 2) x=x+1;

Пример 24.

int x=2, y, z;
y=x++; //1) y=x; 2) x=x+1; y=2, x=3
z=++x;

//1) x=x+1; 2) z=x; x=3, z=3;

!!! Эти операторы можно применять только к переменным, но не к выражениям и константам.

Пример 25.

y++; --x; //верно
(y+x)++; //неверно
1++; //неверно

Слайд 8

7. Условный оператор (?) (условное выражение) Синтаксис: ? : Семантика: 1)

7. Условный оператор (?) (условное выражение)

Синтаксис:

?:

Семантика:

1) Вычисляется значение первого выражения

2)

Если =«истина», то значение оператора =

3) Иначе значение оператора =

Слайд 9

7. Преобразование типов Преобразование (приведение) типов: приведение операндов разных типов к

7. Преобразование типов

Преобразование (приведение) типов: приведение операндов разных типов к

некоторому общему.

Пример 26. Присвоить в переменную abs_x модуль переменной х.

abs_x = (x>=0)? x : -x;

Слайд 10

1) для бинарных операторов Правила приведения операндов к общему типу: тип

1) для бинарных операторов

Правила приведения операндов к общему типу:

тип результата

определяется типом того операнда, который занимает наибольшее место в памяти:

а) если один из операндов имеет тип long double, то и второй операнд приводится к этому типу;

б) если … double, то … double;

в) если … float, то … float;

д) если … short или int, то … int;

г) если … long, то … long;

Библиотека работает с типом данных double.

Слайд 11

2) при присваивании значение правой части приводится к типу левой части,

2) при присваивании

значение правой части приводится к типу левой части,

это и будет типом результата:

а) char -> int (размножением знакового разряда)

б) int -> short
int -> char
long -> short
long -> int
long -> char

Отбрасыванием старших разрядов

в) float -> int
int -> float

Преобразованием типа: ПТ <-> целое

г) double -> float (округлением/
отбрасыванием)

Слайд 12

4) явное задание приведения типов: Используется оператор ( )е, где е

4) явное задание приведения типов:

Используется оператор (<имя_типа>)е, где е – выражение.

3)

при вызове функции;

Когда ни одно из вышеуказанных правил не выполняется, то используется оператор <тип>, который задаёт явное преобразование к явному типу данных.

Слайд 13

Свойства оператора явного приведения типа: - унарный; - префиксный; - правоассоциативный.

Свойства оператора явного приведения типа:

- унарный;

- префиксный;

- правоассоциативный.

Пример 27.

int

x=16;

double y=sqrt((double)x);

На самом деле по правилам вызова функций целочисленный аргумент x автоматически будет приведен к типу данных, который требует аргумент функции sqrt.

Слайд 14

Сводная таблица приоритетов операторов

Сводная таблица приоритетов операторов

Слайд 15

Слайд 16

В таблице: операторы в одной строке с одинаковым приоритетом; - строки

В таблице:

операторы в одной строке с одинаковым приоритетом;

- строки –

по убыванию приоритетов;

- ассоциативность:
Л – левоассоциативный (выполнение слева направо);
П – правоассоциативный (выполнение справа налево);

Слайд 17

УПРАВЛЕНИЕ В Си 1. Инструкции и блоки Если в конце выражения

УПРАВЛЕНИЕ В Си

1. Инструкции и блоки

Если в конце выражения

поставить «;», то выражение становится инструкцией.

<инструкция>::=<выражение>;

Управление – определенный порядок выполнения вычислений в программе.

Пример 28:
x=0 j++ /* выражения */
x=0; j++; /* инструкции */

Слайд 18

::= { [ ] ; …………………. ; } Составная инструкция (блок)

<блок>::= {
[<декларация>]
<инструкция1>;
………………….
<инструкция n> ;
}

Составная

инструкция (блок) – это последовательность описаний (деклараций) и инструкций.

Заключаются внутрь { }.

Семантически блок воспринимается как единая инструкция.

Слайд 19

2. Инструкция if – else if( ) ; else ; или

2. Инструкция if – else

if(<выражение>) <инструкция1>;
else <инструкция2>;

или

if(<выражение>) <инструкция1>;

Синтаксис:

Семантика:

Вычисляется значение

выражения <выражение>. Если значение выражения истинно, то выполняется <инструкция1>, если ложно – то <инструкция2>.
Слайд 20

Пример 29. Вариант 1. int a,b,c; /* Исходные данные */ int

Пример 29. Вариант 1.

int a,b,c; /* Исходные данные */
int x;

/* Результат */
……..
if (a>b)
if (a>c)
x=a;
else
x=c;
else
if(b>c)
x=b;
else
x=c;
Слайд 21

Пример 30. Вариант 2. int a,b,c,x; …….. x=a; if (b>x) x=b;

Пример 30. Вариант 2.

int a,b,c,x;
……..
x=a;
if (b>x) x=b;
if (c>x) x=c;

3. Переключатель

switch

switch (<выражение>) {
case <константное выражение1>: <инструкции 1>;
case < константное выражение n>: <инструкции n>;
default: <инструкции>;
}

Слайд 22

Используется для разветвления алгоритма более чем на 2 направления. Каждая ветвь

Используется для разветвления алгоритма более чем на 2 направления.

Каждая ветвь case

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

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

Если ни одна из констант не подходит, то выполняется ветвь, помеченная default.

Слайд 23

Ветвь default необязательна, и если ее нет, то ничего не вычисляется.

Ветвь default необязательна, и если ее нет, то ничего не вычисляется.


Ветви case и default можно размещать в любом порядке.

Поскольку выбор любой из ветвей case выполняется как переход на метку, то после выполнения одной ветви case, программа переходит к выполнению следующей ветви.

Если нужно завершить выполнение оператора switch, то ветвь case следует завершить оператором break.

Слайд 24

Пример 31. Вариант 1. if (j==1 || j==3 || j==5 ||

Пример 31. Вариант 1.

if (j==1 || j==3 || j==5 || j==7

|| j==8 || j==10 || j==12) kd=31;
else
if (j==2) kd=28;
else kd=30;

Пример 32. Вариант 2.

switch (j) {
case 1: kd=31; break;
case 2: kd=28; break;
case 3: kd=31; break;
…………………………….
case 12: kd=31; break;
default: printf("Ошибка"); }

Слайд 25

Пример 33. Вариант 3. switch (j) { case 1: case 3:

Пример 33. Вариант 3.

switch (j)
{
case 1: case 3: case

5: case 7: case 8:
case 10: case 12:
kd=31;
break;
case 4: case 6: case 9: case 11:
kd=30;
break;
case 2:
kd=28;
break;
default: printf(”Ошибка”);
}
Слайд 26

На блок-схеме оператор switch изображается следующим образом:

На блок-схеме оператор switch изображается следующим образом:

Слайд 27

Слайд 28

Слайд 29

while ( ) ; Вычисляется . Если оно отлично от 0

while (<выражение>)
<инструкция>;

Вычисляется <выражение>.

Если оно отлично от 0 (истинно), то

выполняется <инструкция> и переход на проверку выражения.

Как только <выражение> станет равным 0, цикл while завершается.

Тело цикла может быть блоком.

6. Цикл while

Это цикл с неизвестным количеством повторений, с предусловием.

Слайд 30

Пример 34. е в степени х (с точностью eps) float exp,s,eps,x;

Пример 34. е в степени х (с точностью eps)

float exp,s,eps,x;
int

i,n;
………………………………………… /* Ввод х */
exp=1; n=1; i=1; S=x;
while (s/n>eps)
{
exp+=s/n;
i++;
n*=i;
s*=x;
}
Слайд 31

7. Цикл for Это цикл с известным числом повторений for (

7. Цикл for

Это цикл с известным числом повторений

for (<выражение

1>; <выражение 2>; <выражение 3>)
<инструкция>;

Семантика:

< выражение 1>;
while(<выражение 2>)
{
< инструкция>;
< выражение 3>;
}

Слайд 32

- инициализация счётчика цикла и других переменных. - условие завершения цикла.

<выражение 1> - инициализация счётчика цикла и других переменных.

<выражение 2> -

условие завершения цикла.

<выражение 3> - изменение значения счётчика цикла (и других переменных).

!!! Любое из этих 3 выражений может отсутствовать, но ‘;’ должна быть обязательно.

Бесконечный цикл:
for( ; ;)
{……...}

Слайд 33

Особенности цикла for в языке Си: 1) переменная цикла и ее

Особенности цикла for в языке Си:

1) переменная цикла и ее предельное

значение могут изменяться внутри цикла;

2) по завершению цикла переменная цикла определена;

3) в выражениях 1, 2 и 3 может быть использовано более одного выражения, разделенных оператором ‘,’.

‘,’ – бинарный, инфиксный, левоассоциативный оператор.

Слайд 34

Пример 35. Сумма элементов массива #define N 10 float X[N], S;

Пример 35. Сумма элементов массива

#define N 10
float X[N], S;
int i;
………………………………..
/* Вариант

1 */
S=0;
for (i=0; i S+=X[i];
/* Вариант 2 */
for (S=0, i=0; i S+=X[i];
Слайд 35

/* Вариант 3 */ for (S=0, i=0; i S+=X[i++]; /* Вариант

/* Вариант 3 */
for (S=0, i=0; i S+=X[i++];
/* Вариант 4

*/
i=S=0;
for (; i S+=X[i++];
Слайд 36

Пример 36. Реверсирование элементов массива 0 1 2 3 4 #define

Пример 36. Реверсирование элементов массива

0 1 2 3 4

#define

N 10
…………….
float x[N];
int i, j;
float r;
…………….
Слайд 37

for (i=0, j=N-1; i { r=x[i]; x[i]=x[j]; x[j]=r; } 8. Цикл

for (i=0, j=N-1; i{
r=x[i];
x[i]=x[j];
x[j]=r;
}

8. Цикл do-while


Цикл с неизвестным числом повторений, с постусловием.

do <инструкция>; while (<выражение>);

Слайд 38

Семантика. 1. Выполняется . 2. Вычисляется значение . 3. Если истинно

Семантика.

1. Выполняется <инструкция>.

2. Вычисляется значение <выражения>.

3. Если <выражение> истинно (не равно

0), то снова переходим на пункт 1. Если <выражение> равно 0 (ложно) – конец цикла.

Пример 37. Проверка на корректность ввода

#include
int a, er;
do {
printf("Введите длину стороны треугольгика: ");