Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика. Шпаргалка. С++

.docx
Скачиваний:
317
Добавлен:
31.03.2015
Размер:
445.42 Кб
Скачать

Вопрос 22

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

Алгоритм вычисления суммы

1. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Нужно найти их сумму, т.е. S=a1+a2+a3+…+an.

Нахождение суммы есть последовательное нахождение

Алгоритм формирования нового массива

Как положительные элементы массива A сформировать в массив? Обозначим массив положительных элементов B и по пути “+” после блока 7 поставим присвоение соответствующему элементу массива B элемент массива A, т.е. блок, содержимое которого bk=ai.

k будем использовать как меняющийся индекс нового массива. Необходимо обратить внимание учащихся на блок 2, в котором требуется описать массив B, указав количество его элементов равное количеству элементов массива A. Схема алгоритма на рис.3б.

суммы по формулам:

S=0 S=S+a2 … S=S+ai S=S+an

S=S+a1 S=S+a3 

Алгоритм вычисления суммы удобно организовать циклом, взяв за параметр цикла переменную i, которая меняется от 1 до n с шагом 1, и записав в цикле формулу S=S+ai один раз. Схема алгоритма приведена на рис. 1а.

Алгоритм определения максимального элемента

Для получения максимального числа введем переменную M и ей присвоим значение первого элемента массива a1, а затем необходимо сравнить M с текущим элементом массива ai и если текущий элемент будет больше M, то значение M заменить на значение этого элемента. Схема алгоритма на Рис. 4. Очень важно обратить внимание учащихся на начальное значение переменной M. Почему, например нельзя переменной M присвоить значение равное нулю? (Ответ: Для массива с отрицательными значениями элементов максимум не будет найден.)

Вопрос 24

Алгоритмы обработки двумерных массивов. Поиск в выделенных областях.

Поиск в выделенных областях.

Часто возникает необходимость осуществить обработку в некоторой части матриц: только на главной диагонали, выше главной диагонали, ниже главной диагонали. Для обработки используются кратные циклы.

1)выше главной диагонали, не включая ее элементы:

i:=1 ton-1

j:=I+1 ton

2)выше главной диагонали, включая ее элементы:

i:=1 ton

j:=Iton

3)ниже главной диагонали, не включая ее элементы:

j:=1 ton-1

i:=j+1 ton

4)ниже главной диагонали, включая ее элементы:

j:=1 ton

i:=jton

Вопрос 28

Функции в С++. Описание, вызов, передача результата. Формальные и фактические параметры, правила соответствия, примеры.

Функции

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

Для того, чтобы в С++ использовать функцию, нужно ее:

1) Описать (или определить).

2) Объявить.

3) Вызвать.

Описание функции

Функция описывается заголовком и телом.

Заголовок содержит:

• класс памяти;

• имя функции;

• тип возвращаемого результата;

• имена и типы формальных параметров, заключенные в ( ) и разделенные запятыми.

Объявление и определение функций

Функция — это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.

Любая программа на C++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно. Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова. Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.

Правила соответствия

  • Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.

  • Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).

  • В определении, в объявлении и при вызове одной и той же функции типы и порядок

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

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

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

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

#include <iostream.h>

int sum (int a. int b); // объявление функции

int main(){

int a = 2, b - 3, c. d;

с = sum(a. b): // вызов функции

cin » d:

cout « sum(c. d); // вызов функции

return 0:

}

int sumdnt а. int b){ // определение функции

return (а + b):

}

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

Параметры функции

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

Существует два способа передачи параметров в функцию: по значению и по адресу. При передаче по значению в стек заносятся копии значений аргументов, и операторы функции работают с этими копиями.

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

#1nclude <iostream.h>

void f(int i. int* j . int& k);

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

модификатор const:

1nt f(const char*);

char* t(char* a. const int* b);

По умолчанию параметры любого типа, кроме массива и функции (например, ве­

щественного, структурного, перечисление, объединение, указатель), передаются

в функцию по значению.

Примеры описания функции

Пример :

/* Функция poisk — предназначена для поиска максимального элемента и его номера, значение максимума возвращается в качестве результата через заголовок, а номер максимального элемента n_max возвращается через список параметров. Здесьn_maxобъявленкакуказатель */

intpoisk(int* a, int n, int* n_max)

// входной параметр a - массив объявлен как указатель

// входной параметр n - число элементов в массиве

//

Вопрос 25

Приближенные вычисления и их реализация в С++. Метод бисекции и метод Ньютона.

Вопрос 26

Приближенные вычисления и их реализация в С++. Метод бисекции и метод секущих.

Вопрос 27

Приближенные вычисления и их реализация в С++. Метод бисекции и метод простых итераций.

Вопрос 29

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

Тип void

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

Вызов функций

Вызов функции - это выражение, которое передает управление и ФАКТИЧЕСКИЕ параметры (если они есть) функции. Вызов функции связан с выполнением действий над фактическими параметрами, заданных в ее определении.

Вопрос 30

Параметры-переменные и параметры-значения. Механизм передачи в функцию и из неё. Локальные и глобальные данные. Примеры.

Пара́метр в программировании — принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в каком качестве функция применила это принятое. Т.е. вызывающий код передает аргумент в параметр, который определен в члене спецификации функции.

По способу применения различают:

  • фактический параметр — аргумент, передаваемый в функцию при ее вызове;

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

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

Правила соответствия

  • Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.

  • Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).

  • В определении, в объявлении и при вызове одной и той же функции типы и порядок

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

