Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_1_Книги).doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
1.04 Mб
Скачать

Упражнения, тесты.

  1. Дан код:

const n=5; int * ap[n];

int v; ap[1]=&v; //1

ap[2]= v; //2

int * p; p= new int; ap[3]=*p; //3

int *q; q=new int[10]; ap[9]=q; //4

ap[4]=new int; //5

ap[4]=new int[6]; //6

unsigned m=10; ap[7]=new int[m]; //7

const k=10; int a[k]; ap[8]=a; //8

В каких строках (//1—//8) нет ошибок? Что означают правильные операторы? Объяснить ошибки.

  1. Дан код:

const п=5, m=10; int M [n][m], *p, *ap[n];

int k1=0, k2=n-1;

p=M[k1]; //1

M[k1]=M[k2]; //2

M[k2]=p; //3

for (int i=0; i<n; i++) ap[i]=M[i]; //4

int i1=0, i2=m-1;

p=ap[i1]; //5

ap[i1]=ap[i2]; //6

ap[i2]=p; //7

В каких строках (//1—//7) есть ошибки? Объяснить их.

  1. Как будет работать следующий фрагмент программы

void MyOut(int *u, int size)

{ cout<<endl;

for (int i=0; i<size;i++) cout<<u[i]<<" ";

}

int main()

{ const n=5;

int ar1[n]={10, -2, 33, 4},

ar2[n]={111, -222, 333, 0, 555};

int *t, *t1, *t2; t1=ar1; t2=ar2;

t=t1; t1=t2; t2=t;

MyOut(ar1,n); MyOut(ar2,n);

MyOut(t1,n); MyOut(t2,n);

return 0; getch();

}

Зачем объявили и использовали указатели t1 и t2? Почему не использовали операции new и delete для t, t1 и t2?

  1. Что означает цикл for (int I=0; w[I]; I++); если 1) w – числовой одномерный массив, 2) w -- строка; 3) w – массив указателей.

  2. Дана программа.

void MyFun1 (float **X, int , int );

void MyOut (float *X[], int, int);

int main()

{ int ** A; int N=6, M=4; A=new float [M];

for (int i=0; i<N; i++) A[i]=new float* [N];

MyFun1(A,N,M); MyOut(A,N,M);

delete[]A; for (int i=0;i<N;i++) delete[]A[i];

getch(); return 0; }

void MyFun1 (float *X[], int n, int m)

// В динамической “матрице” размерности n* m надо поменять местами первую по порядку и последнюю строки, не перемещая их физически в памяти.

{ for (int i=0; i<n; i++)

for (int j=0;j<m;j++)

X[i][j]=(i+1)*(j+1);

int t; t=X[0]; X[0]=X[n-1]; X[n-1]=t;

}

void MyOut (float **X, int n, int m)

// Вывод динамической “матрицы” размерности n* m

{ for (int i=0; i<n; i++)

{ cout<<endl;

for (int j=0;j<m;j++) printf("%7.2f", X[i][j]);

} }

Найти ошибки, объяснить их и исправить.

7. Почему не работает следующий фрагмент программы?

const n=5; int ar1[n]={10, -2, 33, 4},

ar2[n]={111, -222, 333, 0, 555};

int *t; t=ar1; ar1=ar2; ar2=t;

Как её изменить, чтобы “переставить” местами два массива, не перемещая их элементы “физически” в памяти ? Как это сделать для динамических массивов?

8. Дан код

const n=3; char *S[n],

*t=new char[10]; //1

for(int i=0;i<n;i++)

{ gets(t); S[i]=t; //2

}

for(int i=0;i<n;i++) printf(“%s ”, S[i]);

Что будет выведено, если последовательно введём:

Иванов

Петров

Сидоров?

Варианты ответов:

      1. Иванов Петров Сидоров

      2. Сидоров Петров Иванов

      3. Иванов Иванов Иванов

      4. Сидоров Сидоров Сидоров

      5. Ошибка в //1

      6. Ошибка в //2: нет new для S[i].

  1. Дан заголовок функции:

void FunMatr (int **X, int , int );

Какой из следующих вызовов правильный?

/*1*/ const Nc=5, Mc=10; int C[Nc][Mc]; FunMatr(C, Nc, Mc);

/*2*/ int ** A; int N=6, M=4; A=new float [N];

for (int i=0; i<N; i++) A[i]=new float* [M];

FunMatr(C, Nc, Mc);

Варианты ответов:

1) только /*1*/ ; 2) только /*2*/ ; 3) /*1*/ и /*2*/ ; 4) нет правильного.

  1. Дан заголовок функции:

void FunArr1 (int *z, int );

Какой из следующих вызовов правильный?

int A[10]; FunArr1(A, 10); //1

int *d; int n; cin>>n; d= new int[n]; FunArr1(d, n); //2

Варианты ответов:

1) только //1; 2) только //2; 3) //1 и //2; 4) нет правильного.

11. Пусть объявлены следующие переменные: int x=10, *p, **q;

Какие из следующих операторов синтаксически правильные?

1) p=x; 2) p=&x; 3) q=p; 4) q=&p; 5) q=&(&p); 6) q=&x; 7) q=&(&x);

12. Пусть объявлена переменная int **u2;

Какие из следующих последовательностей операторов синтаксически правильные?

  1. u2=new *int; *u2=new int; cin>>(**u2);

  2. u2=new *int; *u2=new int; cout>>(**u2);

  3. u2=new *int; cin>>*u2;

  4. u2=new *int; cout>>*u2;

  5. u2=new *int; *u2=new int; cout>>(**u2);

  1. Как можно объявить D, чтобы D =new float *[n]; компилировалось и выполнялось? Выбери правильные варианты из предложенных:

    1. const n=5; float *D;

    2. const n=5; float **D;

    3. int n; cin>>n; float *D;

    4. int n; cin>>n; float **D;

    5. int n; cin>>n; float f; float &D=f;

    6. int n; cin>>n; float f; float &&D=f;

  1. Что надо записать, чтобы было достаточно для того, чтобы

for (int i=0; i<n1; i++) D[i]=new int [n2];

компилировался и выполнялся? Выбери правильные варианты из предложенных:

  1. const n1=5, n2=4; int *D[n1];

  2. int n1=5; const n2=4; int *D[n1];

  3. const n1=5; int n2=4; int *D[n1];

  4. int n1=5, n2=4; int *D[n1];

  5. const n1=5; int n2=4; int **D;

  6. const n1=5; int n2=4; int **D; D=new int [n1];

  7. const n1=5; const n2=4; int **D; D=new int [n2];

15. Пусть const n=5, m=6; int A[n][m]; В каких строках есть ошибки?

1) for (int i=0; i<n; i++) delete [] A[i]; delete [] A;

2) delete [] A; for (int i=0; i<n; i++) delete [] A[i];

3) for (int i=0; i<n; i++) delete [m] A[i]; delete [n] A;

4) for (int i=0; i<n; i++) for (int j=0; j<m; j++) delete A[i][j];

5) for (int i=0; i<n; i++) delete [] A[i]; delete A;

16. Дан код:

const n=5; char t[20]; char **S; S=new *char [n];

for (int i=0; i<n; i++)

{gets(t); S[i]=new char [strlen(t)];

//оператор1

}

Какие из следующих операторов на месте оператора “оператор1” формально синтаксически правильные, хотя выполняют не обязательно одно и тоже и могут не иметь практического значения? Выбери правильные варианты из предложенных:

1) strcpy(S[i],t); 2) strcpy(S[i],t[i]); 3) strcpy(S, t); 4) S[i]=t;

5) t=S[i]; 6) S[i]=t[i]; 7) S[i][0]=t[0];

8) for (int j=0; j<strlen(t); j++) S[i][j]=t[j];

9) for (int j=0; j<=20; j++) S[i][j]=t[j];

17. Пусть const n=5, m=6; int A[n][m]; В каких строках есть ошибки?

1) int S[n]; for(int i=0; i<n; i++) S[i]=A[i];

2) int *S[n]; for(int i=0; i<n; i++) { S[i]=new int [m]; A[i]=S[i]; }

3) int **S; S=new *int [n]; for(int i=0; i<n; i++) S[i]=A[i];

4) int *S; S= A[0]; A[0]=A[n-1]; A[n-1]=S;

