Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/23: Рейтинг темы: голосов - 23, средняя оценка - 4.83
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248

Двумерный массив с условием

02.03.2023, 21:47. Показов 5963. Ответов 59

Студворк — интернет-сервис помощи студентам
3. в файле data.dat задан двумерный массив целых чисел в следующем виде: в первой строке задано количества строк и столбцов массива, а далее в каждой строке файла задается одна строка двумерного массива. Элементы массива задаются через пробел. Ограничений на количества строк и столбцов в массиве нет.

Ввести двумерный массив из файла в массив в программе, отведя соответствующим образом память. Определить, существует ли в массиве строка, каждый элемент которой строго больше всех остальных элементов в столбце, содержащим данный элемент. Если существует, то уничтожить из массива найденную строку. Если строка не найдена, то матрица не изменяется. Вывести в файл data.res полученный двумерный массив.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2023, 21:47
Ответы с готовыми решениями:

Двумерный массив, обработка с условием
Дана матрица A(n,m). Найти номера строк, элементы каждой из которых образуют возрастающую или убывающую последовательность. Крайне плох в...

Как сделать двумерный массив с условием
Здравствуйте. Подскажите пожалуйста, как сделать двумерный массив с выполнением условий. Есть таблица с температурами и давлением. При...

Двумерный массив. Ввести двумерный массив, найти сумму элементов каждого столбца
Ввести двумерный массив, найти сумму элементов каждого столбца.

59
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
21.04.2023, 14:58  [ТС]
Студворк — интернет-сервис помощи студентам
И ещё сокращу количество открытий файлов, разрешили результат второго прогона записывать в датарез

Добавлено через 1 минуту
Ещё можно без arr2 обойтись, сейчас уберу его тоже

Добавлено через 22 минуты
AlexProgramm, вобщем, мне сейчас нужно в функции изменить массив arr, а именно записать в него arrNew
0
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
21.04.2023, 15:14  [ТС]
AlexProgramm,

Что пошло не так?

C
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#include <stdio.h>
#include <stdlib.h>
 
int n, m,l = 100, key = 0;
int findStr(FILE*,FILE*,int *arr);
int findStr(FILE*f1,FILE*f2,int *arr)                               //тело функции
{
    int i, j, k, l = 0, *arrNew, i2 = 0, j2 = 0;
   
    for (i = 0; i < n; i++)                         //поиск строки
    {
        key = 0;
       
        for (j = 0; j < m; j++)  
        {
            if (key == 0)
            {
                for (k = 0; k < n; k++)
                {
                    if (k == i)
                        continue;
               
                    if (arr[i*m+j] > arr[k*m+j])
                        continue;
                    else
                    {
                        key = 1;
                        break;
                    }
                }
            }
            else
                break;
        }                    
       
        if (key == 0)
        {
            printf ("\nВ %d строке все элементы больше своих столбцов", i);
            l = i;
            break;
        }
    }
   
   
    if (key == 0){      
   
    arrNew = (int *) malloc((n - 1) * m * (sizeof(int)));
    free(arr);
    arr = (int *) malloc((n - 1) * m * (sizeof(int)));
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без удаляемой строки
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            if (i == l)
                break;
               
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
        if (i != l)
        {
            i2++;
        }
      arr=arrNew;            
    }
   
 
   
    printf("\n\nНаш массив после преобразования\n");
    for (i2 = 0; i2 < n - 1; i2++)                  //вывод нового массива на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
   
 
    fprintf (f2, "%d %d\n", n - 1, m);
        for (i2 = 0; i2 < n - 1; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }  
       
   
       
    fclose (f1);
    fclose (f2);
    free(arr);
    free(arrNew);
    return l;
   
    }
    else
    {
        arrNew = (int *) malloc(n * m * (sizeof(int)));
        free(arr);
        arr=arrNew;
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без изменений
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
       
            i2++;
       
                   
    }
       
        printf("\n\nНаш массив не измененный\n");
    for (i2 = 0; i2 < n; i2++)                  //вывод нового массива без изменений на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
       
        printf("\nМассив не был изменён\n");
        fprintf (f2, "%d %d\n", n, m);
        for (i2 = 0; i2 < n; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }
        fclose (f1);
        fclose (f2);
        free(arrNew);
        free(arr);
        return 100;
    }
 
       
}
 
