Шпаргалка

Шпаргалка по С++ (1 курс) / шпора по с++, экт 1й курс.doc

 

(1) Основные определения языка С. Алфавит языка. Структ. прог.

Компилитор (транслятор) - перевод программы в язык машинных кодов.

// - однострочный комментарий (С++)

/* текст */ - многострочный (С, С++)

Идентификаторы - имена ( dft34_1).

Ключевые слова - имена операторов.

Алфавит включает: 1) A..Z ;2) a..z;3) 0..9;4) разделители -,;.? ` ! / \ | _ # %
& ^= + - * () {} [ ] ><;5) пробельные слова sp,h_tab, cr, LF, V_TAB, FF, CTRL/Z. ;6) спец. Символы \n - новая строка, \t - гориз. Табл., \r- возврат каретки, \f- новая страница, \a - звуковой сигнал, \` - апостроф, \” - кавычки, \\ - обратный слэшь.

#include <stdio.h> - подкл. Загол. файл

void main () - имя осн. программы

{ int a; a=5; printf(“a=%d \n”,a); }

(2) Осн. типы данных. Константы.

Тип

Диапазон значений

char

1

от -128 до 127

int

2

от -32768 до 32767 

long

4

от -2 147 483 648 до 2 147 483 647

unsigned сhar

1

oт 0 до 255

unsigned int

2

от 0 до 65535 

unsigned long

4

от 0 до 4 294 967 295

Тип

Диапазон значений

float

4

от 4.4E -38 до 3.4E +38

double

8

от 1.7E -308 до 1.7E +308

long doble

10

от 3.4E -4932 до 1.1E +4932

Константы: символьные - сост. из одного символа заключенного в апостроф. const char sym=`m`;

Литеральные - вводятся в текст проги. (до { или после }). 34u

(3) Выражения. Операторы.

Выражение - объединение операций и операндов. Операнд - то над чем выполняется операция.

поразрядные операции:

~ инверсия [~101=010]; & (И) [1011&0110=0010 ];

^ (исключающее ИЛИ) [1011^0110=1101];

| (включающее ИЛИ) [1011|0110=1111];

<< (логический сдвиг влево)[1101<<2=0100];

>> (логический сдвиг вправо) [0110>>2=0001]

Логич-е операции:&& - (и); || - (или); ! - (отриц.).

Арифм-е опер.: +-*/ %(ост. от целочис. дел-я).

Операции отношений: <>, >=, <=, ==, !=.

(++) -инкремент, (--) - декрмент.

(4) If. Условное выраж-е. if (условие1) {опер1; опер2;} else if (условие2) {опер3; опер4;}

else (условие3) {опер5; опер6;};

(5) switch (выражение)

{case значение1: опер1;break;

--------------------------------------

case значениеN: оперN;break;

default: опер X;}

(6) Циклы с пред усл-м.

while (усл-е) {опер1;…оперN;}

(7) Циклы с пост усл-м.

do {опер1;…оперN;}

while (усл-е);

(8) Циклы с параметром.

For (i=1;i<10;i++) {опер1;…оперN;}

(9) Понятие массива. Вектора.

Одномерный массив или вектор - несколько однотипных переменных, совместно использующих одно имя (имя массива), доступ к каждому эл-ту осуществ-ся по его порядковому номеру (индексу).

Объявление :

тип_эл-тов имя_массива[число_эл-тов];

int i_arr[10]; char liter[80]; double l_mas[100];

(10)Понятие массива .Матрицы.

матрицей называется двумерный массив или массив векторов.int faq_i[10][10];

главная диагональ- (i=j);побочная - (i=n-j-1)

Эл-ты индексируются с 0 до n-1.

(11)Понятие массива .Строка как символьный массив.

Строка - массив значений типа char, ЗАВЕРШАЮЩИЙСЯ НУЛЕВЫМ БАЙТОМ.

(c=name[2];-присваивает третий эл-т массива name переменной с).char red[]=''мама'' -эта строка имеет длину не 4 байта а 5 т. к. всякая строка аканчивается нулевым байтом: char red[]={`м','а','м','а','0'};

(12)Структуры. Структура - это одна или несколько переменных одного или различных типов, кот-е для удобства работы сгрупированны в одну языковую конструкцию, под одним именем.

struct date/*назв. структуры*/

