Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_1_2.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
62.28 Кб
Скачать

Лабораторная работа №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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]