Similar presentations:
Алгоритмизация и программирование. Лекция 2
1.
Федеральное государственное автономное образовательное учреждение высшегообразования «Крымский федеральный университет имени В.И. Вернадского»
физико-технический институт
алгоритмизация программирование
© Полетаев Дмитрий Александрович, кандидат
физико-математических
наук,
доцент
кафедры
радиофизики и электроники физико-технического
института Крымского федерального университета имени
В.И.
Вернадского
руководитель
студенческого
конструкторского бюро
e-mail: poletaevda@cfuv.ru
https://vk.com/dmltry
2.
краткая история и особенностиязыка си
•разработан Dennis Ritchie в bell labs (с 1969 по
1973)
•первое применение – портирование ос unix на
компьютерную систему PDP-11
достоинства:
•переносимость
•минимализм
•прямой доступ к памяти
•эффективность
2
3.
cведения, необходимые для написанияпрограммы:
структура программы
типы и структуры данных, имеющиеся в алгоритмическом
языке, их описание, допустимые операции
операторы преобразования данных: присваивания, операторы
ввода и вывода.
правила записи алгоритма - программирование основных
алгоритмических структур
язык программирования – инструмент
для решения задач!!!
3
4.
4структура простейшей программы на
любом алгоритмическом языке
заголовок
ограничитель
описания – неисполняемые
инструкции языка
операторы – исполняемые
инструкции языка
ограничитель
5.
5пустой оператор языка си
запись в среде
обозначение
программирования блок-схемы
;
6.
6алфавит языка си
•латинские буквы: A–Z, a–z
•цифры: 0−9
•символ пробела
•управляющие символы: табуляции,
перевод страницы, новая строка, возврат
•каретки
•29 символов, таких как + − , “ / ? и др.
7.
7комментарии в си
в любом месте программы, там, где
может стоять пробел, допускается
запись комментария:
/*не скупитесь писать комментарии к
программам!!!*/
//подумайте о своих товарищах,
//которым эти программы разбирать!!!
8.
8переменные в си
•имена переменных состоят из латинских
букв, цифр и знака подчеркивания (_),
первый символ не может быть цифрой
•имена переменных не могут совпадать с
зарезервированными словами (void, int и др.)
•переменные регистрозависимые, т.е. A и a –
разные переменные
•желательно, но необязательно, чтобы
переменные имени осмысленные названия
9.
9основные типы переменных в си
БАЗОВЫЕ ТИПЫ:
int – целый
float – вещественный одинарной точности
double – вещественный двойной точности
char – символьный
КВАЛИФИКАТОРЫ:
short – короткий
long – длинный
signed – со знаком
unsigned – без знака
10.
целые типы10
тип данных
размер,
байт
2
unsigned int, unsigned,
unsigned short int
int, signed int, short int,
short
unsigned long
long, long int
unsigned char
char, signed char
диапазон значений
0...65535
2
-32768...32767
4
4
1
1
0...4294967295
-2147483648...2147483647
0...255
-128...127
?
зачем такое количество
разных переменных???
вещественные типы
тип данных
размер,
байты
диапазон
порядка
число цифр
мантиссы
float
4
-38...+38
7
double
8
-308...+308
15
long double
10
-4932...+4932
19
11.
11описание переменных в си
тип список_имен_переменных;
тип имя1, имя2,…,имяi,…, имяN;
тип имя=значение /*инициализация переменной*/
Пример:
float a, b=1.5, _b=0.5, b1; int n=10,i=0, j, ik=1;
12.
переменные char в си12
переменная типа char может быть целочисленной и символьной (символы из
таблицы ascii)
13.
13описание констант в си
константы в си — это фиксированные значения, которые не
могут изменяться программой
они могут быть таких же типов, как и переменные
Пример:
const float a=1.0;
const float b=1.5;
const float _b=0.5;
const int n=10;
?
зачем константы, если
можно те же самые
величины задать
переменными???
14.
преобразование данных в сиint a=1;
double b=0;
b=a;
double c=b;
=
int a=0;
double b=1.5;
a=b;
int a=1;
double c=0;
c=(double) a;
?
что тут не так???
14
15.
тема «ввод-вывод» функция printf () в си15
int printf(const char *format, список аргументов для
подстановки);
для различных типов необходимо использовать
различные спецификации преобразования:
%d – для вывода целых чисел;
%c – для вывода символа;
%f – для вывода вещественного числа в виде целой и дробной части;
(для переменной типа double применяется модификатор типа %lf)
%e – для вывода вещественного числа в виде мантиссы и порядка;
%g – для вывода вещественного числа в виде %f или %e в зависимости от
значения числа;
%u – для вывода беззнакового целого числа в десятичной системе
счисления;
%o – для вывода беззнакового целого числа в восьмеричной системе
счисления;
%x – для вывода беззнакового целого числа в шестнадцатеричной системе
счисления;
%s – для вывода символьной строки.
16.
тема «ввод-вывод» функция scanf () в сиint scanf(const char *format, arg-list);
для различных типов необходимо использовать
различные спецификации преобразования:
%d – для ввода целых чисел;
%c – для ввода символа;
%f – для ввода вещественного числа в виде целой и дробной части;
(для переменной типа double применяется модификатор типа %lf)
%e – для ввода вещественного числа в виде мантиссы и порядка;
%g – для ввода вещественного числа в виде %f или %e в зависимости от
значения числа;
%u – для ввода беззнакового целого числа в десятичной системе
счисления;
%o – для ввода беззнакового целого числа в восьмеричной системе
счисления;
%x – для ввода беззнакового целого числа в шестнадцатеричной системе
счисления;
%s – для ввода символьной строки.
16
17.
тема «операторы» в си17
операторы выполняют различные действия для различных типов
переменных!!!
базовые операторы:
арифметические: +, -, *, /, %(остаток от деления)
int a=1;
a=a+1; // сокращенная форма a+=1;
логические: >, >=, <, <=, ==, !=, &&(логическое и), ||(логическое или),
!(отрицание)
побитовые: &(побитовое И), |(побитовое или), ^(исключающее или),
<<(сдвиг влево), >>(сдвиг вправо), ~(дополнение)
пример:
int a=1;
a=a<<2;
18.
тема «операторы» в си++ и – –
прибавление (вычитание) единицы с
последующей записью значения в
переменную
могут находиться перед
переменной(префиксная запись, «сперва
прибавить (вычесть), потом использовать») и
после (постфиксная запись, наоборот)
18
19.
тема «операторы» в сиприоритет операторов
наивысший
самый низкий
() [] -> .
! ~ ++ -- + - * (type) sizeof
*/%
+<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<=
>>=
19
20.
тема «операторы» в си20
дополнительные операторы (находятся в Библиотеке math.h)
#include <math.h> // подключение Библиотеки
sin(x) //– синус (аргумент в радианах);
cos(x) //– косинус (аргумент в радианах);
tan(x) //– тангенс (аргумент в радианах);
asin(x) //– арксинус (результат в радианах);
acos(x) //– арккосинус (результат в радианах);
atan(x) //– арктангенс (результат в радианах);
sinh(x) //– гиперболический синус;
cosh(x) //– гиперболический косинус;
tanh(x) //– гиперболический тангенс;
log10(x) //– десятичный логарифм;
pow10(x) //– возведение числа 10 в степень x;
log(x) //– натуральный логарифм;
exp(x) //– экспонента;
sqrt(x) //– квадратный корень;
pow(x,y) //– возведение x в степень y;
fabs(x) //– абсолютная величина для double;
abs(x) //– абсолютная величина для int
практически все
данные функции
требуют аргумент
типа double!!!
21.
тема «условие» в сине стесняйтесь
if (условие)
ставить больше
{}/ / оператор 1; фигурных
Да
else
скобок!!!
{} // оператор 2;
оператор 1
21
условие?
Нет
оператор 2
пример: определить знак числа
полная форма
int a=4;
if (a>0) {printf (“a>0”);}
else {printf (“a<0”);}
сокращенная форма
int a=4;
a>0 ? printf (“a>0”) : printf (“a<0”);
22.
тема «условие» в сиswitch - выполнение кода при равенстве
выражения одной из численных констант
switch (переменная)
{
case значение_переменной1:
действие 1;
break;
case значение_переменной2:
действие 2;
break;
default:
действие 3;
break;
}
22
эквивалентный код:
if (переменная==
значение_переменной1)
{действие 1;}
else
{
if (переменная==
значение_переменной2)
{действие 2;}
else {действие 3;}
}
23.
тема «циклы» в си23
цикл с параметром
for (expr1; expr2; expr3) {body}
цикл с постусловием
do
{body}
while (expr);
цикл с предусловием
while (expr)
{body}
24.
тема «циклы» в сиfor(инициализация; условие продолжения выполнения
цикла; приращение)
{операторы;}
for(int i = 0; i < 2; i++)
{
}
24
25.
тема «циклы» в сицикл с постусловием
код си:
do
{ тело цикла;}
while (условие);
тело цикла
нет
условие?
да
тело цикла выполняется хотя бы
один раз.
25
26.
тема «циклы» в сицикл с предусловием
код си:
условие?
нет
while (условие)
{ тело цикла;}
да
тело цикла
тело цикла - один оператор, простой или
составной.
тело цикла может не выполниться ни
разу.
26
27.
тема «циклы» в сиинструкции перехода
break;
прерывание всех
итераций
пример:
for(int i=0; i<10; i++) {
scanf(“%d”,&i);
if( i == 5) break;
}
если i равно 5
прерываем цикл
continue;
переход к следующей
итерации
пример:
for(;;) {
scanf(“%d”,&i);
if (i>0) continue;
printf(“%d”, i);
}
выводить введенные
числа кроме 0
27
28.
тема «массивы» в си28
массив – набор элементов одинакового типа расположенных в памяти
подряд (друг за другом)
обращение происходит с применением общего имени
обращение к конкретному элементу осуществляется по индексу
массив является структурой с произвольным доступом (в отличие от
списка).
динамическим называется массив, размер которого может меняться во
время исполнения программы.
динамические массивы делают работу с данными более гибкой, так как
не требуют предварительного определения хранимых объемов данных,
а позволяют регулировать размер массива в соответствии с
реальными потребностями.
статическими называют массивы, размер которых в программе
определен и не может меняться.
массивы с одним индексом называют одномерными, с двумя —
двумерными и т. д.
одномерный массив соответствует вектору, двумерный — матрице.
29.
тема «массивы» в си29
объявление одномерного статического массива
тип имя_массива[размер-константа];
int a[4]; // одномерный статический массив целых чисел длины 4
// нумерация элементов от 0 до 3
номер элемента
0-й
1-й
2-й
3-й
имя элемента
a[0]
a[1]
a[2]
a[3] …
адрес элемента
0108 010a 010c 010e …
int a[10];
a[i] = i*i; // присваивание элемента массива
…
30.
тема «массивы» в сиодномерный массив одномерных массивов.
объявление
тип имя_массива[размер1][размер2];
int b[3][10]; // матрица с 3 строками и 10 столбцами
30
31.
тема «массивы» в симетоды сортировки
сортировка - расположение элементов
множества в порядке расположения
некоторого ключа.
ограничения:
1. рассматриваются внутренние сортировки - все упорядочиваемые
значения помещаются в оперативной памяти.
2. сортируем одномерные массивы.
31
32.
тема «массивы» в сиПРОСТЕЙШИЕ МЕТОДЫ
СОРТИРОВКИ
СОРТИРОВКА
ПОСРЕДСТВОМ ВЫБОРА
ОБМЕННАЯ
СОРТИРОВКА
СОРТИРОВКА
С ПОМОЩЬЮ ПОДСЧЕТА
МЕТОД
ВСТАВОК
32
33.
тема «массивы» в сисортировка выбором
1 шаг. Выбираем наименьший элемент, переставляем его с первым (с
номером 0).
… imin … n-1
a[0] a[1] … a[imin] … a[n-1]
0
1
2 шаг. Среди элементов со 2-го (номер 1) по n-й (номер n-1) выбираем
наименьший элемент, переставляем его со вторым (с номером 1).
… imin … n-1
a[0] a[1] … a[imin] … a[n-1]
0
1
33
34.
тема «массивы» в сисортировка посредством выбора
k-й шаг. Среди элементов со k-го (номер k-1) по n-й (номер n-1) выбираем
наименьший элемент, переставляем его с k-м
(с номером k-1).
0
k-2
k-1
a[0] … a[k-2] a[k-1]
… imin … n-1
… a[imin] … a[n-1]
(n-1)-й шаг. Среди элементов со (n-1)-го (номер n-2) по n-й (номер n-1)
выбираем наименьший элемент, переставляем его с (n-1)-м (с номером n2).
… n-3 n-2 n-1
a[0] … a[n-3] a[n-2] a[n-1]
0
34
35.
тема «массивы» в си35
обменная сортировка
Просмотр массива и сравнение соседних элементов.
a[i]>a[i+1] - инверсия, элементы необходимо поменять местами.
За один просмотр хотя бы один элемент занимает нужное место:
максимальный элемент поднимается «наверх»
«метод пузырька»
Процесс повторяется, пока есть инверсии.
Признак наличия инверсий (флажок):
n-1
…
1, есть _ инверсии
F
0, нет _ инверсий
max
1
0
36.
тема «массивы» в симетод вставок
Элементы просматриваются по одному и каждый вставляется на свое место
среди ранее упорядоченных
1-й шаг
0
…
1
0
1
2
…
1
…
Одно сравнение,
возможен сдвиг
n-1
n-1
2-й шаг
0
(n-1)-й шаг
n-2
n-1
Максимально
2 сравнения, возможен
сдвиг
Максимально
(n-1) сравнение,
возможен сдвиг
36
37.
тема «массивы» в си37
сортировка с помощью подсчета
Предполагается, что в исходном массиве нет равных элементов. Каждый
элемент сравнивается с остальными. Для каждого элемента подсчитывается
число элементов, меньших его
(т.н. ключ). Значение ключа определяет место элемента в упорядоченном
массиве.
0 1 … i … j … n-1
массив a
массив k
(ключи)
0 1 … i … j … n-1
в начале k заполнен
нулями
38.
тема «строки» в систрока – символьный одномерный массив, который
завершается нулевым символом '\0'.
объявляя массив str, предназначенный для хранения
10-символьной строки, следует использовать 11 char
char str[11]; // резервируется место для '\0'
строковый литерал – список символов, заключенный
в двойные кавычки
“hello” // в памяти
“” – нулевая строка, состоит только из '\0'
38
39.
тема «строки» в си39
в Библиотеке stdio.h
ввод строк:
char s[13];
scanf(“%s”, s); // - считывает строку до пробела
gets(s); // – считывает строку, включая пробел
s[1]=getchar(); //– считывает символ, введенный с клавиатуры
sscanf ({массив}, {остальное как в обычном scanf}); //– ввод
значений не с клавиатуры, а из массива (строки)
40.
тема «строки» в си40
в Библиотеке stdio.h
вывод строк:
char s[13];
printf(“%s”, s); // - выводит строку
puts(s); // – выводит строку и переводит курсор на новую строку
putchar(s[1]); //– выводит символ, не переводя курсор на новую
?
зачем отдельные
функции printf и puts???
41.
тема «строки» в си41
в Библиотеке stdlib.h
конвертирование:
char s[13];
int atoi (s); // - строку в целое
long atol (s); // - строку в длинное целое
double atof (s); // - строку в вещественное
обратное преобразование
int i=0;
double d=0;
itoa (i, s, {основание системы счисления}); // - целое в строку
ltoa (I, s, {основание системы счисления}); // - длинное целое в строку
ftoa (d, s); // - вещественное в строку
42.
тема «строки» в сив Библиотеке string.h
char s1[13], s2[13];
int i=strlen (s1);// – выдает длину строки s1, без нулевого символа
strcpy (s1, s2); // – копирует строку s2 в строку s1
(результат записывается в s1)
strncpy (s1, s2, int n); //– делает все тоже самое, что и предыдущая, но в
//количестве n символов
strcat (s1, s2); // – добавляет в строку s1 строку s2
strncat (s1, s2, int n); //– делает все тоже самое, что и предыдущая, но в
//количестве n символов
strcmp(s1, s2); //- сравнивает строки (результат int)
42
43.
тема «файлы» в сифайл – это поименованная совокупность байт
файлы предназначены только для хранения информации, а
обработка этой информации осуществляется только при
переносе в память компьютера
файл, не содержащий ни одного элемента, называется пустым
текстовый файл
бинарный файл
не применяются первые
31 символ кодовой
таблицы ascii, а символы
конца строки 0x13
(возврат каретки, CR) и
0x10 (перевод строки LF)
преобразуются при вводе
в одиночный символ
перевода строки \n
преобразования не
выполняются, чтение
продолжается, пока не
встретится
физический конец
файла
43
44.
тема «файлы» в си44
в Библиотеке stdio.h
FILE *f; // - задание типа переменной «файл»
f=fopen (“путь к файлу”, “доступ”); // - связь указателя на файл и его
физического местоположения, указание режима открытия
режимы открытия:
r (r+) – файл открывается для чтения (чтения и записи);
w (w+) – открывается пустой файл для записи (чтения и записи), если
файл с таким именем существует, он стирается;
a (а+) – файл открывается для дополнения в конец (чтения и дополнения)
режим открытия может также содержать символы t (текстовый файл) и b
(двоичный файл), указывающие дополнительно на вид открываемого
файла: rb, wb, ab, rt, at, rb+, wb+, ab+
fclose(f); // - закрытие файла
rewind(f); // - установка указателя на начало файла
feof(f); // - функция, сигнализирующая о достижении
чем отличается
конца файла
?
r+ от w+???
45.
тема «файлы» в сив Библиотеке stdio.h
чтение из файла
FILE *f; char s[13];
f=fopen (“путь к файлу”, “r”);
fread (s, 1,13,f); // - считывает строку из файла f по одному символу 13 раз
fscanf(f, “%s”, s); // - считывает строку из файла до пробела
fgets(s,13,f); // – считывает строку, длинной 13 символов (включая нулевой
символ) из файла, //включая пробел
s[1]=fgetc(f); //– считывает символ из файла
45
46.
тема «файлы» в сив Библиотеке stdio.h
запись в файл
FILE *f; char s[13];
f=fopen (“путь к файлу”, “w”);
fwrite(s, 1,13,f); // - записывает строку в файл f по одному символу 13 раз
fprintf(f, “%s”, s); // - записывает строку в файл
fputs(s, f); // – записывает строку в файл
fputc(s[1], f); //– записывает символ в файл
46
47.
тема «записи» в сизапись (также называется структурой) –
коллекция объединенных общим
именем переменных, которая
обеспечивает удобное средство
хранения данных в одном месте
запись – составной тип данных
переменные в записи называются
элементами
47
48.
тема «записи» в сиформат описания:
struct имя_записи {
тип имя_элемента1;
…
тип имя_элементаN; } список_переменных;
пример
struct data{char name [30], surname [30];
float bal} a; // a – имя записи
scanf(“%s” ,a.name);
scanf(“%s” ,a.surname);
scanf(“%f” ,a.bal);
48
49.
тема «функции» в си49
функция – часть программы, которая может вызываться из других частей
программы столько раз, сколько необходимо и возвращает значение
переменной
процедура – функция, которая не возвращает значение
функция и процедура являются подпрограммами, выполняющими одну
или несколько инструкций
функции бывают:
стандартные (находящиеся в Библиотеках)
пользовательские (написанные пользователем)
также функции делятся по типу возвращаемых значений: целочисленные,
вещественные, символьные, либо ничего не возвращающие – тип void,
которые можно считать процедурами
примеры функций
printf(“%d”,i); // - стандартная функция, возвращающая число символов,
выведенных на экран (или отрицательное значение при ошибке)
scanf(“%d”,&i); // - стандартная функция, возвращающая число
прочитанных символов (при вводе букв вместо цифр, выдается 0)
50.
тема «функции» в сипреимущества использования подпрограмм:
использование одного и того же код программы для
многих входных значений, что сокращает объем
структурированность кода программы – вся
программа разбивается на связанные блоки
!
новый тип
программирования –
сверхфункциональный!!!
50
51.
тема «функции» в сиимя пользовательской функции – идентификатор,
задаваемый программистом
имена должны составляться также как и переменные
функции должны именоваться и объявляться вне
функции main, но до позиции ее вызова!!!
локальная переменная функции объявляется и
используется только в своей функции. В разных
функциях могут быть одинаковые локальные
переменные
глобальная переменная функции объявляется в
программе и может использоваться в любой функции.
При объявлении в пользовательской функции
глобальной переменной, выдается ошибка
51
52.
тема «функции» в сиаргумент функции – конкретное значение, передаваемое функции при
вызове (может быть локальной и глобальной переменной)
52
параметр – переменная, которая принимает передаваемый функции
аргумент (является только локальной переменной)
пример:
int ( int i; int j) // - пользовательская целочисленная функция, имеющая параметры
i и j, которым будут переданы аргументы m и n, соответственно
{
int y=0; // - локальная переменная пользовательской функции
y=i*j; // - выполняемое действие в функции
return y; // - возвращаемое значение пользовательской функции
}
int k=0; // - глобальная переменная;
int main() // - стандартная функция
{
int m=0,n=0; // - локальные переменные стандартной функции
?
может ли
параметр
не равняться
аргументу???
k =f (m, n); // - вызов пользовательской функции f с аргументами m и n
return 0; // - возвращаемое значение стандартной функции
}
53.
тема «функции» в сирекурсия подпрограммы – это вызов подпрограммы из неё же самой,
непосредственно (простая рекурсия) или через другие подпрограммы
(сложная рекурсия). Количество вложенных вызовов функции или
процедуры называется глубиной рекурсии.
53
54.
тема «функции» в сиобщий вид рекурсии:
если (простейший случай) тогда
решить напрямую
иначе
делать рекурсивный вызов до появления простейшего
случая
пример:
int factorial (int n)
{
if (n == 0)
{
return 1; // - простейший случай
}
else
{
int value = factorial(n - 1); // - рекурсивный вызов
return n * value;
}
}
54
55.
тема «программно-аппаратные аспекты» в си 55контроллер lpt
порта
RAM
CPU
параметры lpt:
ttl-логика («0» - 0 В, «1» - 5 В)
ток нагрузки не более 14 мА
8 выходов
5 входов
адреса в памяти:
для записи: h378
для чтения: h379
56.
тема «программно-аппаратные аспекты» в си 56R=(Ui-Us)/I
при подключении Библиотеки
inpout32.dll
доступ к lpt порту производится с помощью функций:
Inp32(short addr); // - чтение данных из lpt по адресу addr
Out32(addr, data); // - запись в lpt данных data по адресу addr
57.
благодарю завнимание!!!
вопросы???
programming