{ int day; int month;} today;/*назв. переменной*/ //объявление структуры.

struct date d1, d2, d3; - несколько структурных переменных в одной. Инициализация структуры, содержащей информацию о музыкальной коллекции на CD. Struct cd_info {char title[25]; char artist[20]; int num_songs; float price; char date_bought[8];} cd[10];/*массив структур */ cd_info cd={“Red Moon Men”,“Sam and the Snuds”,12,11.95, “02/13/97” };

Вложенные структуры. Sruct Date

{int mounth;int day; int year;};

struct PersonInfo {float height;float weight;

Date birthday;}person;

Чтобы получить доступ к переменной birthday - члену person нужно использовать операцию «точка»: person.birthday, но т.к. эта переменная в свою очередь является переменной структурного типа Date, то доступ, например, к году рождения будет добавлением операции «точка» к имени year: person.birthday. year.

(13)Объединение.

Вводятся для хранение в некоторый момент времени различных компонентов. Место в памяти выделяется для большего из элементов объединения. Пример:

union un {int i; float f; char c;} my_u; Обращение к элементу i объединения my_u, типа un: my_u.i. В памяти храниться последний инициализированный элемент объединения.

(14) Обобщенная архитектура процессора IBM PC. Адресное пространство. Система адресации в MS-DOS.

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

Практически все микропроцессоры содержат:АЛУ(арифметическо-логическое устройство),регистры,дешифратор команд,блок управления и синхронизации,внутренние шины цепей управления,связанные с шинами адресов и данных,входы и выходы управления.

АЛУ выполняет арифм. и логич. операции и операции сдвига. Регистры- внутренние запоминающие устройства процессора для временного хранения обрабатываемой и управляющей информации .Регистры группируются след. обр.:1) РОН - регистры общ. назначения -8 - 16 разрядных регистров, кот-е могут произвольно исп. программистами:AX,DX,CX, BX,BP, SI, DI, SP. В качестве РОН м.б. применяться 32х разрядные регистры. 2)Регистры сегментов: CS (регистр сегмента кодов), SS (регистр сегмента стека), DS (регистр сегмента данных), ES (регистр доп. сегмента), 3) Регистр системных флагов: FlAGS, 4) Управляющий регистр (счетчик команд): IP.

Дешифратор команд - декодирует содержимое регистра команд, выполняет необх. преобраз - я, и активизирует работу блока управления. Проц имеющий n линий в шине адреса может адресоваться к 2n ячейкам памяти. Кажд. из 2n комбинаций на шине адреса выбирает опред. ячейку памяти. Такая модель памяти назв. - плоской Прога может адресоваться от 0 до 2n-1 ячейке памяти. С точки зрения проги адрес-е пространство разделено на блоки смежных адресов(сегментов), а прога может обращаться только к данным в этих сегментах.

DOS. В РС совместимых ПК адрес формируется в виде пары - сегмент:смещение.(логический или виртуальный адресс). Кажд. лог адр. соотв. ед. физ адрес, но физ адресу соотв. - 4кб лог адресов. Для получения физического адреса ячейки, отсчитанного от начала памяти 0000:0000, содержимое сегмента регистра нужно сдвинуть на 4 разряда влево, азатем сложить со смещением. физ адр=сегмент*16+смещ.

Норамлизованный адрес т.е. адрес приведенный к такому виду, что смещение находится в диапазоне от 0 до 16. Сегмент = сплошной адрес/16(на 4 разряда), Смещение = сплошной адрес%16(остаток от целочисленного деления).

(15)Распределение памяти при выполнении прог на С++: 1)Размещенеие программного кода, 2) Размещ-е данных, 3) Динамического исп., 4)Резервирование компилятором на время выполнения проги.

старшие адреса младшие адреса

памяти памяти.

Куча - специальным обр-м организованная обл. памяти, исп. для работы с динамическими структурами. Объём памяти для кучи зависит от того скока памяти просит прога функцией alloc.

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

(16)Функции в языке С.Параметры функций. Функция-логически завершенный, определенным образом оформленный фрагмент программы, имеющий имя. Функции позволяют разделить большие вычислительные задачи на более мелкие. Функции в С++ бывают встроенные (стандартные) и программируемые пользователем. Вызов функции приводит к выполнению некоторых действий. Например, при обращении к функции printf() осуществляется вывод данных на экран. В общем виде функции описываются следующим образом: [<тип >] <имя функции> (<тип > <имя параметра>,…, <тип > <имя параметра>)

