While, управляемая меткой»

Условие задачки: подсчитать среднюю оценку для случайного количества оценок.

Сделать проект консольного приложения и вести имя проекта TPlab1_4. Создается начальный файл TPlab1_4.cpp, который будет содержать одну пустую функцию main():

int t_main(int args, _TCHAR* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab1_4.h и файл кодов TPlab While, управляемая меткой»1_4.cpp.

Сделать файл TPlab1_4.h, ввести текст файла и сохранить его:

//файл заголовков TPlab1_4.h

#include

using std::cout;

using std::cin;

using std::endl;

#include

using std::setprecision;;

Добавить в файл кодов TPlab1_4.cpp подключение файла заголовков и текст функции main:

//файл кодов TPlab1_4.cpp

#include "stdafx.h"

#include "TPlab1_4.h While, управляемая меткой»"

int _tmain(int argc, _TCHAR* argv[])

{

//блок объявлений и инициализации переменных

Int kol, //счетчик введенных оценок

Oc; //оценка

Float sum, //сумма оценок

Sr; //средняя оценка

sum=0; //установка суммы в начальное положение

kol=0; //инициализация переменной цикла

//блок обработки

cout<<"Vvedite ili end: ";

cin>>oc;

while (oc!=-1)

{

sum+=oc;

kol++;

cout<<"Vvedite ili end: ";

cin>>oc;

}

sr=sum/kol;

//блок выода результатов

if While, управляемая меткой» (kol!=0)

cout<<"Srednjaja ocenka: "<

else cout<<"Net ocenok"<

Return 0; //признак успешнего окончания

}

Пример 4. «Структура повторения for»

Условие задачки: некто занес данный вклад под данный процент годичных; высчитать сумму на счете в конце каждого года в протяжении данного количества лет.

Сделать проект консольного приложения и ввести имя проекта TPlab1_5. Создается While, управляемая меткой» начальный файл TPlab1_5.cpp, который будет содержать одну пустую функцию main():

int t_main(int args, _TCHAR* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab1_5.h и файл кодов TPlab1_5.cpp.

Сделать файл TPlab1_5.h, ввести текст файла и сохранить его:

//файл заголовков TPlab1_5

#include

using std While, управляемая меткой»::cout;

using std::cin;

using std::endl;

using std::ios;

#include

using std::setw;

using std::setiosflags;

using std::setprecision;

#include

Добавить в файл кодов TPlab1_5.cpp подключение файла заголовков и текст функции main():

//файл кодов TPlab1_5.cpp

#include "stdafx.h"

#include "TPlab1_5.h"

int _tmain(int argc, _TCHAR* argv While, управляемая меткой»[])

{

//блок объяления переменных и ввода данных

Double vclad, //начальный вклад

Stavka, //ставка годичного дохода (дробь)

Depozit; //сумма на депозите в конце i-го года

Int god; //число лет

cout<<"Vvod vclada: ";

cin>>vclad;

cout<<"Vvod stavki: ";

cin>>stavka;

cout<<"Vvod chisla let: ";

cin>>god;

//блок обработки и вывода данных

cout<<"God"<

//depozit=vclad*(1.0+stavka)^i); i=1,...,god

for While, управляемая меткой»(int i=1; i<=god; i++)

ios::showpoint)

<

return 0;

}

Пример 5. «Структура повторения с постусловием

Do/while»

Условие задачки: распечатать оценки студентов.

Сделать проект консольного приложения и ввести имя проекта TPlab1_6. Создается начальный файл TPlab1_6.cpp, который будет содержать одну пустую функцию main():

int t_main(int args, _TCHAR While, управляемая меткой»* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab1_6.h и файл кодов TPlab1_6.cpp.

Сделать файл TPlab1_6.h, ввести текст файла и сохранить его:

//файл заголовков TPlab1_6

#include

using std::cout;

using std::cin;

using std::endl;

Добавить в файл кодов TPlab1_6.cpp подключение файла заголовков и текст функции main While, управляемая меткой»():

#include "stdafx.h"

#include "TPlab1_6.h"

int _tmain(int argc, _TCHAR* argv[])

{

int kol, f, ocenka;

cout<<"Vvesti kol-bo studentov: ";

cin>>kol;

cout<<"Ocenki studentov"<

cout<<"Nomer"<<"\tOcenka"<

int i=1;

do

{

cout<

cin>>ocenka;

}

while(++i<=kol);

return 0;

}

Контрольные вопросы

1. Сколько имеется управляющих структур?

2. Перечислите структуры ветвления.

3. Перечислите структуры повторения.

4. Растолкуйте оператор While, управляемая меткой» break.

5. Растолкуйте оператор continue.

Тема 7. Адресные типы данных

7.1. Указатели

В языке С++ есть два метода доступа к переменным и функциям : по имени переменной либо функции и по адресу при помощи указателей.

Указатель - это переменная, содержащая адресок другой переменной либо функции. Внедрение указателей позволяет упростить метод и повысить его эффективность за While, управляемая меткой» счет обычного доступа к огромным объемам данных при помощи указателя. В стек копируется не весь объем данных, а только одно число -адрес первого б данных.

Для инициализации указателя адресом переменной служит операция & (операция адресации либо операция взятия адреса).Для доступа к переменной через указатель употребляется операция * (операция разадресации While, управляемая меткой», либо разыменования, либо воззвания по адресу, либо косвенной адресации).

Пример:

int tabn1,tabn2,*p=&tabn1;//объявление и инициализация

tabn1=1000; //указателя p адресом переменной tabn1

tabn2=*p;//tabn2=1000; Выражение *p значит, что необходимо извлечь

// значение по адресу, равному значению указателя p

Операция разадресации может быть применена также в левой части оператора присваивания для того, чтоб данные While, управляемая меткой» были запомнены по адресу, который содержит указатель.

Пример:

int tabn,*p=&tabn;

tabn=1000;

*p=2000;// Значение tabn поменяется на 2000

Над указателями можно делать последующие операции:

- операции адресации(&) и разадресации(*);

- операция присваивания(=);

- арифметические операции(+,-,++,--);

- операции сопоставления.

При выполнении арифметических операций с указателями подразумевается, что указатель показывает на массив объектов While, управляемая меткой». Таким макаром, если указатель объявлен как указатель на type, то прибавление к нему целого значения перемещает указатель на соответственное количество объектов type . Если type имеет размер 4 б, то прибавление целого числа 5 к указателю этого типа перемещает указатель в памяти на 20 байтов.

Указатели - это удачный метод обработки огромных объемов данных While, управляемая меткой»: массивов, структур, объединений.

Внедрение ключевика const определяет, что указатель и/ либо указываемая переменная не должны изменяться. Если нужно, чтоб указываемая переменная не изменялась, необходимо записать const перед типом указателя.

Пример:

int tabn1, tabn2;

const int *p=&tabn1; //p - указатель на константу типа int

*p=1000; //Присвоение объекту tabn1, на который показывает

// указатель на While, управляемая меткой» константу p, неприемлимо

p=&tabn2; //Присвоение указателю на константу допустимо

Если нужно, чтоб сам указатель не изменялся, необходимо записать const после обозначения типа указателя.

Пример:

int * const p=&tabn1; //Указатель-константа на int

*p=1000; //Присвоение объекту tabn1, на который показывает

// указатель на константу p, допустимо

p=&tabn2; // Присвоение указателю на константу неприемлимо

Адресок именной константы While, управляемая меткой» не может быть присвоен указателю-константе, даже если ее значение не будет изменено.

Пример:

const int kol=25;

int * const p=&kol; //Неприемлимо

const int *p=&kol; //Допустимо

Достоинства указателей последующие:

· экономия памяти, более малогабаритное размещение данных с внедрением массивов указателей;

· действенное выполнение программки при использовании указателей в качестве характеристик функции While, управляемая меткой» при передаче агрегированных данных за счет того, что в стек копируется не весь объем данных, а только одно число -адрес первого б данных;

· возможность конфигурации значений переменных вызывающей функции при изменении значений характеристик вызываемой функции, т.е. возможность возврата значений кроме оператора return;

Кандидатурой указателям являются ссылки.

7.2. Ссылки

Ссылка- это While, управляемая меткой» переменная, которая является другим именованием другой переменной. Ссылка при объявлении должна быть инициализирована и только один раз. После инициализации ее значение изменять нельзя, т.е. нельзя, чтоб такая ссылка ссылалась на другую переменную. Отличие ссылки от указателя разглядим на примере.

Пример: ссылка указатель

int tabn=1000; int tabn=1000;

int &r=tabn While, управляемая меткой»; int *p=&tabn;

cout<

tabn=2000; tabn=2000;

cout<

r=3000; *p=3000;

cout<

Результаты примеров с ссылкой и указателем схожи. Но внедрение ссылки по сопоставлению с указателем более комфортно, потому что ссылка пишется как рядовая переменная и не просит операций адресации(&) и While, управляемая меткой» разадресации(*). Ссылка r определяет положение в памяти переменной tabn. При изменении значения tabn (tabn=2000;) объект ссылки получает это новое значение. При изменении значения ссылки (r=3000) переменная tabn получает это новое значение. Более поточнее можно сказать последующее об операциях над ссылкой. Операция присваивания ссылке r значения 3000 не изменяет ссылку, т.е. ссылка r While, управляемая меткой» всегда ссылается на int tabn, а операция присваивания применяется к переменной tabn.

Таким макаром, операции производятся не над ссылками, а над переменными, на которые они ссылаются. Ссылку образно можно рассматривать, как постоянный указатель, который всегда разадресован. Следует отметить, что ссылка не является копией переменной, а является вторым именованием While, управляемая меткой» (алиасом, псевдонимом) этой переменной.

Ссылки употребляются в качестве формальных характеристик функций при передаче агрегированных данных (структур, объединений). При вызове функции автоматом рассчитывается адресок фактического параметра (переменной вызывающей функции) и помещается в стек, потом копия адреса присваивается формальному параметру (ссылке). Аналогично производится возврат значения функции по ссылке.

Достоинства While, управляемая меткой» ссылок заключаются в последующем:

· действенное выполнение программки при использовании ссылок в качестве характеристик функций при передаче агрегированных данных (как и указатели);

· возможность конфигурации значений переменных вызывающей функции при изменении значений характеристик вызываемой функции, т.е. возможность использования ссылок для возврата значений кроме оператора return ( как и указатели);

· по сопоставлению с указателями, ссылки While, управляемая меткой» более комфортны при программировании, т.к. употребляются обыденные имена переменных и не требуются операции адресации и разадресации.

Контрольные вопросы

1. Растолкуйте понятие указатель.

2. Охарактеризуйте операции адресации и разадресации.

3. Поведайте об использовании ключевика const.

4. В чем появляются достоинства указателей?

5. Растолкуйте понятие ссылка.

6. В чем появляются достоинства ссылок?

Тема 8. Структуры данных While, управляемая меткой» фиксированного размера

8.1. Массивы

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

При объявлении массива резервируется память.

Примеры объявления массивов:

int a[5]; //объявление массива kol для 5 частей типа int

int b[10], c[20]; //объявление 2-ух массивов

char imf[7]; //объявление массива знаков

При объявлении массива можно сразу выполнить его инициализацию набором значений While, управляемая меткой», заключённых в фигурные скобки. Массивы знаков можно инициализировать строчкой знаков, обозначенной в двойных кавычках.

Примеры:

int a[5]={10, 20, 30, 40, 50};

int a[]={10, 20, 30, 40, 50};//можно не указывать размер массива

char imf[]=”akt.dat”;//объявление и инициализация

Доступ к элементам массива осуществляется при помощи индексированной переменной, к примеру, a[i]:

,где i -целое положительное число от 0 до 4 (количества частей минус While, управляемая меткой» 1).

Пример:

int a[5];//1-ый элемент - a[0],...,5-ый элемент - a[4]

В языке С++ предвидено понятие только одномерного массива. Многомерные массивы представляются как массив, состоящий из частей типа массив.

Пример объявления и инициализации двумерного массива:

int a[2][3]={{1, 2, 3},{4, 5, 6}};

1-ый индекс показывает номер строчки, а 2-ой – номер столбца.

Доступ к элементам While, управляемая меткой» двумерного массива осуществляется при помощи индексированной переменной, к примеру, a[i][j]:

, где i – целое число 0, 1; j – целое число 0, 1, 2.

Операции над элементами массива варьируются зависимо от типа его частей.

Массивы и указатели плотно сплетены и могут быть применены практически идиентично. Имя массива можно считать как постоянный указатель. При обработке массивов лучше While, управляемая меткой» использовать нотацию массивов, а не нотацию указателей. Программировать становится легче, программка становится более понятной, хотя и несколько длиннее.

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

Приведем пример массива указателей из While, управляемая меткой» функции menu главы 5:

char* m[]={«Акты работ», «Расценки», «Ведомости», «Выход»};

Хотя размер массива m фиксирован, он обеспечивает доступ к строчкам знаков хоть какой длины. Эта упругость – один из примеров массивных способностей структурированных данных в С++.

Если этот массив строк расположить в двумерном массиве, то такая структура данных обязана иметь фиксированное количество While, управляемая меткой» столбцов, равное самой длинноватой строке. В данном случае издержки памяти будут значительны.

Пример 6. «Типовые операции над массивами»

Условие задачки: ввести два массива, отсортировать их, и потом произвести их слияние..

Сделать проект консольного приложения и ввести имя проекта TPlab2_4.

Создается начальный файл TPlab2_4.cpp, который будет содержать всего одну While, управляемая меткой» пустую функцию main():

int t_main(int args, _TCHAR* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab2_4.h и файл кодов TPlab2_4.cpp.

Сделать файл TPlab1_2.h, ввести текст файла и сохранить его:

//файл заголовков TPlab2_4.h

#include

using std::cout;

using std::cin;

using std::endl;

const int While, управляемая меткой» nmax=100;

const int nmaxr=200;

void vvod(int n, float m[]);

void sort(int n, float m[]);

void slijanie(int n1, float m1[], int n2, float m2[], float m[]);

void vyvod(int n, float m[]);

Добавить в файл кодов TPlab2_4.cpp тексты функций:

//файл кодов TPlab2_4.cpp

#include "stdafx.h"

#include "TPlab2_4.h While, управляемая меткой»"

int _tmain(int argc, _TCHAR* argv[])

{

int k, k1, k2;

float a1[nmax], a2[nmax], a[nmaxr];

cout<<"Vvedite chislo elementov massiva 1: ";

cin>>k1;

vvod(k1, a1);

sort(k1, a1);

cout<<"Vvedite chislo elementov massiva 2: ";

cin>>k2;

vvod(k2, a2);

sort(k2, a2);

k=k1+k2;

slijanie(k1, a While, управляемая меткой»1, k2, a2, a);

vyvod(k, a);

return 0;

}

void vvod(int n, float m[])

{

for(int i=0; i

{

cout<<"Vvedite element "<

cin>>m[i];

}

return;

}

void sort(int n, float m[])

{

int i=0;

int perest=1;

while(i<=n-1 && perest)

{

perest=0;

for(int j=n-1; j>0; j--)

if(m[j-1]>m While, управляемая меткой»[j])

{

perest=1;

float b=m[j-1];

m[j-1]=m[j];

m[j]=b;

}

i++;

}

return;

}

void slijanie(int n1,float m1[],int n2,float m2[],float m[])

{

int i, i1, i2;

i=i1=i2=0;

while(i1

if(m1[i1]

{

m[i]=m1[i1];

i++;

i1++;

}

Else

{

m[i While, управляемая меткой»]=m2[i2];

i++;

i2++;

}

if(i1==n1)

{

for(int k=i2; k

{

m[i]=m2[k];

i++;

}

}

Else

{

for(int k=i1; k

{

m[i]=m1[k];

i++;

}

}

return;

}

void vyvod(int n, float m[])

{

cout<<"Resultat: "<

for(int i=0; i

cout<

return;

}

8.2. Типы данных While, управляемая меткой», определяемые юзером

К типам, определяемым юзером, относятся структуры, объединения и перечисления.

Структуры

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

Пример:

struct tip_rab //Объявление типа структура tip_rab

{

int tabn;

char fio[20];

float zarp;

};

tip_rab rab1,rab2,brigada[10];//Объявление переменных типа

//структура tip_rab

Типы While, управляемая меткой» полей структуры - это любые типы, включая тип структура. Таким макаром, может быть создание иерархической структуры данных.

Доступ к полям структуры осуществляется при помощи составного идентификатора: per.pole

,где pole – идентификатор (имя) поля структуры;

знак (.) - операция выбора поля структуры.

Пример:

rab1.tabn=1200;

Пример указателей на структуры:

tip_rab rab; //Объявление переменной While, управляемая меткой» типа структура tip_rab

tip_rab *p; //Объявление указателя p на тип tip_rab

p=&rab; //Инициализация указателя p адресом rab

//либо tip_rab *p=&rab;//Объявление и инициализация указателя

Доступ к полям структуры осуществляется кроме операции (.)-операции прямого выбора поля структуры (rab.tabn), при помощи операции (->) -операции косвенного выбора поля While, управляемая меткой» структуры либо операции указателя поля (p->tabn). p->tabn==(*p).tabn.

Определение адреса поля структуры производится при помощи операции адресации: &prab->tabn, где операция -> имеет более высочайший ценность.

Над целыми структурами, имеющими один и тот же идентификатор типа, вероятна операция присваивания.

Пример:

rab1=rab2;

Операции над полями структуры While, управляемая меткой» вариируются зависимо от типа полей. Тип структура является главным типом данных в экономических и управленческих задачках. В качестве характеристик функций употребляются ссылки на тип структура.

Пример:

//Вызываемая функция //Вызывающая функция

void vyvod(tip_rab &x) tip_rab rez;

{ //rez имеет значение

cout<

<

<

}

Если нужно заблокировать изменение While, управляемая меткой» переменной rez от функции vyvod, то нужен модификатор const: const tip_rab &x.

Объединения

Объединение - это поименованная совокупа данных, состоящая из фиксированного числа компонент различных типов, но активным может быть только один компонент. Многие синтаксические и многофункциональные характеристики объединений совпадают со структурами.

Пример:

union tip_rab //Объявление типа объединение

{

int tabn While, управляемая меткой»; //Размер 2 б

char fio[20]; //размер 20 б

float zarp; //размер 4 б

};

tip_rab rab1,rab2;//Объявление переменных типа tip_rab

Размер объединения равен размеру собственного наибольшего компонента, в нашем примере - 20 б. Сразу в памяти может находиться значение только 1-го компонента. Переменная rab1 может сразу хранить в 20 б или значение int, или массив char, или значение While, управляемая меткой» float. Значение какого типа, хранимого в памяти на этот момент, контролируется только самим программером. Операция sizeof (rab1) возвращает значение 20, но когда rab1 содержит объект типа int, 18 байтов остаются неиспользованными (туда помещаются символы-заполнители), а когда rab1 содержит объект типа float, - то 16 байтов.

Доступ к полям объединения таковой While, управляемая меткой» же, как и в структуре. Объединение может быть инициализировано только одним значением. Объединения соответствуют типам вариантных записей языков Паскаль и Модула-2. Употребляется как компонент структуры при разработке записей с переменной частью.

Перечисления

Перечисление - это упорядоченная последовательность идентификаторов юзера (перечисляемых констант), принимаемых переменной, причём каждому идентификатору назначается целое значение.

Упорядоченность While, управляемая меткой» идентификаторов юзера определяется растущей последовательностью целочисленных значений идентификаторов.По дефлоту идентификаторы инициализируются значениями 0,1 и т.д.

Примеры:

enum selector {vyhod,sozd,prosm,ud,zam};//vyhod=0,sozd=1,...

enum dni {pn,vt,sr,cht,pt,sb,vs};//pn=0,vt=1,...

selector sel1;//Объявление переменной типа selector

dni d; //объявление переменной типа dni

При объявлении While, управляемая меткой» перечисления можно очевидно инициализировать идентификаторы юзера целыми значениями.

Пример:

enum dni {pn=1,vt,sr,cht=pn+7,pt,sb,vs};//pn=1,vt=2,sr=3,

//cht=8,pt=9,sb=10,vs=11

Пример неименованного перечисления:

enum {false,true}; //символические константы false=0,true=1

Над переменной перечисляемого типа вероятны операции:

операция присваивания, к примеру, sel1=sozd; d=vs;

операции дела While, управляемая меткой», к примеру, if (sel1==sozd) ...;

любые операции, выполняемые над типом int.

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

Контрольные вопросы

1. Дайте понятие массива.

2. Как осуществляется доступ к элементам массива?

3. Как проинициализировать массив при его объявлении?

4. Перечислите типы While, управляемая меткой» данных, определяемые юзером.

5. Дайте понятие структуры.

6. Как осуществляется доступ к элементам структуры?

7. Дайте понятие объединения.

8. Дайте понятие перечисления.

Тема 9. Функции (процедуры)

9.1. Определение, макет и вызов функции

Функция – это поименованный блок программки, состоящий из последовательности операторов. Функция состоит из заголовка и тела (текста) функции. Составными частями тела функции являются While, управляемая меткой» объявления локальных переменных, определения типов, операторы. Перед вызовом функции в соответственном файле кодов должно быть или объявление функции (макет функции), или определение функции (текст функции). Компилятор производит контроль типов данных оператора вызова функции и характеристик функции.

Макет функции – это заголовок функции без тела функции. Макет функции обычно помещают в заголовочный файл, который While, управляемая меткой» подключают к соответственному файлу кодов при помощи директивы компилятора #include.

Примеры прототипов:

int poisk_ind(char tabn[10], int nomer); //воспринимает 2 значения

//типа массив и int, возвращает значение типа int

int poisk_ind(char*, int); //можно без имен переменных

void init(); //не воспринимает и не возвращает значений

float sr_oc(int While, управляемая меткой» n); //воспринимает значение типа int,возвр. тип float

Макет функции докладывает компилятору тип возвращаемых данных, количество характеристик и их тип, порядок их следования. Компилятор употребляет макет функции для проверки корректности вызовов функции

Определение функции – это заголовок и тело функции. Пример из программки п.2.1:

//файл кодов lab1_f2.cpp, см. программку

#include "lab While, управляемая меткой»1_f.hpp" //подключение файла заголовков

float sr_oc(int n) //заголовок функции; float - тип y

{

...

return(y); //возврат значения (y) в функцию main

}

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

Основными составными частями тела функций являются операторы и локальные переменные. В теле функции действуют While, управляемая меткой» переменные перечня формальных характеристик, локальные переменные, объявленные в теле функции, и , если есть, глобальные переменные, объявленные в файле кодов.

Операторы бывают ординарными и составными. К обычным операторам относятся оператор присваивания, оператор вызова функции, оператор return, прерывающий выполнение функции и ворачивающий значение выражения. Составной оператор – это оператор, состоящий из последовательности обычных операторов While, управляемая меткой». Согласно синтаксису можно различить последующие составные операторы: условные операторы и операторы циклов. В теле составных операторов употребляется обычной оператор break, прерывающий их выполнение. В теле операторов цикла употребляется оператор continue, передающий управление на конец цикла.

9.2. Передача характеристик

Оператор вызова функции служит для вызова вызываемой функции в теле вызывающей функции. Он While, управляемая меткой» может быть представлен 2-мя методами:

· как обычной оператор без возврата значений через return;

· как операнд в выражении при возврате значений через return.

Пример :

//файл кодов lab1_f1.cpp

#include "lab1_f.hpp" //подключение файла заголовков

main()

{//...

sr=sr_oc(kol); //оператор вызова функции sr_oc

cout<<"Ваша средняя оценка:"<

getch While, управляемая меткой»();

}

В операторе вызова функции, в круглых скобках, имеется перечень фактических характеристик вызывающей функции: выражения либо имена переменных без типов данных. Значения фактических входных характеристик перед вызовом функции должны быть определены. Оператор вызова функции передает управление вызываемой функции, и копии фактических характеристик через стек присваиваются формальным характеристикам вызываемой функции. Аналогично копии результатов While, управляемая меткой» вызываемой функции пересылаются и присваиваются фактическим характеристикам вызывающей функции. Управление передается назад в вызывающую функцию.

9.3. Программирование рекурсивных алгоритмов

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

Рекурсивная функция – это функция, которая вызывает сама себя.

Разглядим понятие While, управляемая меткой» рекурсии на традиционном примере – расчете факториала целого числа.

Факториал n! равен n*(n-1)*(n-2)*…*1 ,при этом 1!=1 и 0!=1. Пусть нужно вычислить 3!=3*2*1, что можно свести к 3*(2!). Рекурсивная задачка разбивается на этапы, где вызывается рекурсивная функция, которая вычисляет n*(n-1)!: 3! -> 3*2! -> 2*1! -> 1.

Рекурсивная функция поочередно разделяет задачку на две части: одну часть (* - умножение) она While, управляемая меткой» может решить, а вторую часть ((n-1)!) она не может решить. Для выполнения рекурсии нужно, чтоб 2-ая часть была похожа на начальную задачку, но быть несколько меньше. Тогда и рекурсивная функция вызывает новейшую копию самой себя. Это именуется рекурсивным вызовом либо шагом рекурсии. Процесс рекурсии приводит к формированию все наименьших While, управляемая меткой» и наименьших задач и завершается, когда функция добивается базисную задачку (1!=1). Потом функция поочередно возвращает в оборотном порядке значения рекурсивных вызовов оператору вызова, пока не будет возвращено окончательное решение: (1) -> (2*1=2) -> (3*2=6).

Пример 7. «Рекурсивные алгоритмы»

Условие задачки: сделать рекурсивную функцию вычисления факториала.

Сделать проект консольного приложения и ввести имя проекта TPlab While, управляемая меткой»2_2.

Создается начальный файл TPlab2_2.cpp, который будет содержать всего одну пустую функцию main():

int t_main(int args, _TCHAR* argv[])

{return 0;}.

Проект должен содержать файл заголовков TPlab2_2.h и файл кодов TPlab2_2.cpp.

Сделать файл TPlab2_2.h, ввести текст файла и сохранить его:

//файл заголовков TPlab2_2.h

#include

using std::cout;

using std While, управляемая меткой»::cin;

using std::endl;

int fact(int);

Добавить в файл кодов TPlab2_2.cpp подключение файла заголовков и текст функции main():

//файл кодов TPlab2_2.cpp

#include "stdafx.h"

#include "TPlab2_2.h"

int _tmain(int argc, _TCHAR* argv[])

{

int res, n;

cout<<"Vvedite celoe chislo: ";

cin>>n;

res=fact(n);

cout<

return 0;

}

Int fact(int n)

{

if (n<=1)

return 1;

Else

return n*fact(n-1);}

Пусть требуется вычислить 3!. Вызывается функция fact(3). При входе в функцию формальному параметру n присваивается значение фактического параметра 3 и производится выражение 3*fact(2), т.е. снова вызывается функция fact для вычисления fact(2). При входе в функцию формальному параметру n присваивается While, управляемая меткой» значение 2 и производится выражение 2*fact(1), т.е. снова вызывается функция fact для вычисления fact(1). При входе в функцию формальному параметру n присваивается значение 1 и производится выражение 1*fact(0), т.е. снова вызывается функция fact для вычисления fact(0). На этом заканчивается выполнение выражения 1*fact(0), что возвращает значение fact(1)=1; позже заканчивается выполнение выражения 2*fact While, управляемая меткой»(1), что возвращает значение fact(2)=2, и потом заканчивается вычисление 3*fact(2), что дает разыскиваемый итог 3*2=6.

Контрольные вопросы

1. Дайте понятие функции.

2. Что такое определение, макет и оператор вызова функции?

3. Для чего нужен макет функции?

4. Какие есть методы передачи характеристик функции?

5. Охарактеризуйте выполнение оператора вызова функции.

6. Дайте понятие рекурсивной функции.

7. Растолкуйте понятие While, управляемая меткой» шага рекурсии.

Тема 10. Динамические структуры данных

10.1. Списки: главные виды и методы реализации

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

Динамические структуры данных – это наборы данных, размеры которых нарастают и сокращаются во время выполнения программки. Разглядим главные виды динамических структур While, управляемая меткой» данных: списков и методы реализации операций с данными.

Связные списки (linked lists) – наборы частей данных, именуемых узлами, связанные с помощью связывающих указателей в линейную структуру данных, при этом операции вставки частей данных и их удаления осуществляются в любом месте перечня. Каждый узел содержит адреса (связующие указатели While, управляемая меткой») следующего и предшествующего указателя перечня (прямые и оборотные цепочки). Доступ к связному списку начинается через указатель на 1-ый элемент перечня, а потом через связующие указатели каждого перечня.

Стеки (stacks) – личный случай связных списков, в каких операции вставки и удаления проводятся в конце стека (в его верхушке), т.е. по принципу «первый пришел While, управляемая меткой», последний ушел»; применяется в компиляторах и операционных системах. Пример использования стеков и описание алгоритмов операций с элементами перечня представлен в § 7.1 при программировании класса «spisok» способом объектно-ориентированного программирования.

Очереди (queues) - личный случай связных списков, в каких операция вставки проводится в конце очереди (хвосте очереди), а операция удаления While, управляемая меткой» проводится сначала очереди (голове очереди), т.е. по принципу «первый пришел, 1-ый ушел».

Бинарные деревья (binary trees) – нелинейные структуры данных, обеспечивающие скоростной поиск и сортировку данных.

10.2. Динамическое выделение памяти

Создание и сопровождение динамических структур данных ведет к динамическому рассредотачиванию памяти, т. е. к наращиванию и сокращению области памяти в While, управляемая меткой» процессе выполнения программки.

Для управления динамической памятью употребляются:

оператор new для резервирования памяти из heap (кучи);

оператор delete для освобождения памяти.

Синтаксис оператора new (три формы):

new либо new () //резервирование памяти под

//объект типа ;

new (x) //резервирование памяти и инициализация

//значением x

new [] //резервирование под массив

//типа .

Примеры оператора new:

int* p1=new int; //резервирование While, управляемая меткой» памяти под объект

//типа int

int* p2=new int(5); //резервир. и инициализация значением x

char* tabn=new char[20]; //резервир. под массив типа char

t* p=new t; //резервир. под переменную типа структура t:

//struct t {char tabn[10]; float oklad;}

Итог оператора new – указатель на выделенную память, или 0, если произошла ошибка.

Синтаксис оператора delete имеет While, управляемая меткой» две формы:

delete p; //освобождение памяти, p – указатель из new

delete[] p; //освобождение памяти, занятой массивом

Примеры оператора delete:

delete p1; //освобождение памяти, на которую показывает p1

delete[] tabn; //освобождение массива, на который показывает tabn

Операторы new и delete в особенности эффективны при работе с объектами классов в объектно While, управляемая меткой»-ориентированном программировании.

Сравним структуры данных фиксированного размера (массивы) и динамические структуры данных (списки) исходя из убеждений их использования при программировании. Списки эффективны по сопоставлению с массивами в тех случаях, когда число частей данных в структуре данных заблаговременно не понятно и может изменяться во время выполнения программки. Естественно, можно и в этих случаях While, управляемая меткой» использовать массивы, объявив заблаговременно массив под наибольшее число частей, но это приведет к лишнему расходу памяти. Таким макаром, связные списки сберегают память.

Сравнивая операцию сортировки, можно сказать, что списки имеют преимущество, потому что имеют возможность вставки нового элемента прямо в подобающую позицию перечня. Также операции вставки и удаления While, управляемая меткой» в массиве будут более продолжительными, потому что все элементы при этих операциях сдвигаются.

Но массивы имеют большущее преимущество, связанное с резвым доступом к элементам массива, потому что адресок индексированного элемента массива рассчитывается одномоментно по отношению к началу массива. Это разъясняется рассредотачиванием памяти под массив, когда элементы массива располагаются While, управляемая меткой» в памяти безпрерывно. И в этом недочет списков, потому что узлы списков на физическом уровне не хранятся в памяти по соседству вместе.

Контрольные вопросы

1. Дайте определение динамических структур данных.

2. Какие есть главные виды списков?

3. Охарактеризуйте динамический класс памяти.

4. Сравните структуры данных фиксированного типа (массивы) с динамическими структурами данных (списки).

Раздел 3 Процедурное программирование

В While, управляемая меткой» других 4-ех темах мы разглядим вопросы технологии процедурного программирования и главные понятия объектно-ориентированного программирования: потоковый ввод-вывод данных, потоковая обработка файлов данных, методы конструирования программ и главные этапы процедурного программирования, введение в технологию объектно-ориентированного программирования.

Тема 11. Ввод/вывод данных

В C++ нет интегрированных средств ввода/вывода. Кандидатурой While, управляемая меткой» этому служит наличие библиотек ввода/вывода. Разглядим две главные библиотеки, имеющие средства регулирования экраном и клавиатурой:conio.h и iostream.h.

11.1. Видеофункции библиотеки conio.h

Файл conio.h содержит функции прямого ввода/вывода на консоли (клавиатура, экран монитора) в текстовом режиме.

Разглядим функцию форматированного вывода cprintf.

Синтаксис функции:

cprintf(формат,[аргумент While, управляемая меткой»1,...]);

,где формат - это символьная строчка, состоящая из обычных знаков и спецификаций формата;

[аргумент1,...]) – перечень аргументов.

Функция cprintf воспринимает перечень аргументов аргумент1, применяет к каждому из их подобающую спецификацию формата из строчки формат и выводит форматированные данные в выходной поток. Обыкновенные знаки переносятся в выходной поток без конфигураций.

Синтаксис спецификации While, управляемая меткой» формата:

%[флаг] [ширина] [.точность] тип


web-kvest-eto-novaya-tehnologiya-raboti-s-informacionnimi-internet-resursami.html
web-serveri-doklad.html
weekly-internet-parsha-sheet-january-8-2010.html