//ура main!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
int main (void)
{
 
    int i, j,  *arr;
       
    FILE *f1 = fopen("data_dat.txt","r");
    FILE *f2 = fopen("data_res.txt","w");
   
    if (f1 == NULL) {
    printf("failed to open the file");
    fclose (f1);
    fclose (f2);
 
    return -1;
  }
   
    fscanf (f1, "%d %d", &n, &m);
   
    arr = (int *) malloc(n * m * (sizeof(int)));
   
    for (i = 0; i < n; i++){                         //заполнение массива
        for (j = 0; j < m; j++){                      
 //     fscanf(f1, "%d ", &arr[i*m+j]);
        if (fscanf(f1, "%d", &arr[i*m+j]) != 1) // считать элемент матрицы из файла
        {
          printf("failed to read the file");
          break;}
        }
    }
       
    printf("Наш  массив:\n");      
    for (i = 0; i < n; i++)                         //вывод массива на экран
    {
        for (j = 0; j < m; j++)                      
            printf("%2d ", arr[i*m+j]);
       
        printf("\n");        
    }
    if (n==1){
        printf("\nМассив не был изменён и не будет!\n");
        fclose (f1);
        fclose (f2);
 
        free(arr);
        return 34;
    }
    l = findStr(f1,f2,arr);                                //вызов функции
   
   
   
    //2прогон
   
    fscanf (f2, "%d %d", &n, &m);
//    arr2 = (int *) malloc(n * m * (sizeof(int)));
   
  //  for (i = 0; i < n; i++)                         //заполнение массива
   //     for (j = 0; j < m; j++)                      
    //        fscanf(f3, "%d ", &arr2[i*m+j]);
       
    printf("Наш  массив 2 прогона:\n");
    for (i = 0; i < n; i++)                  //вывод исходного массива на экран
    {
        for (j = 0; j < m; j++)                      
            printf("%2d ", arr[i*m+j]);
       
        printf("\n");
    }
   
   
    if (n==1){
        printf("\nМассив не был изменён!\n");
 
        fclose (f1);
        fclose (f2);
        free(arr);
        return 35;
    }
   
    l = findStr(f2,f2,arr);                                //вызов функции
 
    fclose (f1);
    fclose (f2);
    free(arr);
   
 
}
Миниатюры
Двумерный массив с условием  
0
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
21.04.2023, 15:31  [ТС]
AlexProgramm,

Грубо сделано, пока так... Ошибки не уходят. Алг не работает, сейчас буду исправлять


C
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#include <stdio.h>
#include <stdlib.h>
 
int n, m,l = 100, key = 0;
int findStr(FILE*,FILE*);
int findStr(FILE*f1,FILE*f2)                               //тело функции
{
    int i, j, k, l = 0, *arrNew,*arr, i2 = 0, j2 = 0;
   
    fscanf (f1, "%d %d", &n, &m);
   
    arr = (int *) malloc(n * m * (sizeof(int)));
   
    for (i = 0; i < n; i++){                         //заполнение массива
        for (j = 0; j < m; j++){                      
 
        if (fscanf(f1, "%d", &arr[i*m+j]) != 1) // считать элемент матрицы из файла
        {
          printf("failed to read the file");
          break;}
        }
    }
   
    printf("Наш  массив:\n");      
    for (i = 0; i < n; i++)                         //вывод массива на экран
    {
        for (j = 0; j < m; j++)                      
            printf("%2d ", arr[i*m+j]);
       
        printf("\n");        
    }
    if (n==1){
        printf("\nМассив не был изменён и не будет!\n");
        fclose (f1);
        fclose (f2);
 
        free(arr);
        return 34;
    }
   
   
    for (i = 0; i < n; i++)                         //поиск строки
    {
        key = 0;
       
        for (j = 0; j < m; j++)  
        {
            if (key == 0)
            {
                for (k = 0; k < n; k++)
                {
                    if (k == i)
                        continue;
               
                    if (arr[i*m+j] > arr[k*m+j])
                        continue;
                    else
                    {
                        key = 1;
                        break;
                    }
                }
            }
            else
                break;
        }                    
       
        if (key == 0)
        {
            printf ("\nВ %d строке все элементы больше своих столбцов", i);
            l = i;
            break;
        }
    }
   
   
    if (key == 0){      
   
    arrNew = (int *) malloc((n - 1) * m * (sizeof(int)));
    free(arr);
    arr = (int *) malloc((n - 1) * m * (sizeof(int)));
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без удаляемой строки
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            if (i == l)
                break;
               
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
        if (i != l)
        {
            i2++;
        }
      arr=arrNew;            
    }
   
 
   
    printf("\n\nНаш массив после преобразования\n");
    for (i2 = 0; i2 < n - 1; i2++)                  //вывод нового массива на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
   
 
    fprintf (f2, "%d %d\n", n - 1, m);
        for (i2 = 0; i2 < n - 1; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }  
       
   
       
    fclose (f1);
    fclose (f2);
    free(arr);
    free(arrNew);
    return l;
   
    }
    else
    {
        arrNew = (int *) malloc(n * m * (sizeof(int)));
        free(arr);
        arr=arrNew;
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без изменений
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
       
            i2++;
       
                   
    }
       
        printf("\n\nНаш массив не измененный\n");
    for (i2 = 0; i2 < n; i2++)                  //вывод нового массива без изменений на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
       
        printf("\nМассив не был изменён\n");
        fprintf (f2, "%d %d\n", n, m);
        for (i2 = 0; i2 < n; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }
        fclose (f1);
        fclose (f2);
        free(arrNew);
        free(arr);
        return 100;
    }
 
       
}
 
