- •Понятие алгоритма. Свойства алгоритмов. Основные этапы решения задач
- •1. Формулировка задачи
- •2. Математическая постановка задачи
- •3. Разработка алгоритма
- •4. Написание текста и ввод программы
- •5. Выполнение программы. Поиск и устранение синтаксических ошибок
- •6. Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы (загрузочного модуля).
- •Структуры и формы написания программы
- •Внутреннее представление данных
- •Классы памяти
- •Обмен данными через внешние переменные
- •Статические переменные
- •Стандартный ввод/вывод данных через потоки
- •Ввод данных
- •Вывод данных
- •Специфические операции
- •Операции присваивания
- •Некоторые нетрадиционные (унарные) операции
- •Условные выражения
- •Операция условия ?:
- •Выражения (в том числе и условные). Порядок выполнения операций в выражении. Таблица приоритетов.
- •Условный оператор if и его применение при программировании. Сокращенная форма оператора if
- •Полная форма оператора if
- •Множественный выбор else-if
- •Оператор выбора switch и его применение при программировании.
- •Циклические вычислительные процессы
- •Оператор цикла while и его применение при программировании. Цикл while – цикл с предусловием.
- •Оператор цикла do while и его применение при программировании. Цикл do while – цикл с постусловием
- •Оператор цикла for и его применение при программировании. Цикл for – цикл с предусловием
- •Операторы break, goto, continue их применение при программировании. Операторы передачи управления
- •Оператор break
- •Оператор continue
- •Оператор goto
- •Вложенные циклы.
- •Указатели и адреса: описание, инициализация и операции с указателями. Применение указателей при программировании.
- •Статические строки
- •Динамические строки
- •Стандартный цикл обработки строки
- •Одномерные числовые массивы
- •Статические массивы
- •Динамические массивы
- •Динамические матрицы
- •Циклы перебора матрицы
- •Программирование с использованием функций пользователя. Принципы построения функций.
- •Механизм вывода функции
- •Передача значения простого аргумента в функцию. Способы передачи простых данных в функцию
- •Передача в функцию значения аргумента
- •Рекурсивная функция
- •Передача функции в другую функцию через указатель. Параметр функции. Указатель на функцию.
- •Перегрузка функций.
- •Функции с параметрами по умолчанию
- •Шаблоны функций.
- •Формат функции шаблона
- •Механизм шаблона
- •Особенности проекта с функциями-шаблонами
Операторы break, goto, continue их применение при программировании. Операторы передачи управления
break continue goto
Выполнение каждого из этих операторов вызывает скачок в выполнении вычислительного процесса. Частое использование if ухудшает читаемость программы, увеличивает вероятность ошибки и затрудняет ее модификацию.
Операторы применяются в составе условных конструкций.
Оператор break
Применяется: 1) для построения цикла с выходом из него изнутри тела цикла
while(1)
{
операторы
if (условие выхода из цикла)
break;
операторы
{
2) с помощью break формируем особое условие выхода из цикла
while(выражение)
{
операторы
if(особое условие выхода из цикла)
break;
операторы
}
Пример:
Определить является ли простым натуральное число N.
int n, i;
cout<< "Введите число: ";
cin>>n;
for (i=2; i<n; i++)
if (n%i= =0)
break;
if (i= =n)
cout<<"\nЧисло простое";
else
cout<<"\nЧисло не простое";
Оператор continue
Применяется внутри тела цикла и приводит к выполнению следующей итерации, оставшаяся часть текущей итерации пропускается.
while(выражение)
{
операторы
if(условие)
continue;
операторы
}
Оператор continue в цикле применяется всегда в составе условного оператора, также как и break.
Оператор goto
Используется для передачи управления внутри одной функции от одного оператора к другому, помеченному меткой. Метка формируется как имя переменной, т.е. метка начинается с буквы и может содержать в себе буквы цифры и некоторые знаки.
Синтаксис: Не входить внутрь блока, условных операторов цикла.
goto m1;
.............
m1:
.............
Пример:
for (…)
for (…)
{
if (условие ошибки)
goto m1;
.............
}
............
m1:
............
Вложенные циклы.
Цикл называется вложенным, если находится в теле другого цикла.
Задача: из двух цифр сформировать всевозможные двузначные числа и расположить в порядке возрастания (матрица)
int j, i;
i=1;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
cout<<i*10+j<<’ ‘;
cout<<endl;
}
return 0;
Нужно расписать вложенный цикл и показать, как он работает.
Сначала фиксируется переменная во внешнем цикле. Проверяется условие. Если условие истинно, то идём в тело этого цикла. А в теле этого цикла есть внутренний цикл. Инициализация переменной внутреннего цикла, идём внутрь этого цикла, алгоритм обработки. Прокручивается внутренний цикл до конца. Потом выскакиваем во внешний цикл. Идёт коррекция, снова проверка условия, снова закручивается внутренний цикл от начала до конца.
Сумма произведений
+
Указатели и адреса: описание, инициализация и операции с указателями. Применение указателей при программировании.
Указатель – это переменная, которая содержит адрес другой переменной соответствующего типа, или точнее говоря адрес первого байта памяти, выделенного под эту переменную.
Зачем нужны указатели:
Применение указателей в некоторых случаях позволяет упростить алгоритм, повышает его эффективность.
Обращение к памяти через адрес осуществляется быстрее.
С помощью указателей эффективней управляем оперативной памятью. Существуют операции, которые позволяют резервировать или освобождать блоки памяти в процессе выполнения программы. – этот процесс называется управлением динамической памятью.
Обмен данными между различными функциями осуществляется эффективней, передача массивов и дополнительных результатов из функций возможна только через указатель.
Для работы с данными через адрес необходимо:
объявить указатель
положить в указатель правильный адрес
осуществить доступ к данному через адрес
Объявление указателя.
Синтаксис: имя_типа*имя_ указателя;
Пример:
int *p1; // переменная p1 объявлена как указатель на целый тип данных, т.е. она может содержать адрес любой переменной целого типа.
void *p3; // переменная p3 является указателем на тип void т.е. может содержать адрес любого типа.
Инициализация указателей. Помещение в указатель правильного адреса.
Имеются несколько способов инициализации:
в указатель помещаем адрес существующей переменной
double *p1, a; // * относится только к p1
p1=& a; // & - амперсант, операция определения адреса по имени переменной
Инициализация указателя с помощью другого указателя, уже правильно инициализированного.
char a, *p1, *p2;
p1=&a;
p2=p1; // нельзя присваивать указатели разного типа
Указатель на тип void совместим с любым адресом
void *p3;
p3=(void*)p1;
p3=(double*)p2;
В указатель помещаем адрес памяти, выделенной под данное динамически
Способы выделения памяти под данные:
статическая память выделяется в момент компиляции и её объём должен быть заранее известен
динамическая память выделяется в процессе выполнения операции new, её объём может быть вычислен или введён; освобождается память при выполнении delete
int *p1 = new int; - выделяется память под одну переменную целого типа
int *p2 = new int(5); - выделяется память под одну переменную целого типа и туда помещается значение 5
int *p3 = new int[7]; - выделяется память под семь переменных целого типа, лежащих в памяти подряд
В нужном месте программы выделенную память обязательно нужно освободить
delete p1;
delete p2;
delete[]p3;
Операции над указателем.
1. Операция доступа к содержимому по адресу (операция разадресации) * - унарная.
Пример:
1) int *p=new int;;
*p = 7; // операция разадресации- значение по адресу p равно 7.
4. Два адреса можно сравнить с помощью операции отношения = =, ! =, <, < =, >, > =.
2. К указателю на соответствующий тип можно прибавить целое число m, при этом мы сместимся в памяти вперед на m элементов. Но мы должны быть уверены, что в памяти расположены m элементов подряд.
3. От указателя на соответствующий тип можно отнять целое число n, при этом мы сместимся в памяти назад на n элементов.
5. Можно найти разность между двумя указателями, и определить на каком расстоянии находится два объекта между собой.
p-(p-4)=4
Задача.
Выделить память под 3 данных типа int, находящихся в памяти подряд, присвоить значение 1,2,3.
int *p;
p = new int[5];
*p = 1;
*(p+1) = 2;
*(p+2) = 3;
Указатель на константу:
int a=98, b=20; const int *pa;
pa=&a;// правильно
*pa=10;// ошибка
pa=&b;// правильно
Константный указатель:
int a=9, int b=4; int* const pa=&a;
*pa=11;
pa=&b;// ошибка
+
Строки в языке С++: объявление (статически), инициализация, доступ к символам строки, стандартный цикл обработки.
Строка – набор символов, завершающийся 0 символом.
Адрес строки – адрес первого символа в строке.
Со строкой работаем как с единым целым, при этом используется имя или адрес строки.
Если хотим выполнить действие над строкой, как над единым целым – ищем функцию обработки строки.
