Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define EPS 1e-6
- struct data {
- int lines, columns;
- };
- int fillStruct(const char *filename, struct data* size);
- int fillArray(const char* filename, struct data size, double* matr, double ** matrix);
- void printArray(struct data size, double* matr, double ** matrix);
- void swap(struct data size, double * matr, int firstLine, int secondLine);
- void swapix(struct data size, double** matrix, int firstLine, int secondLine);
- void sumk(struct data size, double* matr, int firstLine, double k, int secondLine);
- void sumkix(struct data size, double** matrix, int firstLine, double k, int secondLine);
- void getTriangle(struct data size, double* matr);
- void getTrianglix(struct data size, double** matrix);
- int getRang(struct data size, double* matr);
- int getRangix(struct data size, double** matrix);
- int main() {
- struct data size;
- double* matr;
- double** matrix;
- int temp;
- //заполнение структуры
- temp = fillStruct("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", &size);
- if (temp == -1) {
- printf("file open issue\n");
- return -1;
- }
- if (temp == 1) {
- printf("not enough numbers in first line of file to fill struct\n");
- return -1;
- }
- if (size.lines == 1 || size.columns == 1) {
- printf("rang = 1\nrangix = 1\n");
- return 0;
- }
- matr = (double*)malloc(sizeof(double) * size.lines * size.columns);
- if (!matr) {
- printf("malloc error\n");
- return -1;
- }
- matrix = (double**)malloc(sizeof(double*) * size.lines);
- if (!matrix) {
- printf("malloc errorix\n");
- free(matr);
- return -1;
- }
- for (int i = 0; i < size.lines; i++) {
- matrix[i] = (double*)malloc(sizeof(double) * size.columns);
- if (!matrix[i]) {
- printf("some malloc error\n");
- for (int j = 0; j < i; j++)
- free(matrix[j]);
- free(matrix);
- free(matr);
- return -1;
- }
- }
- //заполнение матриц
- temp = fillArray("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", size, matr, matrix);
- if (temp == -1) {
- printf("file open issue v2\n");
- free(matr);
- for (int i = 0; i < size.lines; i++)
- free(matrix[i]);
- free(matrix);
- return -1;
- }
- if (temp!=0) {
- printf("wrong file data: one of two possible errors in line n %d\n1)size.lines > actual number of lines in file\n2)size.columns > actual number of columns in file\n", temp);
- free(matr);
- for (int i = 0; i < size.lines; i++)
- free(matrix[i]);
- free(matrix);
- return -1;
- }
- printArray(size, matr, matrix);
- getTriangle(size, matr);
- getTrianglix(size, matrix);
- printArray(size, matr, matrix);
- printf("rang = %d\nrangix = %d\n", getRang(size, matr), getRangix(size, matrix));
- free(matr);
- return 0;
- }
- int fillStruct(const char *filename, struct data* size) {
- FILE* f = fopen(filename, "r");
- char line[100];
- if (!f)
- return -1;
- fgets(line, 100, f);
- if (sscanf(line, "%d %d", &size->lines, &size->columns) != 2)
- return 1;
- fclose(f);
- return 0;
- }
- int fillArray(const char* filename, struct data size, double* matr, double ** matrix) {
- FILE* f = fopen(filename, "r");
- double temp;
- char litter[100];
- if (!f)
- return -1;
- fgets(litter, 100, f);
- for (int i = 0; i < size.lines; i++) {
- for (int j = 0; j < size.columns; j++) {
- if (fscanf(f, "%lf", &temp) != 1) {
- return i;
- }
- matr[i * size.columns + j] = temp;
- matrix[i][j] = temp;
- }
- }
- fclose(f);
- return 0;
- }
- void printArray(struct data size, double* matr, double ** matrix) {
- printf("matr:\n");
- for (int i = 0; i < size.lines; i++) {
- for (int j = 0; j < size.columns; j++)
- printf("%lf ", matr[i * size.columns + j]);
- printf("\n");
- }
- printf("matrix:\n");
- for (int i = 0; i < size.lines; i++) {
- for (int j = 0; j < size.columns; j++)
- printf("%lf ", matrix[i][j]);
- printf("\n");
- }
- }
- void swap(struct data size, double* matr, int firstLine, int secondLine) {
- double temp;
- for (int j = 0; j < size.columns; j++) {
- temp = matr[firstLine * size.columns + j];
- matr[firstLine * size.columns + j] = matr[secondLine * size.columns + j];
- matr[secondLine * size.columns + j] = temp;
- }
- }
- void swapix(struct data size, double** matrix, int firstLine, int secondLine) {
- double temp;
- for (int j = 0; j < size.columns; j++) {
- temp = matrix[firstLine][j];
- matrix[firstLine][j] = matrix[secondLine][j];
- matrix[secondLine][j] = temp;
- }
- }
- void sumk(struct data size, double* matr, int firstLine, double k, int secondLine){
- for (int j = 0; j < size.columns; j++)
- matr[secondLine * size.columns + j] +=k * matr[firstLine * size.columns + j];
- }
- void sumkix(struct data size, double** matrix, int firstLine, double k, int secondLine) {
- for (int j = 0; j < size.columns; j++)
- matrix[secondLine][j] += k * matrix[firstLine][j];
- }
- void getTriangle(struct data size, double* matr) {
- int i, j, k = 0, l;
- for (j = 0; j < size.columns; j++) {
- for (i = k; i < size.lines; i++) {
- if (fabs(matr[i * size.columns + j]) > EPS) {
- if (i == size.lines - 1) {
- swap(size, matr, k, i);
- k++;
- break;
- }
- for (l = i + 1; l < size.lines; l++)
- sumk(size, matr, i, -1 * matr[l * size.columns + j] / matr[i * size.columns + j], l);
- swap(size, matr, k, i);
- k++;
- break;
- }
- }
- }
- }
- void getTrianglix(struct data size, double** matrix) {
- int i, j, k = 0, l;
- for (j = 0; j < size.columns; j++) {
- for (i = k; i < size.lines; i++) {
- if (fabs(matrix[i][j]) > EPS) {
- if (i == size.lines - 1) {
- swapix(size, matrix, k, i);
- k++;
- break;
- }
- for (l = i + 1; l < size.lines; l++)
- sumkix(size, matrix, i, -1 * matrix[l][j] / matrix[i][j], l);
- swapix(size, matrix, k, i);
- k++;
- break;
- }
- }
- }
- }
- int getRang(struct data size, double* matr) {
- int result = 0;
- int i, j, k = 0;
- for (i = 0; i < size.lines; i++) {
- for (j = k; j < size.columns; j++) {
- if (fabs(matr[i * size.columns + j]) > EPS) {
- result++;
- break;
- }
- }
- if (j == size.columns - 1) {
- return result;
- }
- k = j+1;
- }
- return result;
- }
- int getRangix(struct data size, double** matrix) {
- int result = 0;
- int i, j, k = 0;
- for (i = 0; i < size.lines; i++) {
- for (j = k; j < size.columns; j++) {
- if (fabs(matrix[i][j]) > EPS) {
- result++;
- break;
- }
- }
- if (j == size.columns - 1)
- return result;
- k = j + 1;
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment