CPP FAQ Часть I

Клуб веб-разработчиков PHP HTML MYSQL JS Apache

вопрос 1. Вывод данных. Ввод данных.

____________________________________

Вывод данных.

C помощью команды cout<< мы можем выводить на экран разные строчки. 

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

если в заголовке программы есть строка #include <iostream.h> 

Строку, которую мы хотим вывести на экран используя cout<<, мы обязательно записываем 

в кавычки. Например: 

cout<<”здесь пишем то, что хотим”; 

Команда cout<< не только выводит на экран строчки, но и позволяет их оформлять.

Для оформления вывода строки используют специальные управляющие символы.

Эти управляющие символы называются Escape-последовательностями.

Приведу некоторые из них: 

\b Удаление последнего выведенного символа

\n Перейти на начало новой строки 

\t Перейти к следующей позиции табуляции 

\\ Вывести обратную черту \ 

\" Вывести кавычку “ 

Ввод данных.

Если нам нужно ввести данные в компьютер, то будем пользоваться командой cin. 

Как ею пользоваться? Синтаксис оператора ввода: 

cin>>имя_переменной;

имя_переменной указывает на переменную, в которую нужно поместить данные, 

введенные с клавиатуры:

Например:

cin>>Number;

Ввод сразу нескольких переменных, записывают таким образом:

cin>>имя_переменной1>>имя_переменной2>>...>>имя_переменнойN;

Список имен переменных должен содержать имена всех переменных, 

в которые Вы хотите ввести данные с клавиатуры.

Список имен может состоять из любого количества имен переменных,

разделенных комбинацией символов >>.

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

вопрос 2. Типы данных. Переменные и константы. Литералы.

________________________________________________________

Язык с++ поддерживает несколько базовых типов данных,

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

____________________________________________________________________________________________

Пояснение    Тип     Размер в байтах    Диапазон значений  Пример объявления и инициализации 

____________________________________________________________________________________________

описывает                                                     

целые        int         4              от -2147483648              int Vozrast;Vozrast=16; 

числа                                   до 2147483647 

____________________________________________________________________________________________                     

описывает

короткие     short       2              от -32768                short Kol_Cats;Kol_Cats=9; 

целые числа                             до 32767 

____________________________________________________________________________________________

описывает

длинные      long        4              от -2147483648     long Kol_Peska;Kol_Peska=214748;

Целые числа                             до 2147483647 

____________________________________________________________________________________________

описывает                               от  -128 до 127

символы      char        1              или от 0 до 256                 char Mark;Mark='C'; 

____________________________________________________________________________________________

описывает

логические   bool        1              true false                 bool Cloudy;Cloudy=true; 

значения 

____________________________________________________________________________________________

описывает 

вещественные 

числа        float       4                                     float Weight;Weight=12.3452; 

одинарной 

точности 

____________________________________________________________________________________________

описывает

вещественные

числа        double      8                                              double weight_atom;

двойной                                                               weight_atom= 0.1E-33; 

точности 

____________________________________________________________________________________________

Переменная — это область в памяти компьютера, где может хранится некоторое значение для 

использования его в программе.

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

Если при описании переменной не использовалось ключевое слово const,

то в переменной можно хранить различные данные (в противном случае невозможно изменить

занесенное при инициализации значение). Для обозначения переменной допускаются практически

любые имена не совпадающие с ключевыми словами.

Литералы (literals) — это постоянные значения, такие как 1 или 3.14159 

Для каждого типа С++ существуют литералы, включая символьный и булевский типы,

целые числа и числа с плавающей точкой. 

Возможны строковые литералы, хотя типа для хранения строк в С++ не существует.

Некоторые примеры:

5  целая константа 

true логическая константа 

5.0 константа с плавающей точкой, понимается как double 

5.0f f или F — с плавающей точкой, понимается как float 

0.3е-2 константа с плавающей точкой double, e или E отделяют экспоненциальную часть 

'd' символьная константа 

"Visual" строковая константа 

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

вопрос 3. Арифметические операции с числами. Выражения.