//ура main!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
int main (void)
{
 
       
    FILE *f1 = fopen("data_dat.txt","r");
    FILE *f2 = fopen("data_res.txt","w");
   
    if (f1 == NULL) {
    printf("failed to open the file");
    fclose (f1);
    fclose (f2);
 
    return -1;
  }
   
  //  fscanf (f1, "%d %d", &n, &m); убери его в функцию
   
 
       
   
    l = findStr(f1,f2);                                //вызов функции
   
   
   
    //2прогон!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   
//    fscanf (f2, "%d %d", &n, &m);
//    arr2 = (int *) malloc(n * m * (sizeof(int)));
   
  //  for (i = 0; i < n; i++)                         //заполнение массива
   //     for (j = 0; j < m; j++)                      
    //        fscanf(f3, "%d ", &arr2[i*m+j]);
       
   
   
    l = findStr(f2,f2);                                //вызов функции
 
    fclose (f1);
    fclose (f2);
}
Миниатюры
Двумерный массив с условием  
0
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
21.04.2023, 15:36  [ТС]
AlexProgramm,

Убрала всё лишнее из майна. Если представить, что программа работает и не выдает ошибки памяти, то всё так, как просил исправить преподаватель


C
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <stdio.h>
#include <stdlib.h>
 
int n, m,l = 100, key = 0;
int findStr(FILE*,FILE*);
int findStr(FILE*f1,FILE*f2)                               //тело функции
{
    int i, j, k, l = 0, *arrNew,*arr, i2 = 0, j2 = 0;
   
    fscanf (f1, "%d %d", &n, &m);
   
    arr = (int *) malloc(n * m * (sizeof(int)));
   
    for (i = 0; i < n; i++){                         //заполнение массива
        for (j = 0; j < m; j++){                      
 
        if (fscanf(f1, "%d", &arr[i*m+j]) != 1) // считать элемент матрицы из файла
        {
          printf("failed to read the file");
          break;}
        }
    }
   
    printf("Наш  массив:\n");      
    for (i = 0; i < n; i++)                         //вывод массива на экран
    {
        for (j = 0; j < m; j++)                      
            printf("%2d ", arr[i*m+j]);
       
        printf("\n");        
    }
    if (n==1){
        printf("\nМассив не был изменён и не будет!\n");
        fclose (f1);
        fclose (f2);
 
        free(arr);
        return 34;
    }
   
   
    for (i = 0; i < n; i++)                         //поиск строки
    {
        key = 0;
       
        for (j = 0; j < m; j++)  
        {
            if (key == 0)
            {
                for (k = 0; k < n; k++)
                {
                    if (k == i)
                        continue;
               
                    if (arr[i*m+j] > arr[k*m+j])
                        continue;
                    else
                    {
                        key = 1;
                        break;
                    }
                }
            }
            else
                break;
        }                    
       
        if (key == 0)
        {
            printf ("\nВ %d строке все элементы больше своих столбцов", i);
            l = i;
            break;
        }
    }
   
   
    if (key == 0){      
   
    arrNew = (int *) malloc((n - 1) * m * (sizeof(int)));
    free(arr);
    arr = (int *) malloc((n - 1) * m * (sizeof(int)));
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без удаляемой строки
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            if (i == l)
                break;
               
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
        if (i != l)
        {
            i2++;
        }
      arr=arrNew;            
    }
   
 
   
    printf("\n\nНаш массив после преобразования\n");
    for (i2 = 0; i2 < n - 1; i2++)                  //вывод нового массива на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
   
 
    fprintf (f2, "%d %d\n", n - 1, m);
        for (i2 = 0; i2 < n - 1; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }  
       
   
       
    fclose (f1);
    fclose (f2);
    free(arr);
    free(arrNew);
    return l;
   
    }
    else
    {
        arrNew = (int *) malloc(n * m * (sizeof(int)));
        free(arr);
        arr=arrNew;
   
    for (i = 0; i < n; i++)                         //массив arr записываем в новый массив arrNew без изменений
    {
        for (j = 0, j2 = 0; j < m; j++)
        {
            arrNew[i2*m+j2] = arr[i*m+j];
            j2++;
        }                    
           
       
            i2++;
       
                   
    }
       
        printf("\n\nНаш массив не измененный\n");
    for (i2 = 0; i2 < n; i2++)                  //вывод нового массива без изменений на экран полностью
    {
        for (j2 = 0; j2 < m; j2++)                      
            printf("%2d ", arrNew[i2*m+j2]);
       
        printf("\n");
    }
       
        printf("\nМассив не был изменён\n");
        fprintf (f2, "%d %d\n", n, m);
        for (i2 = 0; i2 < n; i2++)                         //вывод НОВОГО массива в файл
        {    
            for (j2 = 0; j2 < m; j2++)
                fprintf(f2, "%d ", arrNew[i2*m+j2]);
                           
            fprintf(f2, "\n");        
        }
        fclose (f1);
        fclose (f2);
        free(arrNew);
        free(arr);
        return 100;
    }
 
       
}
 
