Консультация № 144793
23.09.2008, 18:33
0.00 руб.
0 6 3
C++
Разместить в динамической памяти ЭВМ матрицу 5х5 случайных целых чисел в диапазоне от -60 до 60. Напечатать ее. Предусмотреть оба варианта работы с матрицей – один указатель на всю матрицу и массив указателей.

Обсуждение

Неизвестный
23.09.2008, 19:45
общий
это ответ
Здравствуйте, Dragonlio!

Вариант с одним указателем:

//Ширина и высота матрицы
#define MWidth 5
#define MHeight 5

//Матрица
int Matrix[MWidth*MHeight];

int main()
{
int i;
int j;
for (i = 0;i<MWidth*MHeight;i++)
{
Matrix[i] = (rand() / (RAND_MAX/120))-60; //Наполняем матрицу
}

for (i = 0;i<MHeight;i++) //Печатаем матрицу
{
for (j = 0;j<MWidth;j++)
{
printf("%i ",Matrix[i*MWidth+j]);
}
printf("\n"); //Новая строка
}
}

Вариант с массивом указателем:

#include <stdlib.h>

#define MWidth 5
#define MHeight 5

//Матрица
int Matrix[MWidth][MHeight];
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int j;
for (i = 0;i<MHeight;i++)
{
for (j = 0;j<MWidth;j++)
{
Matrix[j][i] = (rand() / (RAND_MAX/120))-60;
}
}
for (i = 0;i<MHeight;i++)
{
for (j = 0;j<MWidth;j++)
{
printf("%i ",Matrix[j][i]);
}
printf("\n");
}
return 0;
}
Неизвестный
23.09.2008, 19:52
общий
Вот вам еще....

Код:

#include "iostream"
#include "stdlib.h"
#include "time.h"
#include "assert.h"

void Create_OneForAll (int *& matrix, unsigned size)
{
assert (size > 0);
matrix = new int [size];

for (unsigned i = 0; i < size; i++)
matrix [i] = (rand () % 61) * ((rand () % 2) ? 1 : -1);
}

void Print_OneForAll (int * matrix, unsigned size)
{
for (unsigned i = 1; i <= size; i++)
wprintf (L"Element % 02u: % 03d\n", i, *matrix++);
}

void Delete_OneForAll (int * matrix)
{
delete [] matrix;
}

int ** Create_TwoDimArray (unsigned size_h, unsigned size_v)
{
assert (size_h > 0 && size_v > 0);
int ** matrix = new int * [size_v];

for (unsigned i = 0; i < size_v; i++)
{
matrix [i] = new int [size_h];

for (unsigned j = 0; j < size_h; j++)
matrix [i][j] = (rand () % 61) * ((rand () % 2) ? 1 : -1);
}

return matrix;
}

void Print_TwoDimArray (int ** matrix, unsigned size_h, unsigned size_v)
{
for (unsigned i = 0; i < size_v; i++)
{
wprintf (L"Line's % 02u elements: ", i + 1);
for (unsigned j = 0; j < size_h; j++)
wprintf (L"% 03d\t", matrix [i][j]);
wprintf (L"\n");
}
}

void Delete_TwoDimArray (int ** matrix, unsigned size_v)
{
for (unsigned i = 0; i < size_v; i++)
delete [] matrix [i];
delete [] matrix;
}

int main()
{
srand (time (NULL));

const unsigned size_h = 5;
const unsigned size_v = 6;

int * matrix1 = NULL;
Create_OneForAll (matrix1, size_h * size_v);
Print_OneForAll (matrix1, size_h * size_v);
Delete_OneForAll (matrix1);
wprintf (L"\n");
int ** matrix2 = Create_TwoDimArray (size_h, size_v);
Print_TwoDimArray (matrix2, size_h, size_v);
Delete_TwoDimArray (matrix2, size_v);

return 0;
}
Неизвестный
23.09.2008, 20:09
общий
это ответ
Здравствуйте, Dragonlio!
Непосредственно данные указанными в задаче способами лежат в MatrixPlain и MatrixInd соответственно.
Для удобства и унификации работы, написана общая обертка Matrix

Приложение:
#include <stdlib.h>
#include <time.h>
#include <iostream>

