Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 6. В файле data.dat задан двумерный массив целых чисел с различным количеством элементов в каждой строке. Элементы массива задаются через пробел. Ограничения на количество строк в массиве нет. Ввести двумерный массив из файла в массив в программе, отведя соответствующим образом память. Определить, существует ли в массиве элемент, равный среднему арифметическому элементов массива из строки, содержащей данный элемент. Если существует, то уничтожить из массива столбец с найденым элементом. Если найдено несколько элементов, то использовать только первый из них. Если элемент не найден, то матрица не изменяется. Вывести в файл data.res полученный двумерный массив.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int ** a_alloc (int *len, int hei);
- void a_free (int **A, int hei);
- void getlen (FILE *f, int *len);
- void gethei (FILE *f, int *hei);
- int to_dec (char *c);
- int a_read_swift (FILE *f, int *res);
- void a_read (FILE *f, int **A, int *len, int hei);
- int fun_swift (int *a, int len);
- int ** fun (int **A, int *A_len, int *B_len, int hei);
- void a_out (FILE *f, int **A, int *len, int hei);
- int ** a_alloc (int *len, int hei) {
- int **A = (int**)malloc(hei * sizeof(int*));
- int i;
- for (i = 0; i < hei; i++)
- A[i] = (int*)malloc(len[i] * sizeof(int));
- return A;
- }
- void a_free (int **A, int hei) {
- int i;
- for (i = 0; i < hei; i++)
- free(A[i]);
- free (A);
- }
- void getlen (FILE *f, int *len) {
- int i = 0;
- int j = 0;
- char c;
- while (1) {
- c = fgetc(f);
- if (c == ' ' || c == '\n' || c == EOF)
- i++;
- if (c == '\n' || c == EOF) {
- len[j++] = i;
- i = 0;
- }
- if (c == EOF)
- break;
- }
- rewind(f);
- }
- void gethei (FILE *f, int *hei) {
- char c;
- *hei = 0;
- while (1) {
- c = fgetc(f);
- if (c == '\n' || c == EOF)
- *hei += 1;
- if (c == EOF)
- break;
- }
- rewind(f);
- }
- int to_dec (char *c) {
- char *mod;
- char s[1];
- int m;
- int i, j;
- int len = (int)strlen(c);
- int res = 0;
- int k = 1;
- for (i = 0; i < len; i++)
- if (c[i] == 'x')
- break;
- mod = (char*)malloc(strlen(c) * sizeof(char));
- for (j = 0; j < strlen(c) && j < i; j++)
- mod[j] = c[j];
- mod = (char*)realloc(mod, i);
- m = atoi(mod);
- printf("%d\n", m);
- for (j = len-1; j > i; j--) {
- s[0] = c[j];
- res += k * atoi(s);
- k *= m;
- }
- free(mod);
- return res;
- }
- int a_read_swift (FILE *f, int *res) {
- char v;
- char *c = (char*)malloc(256 * sizeof(char));
- int i = 0;
- while (1) {
- v = fgetc(f);
- if (v == ' ' || v == '\n' || v == EOF)
- break;
- c[i++] = v;
- }
- if (i == 0){
- free(c);
- *res = 0;
- return 0;
- }
- c = (char*)realloc(c, i * sizeof(char));
- *res = to_dec(c);
- free(c);
- if (v == '\n' || v == EOF)
- return 1;
- else return 0;
- }
- void a_read (FILE *f, int **A, int *len, int hei) {
- int i, j;
- for (i = 0; i < hei; i++)
- for (j = 0; j < len[i]; j++)
- if (a_read_swift(f, &A[i][j]))
- break;
- }
- int fun_swift (int *a, int len) {
- int k = 0;
- int m;
- int i;
- for (i = 0; i < len; i++)
- k += a[i];
- if (k % len != 0)
- return -1;
- m = k / len;
- for (i = 0; i < len; i++)
- if (a[i] == m)
- return i;
- return -1;
- }
- int ** fun (int **A, int *A_len, int *B_len, int hei) {
- int i, j, k;
- int *a ;
- int **B;
- int max_len = 0;
- for (i = 0; i < hei; i++)
- if (A_len[i] > max_len)
- max_len = A_len [i];
- a = (int*)calloc(max_len, sizeof(int));
- for (i = 0; i < hei; i++) {
- j = fun_swift(A[i], A_len[i]);
- if (j >= 0)
- a[j] = 1;
- }
- for (i = 0; i < hei; i++)
- B_len[i] = A_len[i];
- for (i = 0; i < max_len; i++)
- for (j = 0; j < hei; j++)
- if (a[i] && i < A_len[j])
- B_len[j]--;
- B = a_alloc(B_len, hei);
- for (i = 0; i < hei; i++)
- for (j = 0, k = 0; j < A_len[i]; j++)
- if (!a[j])
- B[i][k++] = A[i][j];
- free(a);
- return B;
- }
- void a_out (FILE *f, int **A, int *len, int hei) {
- int i, j;
- for (i = 0; i < hei; i++) {
- for (j = 0; j < len[i]; j++)
- fprintf(f, "%d ", A[i][j]);
- fprintf(f, "\n");
- }
- }
- int main(void) {
- FILE *in = fopen("/Users/Alexey/Desktop/input.txt", "r");
- FILE *out = fopen("/Users/Alexey/Desktop/output.txt", "w");
- int **A, **B;
- int *A_len, *B_len, hei;
- printf("\n");
- gethei(in, &hei);
- A_len = (int*)malloc(hei * sizeof(int));
- B_len = (int*)malloc(hei * sizeof(int));
- getlen(in, A_len);
- A = a_alloc(A_len, hei);
- a_read(in, A, A_len, hei);
- //a_out(out, A, A_len, hei);
- //fprintf(out, "\n\n");
- B = fun(A, A_len, B_len, hei);
- a_out(out, B, B_len, hei);
- a_free(B, hei);
- a_free(A, hei);
- free(A_len);
- free(B_len);
- fclose(in);
- fclose(out);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement