Замечание. Вряд ли вы получите равенство массивов при заполнении массивов случайными числами. Замените соответствующую функцию заполнением с клавиатуры.
Задача 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;
}