1

Тема: Двовимірний масив у C

Є дійсна квадратна матриця A порядку n. Знайти дійсну квадратну
матрицю B порядку n, кожний з елементів якої дорівнює сумі
елементів матриці A у відповідній заштрихованій області, що визначена індексами i,j:
Посилання видалено модератором.

Знов питання, тільки вже у двовимірному масиві. Який тут потрібно скласти цикли?

2

Re: Двовимірний масив у C

Заштрихована область знаходиться у лівій верхній частині

3

Re: Двовимірний масив у C

Цикл по всіх елементах матриці - подвійний вкладений. Оскільки для кожного елементу  матриці B треба обробляти матрицю A, то знадобиться ще подвійний цикл по матриці A, всього 4 вкладені цикли.
Насправді, можна це зробити і простіше, але для цього треба трохи досвіду роботи з матрицями набути, а раз ви таке питаєте, то маєте якраз гарну задачу для набуття досвіду.

4

Re: Двовимірний масив у C

А можете подивитися на цей код, тому що мені потрібно елементи шукати з використанням попередніх обчислень?
https://ideone.com/c6gY7D

5 Востаннє редагувалося wander (28.11.2022 00:17:02)

Re: Двовимірний масив у C

carti538 написав:

А можете подивитися на цей код, тому що мені потрібно елементи шукати з використанням попередніх обчислень?
https://ideone.com/c6gY7D

Прихований текст
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int  m, n, i, j, ch, p, k ;
double A[p][k], B[p][k];
printf("Enter m: \n");
scanf("%d", &m);
printf("Enter n:\n");
scanf("%d", &n);
srand(time(NULL));
printf("use random values:Y/N \n");
scanf("%c", &ch);scanf("%c", &ch);
if(ch=='Y'){
    for (i=0; i<m; i++){
        printf("\n");
        for(j=0; j<n; j++ ){
            A[i][j]=rand()%100;
            printf(" %.lf  ", A[i][j]);
       }
   }
}
    else{
         printf("\nInput elements of array:\n");
         for(i = 0; i < m; i++){
             for(j = 0; j < n; j++){
                 printf("Input A[%d][%d] = ", i, j);
                 scanf("%d", &A[i][j]);
            }
       }  
   }
   
   for(j=1; j<n-1; j++){
       B[0][0]=A[0][0];
          B[0][j]=B[0][j-1]+ A[i][j];
       }
   for(i=1; i<n-1; i++){
          B[i][0]=B[i-1][0]+A[i][0];
          for(j=1; j<n-1; j++){
                 B[i][j]=B[i-1][j]+B[i][j-1]+A[i][j];
       }
   }
       for (i=0; i<m; i++){
         printf("\n\n");
         for(j=0; j<n; ++ j){
             printf(" %.lf  ", B[i][j]);
       }
   }
   return 0;
     
}

Ну, по-перше, нащо писати ось так?

int m, n, i, j, ch, p, k;

Це вимога така, писати на чомусь типу С89, а не оголосити та ініціалізувати змінні ближче до місця використання?

p, k;

Цих двох ви взагалі ніколи не ініціалізовуєте.

double A[p][k], B[p][k];

Гм, а якого розміру масиви ви хочете тут створити?

scanf("%c", &ch);scanf("%c", &ch);

Чому тут двічі виклик scanf? І, ви ж в курсі, що змінна ch у вас типу int, а формат "%c" - це тип char?

A[i][j]=rand()%100;

Тут взагалі UB.

scanf("%d", &A[i][j]);

І тут UB + вираз A[і][j] повертає double, а формат "%d" намагається прочитати це як int.

Вам компілятор взагалі ніяких попереджень не видав?

6 Востаннє редагувалося koala (28.11.2022 10:18:12)

Re: Двовимірний масив у C

wander написав:

Чому тут двічі виклик scanf?

Бо в буфері після попереднього введення лишився символ нового рядка. Грубо, але так теж можна.
Стосовно решти - підтримую.

7 Востаннє редагувалося wander (28.11.2022 11:50:12)

Re: Двовимірний масив у C

koala написав:
wander написав:

Чому тут двічі виклик scanf?

Бо в буфері після попереднього введення лишився символ нового рядка. Грубо, але так теж можна.
Стосовно решти - підтримую.

Я так і зрозумів, але мені здалось, що краще все ж проговорити це з ТСом і, можливо, подумати "разом", як написати краще :)

8

Re: Двовимірний масив у C

Ще мене цікавить питання більше по циклу, тому що він не так працює, не правильні обрахунки робить

9 Востаннє редагувалося wander (28.11.2022 14:37:18)

Re: Двовимірний масив у C