_______________________________________________________

таблица.

___________________________________________________________________________________________

операция     Так она выглядит в С++     Алгебраическое выражение       Как это же выражение 

                     выглядит в С++ 

___________________________________________________________________________________________

Сложение            +                          A+34+t                       A + 34 + t 

___________________________________________________________________________________________

Вычитание           -                          A-34-t                       A - 34 - t 

___________________________________________________________________________________________

Умножение           *                           3·t                           3 * t 

___________________________________________________________________________________________

Деление             /                           25:y                          25 / y 

___________________________________________________________________________________________

остаток от          %                         d mod 2                         d % 2 

деления 

___________________________________________________________________________________________

Операцией нахождения остатка от целочисленного деления % используется только для целых чисел. 

Кроме перечисленных выше стандартных операций существуют еще и специальные. 

Например, в программировании часто встречаются ситуации,

когда надо увеличить или уменьшить значение переменной на единицу.

Чтобы не писать строку

Numb=Numb+1;

которая выполняет увеличение переменной Numb на единицу,

можно использовать оператор инкремент (++):

Numb++;

Аналогично работает оператор декремент (--),

который уменьшает значение переменной на единицу:

Numb--;

Однако «тонкости» математических операций на этом не исчерпываются. 

С++ позволяет использовать по две модификации каждой из приведенных выше операций: 

префиксную (++Number) и постфиксную (Number++). 

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

Постфиксные — наоборот.

Выражение - это то, что приводит к некоторому значению. Уникальным свойством С++

является то, что любое выражение можно превратить в инструкцию, добавив после него

точку с запятой (;).Операции присваивания также являются выражениями, так как они 

возвращают те значения, которые присваиваются.

Все последующие примеры являются правельными выражениями:

x;

y=x;

y=x=z=0;

y=(x*n+1)/y2k;

funk();

y=funk();

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

вопрос 4. Преобразование типов.

_______________________________

Любое арифметическое выражение вроде х+у имеет тип и значение.

Например, если обе переменные х и у одного типа (скажем int), 

то х+у — тоже целое. Если х и у различных типов, то х+у называется смешанным выражением.

Предположим, х типа short, a y типа int. Тогда значение х будет преобразовано к целому, 

и выражение х+у получит тип int. Заметьте, что значение х в памяти остается неизменным. 

Преобразуется только временная копия х при вычислении значения выражения. 

Теперь предположим, что обе переменные х и у имеют тип short. 

Хотя х+у и не является смешанным выражением, все равно произойдет автоматическое 

преобразование; х и у будут повышены до int и выражение будет целым.

Общие правила просты:

Автоматическое преобразование выражения “х операция у” 

 1) Bce bool, char, short или enum повышаются до int.

    Целые типы, которые не могут быть представлены как int, повышаются до unsigned int. 

 2) Если после первого шага выражение остается смешанным, 

    то в соответствии с иерархией типов, 

  

    int < unsigned int< long <unsigned long < float < double < long double 

операнд более низкого типа повышается до более высокого типа,

и значение выражения получает этот тип.

Заметьте, что unsigned int повышается до unsigned long,

если long не может содержать все значения unsigned int. 

Чтобы проиллюстрировать неявные преобразования,

мы сделаем следующие объявления и перечислим различные смешанные выражения 

вместе с соответствующими типами: 

Объявления: char c; long lg; double d; int i;short s; float f; unsigned u; 

____________________________________________________________________________________________

Выражение           Тип                  Выражение  Тип

____________________________________________________________________________________________

с - s / i           int                  u * 3 – i unsigned

____________________________________________________________________________________________

u * 3.0 – i        double                  f * 3 – i float

____________________________________________________________________________________________

с + 1             int                  3 * s * lg long

____________________________________________________________________________________________

с + 1.0            double                         d + s double

____________________________________________________________________________________________

Автоматическое преобразование может происходить при присваивании. Например: 

d = i 

переведет целое значение i в double и затем присвоит его d; 

тип всего выражения будет double. Повышение (или расширение) типа,

как в выражении d = i, обычно будет выполнено правильно, 

а вот понижение (или сужение) типа, как в выражени i = d, 

может привести к потере информации. Здесь дробная часть d будет отброшена. 

Что именно произойдет, в каждом случае зависит от машины. 

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

и в смешанных выражениях, существует явное преобразование, называемое приведением (cast).

Пусть i — целое, тогда 

(double)i 

выполнит приведение значения i так, что выражение будет иметь тип double. 

Сама переменная i остается неизменной. Примеры: 

(char) (' А' +1.0) 

Вот некоторые примеры: 

double у = i/(double)7; //разделит с двойной точностью 

char ptr = (char)(i + 88); //целое к значению символа  

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

вопрос 5. Перечисляемые типы. Логические операции.

__________________________________________________

Перечисляемые типы.

В программах на с++ перечисление - это быстрый и легкий способ создать список целых

констант. Вот простой пример (здесь названия совпадают с их числовыми значениями,

так как перечисление начинаетя с нуля):

enum number{

zero,one,two,three;

};

//...

cout<<two<<endl;//напечатает "2"

Логические операции.

____________________

операций отношения :                  >, <, >=, <=;

операций проверки на равенство:      ==, !=;

Логические операции:   

&&  - (логическое И), 

||  - (логическое ИЛИ) и 

!  - (логическое НЕ, называемое также логическое отрицание).  

Таблица истинности для &&

____________________________________________________________________________________________

выражение 1                    выражение 2                   выражение 1 & & выражение 2 

____________________________________________________________________________________________

true                             true                                   true 

true                             false                                  false 

false                            true                                   false 

false                            false                                  false 

____________________________________________________________________________________________

Таблица истинности для ||

____________________________________________________________________________________________

выражение 1                    выражение 2                   выражение 1 || выражение 2 

____________________________________________________________________________________________

true                             true                                   true 

true                             false                                  true 

false                            true                                   true  

false                            false                                  false 

____________________________________________________________________________________________

Таблица истинности для !

____________________________________________________________________________________________

выражение                                                                   ! выражение 

____________________________________________________________________________________________

true                                                                            false 

false                                                                           true 

____________________________________________________________________________________________

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

вопрос 6. Управляющие структуры (if-else). Структура множественного выбора switch.

__________________________________________________________________________________

Инструкция выбора switch реализует условный переход с множественным ветвлением.

Инструкция switch сравнивает значения аргумента с константами. Когда значение

равно константе, выполняется следующая за константой последовательность инструкций

до тех пор , пока не встретится инструкция break, после которой завершается выполнение

всех инструкций блока switch

Синтаксис:

switch(значения аргумента) 

case constanta_1: инструкция;

break;

case constanta_2: инструкция;

break;

...

case constanta_N: инструкция;

break;

default: инструкция;

Управляющие структуры (if-else).

Инструкция if - первая часть инструкции ветвления.

Синтаксис:

if(выражение)

{

block_1;

}

else

{

block_2;

}

Если значение выражения истино (true) то выполняются инструкции первого блока,

иначе - второго (если он имеется). Вторая часть условной инструкции,

начинающаяся со слова else, не обязательна. Если после инструкции if или else

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

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

вопрос 7. Циклы. break и continue.

__________________________________

1)Цикл for:

Инструкция цикла for позволяет осуществить проверку условия выполнения цикла,

инициализировать и изменять переменные.

Синтаксис:

for(инициализация;условие;инструкции изменения переменных)

{

тело цикла;

}

2)Цикл while:

Инструкция while позволяет создать циклы с предусловием.

Так как проверка условия осуществляется перед выполнением тела цикла,

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

Синтаксис:

while(условие)

{

тело цикла;

}

Цикл выполняется до тех пор, пока условие цикла равно true.

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

3)Цикл do:

Инструкция do является началом инструкций цикла с постусловием.

Так как условие проверяется в конце тела цикла, эта инструкция выполняется не менее

одного раза.

Синтаксис:

do

{

тело цикла;

}while(условие);

Цикл выполняется до тех пор, пока условие цикла равно true.

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

break и continue.

_________________

Инструкция  break применяется для немедленного выхода из циклов for  и  while, 

а также инструкции выбора  switch.

После выполнения инструкции  break управление будет передано первой инструкции,

расположенной следом за последней инструкцией прерванного цикла.

Инструкция  continue  используется для игнорирования оставшихся инструкций в теле

цикла и перехода к очередной проверки условия выполнения тела цикла.

То есть в отличии от инструкции  break управление передается не на следующую

после цикла инструкцию а на следующий шаг итерации.

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

вопрос 8. Область видимости. Указатели на функции.

__________________________________________________

Указатели на функции.

_____________________

Каждая функция характеризуется

типом возвращаемого значения, именем, количеством, порядком следования и типами параметров.

При использовании имени функции без последующих скобок и параметров имя функции выступает в

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

Это значение адреса может быть присвоено другому указателю, и затем уже этот новый указатель

можно применять для вызова функции. Однако в определении нового указателя должен быть тот же

тип, что и возвращаемое функцией значение, то же количество, порядок следования и типы

параметров. Указатель на функцию определяется следующим образом:

тип функции (*имя_указателя)(спецификация_параметров);

Например: 

int(*func1ptr) (char);

— определение указателя func1ptr на функцию с параметром типа char,

возвращающую значение типа int. 

Область видимости.

__________________

Область видимости переменной или функции - это та область, где соответствующий объект

определен. Наиболее важны две категории области видимости: локальная и глобальная.

Локальная переменная видна только в той функции, где она определена.

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

в том числе и функции main().

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

вопрос 9. Аргументы по умолчанию. Встраивание. Перегрузка функций.

__________________________________________________________________

Аргументы по умолчанию.

_______________________

Формальному параметру функции может быть задан аргумент по умолчанию (default argument).

Обычно это константа, которая часто встречается при вызове функции. 

Использование аргумента по умолчанию позволяет не писать его значение при каждом вызове.

Следующая функция вычисления степени целого числа демонстрирует сказанное:

int sqr_or_power(int n, int k = 2) //k = 2 по умолчанию

{

if (k == 2)

return (n * n) ;

else

return pow(n,k) ;

}

Здесь предполагается, что чаще всего эта функция 

применяется для вычисления значения квадрата целого числа n .

Вызовы этой функции могут выглядеть следующим образом:

sqr_or_power(i + 5);  //вычислит (i + 5) * (i + 5)

sqr_or_power (i + 5, 3); //вычислит (i + 5) в кубе

Обратите внимание, что в первом случае при вызове функции sqr_or_power указан только один

параметр, поэтому второму параметру автоматически присвоится значение 2,  так как он

объявлен по умолчанию равным 2. 

Только несколько последних параметров функции могут иметь значения по умолчанию:

void foot (int i, int j = 7) ;               //допустимо

void foot (int i, int j = 2, int k) ;        //недопустимо

void foot (int i, int j = 3, int k = 7) ;    //допустимо

void foot (int i = 1, int j = 2, int k = 3); //допустимо

void foot (int i=- 3, int j);                //недопустимо

То есть аргументами по умолчанию могут быть аргументы, начиная с правого конца списка

параметров функции и далее последовательно слева направо без перерывов. 

Во втором примере недопустимое использование параметров по умолчанию, 

так как крайний правый параметр не является параметром по умолчанию,

а следующий за ним параметр при движении справа налево пытаемся объявить как параметр

по умолчанию - получаем разрыв,а это недопустимо. 

Похожая ситуация наблюдается и в последнем примере - также разрыв параметров по умолчанию. 

Использование аргументов по умолчанию, как и многих других возможностей по умолчанию,

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

Встраивание.

____________

Модификатор inline используется при описании встраиваемых функций.

Такие функции уменьшают число операций процессора, выполняемых при их вызове,

в связи с чем повышается быстродействие программы. Однако при этом 

увеличивается размер программы, поэтому встраиваемыми следует определять

только очень короткие функции.

Пример:

inline double cube(double x)

{

return x*x*x;

}

Ограничения компилятора не позволяют встраивать сложные функции, 

то есть функции содержащие циклы, инструкции switch, if и тому подобные. 

Попытка объявить такую функцию как inline ошибкой не будет, 

просто компилятор не может встроить эту функцию.

Перегрузка функций.

___________________

Перегрузка (от англ. overloading) использует одно и то же имя для нескольких

вариантов функции.Другими словами, несколько функций могут иметь одинаковые имена.

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

Другими словами, компилятор различает функции с одинаковыми именами по параметрам, 

которые передаются в эту функцию. Программисты говорят, что компилятор отличает 

одну функцию от другой по ее сигнатуре.

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

Сигнатура функции задается числом, порядком следования и типами параметров. 

Имена функций могут быть перегружены в пределах одной и той же области видимости.

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

вопрос 10. Сортировка массивов.

_______________________________

Хотя существует множество методов сортировки данных, все эти методы можно отнести

к одному из следующих классов:

* Перестановка (пузырьковая сортировка);

* Отбор;

* Вставка;

пузырьковая сортировка

______________________

Программа сортирует значения массива следующим образом: 

сначала она сравнивает элементы массива a[0] и а[1], 

меняя местами их значения, если они не упорядочены, 

затем проделывает то же самое с элементами а[1] и а[2], а[2] и а[3] и т.д.. 

Главное достоинство пузырьковой сортировки заключается в простоте ее программирования. 

Однако, выполняется она медленно. Это становится очевидным при сортировке больших массивов.

void F(int *mas, int count){

int i,j;

int temp;

for(i=1;i<count;++i){

for(j=count-1;j>=i;--j){

if(mas[j-1]>mas[j]){

temp=mas[j-1];

mas[j-1]=mas[j];

mas[j]=temp;

}

}

}

}

Ее смысл заключается в постоянном сравнении смежных элементов и при необходимости

их перестановке.

Сортировка выбором.

___________________

Алгоритм сортировки выбором основан на использовании элементов в качестве ключей для 

сравнения, при этом в конце каждого просмотра только один элемент помещается в свою 

правильную позицию. Этот алгоритм прост, но неэффективен, так как он не учитывает 

частично или полностью отсортированных наборов данных. Это означает, что число проводимых 

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

Алгоритм:

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

2.Для элементов от X[i + 1] до X[N - 1] выполнить сравнение по ключам и найти наименьший 

  элемент. Назовем его X[min]. 

3.Поменять местами X[min] и X[i]. X[min] теперь находится в своей отсортированной позиции.

После окончания цикла массив отсортирован. 

Сортировка вставками.

_____________________

Сортировка вставками - простой и достаточно эффективный метод сортировки, при котором 

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

упорядочивает элементы X[0] и X[1], вставляя X[1] перед X[0], если X[0] > X[1]. 

Затем оставшиеся элементы данных по очереди вставляются в этот упорядоченный набор. 

После i-й итерации элемент X[i] оказывается в своей правильной позиции и элементы от X[0] 

до X[i] уже отсортированы. 

После каждой итерации только один элемент помещается в свою правильную позицию. 

При сортировке вставками выполняется меньше перестановок, чем в "пузырьковой" сортировке.

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

вопрос 11. Указатели.

_____________________

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

Указатель - это переменная, которая содержит адрес.

Для определения указателя используется символ * в определении или объявлении объекта.

Приведем несколько примеров:

int *iptr;   //Определяет указатель на целое значение

float *fvals;   //Определяет указатель на значение с плавающей точкой

char *cp;  //Описывает указатель на символ

Применение указателей позволяет упростить алгоритм или повысить его эффективность. 

Каким образом? Указатели могут обесечить простые способы ссылок на массивы, списки или

блоки данных. Для таких ссылок достаточно иметь простой элемент данных: указатель.

Нередко бывает проще и эффективнее манипулировать простым указателем, 

чем управлять полным списком данных. Управление памятью компьютера - это еще одно 

из важнейших   применений указателей. 

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

вопрос 12. Указатели - аргументы функций. Ссылки. Ссылочные параметры.

______________________________________________________________________

Указатели - аргументы функций.

______________________________

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

с последующим изменением их значений внутри вызванной функции, рассмотрим функцию my_swap, 

которая меняет местами значения своих параметров. Другими словами, если объявлены две 

переменные типа int a, b; причем, a=7 и b=10, то после вызова функции my_swap(&a, &b) 

результат будет следующим: а=10 и b=7. 

В самой функции my_swap параметры должны быть описаны как указатели, при этом доступ к 

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

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

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

void my_swap(int *px,  int *py)  

int  temp;

temp=*px; //переменной temp писвоили 7

*px=*py; //переменная а приняла значение 10

*py=temp; //переменная b приняла значение 7

}

Теперь, вызов функции из main() будет выглядеть следующим образом: 

my_swap(&a, &b); 

Давайте, подведем итоги: 

аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее функции

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

передачей параметров по ссылке с ипользованием указателей, придерживайтесь следующих 

инструкций: 

1.Объявите параметры-указатели в заголовке функции. 

2.Используйте разыменованный указатель в теле функции. 

3.Передавайте адреса в качестве аргументов при вызове функции.

Ссылки.

_______

ссылка есть другое имя для объекта. Например: 

int L = 999;

int& RL = L;

Здесь RL является ссылкой. 

Теперь к L можно обращаться как по имени L, так и по имени RL. 

Т.е. по сути ссылка является синонимом, псевдонимом переменной L. 

Итак, давайте запишем в общем виде, как определяется ссылка: 

тип& имя_ссылки = инициализирующее_выражение;

Для определения ссылки используется оператор ссылки & (символ амперсанд). 

При определении ссылки необходимо обязательно задать инициализирующее_выражение,

псевдонимом которого и будет ссылка. Например: 

float& ref;  // ошибка

int Count = 0;

int &RefCount = Count;   // правильно

Ссылочные параметры.

____________________

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

доступа к передаваемым данным, а значит возможность изменения этих данных. 

Вызов по ссылке имеет преимущество в смысле производительности перед вызовом по значению, 

поскольку он исключает накладные расходы на копирование больших объемов данных, 

однако следует помнить что при вызове по ссылке вызываемая функция может изменить 

передаваемые в нее данные, а это может быть нежелательно. 

Итак, ссылочный параметр - это псевдоним соответствующего аргумента (параметра). 

Чтобы показать, что параметр функции передан по ссылке, после типа параметра в прототипе 

функции ставится символ амперсанда &, такое же обозначение используется в списке типов 

параметров в заголовке функции.

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

вопрос 13. Функции работы со строками из библиотеки обработки строк.

____________________________________________________________________

включить заголовочный файл string.h 

1. Функция int strlen (const char* s); - определяет длину строки s. 

Возвращает количество символов, предшествующих завершающему нулевому символу. 

Обратите внимание, завершающий ноль-символ в длину не включается.

2. Функция char *strcpy(char *s1, const char *s2); 

- копирует строку s2 в массив символов s1. Возвращает значение s1. 

Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий 

нулевой символ, который также копируется. 

3. Функция int *strcmp(const char *s1, const char *s2);

 - сравнивает строки s1 и s2 (по ASCII-кодам). 

Функция возвращает значение 0, если строки s1 и s2 равны, 

значение меньше ноля, если строка s1 меньше s2, 

и значение больше ноля, если s1 больше s2. 

Обратите внимание, строки сравниваются не по длине, а посимвольно, 

по ASCII-кодам ( т.е. "g" больше "ff"). 

4. Функция char *strcat(char *s1, const char *s2);

 - добавляет строку s2 к строке s1. 

Первый символ строки s2 записывается поверх ноль-символа строки s1. 

Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). 

5. Функция char *strncpy(char *s1, const char *s2, int n); 

- копирует не болеее n символов строки s2 в массив символов s1. Возвращает s1.

