shadeyourself

удаление строки с элементом, равному среднему арифметическом

Apr 24th, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. struct matrixData {
  6.     int lines, columns;
  7. };
  8.  
  9. int get_matrixData(const char* filename, struct matrixData * data);
  10. int getMatrix(const char* filename, int**matrix, struct matrixData data);
  11. int getAvg(int** matrix, struct matrixData data);
  12. int findAvg(int **matrix, struct matrixData data, int avg);
  13. void deleteAvg(int** matrix, int**result, int avgLine, struct matrixData data);
  14. int printResult(const char* filename, int** matrix, int lines, int columns);
  15.  
  16.  
  17. int main() {
  18.     struct matrixData data;
  19.     int** matrix;
  20.     int** result;
  21.     int avg, avgLine, i, j;
  22.     if (get_matrixData("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", &data)==0) {
  23.         return -1;
  24.     }
  25.     //выделение памяти под матрицу
  26.     matrix = (int**)malloc(sizeof(int**) * (data.lines * data.columns));
  27.     for (i = 0; i < data.lines; i++) {
  28.         matrix[i] = (int*)malloc(sizeof(int) * data.columns);
  29.         if (!matrix[i]) {
  30.             for (j = 0; j < data.lines; j++)
  31.                 free(matrix[j]);
  32.             return -1;
  33.         }
  34.     }
  35.     //заполнение матрицы
  36.     if (getMatrix("C:\\Users\\m video\\Desktop\\work with\\data_dat.txt", matrix, data) == -1) {
  37.         return -1;
  38.     }
  39.     avg = getAvg(matrix, data);
  40.     avgLine = findAvg(matrix, data, avg);
  41.     if (avgLine == -1) {
  42.         printResult("C:\\Users\\m video\\Desktop\\work with\\data_res.txt", matrix, data.lines, data.columns);
  43.         for (i = 0; i < data.lines; i++)
  44.             free(matrix[i]);
  45.         free(matrix);
  46.         return 0;
  47.     }
  48.     result = (int**)malloc(sizeof(int*) * ((data.lines - 1) * data.columns));
  49.     for (i = 0; i < (data.lines - 1); i++) {
  50.         result[i] = (int*)malloc(sizeof(int) * data.columns);
  51.         if (!result[i]) {
  52.             for (j = 0; j < (data.lines - 1); j++)
  53.                 free(result[j]);
  54.             return -1;
  55.         }
  56.     }
  57.     deleteAvg(matrix, result, avgLine, data);
  58.     printResult("data.res", result, data.lines - 1, data.columns);
  59.     for (i = 0; i < (data.lines - 1); i++)
  60.         free(result[i]);
  61.     free(result);
  62.     for (i = 0; i < data.lines; i++)
  63.         free(matrix[i]);
  64.     free(matrix);
  65.     return 0;
  66. }
  67.  
  68.  
  69. //заполнение struct matrixData
  70. int get_matrixData(const char* filename, struct matrixData *data) {
  71.     FILE* f = fopen(filename, "r");
  72.     if (f==NULL) {
  73.         printf("file error\n");
  74.         return 0;
  75.     }
  76.     if (fscanf(f, "%d %d", &data->lines, &data->columns) != 2) {
  77.         fclose(f);
  78.         return 0;
  79.     }
  80.     fclose(f);
  81.     return 1;
  82. }
  83. //заполнение двумерного массива(матрицы) из файла
  84. int getMatrix(const char* filename, int** matrix, struct matrixData data) {
  85.     FILE* f = fopen(filename, "r");
  86.     int i, j, musor[2];
  87.     if (!f)
  88.         return -1;
  89.     fscanf(f, "%d %d", &musor[0], &musor[1]);
  90.     for (i = 0; i < data.lines; i++) {
  91.         for (j = 0; j < data.columns; j++) {
  92.             if (fscanf(f, "%d", &matrix[i][j])!= 1) {
  93.                 fclose(f);
  94.                 return -1;
  95.             }
  96.         }
  97.     }
  98.     fclose(f);
  99.     return 0;
  100. }
  101. //считаем среднее арифметическое
  102. int getAvg(int** matrix, struct matrixData data) {
  103.     int avg = 0, i, j;
  104.     for (i = 0; i < data.lines; i++) {
  105.         for (j = 0; j < data.columns; j++)
  106.             avg += matrix[i][j];
  107.     }
  108.     return avg / (data.lines + data.columns);
  109. }
  110. //ищем среднее арефметическое
  111. int findAvg(int** matrix, struct matrixData data, int avg) {
  112.     int i, j;
  113.     for (i = 0; i < data.lines; i++) {
  114.         for (j = 0; j < data.columns; j++) {
  115.             if (matrix[i][j] == avg)
  116.                 return j;
  117.         }
  118.     }
  119.     return -1;
  120. }
  121.  
  122. //переписывание matrix в result без строки с avg, поэлементно
  123. void deleteAvg(int** matrix,int **result, int avgLine, struct matrixData data) {
  124.     int matrixLines =0, resultLines = 0, columns = 0;
  125.     for (matrixLines = 0; matrixLines < data.lines; matrixLines++) {
  126.         if (matrixLines != avgLine) {
  127.             for (columns = 0; columns < data.columns; columns++)
  128.                 result[resultLines][columns] = matrix[matrixLines][columns];
  129.             resultLines++;
  130.         }
  131.     }
  132. }
  133. //вывод результата в файл
  134. int printResult(const char* filename, int** result, int lines, int columns) {
  135.     FILE* f = fopen(filename, "w");
  136.     if (!f)
  137.         return -1;
  138.     int i, j;
  139.     for (i = 0; i < lines; i++) {
  140.         for (j = 0; j < columns; j++) {
  141.             fprintf(f, "%d \n", result[i][j]);
  142.             printf("%d ", i);
  143.         }
  144.     }
  145.     fclose(f);
  146.     return 0;
  147. }
Add Comment
Please, Sign In to add comment