Перш ніж переходити до аналізу алгоритму, який щось обраховує, потрібно виправити помилки, що передують циклам, які з ваших слів не так працюють. Ви звернули увагу на проблеми, які я описав вище та виправили їх? Якщо так, то покажіть ваш оновлений код.

Банально, викиньмо все лишнє і залишімо лише заповнення "матриці" випадковими значеннями. І гарно попросимо, щоб компілятор видав своє фе.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int  m, n, i, j, ch, p, k;
    double A[p][k]; // B[p][k];
    printf("Enter m: \n");
    scanf("%d", &m);
    printf("Enter n:\n");
    scanf("%d", &n);
    srand(time(NULL));
    printf("use random values:Y/N \n");
    (void)ch;
    for (i=0; i<m; i++){
        printf("\n");
        for(j=0; j<n; j++ ){
            A[i][j]=rand()%100;
            printf(" %.lf  ", A[i][j]);
        }
    }
    return 0;
}
Прихований текст
Warning(s):
747111815/source.c:7:17: warning: variable 'k' is uninitialized when used here [-Wuninitialized]
    double A[p][k]; // B[p][k];
                ^
747111815/source.c:6:30: note: initialize the variable 'k' to silence this warning
    int  m, n, i, j, ch, p, k;
                             ^
                              = 0
747111815/source.c:7:14: warning: variable 'p' is uninitialized when used here [-Wuninitialized]
    double A[p][k]; // B[p][k];
             ^
747111815/source.c:6:27: note: initialize the variable 'p' to silence this warning
    int  m, n, i, j, ch, p, k;
                          ^
                           = 0
2 warnings generated.
Error(s):
747111815/source.c:7:14: runtime error: variable length array bound evaluates to non-positive value 0
747111815/source.c:7:17: runtime error: variable length array bound evaluates to non-positive value 0
747111815/source.c:18:13: runtime error: index 0 out of bounds for type 'double [k]'
747111815/source.c:19:31: runtime error: index 0 out of bounds for type 'double [k]'
747111815/source.c:18:13: runtime error: index 1 out of bounds for type 'double [p][k]'
747111815/source.c:19:31: runtime error: index 1 out of bounds for type 'double [p][k]'

Весь код: https://rextester.com/ITT21785

Як бачите, ваш код вже на цьому етапі працює не так.

10

Re: Двовимірний масив у C

https://ideone.com/c6gY7D
Ось замінив код

11

Re: Двовимірний масив у C

Це той самий код.

12

Re: Двовимірний масив у C

https://ideone.com/4A1yXL
Ось цей

13

Re: Двовимірний масив у C

А, що змінилось? І форматуйте свій код, бо читати це неможливо.

14

Re: Двовимірний масив у C

int  m, n, i, j ;
char ch;
int A[n][n], B[n][n];

Чому в останньому рядку дорівнює n?

Подякували: leofun011

15

Re: Двовимірний масив у C

Бо це квадратна матриця, але вже зрозумів, що там має бути m

16

Re: Двовимірний масив у C

wander написав:

А, що змінилось? І форматуйте свій код, бо читати це неможливо.

Ну я ж наче виправив помилки, які були

17

Re: Двовимірний масив у C

carti538 написав:
wander написав:

А, що змінилось? І форматуйте свій код, бо читати це неможливо.

Ну я ж наче виправив помилки, які були

Та де там:

Прихований текст
edit mode |  history
Warning(s):
1549100910/source.c:8:7: warning: variable 'n' is uninitialized when used here [-Wuninitialized]
int A[n][n], B[n][n];
      ^
1549100910/source.c:6:10: note: initialize the variable 'n' to silence this warning
int  m, n, i, j ;
         ^
          = 0
1 warning generated.
Error(s):
1549100910/source.c:8:7: runtime error: variable length array bound evaluates to non-positive value 0
1549100910/source.c:8:10: runtime error: variable length array bound evaluates to non-positive value 0
1549100910/source.c:8:16: runtime error: variable length array bound evaluates to non-positive value 0
1549100910/source.c:8:19: runtime error: variable length array bound evaluates to non-positive value 0
1549100910/source.c:30:31: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:30:31: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:38:17: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:38:17: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:44:13: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:44:13: runtime error: load of address 0x7ffe6262e8c0 with insufficient space for an object of type 'int'
0x7ffe6262e8c0: note: pointer points here
 00 00 00 00  00 a0 50 aa 04 00 00 00  00 00 00 00 00 00 00 00  00 80 00 0a 04 00 00 00  dd 7e 42 00
              ^ 
1549100910/source.c:44:3: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:44:3: runtime error: store to address 0x7ffe6262e8c0 with insufficient space for an object of type 'int'
0x7ffe6262e8c0: note: pointer points here
 00 00 00 00  00 a0 50 aa 04 00 00 00  00 00 00 00 00 00 00 00  00 80 00 0a 04 00 00 00  dd 7e 42 00
              ^ 
