Одномерные массивы
Министерство
образования и науки Российской Федерации
Филиал
федерального государственного бюджетного образовательного учреждения высшего
профессионального образования
«Южно-Уральский
государственный университет» в г. Нижневартовске
Кафедра
«Информатика»
Практическая
работа
Одномерные
массивы.
по
дисциплине Программирование
Автор Алтынбаев Т.Д.
Нижневартовск
2014
. ПОСТАНОВКА ЗАДАЧИ
В одномерном массиве, состоящем из п
вещественных элементов, вычислить: 1) сумму положительных элементов массива;
) произведение элементов массива, расположенных
между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
.1 Исходные данные (входные данные)
Входные данные: N,
M, где N
- количество элементов массива (переменная типа int),
M - массив
целочисленных элементов (типа int).
.2 Перечень результатов (выходные данные)
- минимальный по модулю элемент массива
(переменная типа int),- сумма положительных элементов массива (переменная типа
int).
.3 Вспомогательные переменные
- индексы элементов массива (переменная типа
int), NaydenPerv0 - флаг, который принимает значение ИСТИНА после нахождения в
массиве элемента, равного нулю (переменная типа bool),
Mnew - преобразованный массив целочисленных элементов (типа int).
.4 Среда функционирования
Задача будет решена с помощью алгоритма,
реализованного в среде Microsoft
Visual C++
2008 Express
на языке программирования С++.
2. ПРОЕКТИРОВАНИЕ
.1 Алгоритм
В ходе проектирования алгоритма решения
поставленной задачи была разработана следующая последовательность действий,
необходимая для получения результатов:
) Присваиваем размерности массива (переменной N)
начальное значение 0 (N
= 0);
) До тех пор, пока пользователь не введет
значащую размерность, то есть пока (N
£ 0), выполнять следующее:
.1) запрашивать у пользователя ввод
положительной размерности массива N.
) Заполнение N
элементами массива M;
) Вывод N
элементов массива M;
) Нахождение минимального по модулю элемента min
массива M и его вывод;
) Нахождение суммы модулей элементов S
массива M, расположенных
после первого элемента, равного нулю, и ее вывод;
) Преобразование массива M
в новый массив Mnew
таким образом, чтобы в первой половине нового массива располагались элементы,
стоящие в четных позициях массива M,
а во второй половине - элементы, стоящие в нечетных позициях массива M.
Вывести новый массив Mnew.
В данном алгоритме пункты 3-7 были
детализированы следующим образом:
) Заполнение N
элементами массива M:
.1) Для каждого индекса i,
пробегая значения от 0 до (N-1)
(то есть 0 £ i
< N), необходимо
выполнить следующее:
.1.1) запрашивать у пользователя ввод i-го
элемента массива Mi.
) Вывод N
элементов массива M:
.1) Для каждого индекса i,
пробегая значения от 0 до (N-1)
(то есть 0 £ i
< N), необходимо выполнить
следующее:
.1.1) выводить i-й
элемент массива Mi.
) Нахождение минимального по модулю элемента min
массива M:
.1) Присваиваем переменной min
значение первого элемента массива M0
(min=M0)
.2) Для каждого индекса i,
пробегая значения от 0 до (N-1)
(то есть 0 £ i
< N), необходимо
выполнить следующее:
.2.1) если переменная min
по модулю больше чем модуль i-го
элемента массива Mi
(то есть |min| < | Mi|),
то:
.2.1+.1) присваиваем переменной min
значение i-го элемента
массива Mi
(min
= Mi).
.3) Возвращаем значение переменной min.
) Нахождение суммы модулей элементов S
массива M, расположенных
после первого элемента, равного нулю:
.1) Присваиваем флагу «Найден первый ноль»
значение ЛОЖЬ (NaydenPerv0 = false).
.2) Присваиваем переменной S
начальное значение 0 (S=0).
.3) Для каждого индекса i,
пробегая значения от 0 до (N-1)
(то есть 0 £ i
< N), необходимо
выполнить следующее:
.3.1) если i-й
элемент массива равен 0 и первый ноль еще не найден (то есть Mi
=
0 и NaydenPerviy0
= false), то:
.3.1+.1) флагу «Найден первый ноль» присваиваем
значение ИСТИНА (NaydenPerv0 = true).
.3.2) если первый ноль уже найден (то есть NaydenPerviy0=true),
то:
.3.2+.1) переменную S
увеличиваем на модуль значение i-го
элемента массива (S = S
+ |Mi|).
.4) Возвращаем значение переменной S.
) Преобразование массива M
в новый массив Mnew
таким образом, чтобы в первой половине нового массива располагались элементы,
стоящие в четных позициях массива M,
а во второй половине - элементы, стоящие в нечетных позициях массива M:
.1) Для каждого индекса i,
пробегая значения от 0 до (N-1)
(то есть 0 £ i
< N), необходимо
выполнить следующее:
.3.1) если индекс i
не достиг середины массива (то есть i
< целой части от деление N/2
), то:
.3.1+.1) i-му
элементу нового массива Mnew
i
присваиваем значение (2i+1)-го
элемента массива M2i+1,
(т.е. элемента находящегося в нечетной позиции с учетом, что позиции нумеруются
с 0, а не с 1); иначе (т.е. когда индекс находится во второй половине массива):
.3.1-.1) i-му
элементу нового массива Mnew
i
присваиваем значение (i-2*(целое
от N/2))-го элемента
массива Mi-2*Целое(N/2),
(т.е. элемента находящегося в четной позиции).
.2) Вывод массива Mnew,
то есть выполнение пункта 4 для массива Mnew.
Пункты 3-7 было решено выделить в отдельные
алгоритмы (подпрограммы), обращение к которым осуществляется из основного
алгоритма (главной программы).
.2 Блок-схема
Блок-схема спроектированного алгоритма
представлена на рисунке ниже:
3. РЕАЛИЗАЦИЯ
Для реализации нахождения результата задачи
разработанный ранее алгоритм был реализован с помощью языка программирования C++.
Код получившейся программы представлен ниже:
#include <iostream>
#include <conio.h>
#include <windows.h>namespace std;main ( )
SetConsoleOutputCP(1251);
int n; //размер массива
cout<<"Введите размерность массива:
";
cin>>n;
int *mas = new int[n]; //выделяем память под
массив
int S=0; //сумма пол. эл. массива
for (int i=0; i<n; i++)
{
cout<<"Введите
"<<i<<" элемент массива: ";
cin>>mas[i]; //ввод массива
if (mas[i]>0) //если эл. мас. >0
{
S+=mas[i]; //прибавляем его к сумме
}
}
cout<<"\nСумма положительных
элементов массива: "<<S;
int min=abs(mas[0]);
int indexMin=0;
int max=abs(mas[0]);
int indexMax=0;
for (int i=0; i<n; i++)
{
if (abs(mas[i])>=abs(max))
{
max = mas[i];
indexMax=i;
}
if (abs(mas[i])<=abs(min))
{
min = mas[i];
indexMin=i;
}
}
cout<<"\nМинимальный по модулю
элемент массива: "<<min<<" его индекс: "<<indexMin;
cout<<"\nМаксимальный по модулю
элемент массива: "<<max<<" его индекс:
"<<indexMax;
int P=1; //произведение
//вычисление произведения
if (indexMin<indexMax)
{
for (int i=indexMin; i<indexMax; i++)
{
P*=mas[i];
}
}
else
{
for (int i=indexMax; i<indexMin; i++)
{
P*=mas[i];
}
}
cout<<"\nПроизведение элементов
массива между минимальным и максимальным: "<<P;
cout<<"\nУпорядоченый массив:
\n";
for (int i=0; i<n; i++) //сортировка массива
по убыванию
{
for (int j=i; j<n; j++)
{
if (mas[i]<mas[j])
{
int temp = mas[i];
mas[i]=mas[j];
mas[j]=temp;
}
}
cout<<" "<<mas[i];
}
getch();
delete[] mas;
return 0;
}
.1 Тестирование алгоритма
Сначала выполним трассировку тех функций
(подпрограмм), которые формируют результаты. А именно функции:
MinPoModuluElement(M,N)
- функция нахождения минимального по модулю элемента массива M,
SumPoslePervogo0(M,N)
- функция нахождения суммы модулей элементов массива M,
расположенных после первого элемента, равного нулю, (M,N) - функция
преобразования массива M
таким образом, чтобы в первой половине располагались элементы, стоящие в четных
позициях массива, а во второй половине - элементы, стоящие в нечетных позициях.
Трассировочная таблица для функции MinPoModuluElement(M,N)
с исходными данными N=5 и M={1,2,0,-3,5}:
Номер
шага
|
Описание
шага функции MinPoModuluElement
для N=5 и M={1,2,0,-3,5}
|
N
|
M
|
min
|
i
|
Mi
|
|min|>|Mi|
|
5
|
Вызов
функции MinPoModuluElement
для N=5 и M={1,2,0,-3,5}
|
5
|
{1,2,0,-3,5}
|
|
|
|
|
5.1
|
min=M0
|
|
|
1
|
|
|
|
5.2
|
Для
i пробегаем значения
от 0 до (N-1): i=0
|
|
|
|
0
|
1
|
|
5.2.1
|
Т.к.
|min|=|Mi|,
то переходим к п.5.2
|
|
|
|
|
|
ЛОЖЬ
|
5.2
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
1
|
2
|
|
5.2.1
|
Т.к.
|min|<|Mi|,
то переходим к п.5.2
|
|
|
|
|
|
ЛОЖЬ
|
5.2
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
2
|
0
|
|
5.2.1
|
Т.к.
|min|>|Mi|,
то переходим к п.5.2.1+.1
|
|
|
|
|
|
ИСТИНА
|
5.2.1+.1
|
min =
Mi
|
|
|
0
|
|
|
|
5.2
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
3
|
-3
|
|
5.2.1
|
Т.к.
|min|<|Mi|,
то переходим к п.5.2
|
|
|
|
|
|
ЛОЖЬ
|
5.2
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
4
|
5
|
|
5.2.1
|
Т.к.
|min|<|Mi|,
то переходим к п.5.2
|
|
|
|
|
|
ЛОЖЬ
|
5.2
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1.
Так как i перешло
за границу диапазона, т.е. i
³ N,
то завершаем цикл и переходим к п. 5.3
|
|
|
|
5
|
|
|
5.3
|
Возвращаем
из функции значение переменной min
|
|
|
|
|
|
|
Трассировочная таблица для функции SumPoslePervogo0(M,N)
с исходными данными N=5 и M={1,2,0,-3,5}:
Номер
шага
|
Описание
шага функции SumPoslePervogo0
для N=5 и M={1,2,0,-3,5}
|
N
|
M
|
Nayden
Perv0
|
S
|
Mi
|
Mi=0 и NaydenPerv0=ЛОЖЬ
|
6
|
Вызов
функции SumPoslePervogo0
для N=5 и M={1,2,0,-3,5}
|
5
|
{1,2,0,-3,5}
|
|
|
|
|
|
6.1
|
NaydenPerv0
= ЛОЖЬ
|
|
|
ЛОЖЬ
|
|
|
|
|
6.2
|
S=0
|
|
|
|
0
|
|
|
|
6.3
|
Для
i пробегаем
значения от 0 до (N-1):
i=0
|
|
|
|
|
0
|
1
|
|
6.3.1
|
Т.к.Mi¹0,
то переходим к п. 6.3.2
|
|
|
|
|
|
|
ЛОЖЬ
|
6.3.2
|
Т.к.
NaydenPerv0=ЛОЖЬ, то переходим к п. 6.3
|
|
|
|
|
|
|
|
6.3
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
|
1
|
2
|
|
6.3.1
|
Т.к.Mi¹0,
то переходим к п. 6.3.2
|
|
|
|
|
|
|
ЛОЖЬ
|
6.3.2
|
Т.к.
NaydenPerv0=ЛОЖЬ, то переходим к п. 6.3
|
|
|
|
|
|
|
|
6.3
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
|
2
|
0
|
|
6.3.1
|
Т.к.Mi=0
и NaydenPerv0=ЛОЖЬ, то переходим к п. 6.3.1+.1
|
|
|
|
|
|
|
ИСТИНА
|
6.3.1+.1
|
NaydenPerv0
= ИСТИНА
|
|
|
ИСТИНА
|
|
|
|
|
6.3.2
|
Т.к.
NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.1
|
|
|
|
|
|
|
|
6.3.2+.1
|
S = S
+ |Mi|
|
|
|
|
0
|
|
|
|
6.3
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
|
3
|
-3
|
|
6.3.1
|
Т.к.Mi¹0,
то переходим к п. 6.3.2
|
|
|
|
|
|
|
ЛОЖЬ
|
6.3.2
|
Т.к.
NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.1
|
|
|
|
|
|
|
|
6.3.2+.1
|
S = S
+ |Mi|
|
|
|
|
3
|
|
|
|
6.3
|
Для
i пробегаем
значения от 0 до (N-1):
i=i+1
|
|
|
|
|
4
|
5
|
|
6.3.1
|
Т.к.Mi¹0,
то переходим к п. 6.3.2
|
|
|
|
|
|
|
ЛОЖЬ
|
6.3.2
|
Т.к.
NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.1
|
|
|
|
|
|
|
|
6.3.2+.1
|
S = S
+ |Mi|
|
|
|
|
8
|
|
|
|
6.3
|
|
|
|
|
|
|
|
6.4
|
Возвращаем
значение переменной S
|
|
|
|
|
|
|
|
Аналогично здесь же нужно привести
трассировочную таблицу функций PreobrazovanieMassiva(M,N).
Трассировочная таблица для программы Main
с исходными данными N=5 и M={1,2,0,-3,5}:
Номер
шага
|
Описание
шага
алгоритма
|
N
|
N£0
|
M
|
MinPoModulu Element(M,N)
|
SumPosle Pervogo0(M,N)
|
1
|
N=0
|
0
|
|
|
|
|
2
|
Пока
(N<=0) выполняем п.2.1
|
|
ИСТИНА
|
|
|
|
2.1
|
Вводим
N
|
5
|
|
|
|
|
3
|
Вызов
функции ZapolnenieMassiva(M,N)
|
|
|
{1,2,0,
-3,5}
|
|
|
4
|
Вызов
функции
PechatMassiva(M,N)
|
|
|
|
|
|
5
|
Вызов
функции MinPoModuluElement(M,N) и вывод результата этой функции
|
|
|
|
0
|
|
6
|
Вызов
функции SumPoslePervogo0(M,N) и вывод результата этой функции
|
|
|
|
|
8
|
7
|
Вызов
функции PreobrazovanieMassiva(M,N)
|
|
|
|
|
|
.2 Тестирование программы
Скриншот, демонстрирующий работу программы при
исходных данных N=5 и M={1,2,0,-3,5}:
ЗАКЛЮЧЕНИЕ
массив убывание трассировка алгоритм
В ходе практической работы был разработан
алгоритм, вычисляющий заданное арифметическое выражения, предварительно
анализируя его на область определения выражения. Кроме того, данный алгоритм
был программно реализован средствами среды Microsoft
Visual Studio
C++ 2008 Express
и протестирован.
Тестирование показало, что для случаев возможных
сбоев программа выполняется корректно, и правильно вычисляет арифметическое
выражение на области его определения.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Павловская
Т.А., С/C++.
Программирование на языке высокого уровня / Т.А. Павловская. - СПб.: Питер,
2004.