Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
16.11.2025
Размер:
5.1 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
int Prandom(int range_min, int range_max){
    int r = ((double)rand() / RAND_MAX) * (range_max - range_min) + range_min;
    return(r);
}
void mRandom(int** a, int min, int max, int m, int n){
    int i, j;
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){
            a[i][j]=Prandom(min, max);
        }
    }
}
void mTrans(int** a, int** b, int m, int n){
    int i, j;
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){
            b[j][i]=a[i][j];
        }
    }
}
void mSum(int **a, int** b, int** c, int m, int n){
    int i, j;
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){
            c[i][j]=a[i][j]+b[i][j];
        }
    }
}
void mProduct(int** a, int** b, int** c, int strok1, int stolbcov2, int strok2){
    int i, j, k, s;
    for(i=0; i<strok1; i++){
        for(k=0; k<stolbcov2; k++){
            s=0;
            for(j=0; j<strok2; j++){
                s+=a[i][j]*b[j][k];
            }
            c[i][k]=s;
        }
    }
}
void mPower(int** a, int m, int pow){
    int **body1, **body2;
    int i, j, k, l, s;
    body1 = (int**)malloc(m*sizeof(int*) + m*m*sizeof(int));
    for (i=0; i<m; ++i){
            body1[i] = (int*)(body1+m) + i*m;
    }
    body2 = (int**)malloc(m*sizeof(int*) + m*m*sizeof(int));
    for (i=0; i<m; ++i){
            body2[i] = (int*)(body2+m) + i*m;
    }
    for(i=0; i<m; i++){
        for(j=0; j<m; j++){
            body1[i][j]=a[i][j];
            body2[i][j]=a[i][j];
        }
    }
    for(k=1; k<pow; k++){
            mProduct(a, body1, body2, m, m, m);
            for(i=0; i<m; i++){
                    for(j=0; j<m; j++){
                        a[i][j]=body2[i][j];
                    }
            }
    }
}
void mPrint(int** a, int m, int n){
    int i, j;
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){
            printf("%6d", a[i][j]);
        }
        printf("\n");
    }
}
int K, columns, rows, mark=1;
int **c;
void output_mas_file(int **a, int r, int col){ // Функция для вывода матрицы в файл
    FILE *fp;
    char b[20];
    if ( (fp = fopen("test.txt","w")) == NULL ) {
            printf("Ошибка!\n");
            exit(1);
    }
    int i, j;
    for(i=0; i<r; i++){
            for(j=0; j<col; j++){
                sprintf(b, "%d", a[i][j]);
                fputs(b, fp);
                if(j+1-col) fputs(" ", fp);
                else fputs("\n", fp);
            }

    }
    fclose(fp);
}
void input_mas_file(int **a){ // Функция для вывода матрицы из файла
    int A[100];
    char b[100];
    int ch;
    int i=0, j=0;
    FILE *fp;
    fp = fopen("test2.txt","r");
    ch = getc(fp);
    while (ch != EOF) {
            if(ch==' '){
                b[i]='\0';
                A[j]=atoi(b);
                i=0;
                j++;
            }
            if(ch=='\n'){
                b[i]='\0';
                A[j]=atoi(b);
                i=0;
                j++;
                if(mark){columns=j; mark=0;}
            }
            b[i]=ch;
            ch = getc(fp);
            i++;
    }
    fclose(fp);
    A[j]=atoi(b);
    K=j+1;
    rows = (j+1)/columns;
    c = (int**)malloc(rows*sizeof(int*) + columns*rows*sizeof(int));
    for (i=0; i<rows; ++i){
            c[i] = (int*)(c+rows) + i*columns;
    }
    for(i=0; i<rows; i++){
        for(j=0; j<columns; j++){
            c[i][j]=A[i*columns+j];
        }
    }
}
int main(void)
{
    int i, j, k, m, n, s;
    int **A, **B, **product, **sum;
//    int i, j; // Работа с файлами
//    K=0;
//    input_mas_file(&c);
//    for(i=0; i<rows; i++){
//        for(j=0; j<columns; j++){
//            printf("%d ", c[i][j]);
//        }
//        printf("\n");
//    }
//    output_mas_file(c, rows, columns);
    scanf("%d", &m);
    scanf("%d", &n);
    A = (int**)malloc(m*sizeof(int*) + n*m*sizeof(int));
    for (i=0; i<m; ++i){
            A[i] = (int*)(A+m) + i*n;
    }
    B = (int**)malloc(n*sizeof(int*) + m*n*sizeof(int));
    for (i=0; i<n; ++i){
            B[i] = (int*)(B+n) + i*m;
    }
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){scanf("%d", &A[i][j]);}
    }
    mPrint(A, m, n);
    printf("\n");
//    mRandom(A, 1, 100, m, n);
//    mPrint(A, m, n);
//    printf("\n");
    mTrans(A, B, m, n);
//    mPrint(B, n, m);
//    printf("\n");
    product = (int**)malloc(m*sizeof(int*) + m*m*sizeof(int));
    for (i=0; i<m; ++i){
            product[i] = (int*)(product+m) + i*m;
    }
    sum = (int**)malloc(m*sizeof(int*) + m*n*sizeof(int));
    for (i=0; i<m; ++i){
            sum[i] = (int*)(product+m) + i*n;
    }
    mProduct(A, B, product, m, m, n);
//    mPrint(product, m, m);
//    printf("\n");
//    mSum(A, B, sum, m, n);
//    mPrint(sum, m, n);
//    printf("\n");
//    mPower(A, m, 2);
//    mPrint(A, m, n);
    mPower(product, m, 2);
    mPrint(product, m, n);
}
Соседние файлы в папке 2 семестр