5) int S; S= A[0]; A[0]=A[n-1]; A[n-1]=S;

6) int S;for(int j=0; j<m; j++) {S=A[0][j]; A[0][j]=A[n-1][j];A[n-1][j]=S; }

18. Дан код.

const n=5; int * M[n]; //1

int arr_of_size[n];

for (int i=0; i<n; i++) cin>>arr_of_size[i];

for (int i=0; i<n; i++)

M[i]= new int[arr_of_size[i]]; //2

for (int i=0; i<n; i++)

for (int j=0; j<n; j++)

M [i][j]=i*j; //3

При каких значениях введённых элементов массива arr_of_size будет правильно работать приведённый фрагмент программы?

Варианты ответов:

        1. При любых целых положительных значениях.

        2. При любых значениях.

        3. Если введём пять значений, каждое из которых равно 5.

        4. Ошибка компиляции строки //1, так как n не должна быть константой.

        5. Ошибка компиляции строки //2, так как в new нельзя использовать элемент массива.

        6. Ошибка компиляции строки //3, так как для M нельзя использовать два индекса, это одномерный массив.

Лабораторная работа 3.

Тема. Связь указателей и статических матриц.

Требования и общие указания к заданиям:

  • разработать класс для работы с одной или несколькими матрицами, размерности которых — константы, предусмотрев конструктор, методы для ввода, вывода массива и в зависимости от варианта один или несколько методов для обработки матриц. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;

  • предусмотреть цветной вывод результатов. Например, в задачах А.6 — А.9 элементы матрицы из заштрихованной области вывести другим цветом;

  • при работе с матрицами надо обязательно использовать указатели. При этом должны быть приведены различные (не менее трёх) способы организации циклов с использованием указателей (см. 4.1, 4.2, 4.3);

  • результаты из функций должны возвращаться с помощью указателей, а не с помощью ссылочного типа. Функции, отличные от типа void, не использовать;

  • для перестановки строк матрицы, если их надо выполнять по условию задачи, использовать указатели, как это было показано в §6;

Пример. (+)

Составить класс для работы с целочисленной матрицей, включив в него матрицу, конкретные текущие размерности и следующие методы: конструктор для ввода и проверки текущих размерностей матрицы; ввод матрицы; вывод матрицы; поиск наибольшего и наименьшего значений матрицы, номера одной строки, где находится максимальный и номера одной строки, где находится минимальный элементы всей матрицы; цветной вывод матрицы, в результате которого все элементы найденных в предыдущей функции строк при выводе выделяются другими цветами. В функции main ввести размерности матрицы, создать объект и проверить составленные методы.

const n1max=10, n2max=10;

class ClMatr

{ int a[n1max][n2max], n1, n2;

public:

ClMatr(int size1=5, int size2=3)

{ if (size1>0 && size1<n1max)

n1=size1; else n1=5;

if (size2>0 && size2<n2max)

n2=size2; else n2=3;

}

void MyInp();

void MyOut();

void MaxMin(int *, int *, int *, int *);

void MyColorOut(unsigned, unsigned,unsigned, unsigned, unsigned);

};

void ClMatr::MyInp()

{ int x, y=1;

for (int i=0; i<n1; i++)

{ y++; x=-14;

for (int j=0; j<n2; j++)

{ x+=16; gotoxy(x,y);

cout<<"a["<<i<<","<<j<<"]"<<" ";

scanf("%d", a[i]+j);

}

}

};

void ClMatr::MyOut()

{ int x, y=wherey()+1; int *p1, *p2 ;

for (p1=a[0]; p1<=a[n1-1]; p1+=n2max, y++)

for (x=1, p2=p1; p2<p1+n2; p2++, x+=5)

{

gotoxy(x,y);

printf("%5d", *p2);

}

cout<<endl;

}

void ClMatr::MyColorOut(unsigned i1, unsigned i2,

unsigned col1, unsigned col2, unsigned col3)

{ int x,i=0, y=wherey()+1; int *p1, *p2 ;

for (p1=a[0]; p1<=a[n1-1]; p1+=n2max, y++, i++)

{ if (i==i1) textcolor( col1); else if (i==i2) textcolor(col2);

else textcolor(col3);

for (x=1, p2=p1; p2<p1+n2; p2++, x+=5)

{ gotoxy(x,y); cprintf("%5d", *p2);

}

}

cout<<endl;

}

