Основы информатики 1 семестр Алгоритмические языки и алгоритмы КОРОТИН Павел Николаевич
Архитектура фон-Неймана УВВ ЦП ЗУ АЛУ УУ УУСШ ОЗУ ВЗУ
Принципы фон-Неймана бинарная арифметика принцип хранимой программы линейное пространство памяти безразличие к целевому назначению данных иерархическая организация памяти последовательное выполнение команд
Введение в язык программирования С++. Элементы языка общие с С. Полиморфизм. Инкапсуляция.
История 1970 – Dennis Ritchie разработал язык C для DEC PDP-11 в ОС UNIX – Bjarne Stroustrup в Bell Laboratory разработал язык C – American National Standart Institute утвердил стандарт, который поэтому называется ANSI – International Standards Organization ратифицирован стандарт языка.
Алфавит языка ::= A|B| … |Y|Z|a|b| … |y|z|_ Символы: +, -, *, /, >, =,
Терминальные символы (Зарезервированные слова) asmdefaultforoperatorsizeofunsigned autodeletefriendprivatestaticvirtual breakdogotoprotectedstructvoid casedoubleifpublicswitchvolatile charelseinlineregistertemplatewhile classenumintreturnthis constexternlongshorttypedef continuefloatnewsignedunion
Идентификатор – последовательность буквенно- цифровых символов, начинающаяся с буквы, длиной до 1024 символов. Допустимые: count Test23 Ptr_1 Недопустимые: 1count sizeof Ptr…1
ASCII - American National Standard Code for Information Interchange abcdef 0 nulsohstxetxeotenqackbelbshtnlvtnpcrsosi 1010 dledcldc2dc3dc4naksynetbcanemsubescfsgsrsus 2020sp!"#$%&'()*+,-./ :;? 5050 PQRSTUVWXYZ[\]^_ 6060 `abcdefghIjklmno 7070 pqrstuvwxyz{|}~ del
Базовые типы данных Целые длиной один байт – char 0 Целые длиной несколько байт – int х 30 С плавающей точкой – float 48.f.48e2F Двойной точности - double e-1 Без значения - void
Специальные символьные константы \a Сигнал\t Горизонтальная табуляция \f Подача бумаги\v Вертикальная табуляция \n Новая строка\Одинарная кавычка \r Возврат каретки\хN\хNШестнадцатеричная или восьмеричная константа \?Знак вопроса\N \Двойная кавычка\b\b Удаление предыдущего символа \\Обратный слеш
Модификация базовых типов Со знаком – signed Короткое – short Без знака – unsigned Длинное – long 1 = sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(float) sizeof(double) sizeof(long double)
Пример: #include char c=\t; short s=1; int i; long l; void main() { float f; double d; long double D; cout
Спецификаторы класса памяти auto - Локальная переменная не существует за пределами области видимости. static - Значение переменной постоянно хранится внутри функции или файла. register -Обеспечить доступ к объекту так быстро, как только возможно. extern - Объявляемая переменная определена в другой части программы. extern int x;static int y=0;
Квалификаторы типа const – неизменяемые данные Переменная не может программно изменять своего значения const float e=2.71; volatile – подавление оптимизации Переменная может изменяться независимо от программы. NB: порядок вычисления выражений не определен! X = X1 + X2;
Оператор присваивания Множественное присваивание x = y = z = 0; Стенографическое присваивание x = 10; // x=x 10; Lvalue = Rvalue Lvalue и Rvalue - идентификаторы Lvalue – именующее выражение (адрес переменной) Rvalue – вычисляемое выражение (значение переменной)
Арифметические операции -Вычитание +Сложение *Умножение /Деление % Остаток от деления --Декремент ++Инкремент Пример float y,x = 5/3;//=1.0 y = 5./3;// =1.666… int k=1; ++k;// =2 int m=--k;// k--, m=k; int n=k++;// n=k, k++; // m=1, n=1
Операции сравнения и логические операции >Больше >=Больше или равно
Поразрядные операции &И&И |ИЛИ ^Сложение по модулю два ~Дополнение к 1 >>Сдвиг вправо 1; // 0110>>1=0011=3 x
Еще несколько операторов ?:- условное выражение sizeof- определение размера операнда в байтах,- последовательного вычисления (тип)- явное преобразование к заданному типу :: - расширения области видимости y = x >= 0 ? 1 : -1; I = sizeof(int); J = sizeof I; int k=(y=J, 2*y); float z=(float)5/3; z=float(5)/3; int i; void main() { int i; i=1; ::i=2; …
Массивы Const int размер = …; Тип имя_переменной [размер]; int A[10]; Номер элемента 1-й 1-й 2-й 3-й 4-й… Имя элементаA[0]A[1]A[2]A[3]… Адрес элемента a010c010e… int B[5][10];B[3,4] – не верноB[3][4] - верно
Указатели и ссылки Указатель – переменная, значением которой является адрес. int x[2],*Ptr; Ptr = &x[0]; *Ptr++=1; *Ptr=2; Ссылка – другое имя или еще одно имя объекта. NB: Может быть только инициализирована. int x[]={0,0},&b=x[0]; ++b+=1; *P*P&P & - операция получения адреса объекта * - операция «разыменования» указателя сout
Операторы выделения и освобождения памяти void* new(size_t) – возвращает адрес непрерывного участка памяти для объекта типа и размерностью size_t байт. void delete(void*) – освобождает память, выделенную оператором new, начиная с адреса, на который ссылается указатель. Пример. const int ar_sz=10;ptr[1]=1.f; ptr[2]=2.f; void main() {delete ptr; float* ptr = new float[ar_sz];}
Массивы и указатели int x[]={1,2,3,4,5};int x[5]; const int *y=x; Описание Адрес элемента массива &x[3]y+3 Значение элемента массива x[3]*(y+3) Имя массива – неизменяемый указатель, инициализированный начальным значением.
Строки const int k=…; char str[k];// это ещё не строка str[0]=H; str[1]=e; str[2]=str[3]=l; str[4]=o; str[5]=\0; char str0[]={H,e,l,l,o,\0}; char* str1=Hello; - одномерные массивы символов, заканчивающиеся символом с кодом ноль (\0)
Двумерные массивы и двойные указатели const int ik=5, jk=10; void main() {int a[ik][jk]; int* b[]={a[0],a[1],a[2],a[3],a[4]}; int **c=b; int i=4, j=4; *(*b + i*jk +j)=10; cout
AA[0] A[0][0] … A[0][4]A[0][3]A[0][2]A[0][1] A[1][0] … A[1][4]A[1][3]A[1][2]A[1][1] A[2][0] … A[2][4]A[2][3]A[2][2]A[2][1] A[3][0] … A[3][4]A[3][3] A[3][2 ] A[3][1] A[4][0] … A[4][4]A[4][3] A[4][2 ] A[4][1] A[1] A[2] A[3] A[4] int* B[]; int **C;
Составные типы данных Структура – конгломерат переменных Объединение – наложение переменных Битовое поле – организация доступа к отдельным битам Перечисление – список именованных целых констант Имена типов, введенные пользователем: typedef тип новое_имя; КОНГЛОМЕРАТ – механическое соединение чего-либо разнородного, беспорядочная смесь. Словарь иностранных слов.
Структуры Формат описания: struct имя_шаблона { тип имя_члена; … тип имя_члена; } список_переменных; Пример struct complex { float re,im;} a; Массивы структур: struct complex d[5]; Доступ к членам: complex c,*b=&c; a.re=0.; d[1].im=3.; *b.re=1.; b–>im=2.; Присваивание: c=*b; Имя_шаблона = тег reima Операции доступа к члену структуры:. – через переменную -> - через указатель
Объединения Формат описания: union тег { тип имя_члена; … тип имя_члена; } список_переменных; Пример: union { int i; struct {char h_b,l_b;} j; } a; il_bh_ba a.j.h_b = \0; a.j.l_b=1; cout
Битовые поля – члены структуры или объединения Формат: struct или union тег { тип имя: длина; … тип имя: длина; } список_переменных; Здесь тип – это int, signed, unsigned Пример: struct { int a:4; int b:4; char c; } c; c.a=0; c.b=3; c.c='\0'; void* ptr=&c; cout
Перечисление – набор именованных целых констант Формат: enum тег { список_перечисления } список_переменных; Пример enum {m,t,w,th,f,s,su} d; cout
Приоритеты операций Наивысший ::== != () [] ->.& ! ~ (type) & sizeof * new delete ^ | * / %&& + -|| >?: = > Наинизший =