1549100910/source.c:46:12: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:46:12: runtime error: load of address 0x7ffe6262e8c0 with insufficient space for an object of type 'int'
0x7ffe6262e8c0: note: pointer points here
 00 00 00 00  00 a0 50 aa 04 00 00 00  00 00 00 00 00 00 00 00  00 80 00 0a 04 00 00 00  dd 7e 42 00
              ^ 
1549100910/source.c:46:24: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:46:24: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:46:24: runtime error: load of address 0x7ffe6262e8c0 with insufficient space for an object of type 'int'
0x7ffe6262e8c0: note: pointer points here
 00 00 00 00  00 a0 50 aa 04 00 00 00  00 00 00 00 00 00 00 00  00 80 00 0a 04 00 00 00  dd 7e 42 00
              ^ 
1549100910/source.c:46:22: runtime error: signed integer overflow: -1437556736 + -1437556736 cannot be represented in type 'int'
1549100910/source.c:46:2: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:46:2: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:46:2: runtime error: store to address 0x7ffe6262e8c0 with insufficient space for an object of type 'int'
0x7ffe6262e8c0: note: pointer points here
 00 00 00 00  00 a0 50 aa 04 00 00 00  00 00 00 00 00 00 00 00  00 80 00 0a 04 00 00 00  dd 7e 42 00
              ^ 
1549100910/source.c:46:12: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:49:12: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:49:24: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:49:22: runtime error: signed integer overflow: 1384448000 + 1384448000 cannot be represented in type 'int'
1549100910/source.c:49:2: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:53:13: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:53:25: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:53:25: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:53:23: runtime error: signed integer overflow: -1809317888 + -1809317888 cannot be represented in type 'int'
1549100910/source.c:53:37: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:53:35: runtime error: signed integer overflow: 676331520 - -1809317888 cannot be represented in type 'int'
1549100910/source.c:53:51: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:53:51: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:53:49: runtime error: signed integer overflow: -1809317888 + -1809317888 cannot be represented in type 'int'
1549100910/source.c:53:3: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:53:3: runtime error: index 1 out of bounds for type 'int [n]'
1549100910/source.c:53:13: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:53:37: runtime error: index 1 out of bounds for type 'int [n][n]'
1549100910/source.c:59:18: runtime error: index 0 out of bounds for type 'int [n]'
1549100910/source.c:59:18: runtime error: index 1 out of bounds for type 'int [n][n]'
Enter m: 
Enter n:
use random values:Y/N 

Input elements of array:
Input A[0][0] = Input A[0][1] = Input A[0][2] = Input A[0][3] = Input A[1][0] = Input A[1][1] = Input A[1][2] = Input A[1][3] = Input A[2][0] = Input A[2][1] = Input A[2][2] = Input A[2][3] = Input A[3][0] = Input A[3][1] = Input A[3][2] = Input A[3][3] =  
Matrix A:
-1437556736 -1437556736 -1437556736 -1437556736 
-1437556736 -1437556736 -1437556736 -1437556736 
-1437556736 -1437556736 -1437556736 -1437556736 
-1437556736 -1437556736 -1437556736 -1437556736 

Matrix B:
1342177280 1342177280 1342177280 1342177280 
1342177280 1342177280 1342177280 1342177280 
1342177280 1342177280 1342177280 1342177280 
1342177280 1342177280 1342177280 1342177280 

https://rextester.com/EDFTJ82204

Вам пан koala вище поставив хороше питання, чому дорівнює n? І нащо вам тоді m, якщо матриця квадратна?

18

Re: Двовимірний масив у C

koala написав:
int  m, n, i, j ;
char ch;
int A[n][n], B[n][n];

Чому в останньому рядку дорівнює n?

carti538 написав:

Бо це квадратна матриця, але вже зрозумів, що там має бути m

Ви намагаєтеся відповісти на питання, яке, на вашу думку, спровокувало мене поставити це питання. Ваше припущення було неправильне, я зовсім не тому питаю. Ви можете відповісти на моє питання чи ні? Якщо ні - читайте підручник.

19

Re: Двовимірний масив у C

Вибачте, не так вас зрозумів
n я ж вводю самостійно, хіба ні?

20

Re: Двовимірний масив у C

carti538 написав:

Вибачте, не так вас зрозумів
n я ж вводжу самостійно, хіба ні?

Так, але потім. А в той момент, коли ви проголошуєте масив A, яке значення має n?
Програма виконує всі інструкції послідовно. Якщо ви пишете

int n;
printf("%d\n",n);
n=5;

то в момент виконання printf значення n, швидше за все, не буде 5. Це ви розумієте?

Подякували: carti5381