void ClMatr::MaxMin(int *max, int *Nmax, int *min, int *Nmin)

{ *max=*min=a[0][0]; *Nmax=*Nmin=0;

for (int i=0;i<n1;i++)

for (int j=0;j<n2;j++)

{ int el=*(a[0]+n2max*i+j);

if (*max<el)

{ *max=el; *Nmax=i;

}

else if (*min>el)

{ *min=el; *Nmin=i;

}

}

}

int main()

{ int n1, n2, Nmax, Nmin, max, min; clrscr();

cout<<"\nn1="; cin>>n1; cout<<" n2="; cin>>n2;

ClMatr ob(n1,n2); clrscr();

ob.MyInp(); cout<<endl; ob.MyOut();

ob.MaxMin(&max,&Nmax,&min,&Nmin);

textcolor(10);

cprintf("Max element=%d in %d row\r\n",max , Nmax+1 );

textcolor(11);

cprintf("Min element=%d in %d row\r\n",min , Nmin+1 );

if (Nmax!=Nmin)

ob.MyColorOut(Nmax, Nmin, 10,11, 15);

getch(); return 0;

}

Варианты заданий.

        1. Задачи первого простого уровня.

  1. Найти произведение вектор-строки (одномерного массива) на матрицу.

  2. Найти норму заданной матрицы следующим образом. В каждой строке находим сумму модулей всех элементов. Среди этих сумм определяем максимальную сумму.

  3. Определить, явля­ется ли матрица симметричной относительно главной диагонали.

  4. Определить, есть ли в матрице хотя бы одна строка, состоящая только из нулевых элементов. Если есть, найти номер последней такой строки.

  5. Даны две действительные квадратные матрицы одинакового порядка n. По­лучить новую матрицу путем умножения элементов каждой строки первой матрицы на наибольшее из значений элементов соответствующей строки второй матрицы.

  6. Найти минимальное значение элементов квадратной матрицы, расположенных в закрашенной части, включая и диагональные элементы, на рис.1.

  7. Найти сумму положительных элементов, расположенных в закрашенной части матрицы, не включая диагональные элементы, на рис.2.

  8. Найти произведение ненулевых элементов, расположенных в закрашенной части матрицы, включая диагональные элементы, на рис.3.

  9. Найти количество ненулевых элементов, расположенных в закрашенной части матрицы, не включая диагональные элементы, на рис.4.

Рис. 1. Рис. 2. Рис. 3. Рис. 4.

  1. В квадратной матрице найти разность между наибольшим и наименьшим значениями побочной диагонали.

  2. Найти номера всех максимальных элементов главной диагонали квадратной матрицы.

Задачи второго среднего уровня.

  1. Найти максимальное из чисел, встречающихся в матрице более одного раза.

  2. Седловой точкой матрицы назовём такой элемент, который является одновременно максимальным в столбце и минимальным в строке. Найти одну, любую седловую точку заданной матрицы.

  3. Для заданной квадратной матрицы найти такие k, что к-я строка совпадает с к-м столбцом.

  4. Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены (либо по возрастанию, либо по убыванию).

  5. Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Найти количество локальных минимумов заданной матрицы.

  6. Выполнить операцию сглаживания для заданной матрицы, в результате которой получается новая матрица того же размера, каждый элемент которой вычисляется как среднеарифметическое имеющихся соседей соответствующего элемента исходной матрицы.

  7. Если в заданной матрице нет нулей, то заменить повторяющиеся элементы матрицы нулями и найти количество ненулевых, то есть неповторяющихся элементов. В противном случае матрицу оставить без изменения. Память для новой матрицы не резервировать.

  8. Расстояние между k-й и m-й строками матрицы a определяется как . , где n2 — количество элементов в строке матрицы. Указать номер строки, максимально удаленной от первой строки заданной матрицы.

  9. Найти строку заданной матрицы, в которой длина максимальной серии упорядоченных по возрастанию элементов минимальна.

  10. Взаимно однозначное отображение элементов матрицы на себя можно задать с помощью двух целочисленных матриц: в первой указываем номер строки, куда переходит данный элемент, а во второй – номер столбца. Построить две матрицы, задающие отражение каждого элемента исходной матрицы на симметричный ему элемент относительно главной диагонали.

  11. Изменяя порядок следования строк, рассортировать матрицу по возрастанию первых элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку выбором.

  12. Изменяя порядок следования строк, рассортировать матрицу по возрастанию количества нулей в строках. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку выбором.

  13. Изменяя порядок следования строк, рассортировать матрицу по возрастанию суммы модулей элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку обменом (алгоритм “пузырька”).

  14. Изменяя порядок следования строк, рассортировать матрицу по возрастанию наименьших элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку обменом (алгоритм “пузырька”).

  15. Получить действительную матрицу B, каждый элемент bij  которой ра­вен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 5.

  16. Получить действительную матрицу В, каждый элемент bij  которой ра­вен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 6.

  17. Получить действительную матрицу В, каждый элемент bij  которой ра­вен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 7.