{ <тело функции>}

Рассмотрим на примере использование параметров функции. Напишем функцию space, в качестве аргумента которой будет число пробелов, которое должна напечатать эта функция.

#define address “Zelenograd”

#define name “Moscow Institute Electronic Engineering”

#define department “Informatics and Programming”

//Определение функции starbar

#include <stdio.h>

#define LIMIT 65

void starbar()

{ int count; for (count=1; count <= LIMIT; count++)

putchar (`*'); putchar (`\n'); }

//Определение функции space()

void space(int number)

{ int count; for (count=1; count <= number; count++)

putchar (` '); }

void main()

{ int spaces; starbar(); space(25); printf(“%s \n”, address); spaces = (65-strlen(name))/2; //Вычислить, сколько пробелов space(spaces); printf(“%s \n”, name); space((65-strlen(department))/2); //аргумент-выражение printf(“%s \n”, department); starbar();}

Переменная number называется формальным аргументом. Указанная переменная приобретает значения фактического аргумента при вызове функции.

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

Если для связи с некоторой функцией требуется более одного аргумента, то наряду с именем функции можно задать список аргументов, разделенных запятыми:

void printnum (int i, int j)

{ printf(“ координаты точек %d%d\n”, i, j);}

Рекурсия означает возврат. Рекурсивной наз-ся ф-я вызывающая сама себя.Рекурсивные ф-и, которые вызывают прямо сами себя наз-ся искл-но рекурсивными. Если 2 ф-и рекурсивно вызывают друг друга, то они наз-ся взаимно рекурсивными. Каждый вызов рек. ф-и наз-ся рекурсивным вызовом или шагом рекурса.

(18) Понятие об указателях.Объявление и разыменовывание указателей.

Указатель - переменная (типа int, float), содержащая адрес(местоположение ячейки памяти) другой переменной. int i;//переменная целого типа;

int *iptr// указатель на переменную целого типа. указатели требуют инициализации, при этом им присваивается знач- е 0 или конкретный адрес.

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

iptr =&i;//&-унарная операция адресации, возвращающая адрес своего операнда. Указатели могут ссылаться только на обьекты заданного типа т.к. переменные разных типов занимют разную память (к void указателям- это не относится).Указатели на переменные обьявленных типов позволяют производить с ними те же действия, что и над переменными соответствующих типов.

(19)Указатели на динамические переменные. Работа с кучей.Для локальных и глобальных переменных(статистических) память резервируется на этапе трансляции. Для динамических переменных память выделяется во время выполнения проги. Такие переменные создаются по требованию проги и запоминаются в блоках памяти переменного размера, принадлежащих куче(область памяти организованной спец. образом). Память в куче для динамических переменных резервируется функцией malloc ();Пример: #include <alloc.h> …char *sptr//обьявить указатель на тип char … sptr=(char*)malloc (129);//резервирование 129 байтов

Оператор резервирования может отказать если куча заполнена или её память меньше чем нужное кол-во байтов. Тогда malloc() возвращает нулевое знач-е, следовательно нужно производить проверку. После выделения блока памяти и присваивания его адресу указателя можно разыменовывать его и использовать память, как память статической переменной. Для резервирования памяти также используется ф-я calloc(num,size).Чтобы не происходило утечки памяти по окончании работы с некоторым блоком памяти следует освободить его функцией free(указатель на блок памяти);Резервирование памяти посредством new(); можно сразу присвоить знач-е объекта:float *fptr=new float(25.759);delete iptr; (20)Указатели на динамические переменные. Массив,структура. int m[5];//объявление массива из 5 эл-тов ;int *mptr;//объявление указателя на m[i];mprt=&m[0];//указатель на 0 эл-т массива; x=*mptr;//копирование содержимого m[0] в x; если mptr - указатель на m[0] , то *(mptr+i)-содержимое m[i], а не указатель на m[i]. *ptr++ -разыменовывает *ptr и передвигает указатель ptr к следующему эл-ту массива. К указателям на массивы применимы операции: +,- и <,>(для рядом стоящих эл-тов массива),для сравнения дальних указателейнадо использовать указатели huge, они имеют нормализованные значения смещений: от 0(10) до 15(10). char huge *sptr//объявление указателя типа huge. программы с huge-указателями работают медленнее чем с дальними указателями (например:far[0000:0010]) struct ym{int year; int month;} date; struct ym*date_ptr;//указатель на структуру типа ym date_ptr=(struct ym*)malloc(sizeof(struct ym));//указатель date_ptr адресует блок памяти для запоминания одной структуры типа ym. date->year=2001;//доступ к полю структуры, имеющей указатель (21)Динамические структуры данных.Списки. Динамические структуры- формируются и размещаются в памяти в процессе выполнения проги. Как и обычные структуры динам. структуры состоят из полей, или членов структур. Кроме информационных полей они содержат поля- указатели на свой собственный тип структуры.

Динамическую структуру можно объявить: struct node {int info;stuct node *next;//указатель на структуру типа node};Список - формируется по принципу первым вошел - первым вышел, поэтому заголовочный элемент (head) всегда указывает на первый элемент списка. Для создания списка надо объявить структуру типа node или её прототип: typedef stuct node {int info; stuct node *next;} Node; typedef Node *Nodeptr;//указатель на структуру типа node; После этого объявляют указатель на начало списка, который иногда называют заголовком списка. Назовем его head и объявим: Nodeptr head = NULL; Нулевой указатель на начало списка явл. признаком того, что список пустой. До начала формирования первого элемента в списке следует выделить память под этот элемент, предварительно убелившись, что список пуст. П-р. if (head==NULL) {head=(Nodeptr)malloc(sizeoff(Node)); head->info=1;/*или другому значению*/ head->next= NULL;} Для добавления нового элемента всписок надо объявить указатель на текущий элемент р и выполнить следующие действия: Nodeptr p; //указатель на текущий элемент Nodeptr tail;//указатель на хвост очереди if (head==NULL) {head=(NodePtr)malloc(sizeoff(Node)); head->info=1; head->next=NULL; p=(Nodeptr)malloc(sizeoff(Node)); p->next=head->next // в данном случае - NULL; head->next=p; tail=p;}

(22)Динамические структуры данных. Списки.

Стек - это структура данных , организованная по принципу: «последним вошел первым вышел». Аналог стека бусинки, нанизанные на нитку. Последнюю из бусинок легко снять, а чтоб снять первую, надо снять все предыдущие. Для формирования стека объявляется такая же структура как и для формирования очереди: typedef stuct node {int info; stuct node *next;} Node; typedef Node *Nodeptr;//указатель на структуру типа node; Формирование можно осуществить с помощью следующих операторов. Nodeptr= NULL; if{ (head==NULL) {head=(NodePtr)malloc(sizeoff(Node)); head->info=random(100)-50; head->next=NULL;} else { p=(Nodeptr)malloc(sizeoff(Node)); p->info= random(100)-50; p->next=head; headl=p;} Если известно количество элементов в стеке, или признак завершения его формирования , то пользуются одним из операторов цикла.

Первым в стек на рис. помещён элемент с информационным полем, =1, вторым-2м и т.д. Как видно из рис. следуя указателям next и head, мы доберёмся до элемента 1 в последнюю очередь.

(23)Численные методы. Метод деления отрезка пополам. Решить уравнение f(x)=0 с заданной точностью ζ методом деления отрезка пополам.Метод деления отрезка пополам заключается в следующем.. Проверяется наличие корня на отрезке [а, b]. Для этого вычисляются значения функции f(а) и f(b) . Если f(а)*f(b) > 0, то уравнение не имеет корней на заданном отрезке. Если f(а) * f(b) < 0, т. е. на концах отрезка [а, b] функция f(х) имеет противоположные знаки, то искомый корень лежит на этом отрезке. Поиск корня происходит следующим образом. Находим в точке а значение функции у1=f(а). Затем определяем значение х как среднюю точку между а и b, вычисляем значения у2=f(х). Теперь, если f(а) * f(х) > 0, то корень находится на отрезке [a, b]. Переместим точку, а вправо, выполнив присвоение а=х. В противном случае нужно перемещать влево точку b: b. Таким образом, получим второй отрезок [а, b], но вдвое меньше предыдущего. Процесс деления отрезка пополам продолжается до тех пор, пока отрезок [а, b] не станет меньше заданной точности.