Одномерные массивы
Вычисление суммы положительных элементов массива. Упорядочивание элементов массива по убыванию. Решение задачи с помощью алгоритма, реализованного в среде Microsoft Visual 2008 Express. Реализация и тестирование программы. Выполнение трассировки функций.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | практическая работа |
Язык | русский |
Дата добавления | 23.01.2015 |
Размер файла | 146,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования
«Южно-Уральский государственный университет» в г. Нижневартовске
Кафедра «Информатика»
Практическая работа
Одномерные массивы.
по дисциплине Программирование
Автор Алтынбаев Т.Д.
Нижневартовск 2014
1. ПОСТАНОВКА ЗАДАЧИ
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) сумму положительных элементов массива;
2) произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
1.1 Исходные данные (входные данные)
Входные данные: N, M, где N - количество элементов массива (переменная типа int), M - массив целочисленных элементов (типа int).
1.2 Перечень результатов (выходные данные)
min - минимальный по модулю элемент массива (переменная типа int),
S - сумма положительных элементов массива (переменная типа int).
1.3 Вспомогательные переменные
i - индексы элементов массива (переменная типа int), NaydenPerv0 - флаг, который принимает значение ИСТИНА после нахождения в массиве элемента, равного нулю (переменная типа bool), Mnew - преобразованный массив целочисленных элементов (типа int).
1.4 Среда функционирования
Задача будет решена с помощью алгоритма, реализованного в среде Microsoft Visual C++ 2008 Express на языке программирования С++.
2. ПРОЕКТИРОВАНИЕ
2.1 Алгоритм
В ходе проектирования алгоритма решения поставленной задачи была разработана следующая последовательность действий, необходимая для получения результатов:
1) Присваиваем размерности массива (переменной N) начальное значение 0 (N = 0);
2) До тех пор, пока пользователь не введет значащую размерность, то есть пока (N 0), выполнять следующее:
2.1) запрашивать у пользователя ввод положительной размерности массива N.
3) Заполнение N элементами массива M;
4) Вывод N элементов массива M;
5) Нахождение минимального по модулю элемента min массива M и его вывод;
6) Нахождение суммы модулей элементов S массива M, расположенных после первого элемента, равного нулю, и ее вывод;
7) Преобразование массива M в новый массив Mnew таким образом, чтобы в первой половине нового массива располагались элементы, стоящие в четных позициях массива M, а во второй половине -- элементы, стоящие в нечетных позициях массива M. Вывести новый массив Mnew.
В данном алгоритме пункты 3-7 были детализированы следующим образом:
3) Заполнение N элементами массива M:
3.1) Для каждого индекса i, пробегая значения от 0 до (N-1) (то есть 0 i < N), необходимо выполнить следующее:
3.1.1) запрашивать у пользователя ввод i-го элемента массива Mi.
4) Вывод N элементов массива M:
4.1) Для каждого индекса i, пробегая значения от 0 до (N-1) (то есть 0 i < N), необходимо выполнить следующее:
4.1.1) выводить i-й элемент массива Mi.
5) Нахождение минимального по модулю элемента min массива M:
5.1) Присваиваем переменной min значение первого элемента массива M0 (min=M0)
5.2) Для каждого индекса i, пробегая значения от 0 до (N-1) (то есть 0 i < N), необходимо выполнить следующее:
5.2.1) если переменная min по модулю больше чем модуль i-го элемента массива Mi (то есть |min| < | Mi|), то:
5.2.1+.1) присваиваем переменной min значение i-го элемента массива Mi (min = Mi).
5.3) Возвращаем значение переменной min.
6) Нахождение суммы модулей элементов S массива M, расположенных после первого элемента, равного нулю:
6.1) Присваиваем флагу «Найден первый ноль» значение ЛОЖЬ (NaydenPerv0 = false).
6.2) Присваиваем переменной S начальное значение 0 (S=0).
6.3) Для каждого индекса i, пробегая значения от 0 до (N-1) (то есть 0 i < N), необходимо выполнить следующее:
6.3.1) если i-й элемент массива равен 0 и первый ноль еще не найден (то есть Mi = 0 и NaydenPerviy0 = false), то:
6.3.1+.1) флагу «Найден первый ноль» присваиваем значение ИСТИНА (NaydenPerv0 = true).
6.3.2) если первый ноль уже найден (то есть NaydenPerviy0=true), то:
6.3.2+.1) переменную S увеличиваем на модуль значение i-го элемента массива (S = S + |Mi|).
6.4) Возвращаем значение переменной S.
7) Преобразование массива M в новый массив Mnew таким образом, чтобы в первой половине нового массива располагались элементы, стоящие в четных позициях массива M, а во второй половине -- элементы, стоящие в нечетных позициях массива M:
7.1) Для каждого индекса i, пробегая значения от 0 до (N-1) (то есть 0 i < N), необходимо выполнить следующее:
6.3.1) если индекс i не достиг середины массива (то есть i < целой части от деление N/2 ), то:
6.3.1+.1) i-му элементу нового массива Mnew i присваиваем значение (2i+1)-го элемента массива M2i+1, (т.е. элемента находящегося в нечетной позиции с учетом, что позиции нумеруются с 0, а не с 1); иначе (т.е. когда индекс находится во второй половине массива):
6.3.1-.1) i-му элементу нового массива Mnew i присваиваем значение (i-2*(целое от N/2))-го элемента массива Mi-2*Целое(N/2), (т.е. элемента находящегося в четной позиции).
7.2) Вывод массива Mnew, то есть выполнение пункта 4 для массива Mnew.
Пункты 3-7 было решено выделить в отдельные алгоритмы (подпрограммы), обращение к которым осуществляется из основного алгоритма (главной программы).
2.2 Блок-схема
Блок-схема спроектированного алгоритма представлена на рисунке ниже:
3. РЕАЛИЗАЦИЯ
Для реализации нахождения результата задачи разработанный ранее алгоритм был реализован с помощью языка программирования C++. Код получившейся программы представлен ниже:
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
int 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. ТЕСТИРОВАНИЕ
4.1 Тестирование алгоритма
Сначала выполним трассировку тех функций (подпрограмм), которые формируют результаты. А именно функции:
MinPoModuluElement(M,N) - функция нахождения минимального по модулю элемента массива M,
SumPoslePervogo0(M,N) - функция нахождения суммы модулей элементов массива M, расположенных после первого элемента, равного нулю,
PreobrazovanieMassiva(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 |
i |
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 |
Т.к.Mi0, то переходим к п. 6.3.2 |
ЛОЖЬ |
|||||||
6.3.2 |
Т.к. NaydenPerv0=ЛОЖЬ, то переходим к п. 6.3 |
||||||||
6.3 |
Для i пробегаем значения от 0 до (N-1): i=i+1 |
1 |
2 |
||||||
6.3.1 |
Т.к.Mi0, то переходим к п. 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 |
Т.к.Mi0, то переходим к п. 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 |
Т.к.Mi0, то переходим к п. 6.3.2 |
ЛОЖЬ |
|||||||
6.3.2 |
Т.к. NaydenPerv0= ИСТИНА, то переходим к п. 6.3.2+.1 |
||||||||
6.3.2+.1 |
S = S + |Mi| |
8 |
|||||||
6.3 |
Для i пробегаем значения от 0 до (N-1): i=i+1. Так как i перешло за границу диапазона, т.е. i N, то завершаем цикл и переходим к п. 5.3 |
||||||||
6.4 |
Возвращаем значение переменной S |
Аналогично здесь же нужно привести трассировочную таблицу функций PreobrazovanieMassiva(M,N).
Трассировочная таблица для программы Main с исходными данными N=5 и M={1,2,0,-3,5}:
Номер шага |
Описание шага алгоритма |
N |
N0 |
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) |
4.2 Тестирование программы
Скриншот, демонстрирующий работу программы при исходных данных N=5 и M={1,2,0,-3,5}:
ЗАКЛЮЧЕНИЕ
массив убывание трассировка алгоритм
В ходе практической работы был разработан алгоритм, вычисляющий заданное арифметическое выражения, предварительно анализируя его на область определения выражения. Кроме того, данный алгоритм был программно реализован средствами среды Microsoft Visual Studio C++ 2008 Express и протестирован.
Тестирование показало, что для случаев возможных сбоев программа выполняется корректно, и правильно вычисляет арифметическое выражение на области его определения.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Павловская Т.А., С/C++. Программирование на языке высокого уровня / Т.А. Павловская. - СПб.: Питер, 2004.
Размещено на Allbest.ru
Подобные документы
Одномерные числовые массивы, образование элементами целочисленного массива невозрастающей последовательности. Программное нахождение суммы элементов каждой возможной строки матрицы и формирование массива из найденных сумм, вывод массива-результата.
лабораторная работа [12,8 K], добавлен 09.01.2011Выведение значения элементов массива, которые удовлетворяют неравенству. Подсчет количества отрицательных элементов массива. Изменение исходного массива. Тестирование программы. Проверка её работоспособности. Реакция программы на сообщение об ошибке.
лабораторная работа [1,3 M], добавлен 23.11.2014Решения задачи графическим и программным способами. Описание алгоритма решения графическим способом, укрупненная схема алгоритма. Ввод элементов двумерного массива, вывод преобразованного массива, разработка программы на языке pascal, листинг программы.
курсовая работа [115,5 K], добавлен 22.05.2010Подсчет количества отрицательных элементов массива. Изменение исходного массива перемещением всех его положительных элементов в начало с исходным порядком их следования. Вывод на дисплей количества перемещенных элементов. Алгоритм и код программы.
лабораторная работа [946,5 K], добавлен 23.11.2014Вычисление значения суммы ряда, абсолютной и относительной погрешности. Упорядочение массива по убыванию элементов сверху вниз и слева направо. Построение графика функции. Текстовая строка, проверка числа открывающихся и закрывающихся скобок в строке.
курсовая работа [875,9 K], добавлен 07.06.2014Разработка и реализация типовых алгоритмов обработки одномерных массивов на языке Delphi. Максимальный и минимальный элемент массива. Значение и расположение элементов массива. Элементы массива, находящиеся перед максимальным или минимальным элементом.
лабораторная работа [12,8 K], добавлен 02.12.2014Описание алгоритма решения задачи графическим способом. Ввод элементов исходного массива в цикле. Нахождение определённых элементов. Сортировка элементов с помощью пузырькового метода. Разработка программы на языке Pascal. Поиск наибольшего элемента.
лабораторная работа [123,5 K], добавлен 15.01.2014Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.
контрольная работа [150,4 K], добавлен 03.05.2014Описание алгоритма решения задачи по вычислению суммы элементов строк матрицы с использованием графического способа. Детализация укрупненной схемы алгоритма и разработка программы для решения задачи в среде Turbo Pascal. Листинг и тестирование программы.
курсовая работа [446,0 K], добавлен 19.06.2014Особенности поиска среднеарифметического значения элементов массива. Общая характеристика проблем разработки в среде Turbo Pascal программы упорядочивания массива по возрастанию. Рассмотрение основных этапов разработки программы на языке PASCAL.
курсовая работа [896,7 K], добавлен 18.05.2014