
- •Лабораторная работа №1
- •1.1 Краткие теоретические сведения
- •1.1.1 Инициализации указателя:
- •1.1.2 Описание массива:
- •1.1.3 Правила работы с массивами:
- •1.2 Варианты заданий
- •1.3 Контрольные вопросы:
- •Лабораторная работа №2
- •2.1 Краткие теоретические сведения
- •2.2 Задание
- •2.3 Варианты заданий
- •2.4 Контрольные вопросы:
Лабораторная работа №1
Тема: Операции с массивами и указателями
Цель: получение практических навыков объявления, инициализации, сортировки, поиска элемента в одно и многомерных массивах
1.1 Краткие теоретические сведения
1.1.1 Инициализации указателя:
Присваивание указателю адреса существующего объекта:
при помощи операции получения адреса:
int a=5; // целая переменная
int *p= &a; // в указатель записывается адрес а
int *p(&a); // тоже самое
с помощью значения другого инициализированного указателя:
int *r=p;
с помощью имени массива
int b[10]; // массив
int *t=b; // присваиваем адрес начала массива
Присваивание указателю адреса области памяти в явном виде:
char *vp= (char *)0xB8000000;
Присваивание пустого значения:
int *suxx = NULL;
int * rulez = 0;
Выделение участка динамической памяти и присваивание её адреса указателю:
при помощи оператора new
// в n помещается адрес начала
// участка под переменную типа int
int *n = new int;
// тоже что и в предыдущем примере
// + инициализация значения
int *n = new int (10);
// выделенной динамической памяти значением 10
int *n = new int[10];
//выделение динамической памяти под 10 величин
//типа int при помощи функции malloc в u
// помещается адрес начала участка
int *u = (int *) malloc (sizeof(int));
Освобождение памяти, выделенной с помощью операции new, должно выполняться с помощью delete, а памяти, выделенной функцией malloc – посредством функции free.
1.1.2 Описание массива:
// описание массива из 10 вещественных чисел
float a[10];
//инициализация массива значениями
b[0]=3, b[1]=2, b[2]=1;
int b[3] = {3, 2, 1};
Многомерные массивы:
int matr [6][8]; // описание
// инициализация многомерного массива
int mass2 [][2] = { {1,1},{0,2},{1,2} };
int mass2 [3][2] = {1,1,0,2,1,2};
// оба способа идентичны
Динамические массивы:
Одномерный массив
int n = 100;
float *p = new float[n];
…..
delete [] p;
Многомерный массив
int nstr, nstb;
cout << “Введите количество строк и столбцов”;
cin >> nstr >> nstb;
// объявление переменной типа
// «указатель на указатель на int»
int **mas = new int* [nstr];
// выделение памяти под массив указателей
// на строки массива
for (int i=0;i<nstr;i++)
a[i]= new int [nstb];
// каждому элементу массива указателей на строки
// присваивается адрес начала участка памяти,
// выделенного под строку двумерного массива
1.1.3 Правила работы с массивами:
размерность не динамического массива может быть только константой или константным выражением. Рекомендуется задавать размерность с помощью именованной константы;
элементы массивов нумеруются с нуля, поэтому максимальный номер элемента всегда на единицу меньше размерности;
автоматический контроль выхода индекса за границы массива не производится, поэтому программист должен следить за этим самостоятельно.
указатель — это переменная, в которой хранится адрес области памяти;
имя массива является указателем на его нулевой элемент;
обнуления динамической памяти при ее выделении не происходит. Инициализировать динамический массив нельзя;
освобождение памяти, выделенной посредством new[], выполняется с помощью операции delete[];
перед выходом локального указателя из области его действия необходимо освобождать связанную с ним динамическую память;
если количество элементов, которые должны быть введены в программу, известно до ее выполнения, определяйте массив в операторе описания переменных (причем лучше как локальную переменную, чем как глобальную); если количество можно задать во время выполнения программы, но до ввода элементов, создавайте динамический массив; если нет, используйте линейный список или другую динамическую структуру;
алгоритмы сортировки массивов различаются по быстродействию, занимаемой памяти и области применения.
Пример 1: Написать программу, которая для целочисленного массива из 100 элементов определяет, сколько положительных элементов располагается между его максимальным и минимальным элементами.
#include <iostream.h>
int main(){
int n=10;
int a[n]={1,3,-5,1,-2,1,-1,3,8,4};
int i,imax,imin,count;
for(i=imax=imin=0;i<n;i++){
if (a[i]>a[imax])imax=i;
if (a[i]<a[imin])imin=i;
}
cout<<”\n\t max=”<<a[imax]<<” min=”<<a[imin];
int ibeg=imax<imin ? imax: imin;
int iend=imax<imin ? imin: imax;
cout<<”\n\t ibeg=”<<ibeg<<” iend=”<<iend;
for(count=0,i=ibeg+1;i<iend;i++)
if (a[i]>0)count++;
cout<<”Количество положительных:”<<count<<endl;
return 0;
}
Пример 2: Написать программу, которая для вещественного массива из n элементов определяет сумму его элементов, расположенных правее последнего отрицательного элемента.
#include <iostream.h>
int main(){
int n;
cout<<”Введите кол-во эл-тов:”; cin>>n;
float *a=new float [n];
int i;
cout<<”Введите эл-тов массива:”;
for (i=0;i<n;i++) cin>>a[i];
bool flag_neg=false;
float sum=0;
for (i=n-1;i>=0;i--){
if (a[i]<0){flag_neg=true;break;}
sum+=a[i];
}
if (flag_neg) cout<<”\nСумма”<<sum;
else cout<<”\nОтрицательных элементов нет”;
return 0;
}
Пример 3: Написать программу, которая для прямоугольной целочисленной матрицы определяет номер самого левого столбца, содержащего только положительные элементы. Если такого столбца нет вывести сообщение.
#include <iostream.h>
#include <iomanip.h>
int main(){
int nrow, ncol;
cout<<”Введите кол-во строк и столбцов:”;
cin>>nrow>>ncol;
int i,j;
int **a=new int*[nrow];
for(i=0;i<nrow;i++)a[i]=new int [ncol];
cout<<”Введите элементы массива:”<<endl;
for(i=0;i<nrow;i++)
for(j=0;j<ncol;j++)cin>>a[i][j]; // ввод массива
for(i=0;i<nrow;i++){
for (j=0;j<ncol;j++)cout<<setw(4)<<a[i][j]<<” “;
cout<<endl;}
int num=-1;
bool all_posit;
for(j=0;j<ncol;j++){ // просмотр по столбцам
all_posit=true;
for(i=0;i<nrow;i++)// анализ эл-тов столбца
if (a[i][j]<0){all_posit=false;break;}
if (all_posit){num=j;break;}
}
if (num==-1)cout<<”Столбцов нет”<<endl;
else cout<<”Номер столбца:”<<num<<endl;
return 0;
}
Пример 4: Написать программу, которая упорядочивает строки прямоугольной численной матрицы по возрастанию сумм их элементов.
#include <fstream.h>
#include <iomanip.h>
int main(){
ifstream fin(“input.txt”,ios::in | ios::nocreate);
if (!fin){
cout<<”Файл input.txt не найден”<<endl;return 1;}
int nrow, ncol;
cout<<”Введите кол-во строк и столбцов:”;
fin>>nrow>>ncol; // ввод размерности массива
int i,j;
int **a=new int*[nrow];
for(i=0;i<nrow;i++)a[i]=new int [ncol];
for(i=0;i<nrow;i++)
for(j=0;j<ncol;j++)fin>>a[i][j]; // ввод массива
long *sum=new long[nrow];//массив сумм эл-тов строк
for (i=0;i<nrow;i++){
sum[i]=0;
for(j=0;j<ncol;j++)sum[i]+=a[i][j];
}
for(i=0;i<nrow;i++){ //контрольный вывод
for(j=0;j<ncol;j++)cout<<setw(4)<<a[i][j]<<” “;
cout<<”| “<<sum[i]<<endl;
}
cout<<endl;
long buf_sum;
int nmin,buf_a;
for(i=0;i<nrow-1;i++){// упорядочивание
nmin=i;
for(j=i+1;j<nrow;j++)
if (sum[j]<sum[nmin])nmin=j;
buf_sum=sum[i];sum[i]=sum[nmin];sum[nmin]=buf_sum;
for(j=0;j<ncol;j++){
buf_a=a[i][j];a[i][j]=a[nmin][j];a[nmin][j]=buf_a;
}
}
for(i=0;i<nrow;i++){//вывод упорядоченной матрицы
for (j=0;j<ncol;j++)cout<<setw(4)<<a[i][j]<<” “;
cout<<endl;}
return 0;
}