Одномерные массивы

 

Министерство образования и науки Российской Федерации

Филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования

«Южно-Уральский государственный университет» в г. Нижневартовске

Кафедра «Информатика»










Практическая работа

Одномерные массивы.

по дисциплине Программирование



Автор Алтынбаев Т.Д.








Нижневартовск 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;

}



4. ТЕСТИРОВАНИЕ


.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}NMminiMi|min|>|Mi|5Вызов функции MinPoModuluElement для N=5 и M={1,2,0,-3,5}5{1,2,0,-3,5}5.1min=M015.2Для i пробегаем значения от 0 до (N-1): i=0015.2.1Т.к. |min|=|Mi|, то переходим к п.5.2ЛОЖЬ5.2Для i пробегаем значения от 0 до (N-1): i=i+1125.2.1Т.к. |min|<|Mi|, то переходим к п.5.2ЛОЖЬ5.2Для i пробегаем значения от 0 до (N-1): i=i+1205.2.1Т.к. |min|>|Mi|, то переходим к п.5.2.1+.1ИСТИНА5.2.1+.1min = Mi05.2Для i пробегаем значения от 0 до (N-1): i=i+13-35.2.1Т.к. |min|<|Mi|, то переходим к п.5.2ЛОЖЬ5.2Для i пробегаем значения от 0 до (N-1): i=i+1455.2.1Т.к. |min|<|Mi|, то переходим к п.5.2ЛОЖЬ5.2Для i пробегаем значения от 0 до (N-1): i=i+1. Так как i перешло за границу диапазона, т.е. i ³ N, то завершаем цикл и переходим к п. 5.355.3Возвращаем из функции значение переменной min

Трассировочная таблица для функции SumPoslePervogo0(M,N) с исходными данными N=5 и M={1,2,0,-3,5}:

Номер шагаОписание шага функции SumPoslePervogo0 для N=5 и M={1,2,0,-3,5}NMNayden Perv0SiMiMi=0 и NaydenPerv0=ЛОЖЬ6Вызов функции SumPoslePervogo0 для N=5 и M={1,2,0,-3,5}5{1,2,0,-3,5}6.1NaydenPerv0 = ЛОЖЬЛОЖЬ6.2S=006.3Для i пробегаем значения от 0 до (N-1): i=0016.3.1Т.к.Mi¹0, то переходим к п. 6.3.2ЛОЖЬ6.3.2Т.к. NaydenPerv0=ЛОЖЬ, то переходим к п. 6.36.3Для i пробегаем значения от 0 до (N-1): i=i+1126.3.1Т.к.Mi¹0, то переходим к п. 6.3.2ЛОЖЬ6.3.2Т.к. NaydenPerv0=ЛОЖЬ, то переходим к п. 6.36.3Для i пробегаем значения от 0 до (N-1): i=i+1206.3.1Т.к.Mi=0 и NaydenPerv0=ЛОЖЬ, то переходим к п. 6.3.1+.1ИСТИНА6.3.1+.1NaydenPerv0 = ИСТИНАИСТИНА6.3.2Т.к. NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.16.3.2+.1S = S + |Mi|06.3Для i пробегаем значения от 0 до (N-1): i=i+13-36.3.1Т.к.Mi¹0, то переходим к п. 6.3.2ЛОЖЬ6.3.2Т.к. NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.16.3.2+.1S = S + |Mi|36.3Для i пробегаем значения от 0 до (N-1): i=i+1456.3.1Т.к.Mi¹0, то переходим к п. 6.3.2ЛОЖЬ6.3.2Т.к. NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.16.3.2+.1S = S + |Mi|86.3Для i пробегаем значения от 0 до (N-1): i=i+1. Так как i перешло за границу диапазона, т.е. i ³ N, то завершаем цикл и переходим к п. 5.36.4Возвращаем значение переменной S

Аналогично здесь же нужно привести трассировочную таблицу функций PreobrazovanieMassiva(M,N).


Трассировочная таблица для программы Main с исходными данными N=5 и M={1,2,0,-3,5}:

Номер шагаОписание шага алгоритмаNN£0MMinPoModulu Element(M,N)SumPosle Pervogo0(M,N)1N=002Пока (N<=0) выполняем п.2.1ИСТИНА2.1Вводим N53Вызов функции ZapolnenieMassiva(M,N) {1,2,0, -3,5}4Вызов функции PechatMassiva(M,N)5Вызов функции MinPoModuluElement(M,N) и вывод результата этой функции06Вызов функции SumPoslePervogo0(M,N) и вывод результата этой функции87Вызов функции PreobrazovanieMassiva(M,N)

.2 Тестирование программы


Скриншот, демонстрирующий работу программы при исходных данных N=5 и M={1,2,0,-3,5}:




ЗАКЛЮЧЕНИЕ

массив убывание трассировка алгоритм

В ходе практической работы был разработан алгоритм, вычисляющий заданное арифметическое выражения, предварительно анализируя его на область определения выражения. Кроме того, данный алгоритм был программно реализован средствами среды Microsoft Visual Studio C++ 2008 Express и протестирован.

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



БИБЛИОГРАФИЧЕСКИЙ СПИСОК


1.Павловская Т.А., С/C++. Программирование на языке высокого уровня / Т.А. Павловская. - СПб.: Питер, 2004.


Министерство образования и науки Российской Федерации Филиал федерального государственного бюджетного образовательного учреждения высшего профессионального о

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