//ура main!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
int main (void)
{
 
       
    FILE *f1 = fopen("data_dat.txt","r");
    FILE *f2 = fopen("data_res.txt","w");
   
    if (f1 == NULL) {
    printf("failed to open the file");
    fclose (f1);
    fclose (f2);
 
    return -1;
  }
   
   
 
       
   
    l = findStr(f1,f2);                                //вызов функции
   
   
   
    //2прогон!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
    l = findStr(f2,f2);                                //вызов функции
 
    fclose (f1);
    fclose (f2);
}
Добавлено через 37 секунд
Почему 3 раза подряд выводит failed to open the fail?
0
 Аватар для AlexProgramm
227 / 98 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
22.04.2023, 13:37
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
AlexProgramm, да, но проблема осталась. (Там описка была)
Я думаю, что проблема происходит, когда считывается m и n. Сейчас запишу их считыватель в функцию и пришлю код
Нашел лишние Фри
стр 223
стр 233

У нас сама функция findStr освобождает память массива arr, а в этих строках повторно это прописано!
У меня сейчас все нормально вроде!

Добавлено через 12 минут
В последнем коде!
98 стр
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
arr=arrNew;
указатель arr теперь указывает на массив arrNew
126 стр - мы не должны повторно освобождать память у одного массива! (эта строка по идее лишняя)

Так же в 172 строке!

Добавлено через 3 минуты
Либо убрать 98 и 135 строки
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
23.04.2023, 23:01
DaraChernyshova,
C
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define IN_FILE_NAME "data.dat"
#define OUT_FILE_NAME "data.res"
 
int main(void) {
    FILE * f;
    unsigned long rows, columns, i, j, k;
    int ** matrix, ret;
 
    f = fopen(IN_FILE_NAME, "r");
    assert(f);
 
    ret = fscanf(f, "%lu%lu", &rows, &columns);
    assert(ret == 2);
 
    matrix = malloc(sizeof(int*) * rows);
    assert(matrix);
 
    for (i = 0; i < rows; ++i) {
        matrix[i] = malloc(columns * sizeof(int));
        assert(matrix[i]);
    }
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fscanf(f, "%d", &matrix[i][j]);
            assert(ret == 1);
        }
    }
 
    ret = (ferror(f) | fclose(f));
    assert(ret == 0);
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            for (k = 0; k < rows; ++k) {
                if (k == i)
                    continue;
                if (matrix[k][j] >= matrix[i][j])
                    break;
            }
            if (k == rows)
                break;
        }
        if (j < columns) {
            free(matrix[i]);
            for (; i < rows - 1; ++i)
                matrix[i] = matrix[i + 1];
            rows -= 1;
            break;
        }
    }
 
    f = fopen(OUT_FILE_NAME, "w");
    assert(f);
 
    ret = fprintf(f, "%lu %lu\n", rows, columns);
    assert(ret > 0);
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fprintf(f, "%d ", matrix[i][j]);
            assert(ret > 0);
        }
        ret = fprintf(f, "\n");
        assert(ret > 0);
    }
 
    ret = (ferror(f) | fclose(f));
    assert(ret == 0);
 
    return 0;
}
1
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
25.04.2023, 16:01  [ТС]
easybudda,

Мне нужно сделать без assert и с возможностью двойного прогона

