Вроде как чистый С код

  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
128
#include <stdio.h>
#include <string.h>
#include <math.h>
//Считать массив произвольного размера - возвращает размер и указатель на считанный массив через matrix
int ReadMatrix(FILE* infile, int** matrix) {
int num;
int* read=new int[1];
int size=0;
while ( ! feof(infile) )
{
fscanf(infile,"%d",&num);
if (! feof(infile) )
{
int* temp=new int[++size];
memcpy(temp,read,sizeof(int)*(size-1));
temp[size-1] = num;
int* k=read;
read=temp;
delete [] k;
char ch;
fscanf(infile,"%c",&ch);
}
}
*matrix = read;
return size;
}
//Считывает в matrix width*width элементов из infile
void ReadConstantMatrix(FILE* infile, int* matrix, int width) {
int num;
for (int i=0; i < width*width && !feof(infile); i++ ) {
fscanf(infile,"%d",&num);
if (! feof(infile) )
{
matrix[i] = num;
char ch;
fscanf(infile,"%c",&ch);
}
}
}
//Функция для вывода матрицы размера width x witdh в outfile
void PrintMatrix(FILE* outfile, int* matrix, int width) {
for (int i=0; i<width; i++)
{
for (int j=0; j<width-1; j++)
fprintf(outfile,"%d ",matrix[i*width+j]);
fprintf(outfile,"%d\n",matrix[(i+1)*width-1]);
}
}
// С индексами
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: константные массивы, вывод - на экран */
//Поскольку матрицы по-русски задаются в виде двумерного массива, то для его передачи в функции необходимо получить указатель на первый элемент
//Одномерный массив можно передавать просто так
printf("Тестовая матрица:\n");
PrintMatrix(stdout, &testMatrix[0][0], 5);
printf("С индексами: %d\n", MultDiag(&(testMatrix[0][0]),5));
printf("С указателями: %d\n", MultDiagPointers(&(testMatrix[0][0]),5));
/* ******************************************************** */
/* Часть 2: массив заданного размера, ввод и вывод из файла */
FILE* infile=fopen("test.in","r");
int matrix3x3[3][3];
ReadConstantMatrix(infile,&matrix3x3[0][0],3);
fclose(infile);
FILE* outfile=fopen("test.out","w");
fprintf(outfile,"Исходная матрица:\n");
PrintMatrix(outfile, &matrix3x3[0][0], 3);
fprintf(outfile,"Результат работы функции с индексами: %d\n", MultDiag(&matrix3x3[0][0], 3));
fprintf(outfile,"Результат работы функции с указателями: %d\n", MultDiagPointers(&matrix3x3[0][0], 3));
/* ************************************************************ */
/* Часть 2: массив произвольного размера, ввод и вывод из файла */
infile=fopen("test.in","r");
int* matrix;
int size = ReadMatrix(infile,&matrix);
fclose(infile);
fprintf(outfile,"Исходная матрица:\n");
PrintMatrix(outfile, matrix, (int)sqrt(size));
fprintf(outfile,"Результат работы функции с индексами: %d\n", MultDiag(matrix, (int)sqrt(size)));
fprintf(outfile,"Результат работы функции с указателями: %d\n", MultDiagPointers(matrix, (int)sqrt(size)));
fclose(outfile);
return 0;
}