Переменная — это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменять. Перед использованием любая

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

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

Глобальные переменные – действуют на протяжении всей программы. Хранятся в статическом сегменте памяти. Память под них распределяется при компиляции программы.

32.Многомодульная программа в с++. Препроцессор. Основныедирективы

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

Директивы препроцессора

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

Директива #include

Директива #include <имя_файла> вставляет содержимое указанного файла в ту точ­

ку исходного файла, где она записана.

С помощью директивы #define определяется макрос. Каждое появление в тексте программы имени, расположенном после директивы #define, заменяется определенным для него значением. Например, директива

#definePI 3.14159265359

указывает препроцессору на необходимость замены каждого появления в текущей единице компиляции лексемы PI лексемой 3.14159265359

• Макрос можно отменить в любом месте с помощью директивы #undef:

#undefPI

Директивы условной компиляции #if, #ifdef и #ifndef применяются для того,

чтобы исключить компиляцию отдельных частей программы.

34 Динамическая память.Операторыnew и delete.Функцииmalloc и free

Динамическая память

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

  • new - выделение памяти, если выделение памяти не произошло возвращается нулевой указатель;

  • delete - освобождение памяти, не во всех компиляторах после освобождения памяти указателю присваивается 0

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

указатель = new тип;

указатель = new тип [число элементов] (для массивов.)

Освобождение памяти с помощью оператора delete производится только в том случае, если она была выделена с использованием оператора new и имеет следующий синтаксис:

delete указатель;

delete [число элементов] указатель;

Резервирование и освобождение памяти в программах на C++ может происходить в любой момент времени. Осуществляются операции распределения памяти двумя способами:

с помощью функции malloc, calloc, realloc и free;

посредством оператора new и delete.

Функция malloc резервирует непрерывный блок ячеек памяти для хранения указанного объекта и возвращает указатель на первую ячейку этого блока. Обращение к функции имеет вид:

void *malloc(size);

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

voidfree (void *p size);

Здесь p — указатель на участок памяти, ранее выделенный функциями malloc, calloc или realloc.

Операторы new и delete аналогичны функциям malloc и free. New выделяет память, а его единственный аргумент — это выражение, определяющее количество байтов, которые будут зарезервированы. Возвращает оператор указатель на начало выделенного блока памяти. Оператор delete освобождает память, его аргумент — адрес первой ячейки блока, который необходимо освободить.

Вопрос 31.

Рекурсивный вызов функции.

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

Все функции языка С++ (кроме функции main) могут быть использованы для построения рекурсии.

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

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

33.Понятие указателя. Операции. Указатели и массивы. Указатель на функцию.

Указатели предназначены для хранения адресов областей памяти. В C++

различают три вида указателей — указатели на объект, на функцию и на void, от­

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

Указатель на функцию содержит адрес в сегменте кода, по которому располагает­

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

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

ва функции (не через ее имя, а через обращение к переменной, хранящей ее ад­

рес), а также для передачи имени функции в другую функцию в качестве пара­

метра.

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

определенного типа (основного или составного). Простейшее объявление указа­

теля на объект (в дальнейшем называемого просто указателем) имеет вид:

тип *имя:

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

несколько указателей, требуется ставить ее перед именем каждого из них. На­

пример, в операторе

1nt *a. b . *с;

Указатель на void применяется в тех случаях, когда конкретный тип объекта, ад­

рес которого требуется хранить, не определен

Указатель может быть константой или переменной, а также указывать на кон­

станту или переменную. Рассмотрим примеры:

int 1; // целая переменная

const int ci = 1; // целая константа

int * pi; // указатель на целую переменную

const int * pci; // указатель на целую константу

Указатель на функцию - переменная, которая содержит адрес некоторой функции. Соответственно, косвенное обращение по этому указателю представляет собой вызов функции.

Определение указателя на функцию имеет вид:

int (*pf)(); // без контроля параметров вызова

int (*pf)(void); // без параметров, с контролем по прототипу

35Обработка символьной информации в с++.Массивы символов.Строки.Основные функции для работы со строками

Символ – элементарная единица, некоторый набор которых несет определенный смысл. В языке программирования С++ предусмотрено использование символьных констант. Символьная константа – это целочисленное значение (типа int) представленное в виде символа, заключённого в одинарные кавычки, например 'a'. В таблице ASCII представлены символы и их целочисленные значения.

1// объявления символьной переменной

2char symbol = 'a';

3// где symbol – имя переменной типа char

4// char – тип данных для хранения символов

Строки в С++ представляются как массивы элементов типа char, заканчивающиеся нуль-терминатором \0 называются С строками или строками в стиле С.

\0 — символ нуль-терминатора.

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

1// пример объявления строки

2charstring[10];

3// где string – имя строковой переменной

4// 10 – размер массива, то есть в данной строке может поместиться 9 символов , последнее место отводится под нуль-терминатор.

Функции для работы со строками и символами

Копирование строк

strlen(имя_строки) определяет длину указанной строки, без учёта нуль-символа

strcpy(s1,s2) выполняет побайтное копирование символов из строки s2 в строку s1

Конкатенация строк

strcat(s1,s2) объединяет строку s2 со строкой s1. Результат сохраняется в s1

strncat(s1,s2,n) объединяет n символов строки s2 со строкой s1. Результат сохраняется в s1

Функции поиска

strchr(s,c) поиск первого вхождения символа с в строке s. В случае удачного поиска возвращает указатель на место первого вхождения символа с. Если символ не найден, то возвращается ноль.

12