Пока так
[student@ns116 ~]$ gcc udali.c
udali.c: В функции «udalitel»:
udali.c:31:15: ошибка: сравнение указателя и целого
31 | if (matrix!=1){
| ^~
udali.c:39:22: ошибка: сравнение указателя и целого
39 | if (matrix[i]!=1){
| ^~
[student@ns116 ~]$ ./a.out
a.out: udali.c:18: udalitel: Assertion `ret == 2' failed.
Aborted (стек памяти сброшен на диск)
[student@ns116 ~]$


Не знаю, как заменять assert в 31 и 39. А ещё стек сброшен

Можете с этим помочь?


C
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
129
130
131
132
133
134
135
136
137
#include <stdio.h>
#include <stdlib.h>
//#include <assert.h>
int l;
int udalitel(FILE*,FILE*);
 
 
int udalitel(FILE*f1,FILE*f2) {
 
//    FILE * f;
    unsigned long rows, columns, i, j, k;
    int ** matrix, ret;
 
   
//    assert(f1);
    if (f1==NULL){
        printf("failed to open the fail");
        return 34;
    }
   
 
    ret = fscanf(f1, "%lu%lu", &rows, &columns);
//  
    if (ret!=2){
        printf("Неприемлимые размеры матрицы");
        return 35;
    }
 
    matrix = malloc(sizeof(int*) * rows);
//    assert(matrix);
    if (matrix!=1){
        printf("Беды с матрицей 1");
        return 36;
    }
 
    for (i = 0; i < rows; ++i) {
        matrix[i] = malloc(columns * sizeof(int));
       
        if (matrix[i]!=1){
        printf("Беды с матрицей 2");
        return 37;
    }
//        assert(matrix[i]);
    }
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fscanf(f1, "%d", &matrix[i][j]);
            if (ret!=1){
            printf("Ош1");
            return -5;
            }
           // assert(ret == 1);
        }
    }
 
    ret = (ferror(f1) | fclose(f1));
   // assert(ret == 0);
    if (ret!=0){
    printf("Ош2");
    return -1;
    }
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            for (k = 0; k < rows; ++k) {
                if (k == i)
                    continue;
                if (matrix[k][j] >= matrix[i][j])
                    break;
            }
            if (k == rows)
                break;
        }
        if (j < columns) {
            free(matrix[i]);
            for (; i < rows - 1; ++i)
                matrix[i] = matrix[i + 1];
            rows -= 1;
            break;
        }
    }
 
   
  //  assert(f2);
    if (f2==NULL){
        printf("failed to open the fail");
        return 45;
    }
 
    ret = fprintf(f2, "%lu %lu\n", rows, columns);
    //assert(ret > 0);
    if (ret<=0){
            printf("Ош3");
            return -789;
            }
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fprintf(f2, "%d ", matrix[i][j]);
            //assert(ret > 0);
            if (ret<=0){
            printf("Ош4");
            return -7879;
            }
        }
        ret = fprintf(f2, "\n");
        //assert(ret > 0);
        if (ret<=0){
            printf("Ош5");
            return 89;
            }
    }
 
    ret = (ferror(f2) | fclose(f2));
   // assert(ret == 0);
    if (ret!=0){
            printf("Ош6");
            return 33;
            }
 
    return 0;
}
 
 
int main(void){
    FILE *f1 = fopen("data.dat","r");
    FILE *f2 = fopen("data_res.txt","w");
   
    f1 = fopen("data.dat", "r");
    f2 = fopen("data_res.txt", "w");
    l=udalitel(f1,f2);
    l=udalitel(f2,f2);
    fclose(f1);
    fclose(f2);
   
}
Добавлено через 5 минут
easybudda, сейчас, кстати, с assert двойной прогон тоже не получается.

Второй прогон - взять из итогового файла данные, потом записать в этот же файл
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
25.04.2023, 19:46
DaraChernyshova, assert( (whatever) ); заменяется на if( !(whatever) ) return -1; (в вашем случае -1 подходит для ошибки т.к. в обычном случае функция возвращает 0).
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
27.04.2023, 04:02
Лучший ответ Сообщение было отмечено DaraChernyshova как решение

Решение

C
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
#include <stdio.h>
#include <stdlib.h>
 
void ahtung(int what) {
    if (!what) {
        perror("AHTUNG!!!");
        exit(EXIT_FAILURE);
    }
}
 
void  matrix_from_file(const char * fName, int *** matrix, unsigned * rows, unsigned * columns) {
    FILE * f;
    unsigned i, j;
    int ret;
 
    f = fopen(fName, "r");
    ahtung(f != NULL);
 
    ret = fscanf(f, "%u%u", rows, columns);
    ahtung(ret == 2);
 
    *matrix = malloc(*rows * sizeof(int*));
    ahtung(*matrix != NULL);
 
    for (i = 0; i < *rows; ++i) {
        (*matrix)[i] = malloc(*columns * sizeof(int));
        ahtung((*matrix)[i] != NULL);
    }
 
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < *columns; ++j) {
            ret = fscanf(f, "%d", &((*matrix)[i][j]));
            ahtung(ret == 1);
        }
    }
    
    ahtung(!(ferror(f) | fclose(f)));
}
 
void matrix_to_file(const char * fName, int ** matrix, unsigned rows, unsigned columns) {
    FILE * f;
    unsigned i, j;
    int ret;
 
    f = fopen(fName, "w");
    ahtung(f != NULL);
 
    ret = fprintf(f, "%u %u\n", rows, columns);
    ahtung(ret > 0);
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fprintf(f, "%d%c", matrix[i][j], (j < columns - 1) ? ' ' : '\n');
            ahtung(ret > 0);
        }
    }
 
    ahtung(!(ferror(f) | fclose(f)));
}
 
void func(int ** matrix, unsigned * rows, unsigned columns) {
    unsigned i, j, k;
 
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < columns; ++j) {
            for ( k = 0; k < *rows; ++k) {
                if (k == i)
                    continue;
                if (matrix[k][j] >= matrix[i][j])
                    break;
            }
            if (k < *rows)
                break;
        }
        if (j == columns) {
            free(matrix[i]);
            for (; i < *rows - 1; ++i)
                matrix[i] = matrix[i + 1];
            *rows -= 1;
            break;
        }
    }
}
 
void free_matrix(int ** matrix, unsigned rows) {
    while (rows--)
        free(*matrix++);
}
 
#define IN_FILE_NAME "data.dat"
#define OUT_FILE_NAME "data.res"
 
int main(void) {
    int ** matrix;
    unsigned rows, columns;
 
    matrix_from_file(IN_FILE_NAME, &matrix, &rows, &columns);
    func(matrix, &rows, columns);
    matrix_to_file(OUT_FILE_NAME, matrix, rows, columns);
    free_matrix(matrix, rows);
 
    matrix_from_file(OUT_FILE_NAME, &matrix, &rows, &columns);
    func(matrix, &rows, columns);
    matrix_to_file(OUT_FILE_NAME, matrix, rows, columns);
    free_matrix(matrix, rows);
 
    return 0;
}
1
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
27.04.2023, 10:46  [ТС]
easybudda, а если например всё в одной функции делать?

C
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
#include <stdio.h>
#include <stdlib.h>
 
void attention(int);
void  udali(const char *,const char *, int *** , unsigned *, unsigned *);
 
 
void attention(int what) {
    if (!what) {
        perror("Be carefully!!!");
        exit(EXIT_FAILURE);
    }
}
 
void  udali(const char * fName,const char * fOutName, int *** matrix, unsigned * rows, unsigned * columns) {
//////////////////////////////////////////////////from
    FILE * f;
    unsigned i, j,k;
    int ret;
 
    f = fopen(fName, "r");
    attention(f != NULL);
 
    ret = fscanf(f, "%u%u", rows, columns);
    attention(ret == 2);
 
    *matrix = malloc(*rows * sizeof(int*));
    attention(*matrix != NULL);
 
    for (i = 0; i < *rows; ++i) {
        (*matrix)[i] = malloc(*columns * sizeof(int));
        attention((*matrix)[i] != NULL);
    }
 
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < *columns; ++j) {
            ret = fscanf(f, "%d", &((*matrix)[i][j]));
            attention(ret == 1);
        }
    }
   
    attention(!(ferror(f) | fclose(f)));
////////////////////////////////////////////////////////////////func
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < ((unsigned)columns); ++j) {
            for ( k = 0; k < *rows; ++k) {
                if (k == i)
                    continue;
                if (matrix[k][j] >= matrix[i][j])
                    break;
            }
            if (k < *rows)
                break;
        }
        if (j == ((unsigned)columns)) {
            free(matrix[i]);
            for (; i < *rows - 1; ++i)
                matrix[i] = matrix[i + 1];
            *rows -= 1;
            break;
        }
    }
////////////////////////////////////////////////////////////////to
    f = fopen(fOutName, "w");
    attention(f != NULL);
 
    ret = fprintf(f, "%p %p\n", (void *)rows, (void *)columns);
    attention(ret > 0);
 
    for (i = 0; i < ((unsigned)rows); ++i) {
        for (j = 0; j < ((unsigned)columns); ++j) {
            ret = fprintf(f, "%ls%c", matrix[i][j], (j < ((unsigned)(columns - 1))) ? ' ' : '\n');
            attention(ret > 0);
        }
    }
 
    attention(!(ferror(f) | fclose(f)));
//////////////////////////////////////////////////////////////////free
    while (rows--)
        free(*matrix++);
}
 
 
 
 
 
#define IN_FILE_NAME "data.dat"
#define OUT_FILE_NAME "data.res"
 
int main(void) {
    int ** matrix;
    unsigned rows, columns;
 
    udali(IN_FILE_NAME,OUT_FILE_NAME, &matrix, &rows, &columns);
   
    udali(OUT_FILE_NAME,OUT_FILE_NAME, &matrix, &rows, &columns);
   
 
    return 0;
}

К какому размеру нужно приводить, чтобы не ругался?

[student@ns171 ~]$ gcc udali.c
udali.c: В функции «udali»:
udali.c:45:25: ошибка: приведение указателя к целому другого размера [-Werror=pointer-to-int-cast]
45 | for (j = 0; j < (unsigned)columns; ++j) {
| ^
udali.c:55:18: ошибка: приведение указателя к целому другого размера [-Werror=pointer-to-int-cast]
55 | if (j == (unsigned)columns) {
| ^
udali.c:70:21: ошибка: приведение указателя к целому другого размера [-Werror=pointer-to-int-cast]
70 | for (i = 0; i < (unsigned)rows; ++i) {
| ^
udali.c:71:26: ошибка: приведение указателя к целому другого размера [-Werror=pointer-to-int-cast]
71 | for (j = 0; j < ((unsigned)columns); ++j) {
| ^
udali.c:72:58: ошибка: приведение указателя к целому другого размера [-Werror=pointer-to-int-cast]
72 | ret = fprintf(f, "%ls%c", matrix[i][j], (j < (unsigned)(columns - 1)) ? ' ' : '\n');
| ^
cc1: все предупреждения считаются ошибками
[student@ns171 ~]$
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
27.04.2023, 14:39
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
а если например всё в одной функции делать?
Это Вы уж сами как-нибудь...
0
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
28.04.2023, 00:39  [ТС]
Evgen173, с этим разобрались


Можете, пожалуйста, подсказать, как ошибку из 50 сообщения исправить

Добавлено через 39 минут
easybudda, а можете, пожалуйста, объяснить, для чего при matrix тройной указатель?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
28.04.2023, 06:23
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
для чего при matrix тройной указатель?
Чтобы внутри функции изменить значение внешней по отношению к ней переменной, её надо передать по ссылке. В контексте языка С параметром в функцию передаётся указатель на переменную. Если переменная объявлена, как int**, указателем на неё будет int***.
1
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
28.04.2023, 07:40  [ТС]
easybudda, хорошо, спасибо, это я понимаю теперь


А то, что я хочу сделать, вообще реализуемо, или я какую-то ерунду делаю?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
28.04.2023, 10:13
DaraChernyshova, на обе части вопроса ответ "Да".
1
 Аватар для AlexProgramm
227 / 98 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
30.04.2023, 15:03
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
for (j = 0; j < ((unsigned)columns); ++j)
По идеи здесь вообще не надо приводить к типу unsigned
Переменная и так unsigned
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
void  udali(const char * fName,const char * fOutName, int *** matrix, unsigned * rows, unsigned * columns)
1
 Аватар для DaraChernyshova
2 / 2 / 0
Регистрация: 06.03.2021
Сообщений: 248
19.05.2023, 10:36  [ТС]
AlexProgramm,
[student@ns153 ~]$ gcc 3udalstrock.c
[student@ns153 ~]$ ./a.out

------------------------------------------------------------
total allocation requests: 7 ; max. mem used 0 kBytes
leak 40 Bytes in 2 blocks
Run 'LeakAnalyze ./a.out' to find problems
WORK TIME - 00:00:00.00
[student@ns153 ~]$

C
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
#include <stdio.h>
#include <stdlib.h>
 
void attention(int);
void  matrix_from_file(const char *, int *** , unsigned *, unsigned *);
void matrix_to_file(const char *, int ** , unsigned , unsigned);
void func(int ** matrix, unsigned * rows, unsigned columns);
void free_matrix(int **, unsigned);
 
 
void attention(int what) {
    if (!what) {
        perror("Be carefully!!!");
        exit(EXIT_FAILURE);
    }
}
 
void  matrix_from_file(const char * fName, int *** matrix, unsigned * rows, unsigned * columns) {
    FILE * f;
    unsigned i, j;
    int ret;
 
    f = fopen(fName, "r");
    attention(f != NULL);
 
    ret = fscanf(f, "%u%u", rows, columns);
    attention(ret == 2);
 
    *matrix = malloc(*rows * sizeof(int*));
    attention(*matrix != NULL);
 
    for (i = 0; i < *rows; ++i) {
        (*matrix)[i] = malloc(*columns * sizeof(int));
        attention((*matrix)[i] != NULL);
    }
 
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < *columns; ++j) {
            ret = fscanf(f, "%d", &((*matrix)[i][j]));
            attention(ret == 1);
        }
    }
   
    attention(!(ferror(f) | fclose(f)));
}
 
void matrix_to_file(const char * fName, int ** matrix, unsigned rows, unsigned columns) {
    FILE * f;
    unsigned i, j;
    int ret;
 
    f = fopen(fName, "w");
    attention(f != NULL);
 
    ret = fprintf(f, "%u %u\n", rows, columns);
    attention(ret > 0);
 
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            ret = fprintf(f, "%d%c", matrix[i][j], (j < columns - 1) ? ' ' : '\n');
            attention(ret > 0);
        }
    }
 
    attention(!(ferror(f) | fclose(f)));
}
 
void func(int ** matrix, unsigned * rows, unsigned columns) {
    unsigned i, j, k;
 
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < columns; ++j) {
            for ( k = 0; k < *rows; ++k) {
                if (k == i)
                    continue;
                if (matrix[k][j] >= matrix[i][j])
                    break;
            }
            if (k < *rows)
                break;
        }
        if ((j == columns)&&(*rows!=1)) {
            free(matrix[i]);
            for (; i < *rows - 1; ++i)
                matrix[i] = matrix[i + 1];
            *rows -= 1;
            break;
        }
    }
}
 
void free_matrix(int ** matrix, unsigned rows) {
    while (rows--)
        free(*matrix++);
}
 
#define IN_FILE_NAME "data1.dat"
#define OUT_FILE_NAME "data.res"
 
int main(void) {
    int ** matrix;
    unsigned rows, columns;
 
    matrix_from_file(IN_FILE_NAME, &matrix, &rows, &columns);
    func(matrix, &rows, columns);
    matrix_to_file(OUT_FILE_NAME, matrix, rows, columns);
    free_matrix(matrix, rows);
 
    matrix_from_file(OUT_FILE_NAME, &matrix, &rows, &columns);
    func(matrix, &rows, columns);
    matrix_to_file(OUT_FILE_NAME, matrix, rows, columns);
    free_matrix(matrix, rows);
 
    return 0;
}
Добавлено через 20 секунд
Ищу
Не понимаю, где ошибка

Добавлено через 32 минуты
easybudda, утечка памяти появилась...
Где может быть ошибка. Смотрю, найти никак не выходит

Добавлено через 2 минуты
программа все еще имеет ссылку на память, которая будет освобождена позже?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
20.05.2023, 00:28
DaraChernyshova,
После
Цитата Сообщение от DaraChernyshova Посмотреть сообщение
free_matrix(matrix, rows);
C
1
free(matrix);
добавьте, чтобы не возиться.
1
 Аватар для AlexProgramm
227 / 98 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
24.05.2023, 17:21
DaraChernyshova, сдала?
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
25.05.2023, 06:34
Code
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
#define elem (arr + i * m + j)
 
static void
fclose_cleanup (FILE ** stream)
{
    if (*stream != NULL)
        fclose(*stream);
}
 
static void
free_cleanup (int ** mem)
{
    if (*mem != NULL)
        free(*mem);
}
 
int
main (void)
{
    __attribute__ ((cleanup (fclose_cleanup))) FILE * stream = NULL;
    __attribute__ ((cleanup (free_cleanup))) int * arr = NULL;
    int n, m;
    int i, j, * max, is_undef, * pin;
 
    stream = fopen("data.dat", "r");
    if (stream == NULL) {
        perror("fopen");
        return -1;
    }
 
    if (fscanf(stream, "%d%d", &n, &m) != 2) {
        perror("fscanf");
        return -1;
    }
 
    arr = malloc(sizeof(int) * n * m);
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            if (fscanf(stream, "%d", elem) != 1) {
                if (errno == 0)
                    printf("Array contains fewer elements specified in bounds\n");
                perror("fscanf");
                return -1;
            }
    if (fscanf(stream, "%d", &i) != EOF) {
        printf("Array contains more elements specified in bounds\n");
        return -1;
    }
    fclose(stream);
    stream = NULL;
 
    j = 0;
    pin = NULL;
    do {
        max = arr + j;
        is_undef = 1;
        for (i = 0; i < n; i++)
            if (*max < *elem)
                max = elem;
            else if (*max > *elem)
                is_undef = 0;
        if (pin == NULL)
            pin = max;
        if (is_undef || max != pin + j)
            break;
    }
    while (++j < m);
 
    if (j == m) {
        if (pin + m - arr != n * m)
            memmove(pin, pin + m, sizeof(int) * (n * m - (pin + m - arr)));
        arr = realloc(arr, sizeof(int) * --n * m);
        printf("Array has been modified\n");
    }
    else
        printf("Array has not been modified\n");
 
    stream = fopen("data.res", "w");
    if (stream == NULL) {
        perror("fopen");
        return -1;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++)
            fprintf(stream, "%d%s", *elem, j < m - 1 ? " " : "");
        fprintf(stream, "%s", i < n - 1 ? "\n" : "");
    }
    fclose(stream);
    stream = NULL;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2023, 06:34

Двумерный массив. Заполнить и вывести двумерный массив БЕЗ использования цикла FOR
Заполнить ивывести двумерный массив БЕЗ использования цикла FOR очень срочно!!!

Можно ли заменить двумерный массив на массив массивов и наоборот - массив массивов на двумерный массив?
._.

Создать двумерный массив, опираясь на другой двумерный массив
У меня есть такой массив 0 0 0 0 0 0 0 6 3 2 2 8 9 3 7 6 8 3 4 5 1 0 0 0 0 0 0 0 0 0 0 0 0...

Считать из текстового файла двумерный массив и записать его двумерный динамический
Есть текстовый файл(см.Рисунок) и его надо загрузить в динамический массив(почему динамический?потому что массив будет создаваться в...

Сделайте, чтобы двумерный вектор обогнал двумерный массив при заполнении случайными числами
Всем привет! Попробовал сравнить время заполнения векторов в векторе и массивов в массиве (динамические) случайными числами, получаемыми...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru