- •Федеральное агентство по образованию Российской Федерации
- •Программирование
- •Часть I
- •Предисловие
- •1. Основные понятия алгоритмизации и программирования
- •1.1. Этапы решения задач на эвм
- •1. Постановка задачи:
- •2. Формализация (анализ и исследование задачи, модели, представление ее в виде уравнений, соотношений, ограничений и т.П.):
- •Понятие моделирования
- •Отладка программы
- •Тест и тестирование программы
- •1.2. Основы алгоритмизации
- •Свойства алгоритма
- •Критерии качества алгоритма
- •Способы описания алгоритмов
- •Структурограмма
- •Синтаксическая диаграмма (формулы Бэкуса-Наура)
- •Базовые алгоритмические конструкции
- •Примеры команды если
- •1.3. Теоретические основы программирования
- •Арифметические выражения
- •Арифметические выражения записываются по следующим правилам:
- •Лабораторная работа № 1 Запись арифметических выражений
- •Задание I
- •Задание II
- •Контрольные вопросы
- •2. Программирование алгоритмов линейной структуры
- •2.2. Основные понятия языка
- •2.3. Данные и способы их организации
- •Порядок объявления и инициализации переменных
- •2.4. Стандартные простые типы данных
- •2.5. Структура программы
- •2.6. Операторы
- •Оператор «выражение»
- •2.7. Организация ввода/вывода данных
- •Лабораторная работа № 2 Программирование алгоритмов линейной структуры
- •Задание I
- •Задание II
- •Задание III
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •Математическая модель
- •Алгоритм (блок - схема)
- •3. Программа
- •4. Результат работы программы
- •Решение
- •Математическая модель
- •4. Результат работы программы:
- •3. Операторы ветвления
- •3.1. Простые и составные условия
- •Операция &&
- •Операция ||
- •Операция !
- •3.2. Составной оператор
- •3.3. Условная операция (?:)
- •3.4. Условный оператор if
- •If (условие) оператор 1; else оператор 2;
- •If (условие) оператор;
- •3.5. Оператор switch
- •3.6. Оператор перехода goto
- •Лабораторная работа № 3 Программирование алгоритмов разветвляющейся структуры
- •Задание I
- •Задание II
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •4. Циклы
- •4.1. Оператор цикла с параметром (for)
- •4.2. Оператор цикла с предусловием (while)
- •4.3. Оператор цикла с постусловием (do while)
- •Отличие оператора цикла while от оператора цикла do..While
- •4.4. Вложенные циклы
- •Математическая модель
- •Лабораторная работа № 4 Программирование алгоритмов циклической структуры
- •Задание I
- •Задание II
- •Задание III
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •5. Подпрограммы
- •5.1. Понятие подпрограммы
- •5.2. Формальные и фактические параметры
- •5.3. Локальные и глобальные переменные
- •5.4. Функции
- •Задание I
- •Задание II
- •Лабораторная работа №5 Использование функций для решения прикладных задач
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •3. Программа 4. Результат работы программы:
- •6. Итерация и рекурсия
- •6.1. Понятие итеративного процесса
- •6.2. Понятие рекурсии
- •Лабораторная работа №6 Программирование рекурсивных алгоритмов
- •Задание
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •2. Алгоритм
- •3. Программа
- •4. Результат работы программы
- •7. Одномерные массивы
- •7.1. Понятие структурированного типа данных
- •7.2. Понятие и описание типа массив
- •7.3. Одномерные массивы
- •7.4. Основные действия над элементами массивов
- •1. Инициализация массива: присвоение каждому элементу начального значения:
- •2. Вывод массива на экран:
- •3. Обработка массива
- •Лабораторная работа №7 Использование числовых одномерных массивов
- •Задание I
- •Задание II
- •Контрольные вопросы
- •Пример выполнения задания II лабораторной работы
- •Решение
- •Математическая модель
- •4. Результат работы программы:
- •8. Двумерные массивы
- •Лабораторная работа №8 Двумерные массивы
- •Задание
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •Математическая модель
- •9. Алгоритмы решения задач внутренней сортировки и алгоритмы поиска информации
- •9.1. Сложность алгоритмов
- •9.2. Постановка задачи поиска
- •9.3. Последовательный (линейный) поиск
- •9.4. Бинарный поиск
- •9.5. Постановка задачи сортировки данных
- •9.6. Прямые и быстрые методы внутренней сортировки
- •9.7. Сортировка вставками
- •9.8. Сортировка с помощью прямого выбора
- •9.9. Сортировка с помощью прямого обмена
- •Лабораторная работа № 9 Задачи сортировки и поиска
- •Контрольные вопросы
- •10. Указатели и массивы
- •10.1. Указатели
- •10.2. Взаимосвязь между массивами и указателями
- •10.3. Порядок объявления динамических массивов
- •10.4. Передача массивов в качестве параметров функции
- •Лабораторная работа №10 Применение массивов и указателей для решения прикладных задач
- •Задание I
- •Задание II
- •Задание III
- •11. Особенности работы с функциями
- •11.1. Способы передачи параметров в функцию
- •11.2. Передача имен функций в качестве параметров
- •11.3. Перегрузка функций
- •Лабораторная работа № 11 Исследование способов работы с функциями
- •Задание I
- •Задание II
- •12. Строки как массив элементов типа char
- •Лабораторная работа № 12
- •Задание I
- •Изучение способов формирования строк в языке Си
- •Применение функций работы со строками для обработки символьных массивов
- •Задание II
- •13. Строки как специальный класс string
- •Лабораторная работа № 13 Исследование способов работы с функциями
- •Задание I
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Форма отчета
- •14. Структуры
- •14.1. Изучение порядка объявления и инициализации структур
- •14.2. Программирование с использованием структур
- •14.3. Использование функций для работы с производными типами данных
- •Лабораторная работа № 14 Применение структур для решения прикладных задач
- •Задание I
- •15. Файлы
- •15.1. Подход с использованием возможностей языка Си
- •Ifstream идентификатор_потока(имя_файла,ключи_потока);
- •Лабораторная работа № 15 Исследование методов доступа к файлам данных
- •Задание I
- •1. Работа с неструктурированными данными
- •2. Работа со структурированными данными
- •Пример выполнения лабораторной работы
- •Литература
- •Приложение 1 Порядок выполнения лабораторных работ
- •Приложение 2 Базовые функции
Контрольные вопросы
Дайте определение производного типа данных, структурированного типа.
Дайте определение массива.
Каким может быть тип элементов массива?
Имя, размер и размерность массива.
Какова структура одномерного массива?
Правила описания одномерного массива.
Как осуществляется доступ к элементам одномерного массива?
Как осуществляется ввод массива?
Какие способы ввода массива вы знаете?
Вывод линейного массива.
Пример выполнения задания II лабораторной работы
Задание. Массив D содержит 24 значения атмосферного давления за каждый час в течение суток. Определить, какое значение атмосферного давления было наибольшим и в какое время оно было зафиксировано.
Решение
Математическая модель
Значением атмосферного давления являются элементы массива D[24], значением времени – индексы элементов. Решение задачи сводится к поиску максимального элемента в массиве и определению его индекса.
Аргументы: D[24] – массив целого типа.
Результаты: imax целого типа – индекс максимального элемента;
D[imax] целого типа – значение максимального элемента.
Промежуточная величина: max целого типа – максимальное значение элемента массива.
2. Алгоритм |
3. Программа |
|
#include <iostream> #include <conio.h> #include <math.h>
using namespace std;
void Input(int mass[24]); void Print(int mass[24]);
int main() { int D[24]; cout<<" Введите массив "<<endl; Input(D); cout<<" Массив значений давления:"<<endl; Print(D);
int max = D[0], imax = 1; for(int i=0; i<24; i++) { if (D[i]>max) { imax = i+1; max = D[i]; } }
cout<<" Максимальное значение давления : "<<D[imax-1]<<" в "<<imax<<" ч. "; _getch(); return 0; }
void Input(int mass[24]) { for(int i=0; i<24; i++) { cin>>mass[i]; } }
void Print(int mass[24]) { for(int i=0; i<24; i++) { cout<<mass[i]<<" "; } cout<<endl; } |
4. Результат работы программы:
Массив значений давления:
748 743 756 748 741 760 748 743 757 748 756 756 751 760 754 756
752 758 758 757 750 747 759 750
Максимальное значение давления 760 в 6 ч.
8. Двумерные массивы
Итак, массив представляет собой структуру данных, позволяющую хранить под одним именем совокупность данных любого, но только одного какого-то типа. Массив характеризуется своим именем, типом хранимых элементов, размером (числом хранимых элементов), нумерацией элементов и размерностью.
Объявление переменной как одномерного массива (массива с размерностью 1) имеет вид:
тип_данных идентификатор [константное_выражение];
Например, оператор
int A[10];// объявляет массив с именем A, содержащий 10 целых чисел
Доступ к элементам этого массива осуществляется выражением A[i], где i - индекс, являющийся в данном примере целым числом в диапазоне 0 - 9. Например, A[0] - значение первого элемента, A[1] - второго, A[9] - последнего.
Напомним, что объявление переменной массива можно совмещать с заданием элементам массива начальных значений. Например, оператор:
int A[10] = {0};//присваивает нулевые значения всем элементам массива
int A[10] = {1,2,3,4,5,6,7,8,9,10};//A[0] = 1, A[2] = 2, …, A[9] = 10
Если начальных значений меньше, чем элементов в массиве, оставшиеся элементы автоматически получают нулевые начальные значения.
Если массив при его объявлении не инициализирован, то его элементы имеют случайные значения. Элементы такого массива нельзя использовать в выражениях, пока им не будут присвоены какие-нибудь значения.
Можно объявлять многомерные массивы, т.е. массивы, элементами которых являются массивы. Например, двумерный массив можно объявить таким образом:
int A2[10][3];
Этот оператор описывает двумерный массив, который можно представить как таблицу, состоящую из 10 строк и 3 столбцов.
Таким
образом, двумерный
массив –
это массив, размерность которого равна
2. Визуально, двумерный массив – это
обычная таблица, со строками и столбцами
или матрица
.
Фактически двумерный массив – это
одномерный массив одномерных массивов.
Структура двумерного массива, с
именем A, размером m
на n показана
ниже (см. рис. 8.1).
A[0][0] |
A[0][1] |
… |
A[0][n-1] |
|
A[1][0] |
A[1][1] |
… |
A[1][n-1] |
|
A[2][0] |
A[2][1] |
… |
A[2][n-1] |
|
… |
… |
… |
… |
|
A[m-1][0] |
A[m-1][1] |
… |
A[m-1][n-1] |
Рисунок 8.1 – Двумерный массив в виде таблицы (слева) или матрицы (справа)
На рисунке 8.1 m – количество строк двумерного массива; n – количество столбцов двумерного массива; m * n – количество элементов массива.
Общий вид описания двумерного массива:
тип_данных имя_массива [количество_строк][количество_столбцов];
В объявлении двумерного массива, также как и в объявлении одномерного массива, первым делом, нужно указать:
тип данных;
имя массива.
Доступ к значениям элементов многомерного массива обеспечивается через индексы, каждый из которых заключается в квадратные скобки. Например, A2[3][2] - значение элемента, лежащего на пересечении четвертой строки и третьего столбца (помните, что индексы начинаются с 0).
Если многомерный массив инициализируется при его объявлении, список значений по каждой размерности заключается в фигурные скобки. Приведенный ниже оператор объявляет трехмерный массив A3 размерностью 4 на 3 на 2.
int A3[4][3][2] = {{{0,1},{2,3},{4,5}},
{{6,7},{8,9},{10,11}},
{{12,13},{14,15},{16,17}},
{{18,19},{20,21},{22,23}}};
Этот оператор создает массив A3, четыре строки которого являются матрицами вида
0 1 6 7 12 13 18 19
2 3 8 9 14 15 20 21
4 5 10 11 16 17 22 23
Например, элемент A3[0][1][0] равен 2, элемент A3[3][0][1] равен 19 и т.д.
Если в списке инициализации в какой-то из размерностей не хватает данных, то все дальнейшие не перечисленные элементы считаются равными нулям.
Обе размерности массива должны быть константами или константными выражениями, поскольку инструкции по выделению памяти формируются компилятором до выполнения программы.
В памяти двумерный массив располагается по строкам.
Строки массива ничем не отделены одна от другой, то есть прямоугольной матрицей двумерный массив является только в нашем воображении. При просмотре массива от начала в первую очередь изменяется правый индекс (номер столбца).
К элементу двумерного массива обращаются, указывая номер строки и номер столбца, на пересечении которых он расположен, например:
а[1][4] a[i][j]
Компилятор воспринимает как номер строки первый индекс, как бы он ни был обозначен в программе.
1. Инициализация двумерных массивов аналогична инициализации одномерных массивов:
а) инициализация:
const int n = 3; // число строк
const int m = 4; // число столбцов
// выделяем память под матрицу с одновременной
// инициализацией элементов
double a[n][m] =
{
{3, -3.1, 4.6, 5.5},
{2, 1.2, -10, -2.5},
{7.6, 3.1, 1.6, 0.5}
};
При инициализации двумерного массива в ходе работы программы , необходимо организовать вложенные циклы:
б) ввод данных с клавиатуры:
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
cin >> a[i][j];
В соответствии с приведенным здесь порядком следования циклов элементы массива должны вводиться по строкам.
в) формирование массива с помощью генератора псевдослучайных чисел;
г) непосредственное присваивание (вычисление по формуле):
2. Вывод матрицы надо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего, включается еще оператор cout << endl;, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
cout << a[i][j] << "\t ";
cout << endl;
}
Пример. Дана прямоугольная матрица действительных чисел размером n×m. Пронормировать эту матрицу, т.е. поделить значение всех элементов матрицы на максимальный по модулю элемент.
Возможный текст программы:
#include <iostream>
using namespace std;
#include <cmath>
int main()
{
const int n = 3; // число строк
const int m = 4; // число столбцов
double a[n][m]; // выделяем память под матрицу
int i, j;
double max;
// Ввод матрицы с клавиатуры
cout << "Matriza A("<< n << "*" << m << "):" << endl;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
cin >> a[i][j];
// Поиск в матрице максимального по модулю значения
max = fabs(a[0][0]);
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
if(fabs(a[i][j]) > max)
max = fabs(a[i][j]);
cout << "max=" << max << endl;
// Нормируем матрицу
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
a[i][j] /= max;
// Вывод матрицы в виде таблицы на экран монитора
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
cout << a[i][j] << "\t ";
cout << endl;
}
return 0;
}
Как видно из текста программы, для работы с матрицей почти всегда требуются двойные циклы. Обратите на то, как напечатать матрицу в виде таблицы.
