
ОП_ЛР9
.doc
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
-
Федеральное государственное автономное образовательное учреждение высшего образования
«Санкт-Петербургский государственный университет аэрокосмического приборостроения»
КАФЕДРА № 2
Преподаватель
доцент, к.т.н. Куртяник Д.В.
Отчёт
по лабораторной работе №9
по дисциплине Информатика
на тему: « Динамические массивы»
Работу выполнил
студент гр. 4616 Павлов А.В.
Санкт-Петербург
Цель лабораторной работы: изучение структурной организации динамических массивов и способов доступа к их элементам с использованием указателей; совершенствование навыков процедурного программирования на языке C/С++ при решении задач обработки динамических массивов.
Задание на программирование: используя технологию процедурного программирования, разработать программу обработки одномерных и двумерных (матриц) динамических массивов в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание и выполнить постановку задачи: сформулировать условие, определить входные и выходные данные, их ограничения.
2) Разработать математическую модель: описать с помощью формул и рисунков структуру массивов и процесс их преобразования.
3) Построить схему алгоритма решения задачи.
4) Составить программу на языке C/С++.
5) Входные данные на этапах тестирования и демонстрации работы преподавателю должны задаваться либо с использованием специально подобранных арифметических формул, либо вводиться с клавиатуры по запросу. Датчики псевдослучайных чисел использовать запрещается.
Выходные данные должны выводиться на экран с пояснениями.
6) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов, в том числе с ошибочными входными данными. Входные и выходные массивы должны выводиться в одном и том же формате.
7) Использовать стандартные потоковые объекты ввода/вывода cin и cout.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.
1-3)
Вариант 9
10.
1) Дан массив a0, a1, a2,…, an-1. Определить количество и произведение значений элементов массива, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением.
2) В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк с одинаковыми номерами областей 1 и 2 (см. рисунок).
Текст программы для 1 задания
#include <iostream>
#include <conio.h>
using namespace std;
void inputmas(int * ,int);
int summa(int * ,int ,int );
int main(){
setlocale( LC_ALL,"Russian" );
int razmernost, *massiv; //динамический массив
int max,min,imax=0,imin=0;
cout<<"Дан массив a0, a1, a2,…, an-1. Определить количество и произведение значений элементов массива, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением."<<endl;
cout<<"\nВведите рамерность массива: ";
cin>>razmernost;
massiv=new int[razmernost]; //создания динамического массива
inputmas(massiv,razmernost);
//Вывод массива
cout<<"\n\n\nМассив:";
for(int i=0;i<razmernost;i++){
cout<<" "<<*(massiv+i);
}
max=*massiv;
min=*massiv;
//поиск максимального и минимального элемента
for(int i=1;i<razmernost;i++){
if((max*max)<(*(massiv+i)**(massiv+i))){max=*(massiv+i);imax=i;}
if((min*min)>(*(massiv+i)**(massiv+i))){min=*(massiv+i);imin=i;}
}
if(imax<imin){imin+=imax;imax=imin-imax;imin-=imax;}
cout<<"\n\nМаксимальный по абсолютной величине элемент в массиве: "<<max<<"\nМинимальный по абсолютной величине элемент в массиве: "<<min<<endl;
//вывод
cout<<"\nКоличество элементов, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением: "<<(imax-imin-1)<<"\n\nпроизведение значений элементов массива, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением: "<<summa(massiv,imin,imax)<<endl;
delete []massiv;
getch();
return 0;
}
//Ввод элементов массива
void inputmas(int *massiv,int razmernost){
cout<<"\nВведите в одной строке элементы массива, состоящего из "<<razmernost<<" целых чисел,\nи нажмите <ENTER>"<<endl;
//ввод изначального массива
for(int i=0;i<razmernost;i++){
cout<<"Введите "<<(i+1)<<" элемент массива: ";
cin>>*(massiv+i);
}
}
//Сумма элементов
int summa(int *massiv,int imin,int imax){
int sum=1;
//подсчет суммы элементов и их количества
for(int i=imin+1;i<imax;i++)sum*=*(massiv+i);
return sum;
}
Текст программы 2
#include <iostream>
#include <conio.h>
#include <iostream>
#include <cstdlib>
using namespace std;
typedef int telem ; //определение типа элементов массива
typedef telem *tstr ; //определение типа "указатель на telem"
typedef tstr *tmatr; //определение типа "указатель на указатель на telem"
void inputmatr(tmatr , int ) ;
void perestanivka(tmatr , int);
void outputmatr(tmatr ,int) ;
int main(){
setlocale( LC_ALL,"Russian" ) ;
int razmernost;
//динамический массив
cout<<"Введите размерность динамического двумерного массива: ";
cin>>razmernost;
tmatr massiv=new tstr [(razmernost*2)]; //выделение динамической памяти под массив
//указателей на строки массива
for(int i=0;i<razmernost*2;i++) //цикл выделения памяти под каждую строку
*(massiv+i)=new telem [(razmernost*2)]; //каждому элементу массива указателей
//на строки присваивается адрес начала
//области памяти, выделяемой под строку
//ввод элементов матрицы
inputmatr(massiv,razmernost) ;
//вывод элементов матрицы
cout<<"\nИзначальный массив:"<<endl;
outputmatr(massiv,razmernost);
//сортировка массива
perestanivka(massiv,razmernost);
//вывод элементов матрицы
cout<<"\n\nОтсортированный массив:"<<endl;
outputmatr(massiv,razmernost);
getch();
return 0;
}
//Ввод элементов в массив
void inputmatr(tmatr massiv, int razmernost)
{
for(int i=0;i<razmernost*2;i++){
for(int j=0;j<razmernost*2;j++){
//автоматическое заполнение
*(*(massiv+j)+i)=rand()%10;
//заполнение в ручную
cin>>*(*(massiv+j)+i);
}
}
}
//Сортировка массива
void perestanivka(tmatr massiv, int razmernost)
{
int bufer;
for(int i=0;i<razmernost;i++){
for(int j=0;j<razmernost-i;j++){
bufer=*(*(massiv+j+i)+i);
*(*(massiv+j+i)+i)=*(*(massiv+j+razmernost)+i);
*(*(massiv+j+razmernost)+i)=bufer;
}
}
}
//Вывод массива
void outputmatr(tmatr massiv, int razmernost)
{
for(int i=0;i<razmernost*2;i++){
for(int j=0;j<razmernost*2;j++){
cout<<" "<<*(*(massiv+j)+i)<<" ";
}
cout<<endl;
}
}
Примеры.