Рис. 5. Рис. 6. Рис. 7.

Задачи повышенной сложности.

  1. Для заданной квадратной целочисленной матрицы найти максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

  2. Для заданной квадратной целочисленной матрицы найти максимум среди сумм элементов диагоналей, параллельных побочной диагонали.

  3. Две строки целочисленной матрицы назовём похожими, если совпадают множества чисел, встречающихся в этих строках. Найти количество строк в максимальном множестве попарно непохожих строк заданной матрицы, расположенных подряд..

  4. Найти количество строк заданной матрицы размерности 5*10, являющихся перестановкой чисел 1, 2, ..., 10.

  5. Изменяя порядок следования строк, рассортировать целочисленную матрицу по возрастанию количества симметричных чисел в строке. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку вставками.

  6. Изменяя порядок следования строк, рассортировать целочисленную матрицу по возрастанию максимальной длины серии упорядоченных по возрастанию элементов строки. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку слиянием.

  7. По матрице A построить матрицу B того же размера, где элемент bij определяется следующим образом. Через aij проведем в A линии, параллельные сторонам прямоугольника до пересечения с побочной диагональю; bij определяется как максимум среди элементов треугольника в А (рис. 8).

  8. По матрице А построить матрицу В того же размера, где bij определяется следующим образом. Через aij проведем в A диагонали, параллельные главной и побочной диагоналям; bij определяется как максимум в закрашенной части матрицы А (рис. 9).

Рис. 8. Рис. 9.

  1. Найти сум­му элементов, расположенных в закрашенной части квадратной матрицы на рис. 10.

  2. Найти произведение ненулевых элементов, расположенных в закрашенной части квадратной матрицы на рис. 11.

Рис. 10. Рис. 11.

  1. Начиная с центра, обойти по спирали по часовой стрелке все элементы квадратной матрицы, распечатывая их в порядке обхода.

  2. Начиная с центра, обойти по спирали против часовой стрелки все элементы квадратной матрицы, распечатывая их в порядке обхода.

  3. Заполнить квадратную матрицу размерности n*n по спирали по часовой стрелке числами 1, 2, 3, …,n*n, начиная с элемента, находящегося в верхнем левом углу.

  4. Получить квадратную матрицу порядка n, элементами которой являются заданные действительные числа а1, ..., аnn, расположенные в ней по схеме, которая приведена на рисунке.

Лабораторная работа 4.

Тема. Массив указателей на строки.

Требования и общие указания к заданиям:

Задания выполнить двумя способами:

a) создать статический массив строк как статический массив указателей на строки;

b) создать динамический массив строк как динамический массив указателей на строки (см. §5.).

Варианты заданий.

B. Задачи второго среднего уровня.

