- •1. Основы алгоритмизации и программирования
- •1.1. Этапы подготовки и решения задач на эвм
- •1.2. Алгоритмы и способы их описания Понятие алгоритма
- •Способы описания алгоритмов
- •Структурные схемы алгоритмов
- •1.3. Компиляция и интерпретация программ
- •1.4. Стили программирования
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентированное программирование
- •2.1. Пример готовой программы.
- •2.2. Структура основной программы
- •2.3. Алфавит языка
- •2.4. Константы и переменные Константы
- •Переменные
- •Примеры записи имен переменных
- •2.5. Арифметические выражения
- •Примеры вычисления арифметических выражений
- •Стандартные функции
- •Примеры программирования арифметических выражений
- •Контрольные задания
- •1. Составить описания для заданных переменных
- •2.6. Линейные вычислительные процессы
- •Оператор присваивания
- •Странные операторы присваивания
- •Функции ввода-вывода
- •Функции ввода исходных данных с клавиатуры
- •Потоковый ввод данных числового типа
- •Функция форматного ввода
- •Операторы вывода данных на экран Потоковый вывод
- •Форматный вывод
- •Контрольные задания
- •2.7. Разветвляющиеся вычислительные процессы
- •If (логическое выражение) p1; else p2;
- •Логические выражения
- •Порядок выполнения операций в логических выражениях
- •Условные операторы
- •Короткий условный оператор
- •Полный условный оператор
- •If (логическое выражение) { p1;} else {p2;}
- •Вложенные структуры условных операторов
- •Оператор выбора
- •Контрольные задания
- •2.8. Циклические вычислительные процессы
- •Операторы цикла с условием
- •Оператор цикла с параметром
- •2.9. Базовые алгоритмы
- •Задача 1. Алгоритм организации счетчика
- •Задача 2. Алгоритм накопления суммы
- •Задача 3. Алгоритм накопления произведения
- •Задача 4. Алгоритм поиска минимального члена последовательности
- •Задача 5. Табулирование функции (или кратные циклы)
- •Задача 6. Вычисление сумм элементов последовательностей
- •2.10. Указатели и массивы
- •2.10.1. Указатели
- •2.10.2. Понятие массива
- •Одномерные массивы
- •Описание одномерного массива
- •Индексированные переменные
- •Ввод-вывод одномерных массивов
- •Обработка одномерных массивов
- •Задача 1. Организация счетчика
- •Задача 2. Накопление суммы и произведения
- •Задача 3. Поиск минимального и максимального элементов массива
- •Двухмерные массивы
- •Описание двухмерного массива
- •Ввод-вывод двухмерного массива
- •Обработка матриц
- •2.11. Подпрограммы Структура сложной программы
- •Функции
- •Общий вид описания функции
- •Int I,j; //локальные переменные
- •Обращение к функции
- •Пример программы с функцией
- •Механизмы замены параметров
- •Параметры-массивы в функциях
- •Примеры программирования задач с использованием подпрограмм Задача 1
- •Рекурсия
- •2.12. Текстовые данные
- •Символьный тип данных
- •Ввод-вывод символьных данных
- •Обработка символьных данных
- •Ввод-вывод строковых данных
- •Обработка строковых данных
- •Стандартные функции обработки строк
- •Сравнение строк:
- •Сцепление строк
- •Определение длины строки
- •Копирование строк
- •Поиск символа в стоке
- •Пример программы для задачи с текстовыми данными
- •Контрольные задания
- •2.13. Динамическое выделение памяти
- •Структуры данных Понятие структуры
- •Обработка структур
- •Пример задачи с использованием структурированных данных
- •2.15. Файлы данных Понятие файла
- •2.15.1. Работа с файлами в стиле с
- •Объявление файловой переменной
- •Открытие файла
- •Закрытие файла
- •// Обработка открытого файла
- •Обработка открытого файла
- •Функции ввода/вывода
- •Работа с текстовыми файлами
- •Обработка бинарных файлов
- •Контрольные задания
- •Заключение
- •Оглавление
Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые используются при обработке одномерных массивов: организация счетчика, накопление сумм и произведений, поиск минимального и максимального элементов матрицы. Однако реализацию этих алгоритмов можно условно рассматривать для двух типов задач.
Алгоритмы реализуются для всех элементов матрицы (просмотр может быть с условием). Начальная установка искомых параметров выполняется перед двойным циклом. В этом случае запись операторов цикла для индексов i и j осуществляется последовательно друг за другом и имеет вид:
<начальная установка искомых параметров>
for (i = 0; i<n; i++)
for (j = 0; j< n; j++)
<тело цикла>;
Алгоритмы реализуются внутри каждой строки или каждого столбца матрицы. В этом случае начальная установка искомых параметров выполняется между операторами цикла, записанными для индексов i и j. Например, если алгоритм реализуется для каждой строки, то запись в программе имеет следующий вид:
for ( i = 0; i< m ; i++)
{
<начальная установка искомых параметров>
for ( j = 0; j< n; j++)
<тело цикла>;
}
Ниже рассмотрены примеры программирования задач каждого типа.
Реализация алгоритмов задач первого типа
Задача 1. Дана матрица вещественных чисел А = {аij}4х6. Вычислить значение Z = Р1/|Р2|, где Р1 и Р2 – произведения положительных и отрицательных элементов матрицы соответственно.
Решение
Эта задача относится к первому типу, так как для вычисления P1 и P2 следует просмотреть всю матрицу. В этой задаче инициализацию переменных P1 и P2 следует сделать один раз перед циклами по индексам элементов матрицы.
Текст программы:
#include "stdafx.h"
#include<math.h>
int main()
{ float A [4][6] ; // описание матрицы А
int i;
int j;
float P1, P2;
float Z;
printf("Введите матрицу А\n");
for ( i =0; i<4; i++)
for ( j = 0;j<6; j++)
scanf("%f",&A[i][j]);
P1=1; P2=1; // установка начальных значений произведений
for ( i = 0; i<4; i++) //цикл по строкам
for ( j =0; j<6 ;j++) //цикл по столбцам
{
if (A[i][j]>0) P1= P1*A[i][j]; // произведение +
if ( A[i][j]<0) P2 = P2*A[i][j];// произведение -
}
Z=P1/abs(P2);
printf("Z=%10.2f \n",Z);
return 0;
}
Задача 2. В квадратной целочисленной матрице В= {bij}5х5 вычислить модуль разности между числом нулевых элементов, стоящих ниже главной диагонали, и числом нулевых элементов, стоящих выше главной диагонали.
Введем обозначения:
L1 – счетчик нулевых элементов ниже главной диагонали;
L2 – счетчик нулевых элементов выше главной диагонали;
Требуется найти L = | L1 -L2 |.
Для заполнения матрицы воспользуемся датчиком случайных чисел.
Да
Да
Текст программы:
#include "stdafx.h"
#include<math.h>
#include<stdlib.h>
#include<iostream>
int main()
{
int B[5][5] ; // описание матрицы B
int i, j, L1, L2, L;
for ( i = 0; i< 5; i++)
for (j = 0;j<5; j++)
B[i][j]= floor(rand()/1000.0);
L1 = 0; // инициализация счетчиков L1 и L2
L2 = 0;
for ( i = 0; i< 5; i++)
for (j = 0; j< 5; j++)
if (B[i][j]==0 ) // поиск элементов, равных нулю
{
if ( i>j) L1=L1+1; // выше главной диагонали
if ( i<j) L2=L2+1; // ниже главной диагонали
}
L = abs(L1 - L2);
std::cout<<"L="<<L<<"\n";
return 0;
}
Реализация алгоритмов задач второго типа
Задача 1. В матрице X ={хij}3х6 вещественных чисел первый элемент каждой строки поменять местами с минимальным элементом этой строки. Вывести матрицу X после обмена. ( Для заполнения матрицы воспользуемся датчиком случайных чисел).
НАЧАЛО
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
min=X[i][j]
jmin=j
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
min=X[i][j]
jmin=j
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
min=X[i][j]
jmin=j
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
X[i][jmin]=X[i][0]
X[i][0]=min
min=X[i][j]
jmin=j
Да
Х[i][j]<min
J = 0, 6
i = 0, 3
min=106
НАЧАЛО
Вывод
Матрицы Х
Инициализация матрицы Х
Инициализация матрицы Х
Вывод
Матрицы Х
i = 0, 3
min=106
J = 0, 6
Да
X[i][jmin]=X[i][0]
X[i][0]=min
Х[i][j]<min
Текст программы:
#include "stdafx.h"
#include<math.h>
int main()
{
float X[3][6]; // описание матрицы X
int i,j,jmin;
float min;
for(i=0; i<3; i++)
for (j= 0; j<6; j++)
X[i][j]=rand()/100; /* заполнение элемента матрицы случайным числом*/
printf(" матрица X\n");
for(i=0; i<3; i++) //вывод матрицы до перестановки
{
for (j=0; j<6; j++) printf("%8.2f",X[i][j]);
printf("\n");
}
for(i=0; i<3; i++) //цикл по строкам
{
min=+1E6; // установка начального значения min
for (j=0; j<6; j++) //цикл по столбцам
if (X[i][j]<min) // поиск минимума
{
min=X[i][j];
jmin=j;
}
X[i][jmin]=X[i][0];// перестановка первого элемента
X[i][0]=min; // матрицы с наименьшим
}
for(i=0; i<3; i++) //вывод матрицы после перестановки
{
for (j=0; j<6; j++) printf("%8.2f",X[i][j]);
printf("\n");
}
return 0;
}
Задача 2. Дана матрица вещественных чисел С = {сij}8х4. Вычислить среднее арифметическое каждого столбца. Результат оформить в виде одномерного массива S = {sj};j = .
Данная задача
#include "stdafx.h"
int main()
{ float C[8][4];
float S[4];
int i, j;
printf("Введите матрицу С:\n");
for(i=0; i<8; i++)
for (j= 0; j<4; j++)
scanf("%f",&C[i][j]);
for (j= 0; j<4; j++)
{
S[j]=0; //начальная установка элемента массива для сумм
for(i=0; i<8; i++)
S[j]= S[j] + C[i][j]; //накопление суммы j-го столбца
S[j]=S[j]/8; //вычисление среднего значения суммы j-го столбца
}
for (j= 0; j<4; j++)
printf("%8.2f",S[j]); // вывод всех сумм
printf("\n");
return 0;
}
В приведенной выше программе для вычисления каждого элемента S[j] организован двойной цикл, в котором индекс j является внешним параметром цикла, а индекс i - внутренним.
Приведем вариант программы без использования одномерного массива S.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{ float C[8][4];
float S;
int i, j;
printf("Введите матрицу С:\n");
for(i=0; i<8; i++)
for (j= 0; j<4; j++)
scanf("%f",&C[i][j]);
for (j= 0; j<4; j++)
{
S=0;
for(i=0; i<8; i++)
S= S + C[i][j];
S = S/8;
cout<<"Среднее арифметическое "<<j<<" столбца="<<S<<endln;
}
return 0;
}