template <class MIMPL>
class Matrix
{
public:
template <class T>
struct Line{
Line(T* l) : dataLine_(l) {}
T& operator[](unsigned int y) { return dataLine_[y]; }
private:
T* dataLine_;
};
typedef typename MIMPL::DataType Type;
typedef Line<Type> DataLine;

Matrix(unsigned int w, unsigned int h) : impl_(h, w), h_(h), w_(w) {}

DataLine operator[] (unsigned int x) { return DataLine(impl_.getLine(x)); }

void fillRandom(Type min, Type max){
for(unsigned int j = 0; j < height(); ++j)
for(unsigned int i = 0; i < width(); ++i){
Type val = Type(min + (float)rand() / RAND_MAX * (max - min));
(*this)[i][j] = val;
}
}

unsigned int width() const { return w_; }
unsigned int height() const { return h_; }

protected:
MIMPL impl_;
unsigned int h_;
unsigned int w_;
};

// реализация адресации с указателем на всю матрицу
template <class T>
class MatrixPlain
{
public:
typedef T DataType;

MatrixPlain(unsigned int w, unsigned int h){
columns_ = w;
data_ = new DataType[w * h];
}
~MatrixPlain(){
delete data_;
}
DataType* getLine(unsigned int y) {
return data_ + columns_ * y;
}
private:
DataType* data_;
unsigned int columns_;
};

// реализация с отдельными указателями на строки
template <class T>
class MatrixInd
{
public:
typedef T DataType;

MatrixInd(unsigned int w, unsigned int h){
lines_ = h;
data_ = new DataType*[lines_];
for(unsigned int i = 0; i < lines_; ++i)
data_[i] = new DataType[w];
}
~MatrixInd(){
for(unsigned int i = 0; i < lines_; ++i)
delete data_[i];
delete data_;
}
DataType* getLine(unsigned int y) {
return data_[y];
}
private:
DataType** data_;
unsigned int lines_;
};


// матрица с реализацие в виде указателя на всю матрицу вещественных чисел
typedef Matrix<MatrixPlain<float> > PlainFloatMat;
// матрица с реализацие в виде указателя на всю матрицу целых чисел
typedef Matrix<MatrixPlain<int> > PlainIntMat;
// матрица с реализацие в виде указателя на всю матрицу вещественных чисел
typedef Matrix<MatrixInd<float> > IndexedFloatMat;
// матрица с реализацие в виде указателя на всю матрицу целых чисел
typedef Matrix<MatrixInd<int> > IndexedIntMat;


template <class Mat>
void printMatrix(Mat& mat)
{

for(unsigned int y = 0; y < mat.height(); ++y){
for(unsigned int x = 0; x < mat.width(); ++x)
std::cout << mat[x][y] << "\t";
std::cout << "\n";
}
}

int main(int argc, char* argv[])
{
// чтобы случайные числа стали еще случайнее :)
srand((unsigned)time(NULL));

std::cout.precision(4);

const unsigned int size = 5;

PlainFloatMat plainFMat(size, size);
plainFMat.fillRandom(-60.f, 60.f);

plainFMat[2][1] = 0; // пример индексной адресации
printMatrix(plainFMat);

std::cout << "\n\n";

IndexedIntMat indIMat(size, size);
indIMat.fillRandom(-60, 60);
printMatrix(indIMat);

return 0;
}
Неизвестный
23.09.2008, 20:23
общий
Это означает, что вы не потрудились указать свою среду разработки в вопросе так же, как и уточнить, к кому этот вопрос был. Пишем на С++ Билдере, или я ошибаюсь?
Замените и откорректируйте вывод с wprintf на std::cout либо подключите правильный для вашей среды заголовок
Неизвестный
24.09.2008, 00:01
общий
это ответ
Здравствуйте, Dragonlio!
Код требуемого вопроса в приложении!

Приложение:
//Определяет ввод-вывод
#include <iostream>
//Необходимы для функции rand()
#include <time.h>
#include <stdlib.h>

using namespace std;

int main()
{
srand(time(NULL));

//Ввод размера массива m x n
int m,n;
cout<<"BBEDITE PA3MEP MACCuBA:\n ";
cin>>m>>n;

//Создание массива указателей,заполнение его случайными значениями и вывод на экран
int** arr=new int*[m];
for (int i=0;i<m;i++){
arr[i]=new int[n];
for (int j=0;j<m;j++){
arr[i][j]=rand()%122-60;
cout<<arr[i][j]<<"\t";
}
cout<<endl;
}

cout<<endl;

//Указатель на массив
int** p=arr;

//Вывод массива
for(int i=0; i<m; i++){
for (int j=0;j<n;j++){
cout<<p[i][j]<<"\t";
}
cout<<endl;
}

//Очистка памяти
for(int i=0; i<m; i++)
{
delete [] arr[i];
}

return 0;
}
Неизвестный
24.09.2008, 20:19
общий
подскажите куда добавить system ("pause") чтобы просмотреть рез.-т
Форма ответа