В вариантах с чётными номерами использовать сортировку обменом, в вариантах с нечётными номерами — сортировку выбором.

  1. Рассортировать слова русского текста по возрастанию отношения количества гласных букв к общему количеству букв в слове.

  2. Вывести слова русского текста в алфавитном порядке по первой букве. Слова, начинающиеся с новой буквы, выводить с красной строки.

  3. Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова в сортировке не должны участвовать.

  4. Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством расположить в алфавитном порядке.

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

  6. Ввести текст и список слов. Для каждого слова из заданного списка найти, сколько раз оно встречается в тексте. Рассортировать эти слова по возрастанию найденного количества.

  7. Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве фамилии, затем, если они совпадают, по первой букве имени и, наконец, по первой букве отчества.

  8. Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве имени, затем по возрастанию количества букв в имени.

  9. Все имена из заданного списка студентов рассортировать по частоте их встречаемости в этом списке.

  10. Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве имени, затем, если они совпадают, по возрастанию количества букв в фамилии.

  11. Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по двум первым буквам фамилии, затем, если первые две буквы фамилии одинаковы, по возрастанию количества букв в фамилии.

  12. Создать массив строк и соответствующий ему массив числовых параметров. Рассортировать строки по числовому параметру. Для одинаковых числовых параметров сортировать по алфавиту.

С. Задачи повышенной сложности.

Решить те же (см уровень B)задачи, используя в вариантах с чётными номерами сортировку вставками, а в вариантах с нечётными номерами — сортировку простым слиянием.

Лабораторная работа 5.

Тема. Динамические матрицы.

Требования и общие указания к заданиям:

  • разработать класс для работы с одной или несколькими матрицами, размерности которых являются полями класса (см. лаб. работу 1). В конструкторе создать динамическую матрицу, а в деструкторе освободить память. Предусмотреть методы для ввода, вывода динамической матрицы и в зависимости от варианта один или несколько методов для её обработки. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;

  • предусмотреть цветной вывод результатов;

  • там, где это можно, желательно использовать указатели для организации циклов. Но при этом надо учитывать, что строки динамической матрицы в памяти располагаются не рядом;

  • перестановки строк матрицы выполнять с помощью указателей..

Пример 1 (+) Сортировка строк целочисленной динамической матрицы по возрастанию максимальных элементов строк. Порядок чисел в каждой строке не меняется.

/* Прототип функции для вывода матрицы D и вектора максимальных элементов строк S. */

void Myprint (int **D,int *S,int ,int);

int main()

{

// 1) Объявление и создание динамической матрицы

int n, m; int **d; randomize();

n=random(5)+2; m=random(5)+2;

d=new int*[n];

for(int i=0;i<n;i++) d[i]=new int [m];

// 2) Получение элементов динамической матрицы случайным образом

for(int i=0;i<n;i++)

for(int j=0;j<m;j++)

d[i][j]=random(15)-6;

/* 3) Построение вектора максимальных элементов строк s. Его размерность соответствует количеству строк матрицы. */

int *s,Mymax,Mymin,nmin;

s=new int[n]; // Построение динамического одномерного массива

for(int i=0;i<n;i++)

{ Mymax=d[i][0];

for(int j=0;j<m;j++)

if (d[i][j]>Mymax) Mymax=d[i][j];

s[i]=Mymax;

}

// 4) Вывод не рассортированной матрицы и вектора

Myprint(d,s,n,m) ;

// 5)Сортировка

for(int start=0;start<=n-2;start++)

{

/* Начиная с элемента s[start], находим наименьший элемент Mymin и его номер nmin */

Mymin=s[start]; nmin=start;

for(int i=start;i<n;i++)

if(s[i]<Mymin)

{ Mymin=s[i]; nmin=i;

}

/* Переставляем адреса строк матрицы с номерами start и nmin. Элементы этих строк остаются на старых местах */

int *p; p=d[start]; d[start]=d[nmin]; d[nmin]=p;

/* Переставляем элементы одномерного массива с номерами start и nmin */

int t; t=s[start]; s[start]=s[nmin]; s[nmin]=t;

}

// 6) Вывод рассортированной матрицы и вектора

Myprint(d,s,n,m) ;

getch(); return 0;

}

/* Функция для вывода матрицы D и вектора максимальных элементов строк S. */

void Myprint (int **D, int *S, int N, int M)

{for(int i=0;i<N;i++)

{ printf("\n");

for(int j=0;j<M;j++)

printf("%5d",D[i][j]);

printf(" => %5d",S[i]);

}

printf("\n");

}

