Слайд 1Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Факультет электротехники и автоматики
Программирование
и
основы
алгоритмизации
Шевченко Алексей Владимирович
Кафедра РАПС
Санкт-Петербург, 2010 г.
Слайд 2Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
1
Тема 1. Типы
данных, адресация
Шевченко А. В.
char
double
long*
short
Слайд 3Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
2
Классификация типов данных
Шевченко
А. В.
Типы данных
Простые
Составные
Целые
Вещественные
Массивы
Объединения
Структуры
Слайд 4Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
3
Целые типы данных
Шевченко
А. В.
Тип
char
Размер
Диапазон
1
-128 … 127
unsigned char
1
0 … 255
short
2
-32768 … 32767
unsigned short
2
0
… 65535
long
4
-231 … 231-1
unsigned long
4
0 … 232-1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
unsigned char
char
Знаковый разряд (0 = +, 1 = -)
int - зависит от платформы
11111111 = 255 00000000 = 0
01111111 = 127
00000000 = 0
11111111 = -1 10000000 = -128
0
7
Слайд 5Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
4
Вещественные типы данных
Шевченко
А. В.
Тип
float
Размер
Диапазон
4
3.4*10-38 … 3.4*1038
double
8
1.7*10-308 … 1.7*10308
long double
10
3.4*10-4932 … 3.4*104932
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
float
Знаковый разряд
(0 = +, 1 = -)
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
15
31
16
порядок
мантисса
Число = (1+мантисса)*2(порядок-127)
мантисса
Точность
7
15
19
Слайд 6Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
5
Адресация. Архитектура компьютера
Шевченко
А. В.
Центральная часть
Периферийные устройства
Процессор
Оперативная
память
Устройства ввода-вывода
Диски
Ленты
...
Слайд 7Оперативная память
Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
5
Адресация. Процессор
и память
Шевченко А. В.
Процессор
Регистр
Регистр
Регистр
Регистр
Программный счетчик
Указатель стека
АЛУ
00000000
00000001
00000002
00000003
00000004
…
адрес
Архитектура процессора: разрядность, система команд
Слайд 8Оперативная память
Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
6
Адресация. Адресное
пространство
Шевченко А. В.
Процессор
Регистр
Регистр
Регистр
Регистр
PC - программный счетчик
SP - указатель стека
АЛУ
00000000
00000001
00000002
00000003
00000004
…
Адресное пространство:
16
бит = 64К, 32 бита = 4М
команды
данные
Слайд 9Виртуальное адресное пространство
Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
7
Адресация.
Образ задачи
Шевченко А. В.
Образ задачи
Данные
Код
Стек
Регистры
00000000
00000001
00000002
00000003
00000004
…
Образ задачи создается компилятором и построителем
в виртуальном адресном пространстве
Слайд 10Виртуальное адресное пространство
Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
7
Адресация.
Переменные. Указатели
Шевченко А. В.
Текст программы
short a;
unsigned
char b = 3;
short *p = &a;
...
a = 5;
*p = 5;
00000000
00000001
00000002
00000003
00000004
…
Компилятор размещает переменные и присваивает адреса:
адрес а = 00000000
адрес b = 00000002
адрес р = 00000004
содержимое а = ? / 5
содержимое b = 3
содержимое р = 0
p
00000005
00000006
00000007
b
a
Слайд 11Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
8
Структуры
Шевченко А. В.
Текст
программы
typedef struct
{
short a;
float b;
char c;
} A;
…
A a1, a2;
a1.a = -23456;
a1.b = 1234.56;
a1.c = 8;
Оператор typedef создает новый тип данных. В структурах компилятор применяет выравнивание
a
b
c
A
a
b
c
a
b
c
a1
a2
sizeof(A) = 12
Слайд 12Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
8
Оптимальное размещение данных
в структурах
Шевченко А. В.
a
b
c
A1
sizeof(A1) = 12
a
c
A2
sizeof(A2) = 8
b
Текст программы
typedef struct
{
short a;
float b;
char c;
} A1;
…
typedef struct
{
short a;
char c;
float b;
} A2;
Слайд 13Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
10
Объединения
Шевченко А. В.
Текст
программы
typedef union
{
short a;
float b;
char c;
} B;
…
B b1, b2;
b1.a = -23456;
b1.b = 1234.56;
b1.c = 8;
В объединениях поля данных перекрываются. Размер равен самому большому полю
a
b
c
B
a,b,c
b1
b2
a,b,c
sizeof(B) = 4
Слайд 14Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
11
Массивы
Шевченко А. В.
Текст
программы
int a[4];
…
int *b =
a;
…
(a[2] == b[2]) //true
Имя массива эквивалентно адресу первого элемента массива
a[0]
a[1]
a[2]
a
sizeof(a) = 16
a[3]
Слайд 15Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
12
Динамическое выделение памяти
под массивы
Шевченко А. В.
Текст программы
int *a = new
int[40];
…
a[12] = 5;
a[39] = 8;
a[40] = … ОПАСНО!!!
…
delete[] a;
Имя массива эквивалентно адресу первого элемента массива
a
a[0]
a[1]
a[2]
...
a[39]
Динами-ческая память
Слайд 16Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
13
Символы, строки. Кодирование
символов
Шевченко А. В.
Слайд 17Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
14
Символы, строки
Шевченко А.
В.
Текст программы
char a[8];
a[0] = ’T’;
a[1] = ’e’;
a[2] = ’к’;
a[3] = ’с’;
a[4] = ’т’;
a[5] = 0;
...
strcpy(a, ”Текст”);
В языках С и С++ строки заканчиваются нулевым байтом
a
210
229
234
241
242
0
?
?
Т
е
к
с
т
Слайд 18Программирование и основы алгоритмизации
Тема 1. Типы данных, адресация
15
Операции со строками
Шевченко
А. В.
Текст программы
char a[8]; // выделение памяти
char
*b = ”Текст”; // строковая константа
strcpy(a, b); // копирование строк
int len = strlen(a); // длина строки
int cmp = strcmp(a, b); // сравнение строк
char* s = strсhr(a, ’т’); // поиск символа
char* s = strstr(a, ”кс”); // поиск подстроки
Слайд 19Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
1
Тема 2. Переменные,
управление памятью
Шевченко А. В.
double a;
char b[64];
long* c = new long(48);
Слайд 20Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
2
Программирование. Задачи
Шевченко А.
В.
Аппаратное обеспечение
Программное обеспечение
Слайд 21Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
3
Программирование. Языки
Шевченко А.
В.
Ассемблер
Языки программирования
Низкого уровня
Высокого уровня
Компиляция
Интерпретация
Процедурные
Непроцедурные
Алгол, Кобол,
Фортран, ПЛ/1,
С, Паскаль
Бэйсик
Пролог
Слайд 22Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
4
Программирование. Компиляция и
построение задачи
Шевченко А. В.
Текст программы
int a = 5;
int main()
{
int b = a/5;
int c = f(b);
}
int f(int a)
{
return(abs(a));
}
Виртуальное адресное пространство
0x00000000
0x00000001
0x00000002
0x00000003
0x00000004
…
Образ задачи
Данные
Код
Компилятор
Слайд 23Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
5
Размещение переменных в
памяти
Шевченко А. В.
Текст программы
int A;
int B = 999;
void f()
{
int C;
int *D = new int[8];
*D = A+B+C;
...
}
Виртуальное адресное пространство задачи
0x00000000
Динамическая
память (Heap)
Неинициализи-рованные данные
0x00400000
0x00800000
Инициализи-рованные данные
Код
Стек
Управляющие
структуры
Слайд 24Файл образа задачи (.exe)
Программирование и основы алгоритмизации
Тема 2. Переменные, управление
памятью
6
Файл образа задачи
Шевченко А. В.
Виртуальное адресное пространство задачи
0x00000000
Динамическая
память (Heap)
0x00400000
0x00800000
Данные
Код
Управляющие
структуры
Заголовок
Неинициализирован-ные
данные (BSS)
Инициализированные данные
Код
Стек
Управляющие
структуры
Слайд 25Программирование и основы алгоритмизации
Тема 2. Переменные, управление памятью
6
Выполнение задачи
Шевченко А.
В.
Оперативная память
0x00000000
Динамическая
память (Heap)
0x00400000
0x00800000
Неинициализирован-ные данные (BSS)
Инициализированные данные
Код
Стек
Управляющие
структуры
Загрузка
Точка входа
Слайд 26Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
1
Тема 3. Препроцессор, функции
Шевченко
А. В.
#define MAXCOUNT 100
void f(int a, int b);
Слайд 27Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
2
Препроцессор
Шевченко А. В.
Текст программы
#define
MAX 200
int data[MAX];
int main()
{
for(int i = 0; i
< MAX; i++)
data[i] = ...
}
Препроцессор
Компилятор
Слайд 28Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
3
Директивы препроцессора
Шевченко А. В.
Текст
программы
#define MAX 200
#define GETINT(var, edit) \
var = StrToInt(edit->Text)
#ifdef
DEBUG
ShowMessage(”Точка 1”);
#endif
Директивы препроцессора начинаются с символа #
Слайд 29Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
4
Включение при компиляции кода
из других файлов
Шевченко А. В.
Текст программы
#include ”file1.h”
#include
Файл
file1.h
Файл file2.h
Слайд 30Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
5
Определение символических имен
Шевченко А.
В.
Текст программы 1
#define MAX 200
...
int data[MAX];
for(int i = 0; i
< MAX; i++)
data[i] = 0;
Текст программы 2
#define Red 0x0000FF
#define Green 0x00FF00
#define Blue 0xFF0000
...
Edit->Color = Red;
Слайд 31Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
6
Стандартные имена компилятора
Шевченко А.
В.
Текст программы
__cplusplus Определено, если компилируется код С++.
__DATE__ Дата начала компиляции текущего
файла.
__FILE__ Имя текущего файла.
__FUNC__ Имя текущей функции.
__LINE__ Номер текущей строки.
__STDC__ Определено, если применяется стандарт ANSI.
__TIME__ Время начала компиляции текущего файла.
Слайд 32Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
7
Макросы
Шевченко А. В.
Текст программы
#define
GETINT(var, edit) \
var = StrToInt(edit->Text)
...
int rows;
int cols;
...
GETINT(rows, RowsEdit);
GETINT(cols, ColsEdit);
rows = StrToInt(RowsEdit->Text);
cols = StrToInt(ColsEdit->Text);
Слайд 33Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
8
Пример использования макроса
Шевченко А.
В.
Текст программы 1
#define square(a, b) (a*b)
...
int s = square(3+1, 5+1);
x
= 9
x = 24
Слайд 34Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
9
Условная трансляция
Шевченко А. В.
Текст
программы
#define DEBUG
#define TRACE
...
long password;
#ifdef DEBUG
#ifdef TRACE
ShowMessage(”Точка
1”);
#endif
password = 1;
#else
GetPassword(password);
#endif
Слайд 35Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
10
Пример использования условной трансляции
Шевченко
А. В.
Текст заголовка lib.h
#ifndef LIB
#define LIB
...
...
...
#endif
Текст заголовка form1.h
#include
...
Текст
заголовка form2.h
#include
...
Текст программы prog.cpp
#include
#include
...
Слайд 36Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
11
Функции
Шевченко А. В.
Текст заголовка
lib.h
int abs(int val);
Текст программы prog.cpp
#include
...
int a = abs(b);
...
int
c = a+abs(d);
Текст программы lib.cpp
int abs(int val)
{
if(val < 0)
val = -val;
return(val);
}
Слайд 37Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
12
Декларация функции
Шевченко А. В.
Текст
заголовка
double square(double length, double width);
Тип функции
Имя функции
Список
параметров
Тип параметра
Имя параметра
void
func(int a, int b);
Функция не возвращает значения
Слайд 38Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
13
Параметры функции по умолчанию
Шевченко
А. В.
Текст заголовка
int func(int a, int b = 3, int
c = 5);
Значение параметра по умолчанию
Текст программы
int func(int a, int b, int c) { return(a+b+c); }
int x = func(7, 5, 2);
int x = func(7, 5);
int x = func(7);
int x = func();
Ошибка!
Слайд 39Текст программы 1
Текст программы 2
Программирование и основы алгоритмизации
Тема 3. Препроцессор,
функции
14
Передача параметров в функцию
Шевченко А. В.
void func(int a, int b)
{
a += b;
}
...
int x = 5;
int y = 3;
func(x, y);
void func(int &a, int &b)
{
a += b;
}
...
int x = 5;
int y = 3;
func(x, y);
По значению
По ссылке
Слайд 40Текст программы
Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
15
Функции с переменным
числом параметров
Шевченко А. В.
int sprintf(char *buffer, const char *format, ...);
{
...
va_list args;
va_start(args, format);
for(int i = 0; i < narg; i++)
{
int* par = va_arg(args, int*);
...
}
va_end(args);
}
Последний фиксированный параметр
Получение следующего параметра
Слайд 41Текст программы
Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
16
Рекурсивный вызов функции
Шевченко
А. В.
double factorial(double N)
{
return(N == 1 ? 1
: N*factorial(N-1));
}
...
ShowMessage(factorial(170));
Слайд 42Текст программы
Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
17
Затраты на вызов
функции
Шевченко А. В.
...
int a = 5;
int b = 4;
int c = square(a, b);
...
Стек
0х00000005
0х00000004
0х00402768
0х0001238С
Параметры,
точка возврата,
сохраняемые регистры
Слайд 43Макросы
Программирование и основы алгоритмизации
Тема 3. Препроцессор, функции
18
Сравнение макросов и функций
Шевченко
А. В.
Быстрота выполнения
Большие затраты памяти
Функции
Дополнительные затраты времени
Экономия памяти
Нет контроля типов
параметров
Контроль типов параметров
inline - функции, шаблоны
Слайд 44Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
1
Тема 4. Управление
выполнением программы
Шевченко А. В.
for(int i = 0; i < N;
i++)
try {...} catch(...) {...}
Слайд 45Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
2
Операторы управления выполнением
программы
Шевченко А. В.
Операторы управления выполнением программы
Оператор безусловного перехода
Операторы условного перехода
Операторы
цикла
Обработка исключительных ситуаций
Слайд 46Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
3
Оператор безусловного перехода
Шевченко
А. В.
Текст программы
...
a = b+c;
goto label;
...
label:
d = e-a;
...
Слайд 47Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
4
Оператор условного перехода
if
Шевченко А. В.
Текст программы
if(a < b)
{
...
}
else
{
...
}
Выражение:
- логическое (true, false),
- арифметическое (не 0 = true,
0 = false)
Блок «true»
Блок «false»
Слайд 48Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
5
Примеры оператора if
Шевченко
А. В.
Текст программы
if(a < b)
a = b;
if(a
b)
a = b;
else
a = c;
Текст программы
if(a < b)
{
a = b;
c = b-d;
}
else
{
a = c;
d--;
}
Текст программы
if(a < b)
a = b;
else
if(a < c)
a = c;
else
if(a < d)
a = d;
else
a = 0;
Слайд 49Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
6
Оператор условного перехода
switch
Шевченко А. В.
Текст программы
switch(a)
{
case CONST1:
...
break;
case CONST2:
...
break;
default:
...
}
Выражение
Блок «CONST1»
Блок «по умолчанию»
Блок «CONST2»
Слайд 50Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
7
Пример оператора switch
Шевченко
А. В.
Текст программы
char* text;
switch(note)
{
case 5: text = "Отлично";
break;
case 4: text = "Хорошо"; break;
case 3: text = "Удовлетворительно"; break;
case 2: text = "Неудовлетворительно"; break;
default:
text = "Ошибка";
}
Слайд 51Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
8
Оператор цикла while
Шевченко
А. В.
Текст программы
while(a > b)
{
...
}
Выражение
Тело цикла
Слайд 52Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
9
Пример оператора while
Шевченко
А. В.
Текст программы
int a = 10;
while(a--)
{
ShowMessage("Сколько можно повторять!");
}
Слайд 53Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
10
Оператор цикла for
Шевченко
А. В.
Текст программы
for(int i = 0; i < N; i++)
{
...
}
Выражение, определяющее продолжение
Тело цикла
Инициация
Выражение, выполняемое после тела цикла
Слайд 54Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
11
Пример оператора for
Шевченко
А. В.
Текст программы
int factorial(int N)
{
int f = 1;
for(int i = 1; i <= N; i++)
f *= i;
return(f);
}
Слайд 55Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
12
Оператор цикла do
Шевченко
А. В.
Текст программы
do
{
...
}
while(a < b)
Выражение, определяющее продолжение
Тело цикла
Слайд 56Программирование и основы алгоритмизации
Тема 4. Управление выполнением программы
13
Операторы break, continue
и return
Шевченко А. В.
Текст программы
while(true)
{
...
if(...) continue;
...
if(...) break;
...
if(...) return;
}
Переход к концу цикла
Выход из цикла
Выход из функции