6. Функция char *strncmp(char *s1, const char *s2, int n);

 - сравнивает до n символов строки s1 со строкой s2. 

Возвращает 0, меньше, чем 0 или больше, чем 0, 

если s1 соответственно равн, меньше или больше s2.

7. Функция char *strncat(char *s1, const char *s2, int n); 

- присоединяет первые n символов строки s2 в строку s1. Возвращает s1.

8. Функция char *strchr(const char *s, int c); 

- проверяет строку s на содержание символа хранящегося в c. 

Результатом функции является адрес первого вхождения символа c в строку s. 

Если символ не найден, возващается NULL.

9. Функция char *strstr(const char *s1, const char *s2);

 - проверяет строку s1 на содержание подстроки s2. 

Результатом функции является адрес первого вхождения подстроки s2 в строку s1.

Если подстрока не найдена, возващается NULL.

10. Функция char *strlwr(char *s); 

- конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). 

11. Функция char *strupr(char *s); 

- конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).

12. Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch.

13. Функция char *strrev(char *s);

- меняет порядок следования символов в строке на противоположный 

(меняет первый символ с последним, второй символ с предпоследним и т.д.). 

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

вопрос 14. Рекурсия. Рекурсии или итерации.

___________________________________________

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

либо непосредственно, либо косвенно с помощью другой функции. 

 /*Рекурсивная функция факториала*/

  #include<iostream.h>

  unsigned factorial(int);

  void main(void)

  {

  for (int i = 0; i <= 10; i++)

  cout << i << "! = " << factorial(i) << '\n';

  }

  unsigned factorial ( int number)

  {

  if (number <= 1) return 1;

  else return number * factorial(number - 1);

  } 

Рекурсия имеет много недостатков. 

Повторный запуск рекурсивного механизма вызовов функции приводит к росту накладных расходов:

к нарастающим затратам процессорного времени или требуемого объема памяти. 

Каждый рекурсивный вызов приводит к созданию новой копии функции 

(в самом деле копируются только переменные данной функции); 

для этого может потребоваться значительная память. 

Итерации обычно не связаны с функциями, так что в них отсутствуют накладные расходы на

повторные вызовы функции и дополнительные затраты памяти.

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

вопрос 15. Определение структур. Указатели на структуру.

________________________________________________________

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

Структура состоит из полей. Поля (элементы структуры) - переменные или массивы 

стандартного типа (int, char и т.п) или другие, ранее описанные структуры. 

Описанный тип данных можно использовать для объявления переменных типа структур. 

можно объявлять сколько угодно переменных с одной и той же структурой.

В одной программе может быть множество разных структур. 

Из структур можно организовывать массивы. 

Объявление структуры осуществляется с помощью ключевого слова struct, 

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

 struct [имя] { 

               тип_элемента_1 имя_элемента_1;

               тип_элемента_2 имя_элемента_2;

                    ...

               тип_элемента_n имя_элемента_n;

     };

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

Именем элемента может быть любой идентификатор. Через запятую можно записывать несколько 

идентификаторов одного типа. Элементы одной и той же структуры должны иметь уникальные 

имена, но две разные структуры могут содержать элементы с одинаковыми именами. 

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

struct date { int day, month, year; };

Переменные структуры объявляются так же, как переменные других типов. Например, 

date days;

Указатели на структуру.

_______________________

Имя структуры обладает всеми правами имен типов, 

а следовательно, можно определять указатели на структуры: 

имя_структуры *имя_указателя на структуру;

для доступа к элементам структуры мы использовали операцию точка (.). 

Операция точка обращается к элементу структуры по имени переменной объекта. 

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

к элементам структуры. Ее обеспечивает оператор стрелка (->).

Формат соответствующего выражения следующий: 

имя_указателя->имя_элемента_структуры

Выражение birthday->month эквивалентно (*birthday).month, 

которое разыменовывает указатель и делает доступным элемент month через оператор точка.

Скобки нужны, т.к. оператор точка имеет более высокий приоритет, &

13:32
FF
RSS
Нет комментариев. Ваш будет первым!