Пример 2. (+) Создание динамической ”матрицы”. В первой строке резервируем память для одного элемента, во второй строке – для двух и т. д. Другими словами, создаём в памяти нижний треугольник квадратной “матрицы” относительно главной диагонали.

int main()

{ int n1; cout<<"Size1=>";

cin>>n1; // Объявили и ввели только одну размерность

int **arr;

arr= new int*[n1];

for (int i=0;i<n1;i++)

arr[i]=new int[i+1];

/* В i-й строке резервируем память для (i+1) элемента Дальше работаем, как с обычной матрицей. Например, в каждой строке находим среднее значение элементов, находящихся “левее ” главной диагонали */

float s;

for (int i=0; i<n1;i++)

{ s=0;

// Внутренний цикл с помощью указателя и номера элемента

for (int *q=arr[i], j=0; q< arr[i]+i+1; q++, j++)

{ *q=(i+1)*(j+1);

s+=*q;

cout.width(6);

cout<< (*q);

}

/* или внутренний цикл с помощью индекса

for (int j=0;j<i+1;j++)

{ arr[i][j]=(i+1)*(j+1);

s+=arr[i][j];

cout.width(6);

cout<<arr[i][j];

} */

// В этой же строке экрана курсор переводим в позицию с номером (n1+1)*6

gotoxy((n1+1)*6, wherey());

cout<<"Average=> "<<s/(i+1)<<endl;

}

//Удаляем динамическую матрицу так, как в предыдущем примере

for (int i=0;i<n1;i++)

delete[]arr[i];

delete[]arr;

getch(); return 0;

}

Пример 3. (+). Создание динамической “матрицы” с различным количеством элементов в строках. В каждой строке резервируем память для количества элементов, которое вводим с экрана.

int main()

{ int n1; cout<<"Size1=>"; cin>>n1; // Количество строк

int *arr_of_size;

/*Объявление динамического одномерного массива, в котором будут храниться количество элементов в каждой строке. */

arr_of_size=new int[n1]; // Создание динамического одномерного массива

cout<<"Input the size of each row";

for (int i=0;i<n1;i++) cin>>arr_of_size[i];

// Объявление и создание динамической матрицы

int **arr;

arr= new int*[n1];

for (int i=0;i<n1;i++)

arr[i]=new int[arr_of_size[i]];

/* Количество элементов каждой строки берём из одномерного динамического массива*/

float s;

for (int i=0; i<n1;i++)

{ s=0;

for (int j=0;j<arr_of_size[i];j++)

{

arr[i][j]=(i+1)*(j+1);

s+=arr[i][j];

cout.width(6);

cout<<arr[i][j];

}

gotoxy((arr_of_size[i]+1)*6, wherey());

if (arr_of_size[i]==0)

cout<<"No elements";

else

cout<<"Average=> "<<s/arr_of_size[i]<<endl;

}

//Удаляем матрицу

for (int i=0;i<n1;i++)

delete[]arr[i];

delete[]arr;

delete []arr_of_size; // Удаляем динамический одномерный массив

getch(); return 0;

}

/* Замечание. Этапы 2) – 6) не отличаются от работы со статической матрицей фиксированной размерности.*/

Варианты заданий.

A.Задачи первого простого уровня.

Можно использовать любой алгоритм сортировки

  1. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по наибольшему элементу строки.

  2. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по убыванию количества чисел, принадлежащих отрезку [a, b], где a, b – одинаковые для каждой строки, a<=b.

    1. Из динамической квадратной матрицы размерности n*n получить одномерный динамический массив, который содержат наименьшие элементы строк.

    2. В динамической матрице с одинаковым количеством элементов в каждой строке получить номера строк, элементы каждой из которых образуют монотонно убывающую последовательность

    3. В динамической матрице с одинаковым количеством элементов в каждой строке получить номера строк, все элементы которых четны.

    4. В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество нулевых строк, то есть строк, в которых все нули.

    5. В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество строк, в которых есть хотя бы один нуль.

    6. Найти норму заданной динамической матрицы А,с одинаковым количеством элементов в каждой строке, определенную как .

    7. Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Найти наибольший и наименьший элементы этого треугольника.

    8. Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Найти сумму всех элементов этого треугольника.