вторая прога

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
//Считать массив произвольного размера - возвращает размер и указатель на считанный массив через matrix
int ReadMatrix(istream* infile, int** matrix) {
int num;
int* read=new int[1];
int size=0;
while ( ! infile->eof() && size < 100)
{
(*infile) >> num;
if (! infile->eof() )
{
int* temp=new int[++size];
memcpy(temp,read,sizeof(int)*(size-1));
temp[size-1] = num;
int* k=read;
read=temp;
delete [] k;
}
}
*matrix = read;
return size;
}
//Считывает в matrix width*width элементов из infile
void ReadConstantMatrix(istream* infile, int* matrix, int width) {
int num;
for (int i=0; i < width*width && !infile->eof(); i++ ) {
(*infile) >> num;
if (! infile->eof() )
{
matrix[i] = num;
}
}
}
//Функция для вывода матрицы размера width x witdh в outfile
void PrintMatrix(ostream* outfile, int* matrix, int width) {
for (int i=0; i<width; i++)
{
for (int j=0; j<width-1; j++)
(*outfile)<<matrix[i*width+j]<<" ";
(*outfile)<<matrix[(i+1)*width-1]<<endl;
}
}
// С индексами
int MultDiag(const int* matrix, int width) {
int result = 1;
for (int i=0; i < width; i++) {
if ( i*width+i != (i+1)*width-1-i )
result *= matrix[i*width+i] * matrix[(i+1)*width-1-i];
else
result *= matrix[i*width+i];
}
return result;
}
// С указателями
int MultDiagPointers(const int* matrix, int width) {
int result=1;
for (int i=0; i < width; i++) {
if ( i*width+i != (i+1)*width-1-i )
result *= *(matrix+i*width+i) * *(matrix+(i+1)*width-1-i);
else
result *= *(matrix+i*width+i);
}
return result;
}
// Тестовая матрица
int testMatrix[][5] = {
{1,2,3,4,5},
{2,1,4,5,6},
{3,4,5,6,7},
{4,5,6,1,8},
{5,6,7,8,1}
};
int main() {
/* ********************************************** */
/* Часть 1: константные массивы, вывод - на экран */
//Поскольку матрицы по-русски задаются в виде двумерного массива, то для его передачи в функции необходимо получить указатель на первый элемент
//Одномерный массив можно передавать просто так
cout << "Тестовая матрица:" << endl;
PrintMatrix(&cout, &testMatrix[0][0], 5);
cout << "С индексами: " << MultDiag(&(testMatrix[0][0]),5) << endl;
cout << "С указателями: " << MultDiagPointers(&(testMatrix[0][0]),5) << endl;
/* ******************************************************** */
/* Часть 2: массив заданного размера, ввод и вывод из файла */
ifstream infile("test.in");
int matrix3x3[3][3];
ReadConstantMatrix(&infile,&matrix3x3[0][0],3);
infile.close();
ofstream outfile("test.out");
outfile << "Исходная матрица:" << endl;
PrintMatrix(&outfile, &matrix3x3[0][0], 3);
outfile << "Результат работы функции с индексами: " << MultDiag(&matrix3x3[0][0], 3) <<endl;
outfile << "Результат работы функции с указателями: " << MultDiagPointers(&matrix3x3[0][0], 3) <<endl;
/* ************************************************************ */
/* Часть 2: массив произвольного размера, ввод и вывод из файла */
infile.open("test.in");
int* matrix;
int size = ReadMatrix(&infile,&matrix);
infile.close();
outfile << "Исходная матрица:" << endl;
PrintMatrix(&outfile, matrix, (int)sqrt(size));
outfile << "Результат работы функции с индексами: " << MultDiag(matrix, (int)sqrt(size)) <<endl;
outfile << "Результат работы функции с указателями: " << MultDiagPointers(matrix, (int)sqrt(size)) <<endl;
outfile.close();
return 0;
}