Замечание. Вряд ли вы получите равенство массивов при заполнении массивов случайными числами. Замените соответствующую функцию заполнением с клавиатуры.

Задача 2

Создать массив-результат из исходного путем перезаписи всех положительных чисел

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

Выделяем функции проекта:

1. Функция заполнения случайными числами

2. Ф-я вывода массива на экран

3. Ф-я создания нового массива

3/

1. OtrOut

2. Исходные данные

а) исходный массив

int*p1;

int n;

массив результат

int*p2;

int n;

3. Результат (количество в массиве результате) => int

Файл: mas1.h

#ifndef MAS1_H

#define MAS1_H

void InMasRnd(int *p, int n, int min, int max);

void OutMas(int *p, int n);

int OtrOut(int *p1, int *p2, int n);

#endif

Файл: mas1.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

void InMasRnd(int *p, int n, int min, int max)

{

int i;

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

p[i]=rand()%(max-min+1)+min;

return;

}

void OutMas(int *p, int n)

{

int i;

cout << endl;

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

cout << p[i] << " | ";

return;

}

int OtrOut(int *p1, int *p2, int n)

{

int i, j=0;

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

if (p1[i] > 0) {

p2[j]=p1[i];

j++;

}

}

return j;

}

Файл: main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

#include "mas1.h"

int main(void)

{

const int N=5;

int mas1[N], mas2[N], z;

srand((unsigned)time(NULL));

InMasRnd(mas1,N,-5,10);

cout << "\nПервый массив:";

OutMas(mas1,N);

z = OtrOut(mas1,mas2,N);

cout << "\nВторой массив:";

OutMas(mas2,z);

return 0;

}

Функции и двумерные массивы

Любой двумерный массив определяется тремя параметрами:

· Адресом первого элемента в массиве int*p.

· Количество строк в матрице int n.

· Количество столбцов в матрице int m.

При этом определение адреса элемента массива с индексами i,j будет производится по формуле p+i*m+j. Для организации вызова функции (main) необходимо уметь определить адрес первого элемента в массиве.

Если память под массив выделена статически: int mas [3][4]; то mas [0] – адрес первого элемента в массиве.

Если память под двумерный массив выделена динамически: int*p;

p=new int[3*4]; p-адрес первого элемента в массиве.

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

Для обработки матрицы построчно можно использовать готовые функции для одномерного массива

Задача 1.

Демонстрирует получение матрицы результата с выделением памяти внутри main

Дана матрица, создать транспонированную.

Выделяем функции:

1. Заполнение матрицы случайными числами, по-скольку перебор идет построчно, используем ранее записанную функцию InMasRnd

2. Вывод матрицы на экран в матричной форме

3. Создание транспонируемой матрицы

Анализ характеристик функции:

2/

1. OutMas

2. Исходные данные:

матрица

int *p;

int n;

int m;

3. Результат: нет (void)

3/

1. TransMas

2. Исходные данные:

матрица исходная

int *p1;

int n;

int m;

матрица транспонированая - int *p2;

3. Результат: нет (void)

файл: mas2.h

----------------

#ifndef MAS2_H

#define MAS2_H

void InMasRnd(int *p, int n, int min, int max);

void OutMas(int *p, int n, int m);

void TransMas(int *p1, int *p2, int n, int m);

#endif

----------------

файл: mas2.cpp

----------------

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <iomanip>

#include <stdlib.h>

#include <time.h>

void InMasRnd(int *p, int n, int min, int max)

{

int i;

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

p[i]=rand()%(max-min+1)+min;

return;

}

void OutMas(int *p, int n, int m)

{

int i,j;

cout << endl;

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

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

cout << setw(5) << *(p+i*m+j);

}

cout << endl;

}

return;

}

void TransMas(int *p1, int *p2, int n, int m)

{

int i,j;

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

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

*(p2+j*n+i)=*(p1+i*m+j);

}

}

return;

}

----------------

файл: main.cpp

----------------

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <stdlib.h>

#include <time.h>

#include "mas2.h"

int main(void)

{

const int N=3;

const int M=5;

int m1[N][M], m2[M][N];

srand((unsigned)time(NULL));

InMasRnd(m1[0],N*M,-20,30); // m1[0] - адрес нулевой строки, // соответ-но адрес первого числа

cout << "\nИсходный массив:";

OutMas(m1[0],N,M);

cout << "\nВторой массив:";

TransMas(m1[0],m2[0],N,M);

OutMas(m2[0],M,N);

return 0;

}

Наши рекомендации