2차원 파스칼 배열 - 행렬. 정적 배열: 선언, 채우기, 사용 원 형태의 2차원 배열 채우기




정렬 (또한 인덱스 배열, 때때로 테이블, ) - 동일한 유형의 명명된(순서가 지정된) 변수(데이터) 집합으로, 메모리에 차례로 즉시 위치하며 다음에 의해 액세스됩니다. 색인. 가장 간단한 경우 정렬일정한 길이를 가지며 동일한 유형의 데이터 단위를 저장합니다.

색인같은 배열이 숫자입니다 전체, 특정 배열 요소를 가리킵니다.

사용되는 배열 인덱스의 수는 다를 수 있습니다. 인덱스가 하나인 배열을 호출합니다. 1차원적인, 2개 포함 - 2차원등.

1차원배열이 엄격하게 일치하지 않습니다. 벡터 수학에서는 2차원 - 행렬 . 가장 일반적으로 사용되는 배열은 다음과 같습니다. 하나또는 인덱스, 덜 자주 - 3개 이상의 인덱스가 있는 경우는 극히 드뭅니다.

배열은 다음과 같이 설명됩니다.

가장 일반적인 유형의 인덱스는 범위입니다. 예를 들면 다음과 같습니다.

위의 설명은 배열 B, 구성 5 요소와 상징 배열R, 구성 34 강요. 배열의 경우 안에 5*6=30바이트의 메모리가 할당됩니다. 진짜눈에 띄는 6 메모리 바이트), 배열 R의 경우 - 1*34=34바이트 메모리(다음과 같은 변수의 경우) - 1 바이트). 기본형배열의 요소는 파일을 제외하고 단순하거나 구조화된 모든 것이 될 수 있습니다! 배열은 다음을 사용하여 선언할 수 있습니다. 소유하다유형:

주기 어떤 방식으로든 구성되어(예: 조건부 점프 사용) 반복적으로 실행되는 명령어 시퀀스라고 할 수 있습니다.

루프 본문의 단일 실행을 호출합니다. 반복. 표현, 다시 한 번 실행됩니다. 반복, 또는 주기 end는 종료 조건이거나 루프 종료 조건(그러나 지속의 조건이 될 수도 있습니다). 현재 반복 횟수를 저장하는 변수를 호출합니다. 반복 카운터루프 또는 그냥 카운터주기. 주기반드시 포함하지는 않습니다 카운터.

주기가 있습니다:

- 주기 카운터 있음, 일부 변수는 주어진 값에서 값을 변경합니다. 주요한최대 값 결정적인일부의 의미 단계, 이 변수의 각 값에 대해 루프 본문이 한 번 실행됩니다. 운영자가 구현 ~을 위한

예. 채우다 정렬:

그래서 당신은 채울 수 있습니다 2차원정렬:

- 주기 전제조건이 있는, 시작하기 전에 지정된 일부 조건이 true인 한 실행됩니다. 운영자가 구현 ~하는 동안.

- 주기 사후 조건이 있는, 루프 본문이 실행된 후 조건을 확인하므로 본문은 항상 적어도 한 번 실행됩니다. Pascal에서 이 루프는 연산자에 의해 구현됩니다. 반복...까지

수술이 있습니다 반복 건너뛰기, 현재 반복 중인 경우 주기실행된 루프의 본문이 끝날 때까지 모든 명령을 건너뛰어야 합니다. 이 경우 루프 자체는 중단되어서는 안 됩니다. 계속 또는 종료 조건은 일반적인 방법으로 계산되어야 합니다. 운영자가 구현 계속하다.

이 명령은 루프에서도 자주 사용됩니다. 사이클의 조기 종료예를 들어, 루프 본문을 실행하는 동안 오류가 감지된 경우, 그 이후에는 루프를 더 이상 작동할 수 없습니다. 운영자가 구현 출구또는 부서지다.

처음으로 돌아가자, 아니면 처음으로 돌아가자 . 우리는 이 프로그램이 무엇을 하는지 결정해야 합니다:

위의 내용을 바탕으로 사용된 2차원 배열은 다음과 같습니다. 크기의 행렬이다 N엑스 N. 루프가 사용됩니다 카운터 있음하나에서 N, 분명히 이전에 정의되었습니다.

루프 내부: 변수 와 함께인덱스가 있는 2차원 배열의 값을 가져옵니다. (c:=A), 먼저 이것 . 그런 다음 이 배열 요소 대신 동일한 배열이지만 인덱스가 있는 요소의 값이 입력됩니다. (A:=A) 또는 언제 k:=1 (A:=A). 저것들. 첫 번째 줄의 요소가 입력됩니다. 인덱스의 첫 번째 숫자는 행렬의 행 번호를 담당합니다. - [ ,j], 두 번째는 열 번호 - . 그리고 마지막에는 인덱스가 있는 요소 대신 , 배열 요소의 초기 값이 입력됩니다 인덱스 포함 , 우리는 변수에 입력했습니다 와 함께 (A:=c).

그리고 루프가 반복될 때마다 값이 증가 단위. 다음 단계를 따르세요. 먼저 이 :

с:=A A:=A A:=c

с:=A A:=A A:=c

с:=A A:=A A:=c

그래서 N몇 번 전에 . 저것들. 왼쪽에서 오른쪽으로, 위에서 아래로 방향 행렬의 대각선 값입니다. 그리고 이 대각선의 요소는 요소에 따라 값을 변경합니다. 첫 번째 매트릭스 배수구(또는 케이- 그 라인). 그래서 정답은 옵션 3: 이 알고리즘은 장소를 교환합니다 대각선 요소 및케이번째 테이블 열.

섹션: 컴퓨터 과학

주제: 2차원 배열. 주어진 규칙에 따라 2차원 배열을 채웁니다.

목표: 2차원 배열의 요소를 다루는 기술을 연습하고, 주어진 규칙에 따라 2차원 배열을 채우는 방법을 배우고, 행 번호와 열 번호 사이의 관계를 도출하는 방법을 배웁니다. 학생들의 논리적 사고력 개발.

수업 진행

1. 지식 업데이트

요소의 위치가 두 개의 인덱스로 설명되는 배열을 2차원 배열이라고 합니다. 이러한 배열의 구조는 직사각형 행렬로 표현될 수 있습니다. 행렬의 각 요소는 행과 열 번호를 나타냄으로써 고유하게 식별되며, 행 번호는 i, 열 번호는 j입니다.
n*m 크기의 행렬 A를 생각해 보세요.

11 12 13 14
21 22 23 24
31 32 33 34

3행 4열의 행렬, 행 수 n=3, 열 수 m=4. 각 요소에는 두 개의 숫자, 즉 요소가 있는 행 번호와 열 번호로 구성된 고유한 번호가 있습니다. 예를 들어, a23은 두 번째 행과 세 번째 열에 있는 요소입니다.
터보 파스칼의 2차원 배열은 다양한 방식으로 설명될 수 있습니다. 2차원 배열을 설명하려면 해당 요소의 유형과 번호가 매겨진 방식(인덱스 유형)을 결정해야 합니다. 2차원 배열을 설명하는 방법에는 여러 가지가 있습니다.

상수 maxN=...; (최대 행 수)
최대M=...; (최대 열 수)

편도

유형 Mas = 배열<тип элементов>; (1차원 배열)
TMas 유형 = Mas 배열; (1차원 배열을 요소로 하는 1차원 배열)

방법 2

TMas 유형 = 배열의 배열<тип элементов>;
(1차원 배열을 요소로 하는 1차원 배열)

3방향

유형<имя типа>= 배열<тип элементов>; (2차원 배열)

2차원 배열을 설명하는 세 번째 방법이 선호됩니다.

예를 들어:

상수 N=3; M=4;
유형 TMas= 정수 배열; (정수의 2차원 배열)

2차원 배열의 형성은 키보드 입력, 난수 생성기를 통한 입력, 주어진 규칙에 따른 입력, 파일 사용 등 네 가지 방법으로 수행할 수 있습니다.

1) 키보드 입력과 행렬 요소의 행별 출력 알고리즘을 사용하여 2차원 배열을 형성합니다.

상수 N=10;M=10;
유형 Tmas= 정수 배열;
변 A: 크리스마스; i,j:정수;
시작하다
(행렬 요소의 입력)
i:=1 ~ N의 경우
j:=1 ~ M의 경우
읽다);
(행렬 요소의 출력)
i:=1 ~ N의 경우 시작합니다.
j:=1 ~ M의 경우
쓰기(A:4); (첫 번째 줄이 인쇄됩니다)
Writeln(개행 문자)
끝;
끝.

2) 난수 생성기를 통해 2차원 배열을 생성하는 프로그램의 일부입니다.

시작하다
무작위화; (난수 생성기 초기화)
(행렬 요소의 입력)
i:=1 ~ N의 경우
j:=1 ~ M의 경우
A:=random(45)-22;

2. 새로운 자료를 연구합니다. 규칙에 따라 배열 채우기

특정 법칙에 따라 2차원 배열을 채우는 프로그램의 여러 부분을 고려해 보겠습니다. 이렇게 하려면 채우기 규칙을 도출해야 합니다.

1. 예를 들어 다음과 같이 n*m 크기의 배열 A를 채웁니다.

1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41

배열은 "뱀" 원리에 따라 채워집니다. 채우기 규칙: 행 번호가 홀수이면 A=(i-1)*m+j이고, 그렇지 않으면 A=i*m-j+1입니다.

프로그램 M1A;

n,m,i,j: 정수;
시작하다
readln(n,m);
i:=1부터 n까지 시작하세요
j:=1에서 m까지
시작하다
내가 mod 2 = 1이면
A=(i-1)*m+j
또 다른
A=i*m-j+1;
쓰기(A:3);
끝;
쓰다;
끝;
읽기;
끝.

다음은 주어진 규칙에 따라 다른 채우기 방법에 대한 프로그램의 예입니다.

M1B 프로그램;
var A:정수 배열;
n,m,i,j: 정수;
c:정수;
시작하다
readln(n,m);
c:=1;
i:=1 ~ n do에 대해
시작하다
j:=1에서 m까지
시작하다
A:=c;
if (i mod 2 = 0) 및 (j<>남) 그럼
12월(c)
또 다른
Inc(c);
쓰기(A:3);
끝;
c:=c+m-1;
쓰다;
끝;
읽기;
끝.

2. 다음 원리에 따라 배열 A를 채웁니다.

1 0 2 0 3 0 4
0 5 0 6 0 7 0
8 0 9 0 10 0 11
0 12 0 13 0 14 0

프로그램 M2;
var A:정수 배열;
n,m,i,j: 정수;
c:정수;
시작하다
readln(n,m);
c:=0;
i:=1 ~ n do에 대해
시작하다
j:=1에서 m까지
시작하다
(i-1+j) mod 2 = 0이면
A:=0
또 다른
시작하다
Inc(c);
A:=c;
끝;
쓰기(A:5);
끝;
쓰다;
끝;
읽기;
끝.

3. 다음 원리에 따라 배열 A를 채웁니다.

1 12 13 24 25 36
2 11 14 23 26 35
3 10 15 22 27 34
4 9 16 21 28 33
5 8 17 20 29 32
6 7 18 19 30 31

var A:정수 배열;
n,m,i,j: 정수;
c:정수;
시작하다
readln(n,m);
c:=1;
j:=1에서 m까지
시작하다
i:=1 ~ n do에 대해
시작하다
A:=c;
if (j mod 2 = 0) 및 (i<>엔) 그럼
12월(c)
또 다른
Inc(c);
끝;
c:=c+n-1;
끝;
i:=1 ~ n do에 대해
시작하다
j:=1에서 m까지
쓰기(A:5);
쓰다;
끝;
읽기;
끝.

4. 다음 원리에 따라 배열 A를 채웁니다.

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

var i,j,m,c,d: 정수;

시작하다
c:=1;
readln(m);
j:=1에서 m까지
시작하다
나는:=c;
d:=1;
반복하다
A:=d;
Inc(i);
내가 그렇다면
나는:=1;
Inc(d);
i=c까지;
12월(c);
c라면<= 0 then
c:=m-c;
끝;
i:=1에서 m까지
시작하다
j:=1에서 m까지
쓰기(A:2);
쓰다;
끝;
끝.

5. 다음 원리에 따라 배열 A를 채웁니다.

1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1

var m,i,j: 정수;
A:정수 배열;
시작하다
readln(m);
i:=1에서 m까지
시작하다
j:=1에서 m까지
시작하다
(i=j) 또는 (m-i+1=j)이면
답변:=1
또 다른
답변:=0;
쓰기(A:2);
끝;
쓰다;
끝;
끝.

3. 독자적 해결의 문제점

6 5 4 3 2 1
7 8 9 10 11 12
18 17 16 15 14 13
19 20 21 22 23 24
30 29 28 27 26 25
31 32 33 34 35 36

36 25 24 13 12 1
35 26 23 14 11 2
34 27 22 15 10 3
33 28 21 16 9 4
32 29 20 17 8 5
31 30 19 18 7 6

0 1 1 1 0
1 0 1 0 1
1 1 0 1 1
1 0 1 0 1
0 1 1 1 0

4) 다음 원칙에 따라 배열을 채웁니다.

31 32 33 34 35 36
25 26 27 28 29 30
19 20 21 22 23 24
13 14 15 16 17 18
7 8 9 10 11 12
1 2 3 4 5 6

5) 다음 원칙에 따라 배열을 채웁니다.

31 25 19 13 7 1
32 26 20 14 8 2
33 27 21 15 9 3
34 28 22 16 10 4
35 29 23 17 11 5
36 30 24 18 12 6

숙제:

1) 다음 원리에 따라 배열을 채웁니다.

6 7 18 19 30 31
5 8 17 20 29 32
4 9 16 21 28 33
3 10 15 22 27 34
2 11 14 23 26 35
1 12 13 24 25 36

2) 다음 원칙에 따라 배열을 채웁니다.

31 32 33 34 35 36
30 29 28 27 26 25
19 20 21 22 23 24
18 17 16 15 14 13
7 8 9 10 11 12
6 5 4 3 2 1

3) 다음 원칙에 따라 배열을 채웁니다.

0 1 1 1 0
1 0 1 0 1
1 1 0 1 1
1 0 1 0 1
0 1 1 1 0

배열은 동일한 유형의 셀 그룹으로 표시되는 데이터 구조이며 하나의 단일 이름으로 통합됩니다. 배열은 동일한 유형의 많은 양의 데이터를 처리하는 데 사용됩니다. 배열의 이름은 포인터가 무엇인지에 대한 것입니다. 잠시 후에 말씀드리겠습니다. 배열의 개별 데이터 셀을 배열 요소라고 합니다. 배열의 요소는 모든 유형의 데이터일 수 있습니다. 배열은 하나 이상의 차원을 가질 수 있습니다. 배열은 차원의 수에 따라 1차원 배열, 2차원 배열, 3차원 배열 등 n차원 배열까지 구분됩니다. 1차원 배열과 2차원 배열은 프로그래밍에서 가장 자주 사용되므로 이러한 배열만 고려하겠습니다.

C++의 1차원 배열

1차원 배열은 1차원 배열의 요소 수를 특성화하는 하나의 매개변수가 있는 배열입니다. 실제로 1차원 배열은 1개의 행과 n개의 열만 가질 수 있는 배열입니다. 1차원 배열의 열은 배열의 요소입니다. 그림 1은 정수형 1차원 배열의 구조를 보여줍니다. . 이 배열의 크기는 16셀입니다.

그림 1 - C++의 배열

1차원 배열의 최대 인덱스는 은 15이지만 배열 셀의 번호는 항상 0부터 시작하므로 배열의 크기는 16개 셀입니다. 셀 인덱스는 배열의 각 셀에 액세스하고 그에 대한 작업을 수행할 수 있는 음수가 아닌 정수입니다( 셀).

//C++에서 1차원 배열을 선언하기 위한 구문: /*데이터 유형*/ /*1차원 배열의 이름*/; //그림 1의 1차원 배열 선언 예: int a;

여기서 int는 정수입니다.

A는 1차원 배열의 이름입니다.
16은 1차원 배열, 16셀의 크기입니다.

항상 배열 이름 바로 뒤에는 1차원 배열의 크기를 지정하는 대괄호가 있습니다. 이것이 배열을 다른 모든 변수와 구별하는 것입니다.

//1차원 배열을 선언하는 또 다른 방법 int mas, a;

두 개의 1차원 배열 mas와 a가 각각 크기 10과 16으로 선언되었습니다. 또한 이 선언 방법에서는 모든 배열이 동일한 데이터 유형(이 경우 int)을 갖습니다.

// 배열은 선언 시 초기화될 수 있습니다: int a = ( 5, -12, -12, 9, 10, 0, -9, -12, -1, 23, 65, 64, 11, 43, 39, -15 ); // 1차원 배열 초기화

1차원 배열의 초기화는 부호 뒤의 중괄호로 수행됩니다. 같음, 각 배열 요소는 쉼표로 이전 요소와 구분됩니다.

Int a=(5,-12,-12,9,10,0,-9,-12,-1,23,65,64,11,43,39,-15); // 크기를 결정하지 않고 배열을 초기화합니다.

이 경우 컴파일러 자체가 1차원 배열의 크기를 결정합니다. 배열의 크기는 초기화 시에만 생략할 수 있으며, 일반적으로 배열을 선언할 때에는 배열의 크기를 지정해야 합니다. 1차원 배열을 처리하는 간단한 프로그램을 개발해 보겠습니다.

// array.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #include "stdafx.h" #include << "obrabotka massiva" << endl; int array1 = { 5, -12, -12, 9, 10, 0, -9, -12, -1, 23, 65, 64, 11, 43, 39, -15 }; // объявление и инициализация одномерного массива cout << "indeks" << "\t\t" << "element massiva" << endl; // печать заголовков for (int counter = 0; counter < 16; counter++) //начало цикла { //вывод на экран индекса ячейки массива, а затем содержимого этой ячейки, в нашем случае - это целое число cout << "array1[" << counter << "]" << "\t\t" << array1 << endl; } system("pause"); return 0; }

// 코드 코드::블록

// Dev-C++ 코드

// array.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #포함하다 네임스페이스 std 사용; int main(int argc, char* argv) ( cout<< "obrabotka massiva" << endl; int array1 = { 5, -12, -12, 9, 10, 0, -9, -12, -1, 23, 65, 64, 11, 43, 39, -15 }; // объявление и инициализация одномерного массива cout << "indeks" << "\t\t" << "element massiva" << endl; // печать заголовков for (int counter = 0; counter < 16; counter++) //начало цикла { //вывод на экран индекса ячейки массива, а затем содержимого этой ячейки, в нашем случае - это целое число cout << "array1[" << counter << "]" << "\t\t" << array1 << endl; } return 0; }

안에 라인 10 - 11 array1이라는 이름의 정수 1차원 배열이 선언되고 초기화되었으며, 크기는 16개 셀입니다. 즉, 이러한 배열은 16개의 숫자를 저장할 수 있습니다. 모든 배열 처리는 루프와 결합해야만 가능합니다. 배열 처리를 위해 선택할 루프는 사용자가 결정합니다. 하지만 이 작업에는 가장 적합합니다. 카운터 변수 counter를 사용하여 1차원 배열 array1의 요소에 액세스합니다. for 루프의 연속 조건에는 1차원 배열 array1에 16번째 인덱스가 없으므로 엄격한 부등호가 포함됩니다. 그리고 셀 번호는 0부터 시작하므로 배열에는 16개의 요소가 있습니다. for 루프의 본문에는 cout 연산자가 1차원 배열의 요소를 인쇄합니다(그림 2 참조).

Obrabotka Massiva 인덱스 요소 Massiva array1 5 array1 -12 array1 -12 array1 9 array1 10 array1 0 array1 -9 array1 -12 array1 -1 array1 23 array1 65 array1 64 array1 11 array1 43 array1 39 array1 -15 계속하려면 아무 키나 누르십시오. . .

그림 2 - C++의 배열

C++에서 1차원 배열을 처리하는 또 다른 프로그램을 개발해 보겠습니다. 프로그램은 키보드에서 입력된 10개의 숫자를 순차적으로 읽어야 합니다. 입력된 모든 숫자가 합산되어 그 결과가 화면에 표시됩니다.

// array_sum.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #include "stdafx.h" #include << "Enter elementi massiva: " << endl; int sum = 0; for (int counter = 0; counter < 10; counter++) // цикл для считывания чисел cin >> << "array1 = {"; for (int counter = 0; counter < 10; counter++) // цикл для вывода элементов массива cout << array1 << " "; // выводим элементы массива на стандартное устройство вывода for (int counter = 0; counter < 10; counter++) // цикл для суммирования чисел массива sum += array1; // суммируем элементы массива cout << "}\nsum = " << sum << endl; system("pause"); return 0; }

// 코드 코드::블록

// Dev-C++ 코드

// array_sum.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #포함하다 네임스페이스 std 사용; int main(int argc, char* argv) ( int array1; // 정수 배열 선언 cout<< "Enter elementi massiva: " << endl; int sum = 0; for (int counter = 0; counter < 10; counter++) // цикл для считывания чисел cin >>배열1; // 키보드 cout에서 입력된 숫자를 읽습니다.<< "array1 = {"; for (int counter = 0; counter < 10; counter++) // цикл для вывода элементов массива cout << array1 << " "; // выводим элементы массива на стандартное устройство вывода for (int counter = 0; counter < 10; counter++) // цикл для суммирования чисел массива sum += array1; // суммируем элементы массива cout << "}\nsum = " << sum << endl; return 0; }

배열을 처리하기 전에 먼저 선언해야 하며, 1차원 배열의 크기는 작업 조건에 따라 10으로 규정됩니다. sum 변수에는 1차원 배열 요소의 합을 누적합니다. 첫 번째 for 루프는 선언된 1차원 배열을 키보드에서 입력한 숫자로 채웁니다. 라인 12 - 13. counter 변수는 인덱스 0부터 9번째까지 1차원 배열 array1 의 요소에 순차적으로 액세스하는 데 사용됩니다. 두 번째 for 루프는 배열의 요소를 표시합니다. 라인 15 - 16. 세 번째 for 루프는 1차원 배열의 요소를 순차적으로 읽어서 합산하고 그 합을 sum 변수에 누적합니다. 라인 17 - 18. 프로그램의 결과는 그림 3에 나와 있습니다.

Elementi Massiva를 입력하세요. 0 1 2 3 4 5 6 7 8 9 array1 = (0 1 2 3 4 5 6 7 8 9 ) sum = 45 계속하려면 아무 키나 누르세요. . .

그림 3 - C++의 배열

먼저 10개의 숫자를 모두 순차적으로 입력한 후 1차원 배열을 표시하고, 배열에 있는 숫자의 합을 출력했습니다.

C++의 2차원 배열

지금까지 우리는 항상 이에 국한될 수 없는 1차원 배열을 고려했습니다. 테이블의 일부 데이터를 처리해야 한다고 가정해 보겠습니다. 테이블에는 행 수와 열 수라는 두 가지 특성이 있습니다. 또한 2차원 배열에는 배열 요소의 개수 외에 2차원 배열의 행 개수, 열 개수 등의 특징이 있습니다. 즉, 시각적으로 2차원 배열은 행과 열이 있는 일반 테이블입니다. 실제로 2차원 배열은 1차원 배열의 1차원 배열입니다. m x n 크기의 a라는 2차원 배열의 구조가 아래에 나와 있습니다(그림 4 참조).

그림 4 - C++의 배열

여기서 m은 2차원 배열의 행 수입니다.
n은 2차원 배열의 열 수입니다.
m * n — 배열 요소의 수입니다.

// 2차원 배열 선언 구문 /*데이터 유형*/ /*배열 이름*/;

2차원 배열을 선언할 때와 1차원 배열을 선언할 때 우선 다음을 지정해야 합니다.

  • 데이터 형식;
  • 배열 이름.

그 후, 첫 번째 대괄호는 2차원 배열의 행 수를 나타내고, 두 번째 대괄호는 2차원 배열의 열 수를 나타냅니다. 2차원 배열은 두 번째 대괄호 쌍으로 1차원 배열과 시각적으로 구별됩니다. 2차원 배열을 선언하는 예를 살펴보겠습니다. 요소 수가 15인 2차원 배열을 선언해야 한다고 가정해 보겠습니다. 이 경우 2차원 배열은 3개의 행과 5개의 열 또는 5개의 행과 3개의 열을 가질 수 있습니다.

// 2차원 배열 선언의 예: int a;

  • a는 정수 배열의 이름입니다.
  • 첫 번째 대괄호 안의 숫자는 2차원 배열의 행 수를 나타내며, 이 경우에는 5입니다.
  • 두 번째 대괄호 안의 숫자는 2차원 배열의 열 수를 나타내며, 이 경우에는 3입니다.

// 2차원 배열의 초기화: int a = ( (4, 7, 8), (9, 66, -1), (5, -5, 0), (3, -3, 30), ( 1, 1, 1) );

이 배열에는 5개의 행과 3개의 열이 있습니다. 할당 기호 뒤에는 일반 중괄호가 배치되며, 그 안에는 2차원 배열의 행 수만큼 중괄호 쌍이 배치되고 이 괄호는 쉼표로 구분됩니다. 각 중괄호 쌍에 쉼표로 구분된 2차원 배열의 요소를 씁니다. 모든 중괄호에서는 요소 수가 동일해야 합니다. 배열에 5개의 줄이 있으므로 내부 괄호 쌍도 5개 있습니다. 열 수가 3개이므로 내부 괄호 안에 3개의 요소가 기록됩니다. 그래픽적으로 배열은 2차원 테이블처럼 보입니다(그림 5 참조).

그림 5 - C++의 배열

2차원 배열의 각 셀에 값이 표시되면 이 셀의 주소가 오른쪽 하단에 표시됩니다. 2차원 배열의 셀 주소는 배열 이름, 행 번호, 열 번호입니다.

2차원 배열을 처리하기 위한 "Labyrinth"라는 간단한 프로그램을 개발해 보겠습니다. 미궁은 2차원 배열을 기반으로 구축되어야 합니다. 우리는 재량에 따라 미로의 크기를 선택할 것입니다.

// array2.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #include "stdafx.h" #include < 33; i++) //переключение по строкам { for (int j = 0; j < 20; j++)// переключение по столбцам if (mas[i][j] == 1) { // вывести два раза символ (номер которого 176 в таблице аски) в консоль cout << static_cast(176); 시합<< static_cast(176); ) 그렇지 않으면<< " "; // вывести два пробела cout << endl; } system("pause"); return 0; }

// 코드 코드::블록

// Dev-C++ 코드

// array2.cpp: 콘솔 애플리케이션의 진입점을 정의합니다. #포함하다 네임스페이스 std 사용; int main(int argc, char* argv) ( // 1-조건부 "미로의 벽" // 2-"올바른 경로, 미로에서 나가기" // 0-"잘못된 경로" int mas = ( (1, 2,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,), // 2차원 배열 초기화 ( 1,2,1,0,0,1,0,1,2,2,2,1,1,1,1,0,0,0,0,1,), (1,2,1,1 ,0,1,0, 1,2,1,2,2,2,2,1,0,1,1,0,1,), (1,2,2,2,2,2,2, 1,2,1,1,1,1,2,1,0,0,1,0,1,), (1,1,1,1,1,1,2,1,2,1,0 ,0,1,2, 1,1,0,1,0,1,), (1,0,0,1,0,0,2,2,2,1,1,0,0,2, 0,0,0,1,0,1,), (1,0,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,1 ,0,1,), (1,0,0,0,0,0,0,0,0,1,1,1,1,2,1,0,0,0,0,1,), (1,1,1, 1,1,1,0,1,1,1,2,2,2,2,1,0,1,1,1,1,), (1,1,0, 0,0,1,0,0,1,1,2,1,1,1,1,0,0,0,0,1,), (1,0,0,1,0,0,0 ,0,0,1, 2,2,2,2,1,1,1,1,0,1,), (1,1,1,1,1,1,1,1,1,1, 1,1,1,2,1,0,0,0,0,1,), (1,2,2,2,2,2,2,2,2,2,2,2,2,2 ,1,0,1, 1,1,1,), (1,2,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,1,) , (1,2,1,0,0,0,1,2,2,2,1,0,0,0,0,0,1,1,0,1,) , (1,2,1,1,1,1,1,2,1,2,1,1,1,0,1,0,0,0,0,1,), (1,2,1 ,2,2,2, 1,2,1,2,2,2,1,1,1,1,1,1,1,1,), (1,2,1,2,1,2, 1,2,1,0,1,2,2,2,2,2,2,2,2,1,), (1,2,1,2,1,2,1,2,1,0 ,1,1,1, 1,1,1,1,1,2,1,), (1,2,1,2,1,2,1,2,1,0,0,0,0, 0,0,0,0,0,2,1,), (1,2,1,2,1,2,2,2,1,0,1,1,1,1,1,1,0 ,1,2,1, ), (1,2,1,2,1,1,1,1,1,0,0,0,1,0,1,0,0,1,2,1, ), (1,2, 1,2,2,1,0,0,1,1,1,0,0,0,1,0,1,1,2,1,), (1,2, 1,1,2,1,1,0,0,0,0,0,1,0,1,0,0,1,2,1,), (1,2,1,1,2,1 ,0,0,1, 1,1,1,1,1,1,1,1,1,2,1,), (1,2,1,1,2,1,1,0,1, 2,2,2,2,2,2,2,2,2,2,1,), (1,2,1,1,2,1,0,0,1,2,1,1,1 ,1,1,1, 1,1,1,1,), (1,2,1,1,2,1,0,1,1,2,1,1,1,1,1,1, 1,1,2,2 ,), (1,2,1,1,2,1,0,0,1,2,1,1,2,2,2,2,2,2,2,1 ,), (1,2,1,1,2,1,0,1,1,2,1,1,2,1,1,1,1,1,1,1,), (1,2 ,1,1,2, 1,0,0,1,2,1,1,2,1,0,0,0,1,0,1,), (1,2,2,2,2, 1,0,1,1,2,2,2,2,0,0,1,0,0,0,1,), (1,1,1,1,1,1,1,1,1 ,1,1,1, 1,1,1,1,1,1,1,1,) ); // 두 개의 루프 - 내부 및 외부, 배열의 각 요소에 액세스 for (int i = 0; i< 33; i++) //переключение по строкам { for (int j = 0; j < 20; j++)// переключение по столбцам if (mas[i][j] == 1) { // вывести два раза символ (номер которого 176 в таблице аски) в консоль cout << static_cast(176); 시합<< static_cast(176); ) 그렇지 않으면<< " "; // вывести два пробела cout << endl; } return 0; }

올바른 경로와 잘못된 경로는 동일한 숫자(예: 0)로 지정될 수 있지만 명확성을 위해 올바른 경로는 숫자 2로 지정됩니다. 배열은 프로그램을 단순화하기 위해 수동으로 초기화되었습니다. 프로그램이 2차원 배열을 처리하므로 2차원 배열의 요소 간을 전환하려면 두 개의 루프가 필요합니다. 첫 번째 for 루프는 2차원 배열의 행 사이를 전환합니다. 2차원 배열에는 33개의 행이 있으므로 카운터 변수 i는 0에서 33까지 증가하고, 46번째 줄. 첫 번째 루프 내부에는 2차원 배열의 행 요소를 순환하는 for 루프가 있습니다. 두 번째 for 루프의 본문에서는 단항 데이터 유형 변환 작업이 내부에서 수행됩니다. - static_cast<>() , 문자 번호 176을 인쇄합니다. 미로의 너비를 늘리기 위해 데이터 유형 변환 작업이 중복됩니다. 프로그램의 결과(그림 6 참조)

그림 6 - C++의 배열

동일한 유형의 많은 양의 데이터로 문제를 해결할 때 메모리 주소에 따라 정렬되지 않은 다른 이름을 가진 변수를 사용하면 프로그래밍이 어려워집니다. 이러한 경우 C 언어에서는 배열이라는 개체를 사용합니다.

하나의 이름으로 표시되는 동일한 유형의 일련의 객체를 포함하는 연속적인 메모리 조각입니다.

배열의 특징은 다음과 같은 기본 개념입니다.

배열 요소(배열 요소 값)– 어레이 내에 위치한 특정 메모리 셀에 저장된 값과 이 메모리 셀의 주소입니다.
각 배열 요소는 세 가지 값으로 특성화됩니다.

  • 요소 주소 - 이 요소가 위치한 시작 메모리 셀의 주소입니다.
  • 요소 인덱스(배열에 있는 요소의 서수);
  • 요소 값.

배열 주소 - 배열의 시작 요소 주소입니다.

배열 이름은 배열 요소를 참조하는 데 사용되는 식별자입니다.

배열 크기 – 배열 요소 수

요소 크기는 하나의 배열 요소가 차지하는 바이트 수입니다.

그래픽적으로 컴퓨터 메모리에서 배열의 위치는 연속적인 주소 스트립으로 표시될 수 있습니다.

그림에 표시된 배열에는 0부터 q-1까지의 인덱스를 가진 q개의 요소가 포함되어 있습니다. 각 요소는 컴퓨터 메모리에서 k바이트를 차지하며 메모리의 요소 배열은 순차적입니다.

배열의 i번째 요소의 주소는 다음과 같습니다.

배열 주소는 배열의 시작(0) 요소 주소입니다. 배열 요소에 접근하려면 해당 요소의 일련번호(인덱스)가 사용되며 초기값은 0입니다. 따라서 배열에 q개의 요소가 포함되어 있으면 배열 요소의 인덱스는 0에서 q-1까지 다양합니다.

배열 길이는 배열의 모든 요소를 ​​저장하기 위해 메모리에 할당된 바이트 수입니다.

배열 길이 = 요소 크기 * 요소 수

이 함수는 배열 요소의 크기를 결정하는 데 사용할 수 있습니다.

int sizeof(유형);

예를 들어,

sizeof(char) = 1;
sizeof(int) = 4;
sizeof(float) = 4;
sizeof(double) = 8;

배열 선언 및 초기화

C에서 배열을 선언하려면 다음 구문을 사용합니다.

유형 이름[차원]=(init);

초기화는 배열 요소의 초기 값 집합으로, 중괄호 안에 쉼표로 구분되어 지정됩니다.

int a = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); // 10개의 정수 배열

중괄호에 지정된 초기화 값의 수가 대괄호에 지정된 배열 요소의 수보다 적으면 배열의 나머지 모든 요소(초기화 값이 충분하지 않음)는 0이 됩니다. 이 속성은 배열의 모든 요소를 ​​0 값으로 설정하는 데 사용하면 편리합니다.

int b = (0); // 0으로 초기화된 10개의 요소로 구성된 배열 b


선언 시 배열이 초기화되면 해당 요소의 상수 초기 값은 중괄호 안에 쉼표로 구분되어 표시됩니다. 이 경우 대괄호 안의 요소 개수는 생략 가능하다.

int a = (1, 2, 3, 4, 5, 6, 7, 8, 9);

배열 요소에 접근할 때 필요한 요소의 인덱스는 대괄호 안에 표시됩니다.

C의 예

1
2
3
4
5
6
7
8

#포함하다
정수 메인()
{
int a = (5, 4, 3, 2, 1); // 배열 a에는 5개의 요소가 포함되어 있습니다.
printf("%d %d %d %d %d\n" , a, a, a, a, a);
getchar();
0을 반환합니다.
}

프로그램 실행 결과:

하지만 프로그램 실행 중에 배열 요소의 값을 설정해야 하는 경우가 종종 있습니다. 초기화 없이 배열 선언을 사용합니다. 이 경우 대괄호 안에 요소 수를 표시하는 것은 필수입니다.

정수 a;

파라메트릭 루프는 배열 요소의 초기 값을 설정하는 데 자주 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


#포함하다
정수 메인()
{
정수 a;
나는 int;
// 배열 요소 입력
(i = 0; 나는<5; i++)
{
printf("a[%d] = ", i);
scanf("%d" , &a[i]);
}
// 배열 요소 출력
(i = 0; 나는<5; i++)
printf("%d " , a[i]); // 인쇄 형식의 공백이 필요합니다.
getchar(); getchar();
0을 반환합니다.
}

프로그램 실행 결과

다차원 배열

다차원 배열은 C에서도 선언할 수 있습니다. 다차원 배열과 1차원 배열의 차이점은 1차원 배열에서는 요소의 위치가 하나의 인덱스로 결정되고 다차원 배열에서는 여러 인덱스로 결정된다는 것입니다. 다차원 배열의 예로는 행렬이 있습니다.

다차원 배열 선언의 일반적인 형태

유형 이름[차원1][차원2]...[차원m];

다차원 배열의 요소는 주소의 오름차순으로 연속적인 RAM 셀에 위치합니다. 컴퓨터 메모리에서 다차원 배열의 요소는 행으로 배열됩니다(예: 2행과 3열로 구성된 배열).

정수 a;


다음과 같이 메모리에 위치하게 됩니다.

주어진 2차원 배열의 총 요소 수는 다음과 같이 결정됩니다.

행 수 * 열 수 = 2 * 3 = 6.

배열을 수용하는 데 필요한 메모리 바이트 수는 다음과 같습니다.

항목 수 * 항목 크기 = 6 * 4 = 24바이트.

다차원 배열 초기화

다차원 배열의 요소 값은 1차원의 경우와 마찬가지로 선언 시 중괄호()로 묶인 상수 값으로 지정할 수 있습니다. 다만, 이 경우 행과 열의 요소수를 대괄호 안에 표시하여야 한다.

C의 예

1
2
3
4
5
6
7
8
9

#포함하다
정수 메인()
{
int a = (1, 2, 3, 4, 5, 6);
printf("%d %d %d\n" , a, a, a);
getchar();
0을 반환합니다.
}



그러나 프로그램 실행 중에 다차원 배열 요소의 값을 입력해야 하는 경우가 더 많습니다. 이를 위해 중첩된 파라메트릭 루프를 사용하는 것이 편리합니다.

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

#define _CRT_SECURE_NO_WARNINGS
#포함하다
정수 메인()
{
정수 a; // 2개의 행과 3개의 열로 구성된 배열
int i, j;
// 배열 요소 입력
(i = 0; 나는<2; i++) // 라인을 통해 루프
{
(j = 0; j<3; j++) // 열을 반복합니다.
{
printf("a[%d][%d] = " , i, j);
scanf("%d" , &a[i][j]);
}
}
// 배열 요소 출력
(i = 0; 나는<2; i++) // 라인을 통해 루프
{
(j = 0; j<3; j++) // 열을 반복합니다.
{
printf("%d " , a[i][j]);
}
printf("\n" ); // 개행
}
getchar(); getchar();
0을 반환합니다.
}



함수에 배열 전달하기

특수 기능을 이용하여 배열 처리를 편리하게 구성할 수 있습니다. 배열을 처리하려면 함수에 인수로 전달해야 합니다.

  • 배열 주소,
  • 배열 크기.

예외는 문자열 처리 함수로, 주소만 전달하는 것으로 충분합니다.

변수를 함수에 인수로 전달하면 데이터가 복사본으로 전달됩니다. 즉, 함수 내에서 매개변수 값이 변경되더라도 호출하는 함수 내에서는 해당 값에 영향을 주지 않습니다.

변수 주소(또는 배열 주소)가 함수에 전달되면 지정된 주소 범위 내의 데이터에 대해 함수에서 수행되는 모든 작업이 원본 데이터에 수행되므로 원래 배열(또는 변수 값)이 변경될 수 있습니다. 호출된 함수에 의해.

10개 요소로 구성된 C Dan 배열의 예. 배열의 가장 큰 요소와 시작 요소를 바꿉니다. 최대 요소 검색 및 교환 작업을 위해서는 이 기능을 사용하십시오.

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

#define _CRT_SECURE_NO_WARNINGS
#포함하다
// 교환 함수
무효 변경(int *x, int n)
{
// x - 배열에 대한 포인터(배열 주소)
// n - 배열 크기
나는 int;
정수 최대, 인덱스;
최대 = x;
인덱스 = 0;
// 최대 요소 찾기
(i = 1; 나는 {
만약 (x[i]>최대)
{
최대 = x[i];
지수 = 나;
}
}
// 교환
x = x;
x = 최대;
}
// 주요 기능
정수 메인()
{
정수 a;
나는 int;
(i = 0; 나는<10; i++)
{
printf("a[%d] = ", i);
scanf("%d" , &a[i]);
}
변경(a, 10); // 교환 함수 호출
// 배열 요소 출력
(i = 0; 나는<10; i++)
printf("%d " , a[i]);
getchar();
getchar();
반품
p = p * x[i];
}
p를 반환;
}
// 주요 기능
정수 메인()
{
정수 a; // 5개 요소로 구성된 배열 a를 선언했습니다.
나는 int;
정수 pr;
// 배열 요소 입력
(i = 0; 나는<5; i++)
{
printf("a[%d] = ", i);
scanf("%d" , &a[i]); // &a[i] - 배열의 i번째 요소의 주소
}
pr = func(a, 5); // 제품 계산
printf("\n pr = %d" , pr); // 짝수 요소의 곱을 출력합니다.
getchar(); getchar();
0을 반환합니다.
}



파스칼에서 2차원 배열은 요소 유형도 배열(배열의 배열)인 1차원 배열로 처리됩니다. 2차원 파스칼 배열의 요소 위치는 두 개의 인덱스로 설명됩니다. 직사각형 테이블이나 행렬 형태로 표시될 수 있습니다.

3*3 차원의 2차원 파스칼 배열을 생각해 보세요. 즉, 세 개의 라인이 있고 각 라인에는 세 개의 요소가 있습니다.

각 요소에는 1차원 배열과 같이 고유한 번호가 있지만 이제 번호는 이미 요소가 있는 행 번호와 열 번호라는 두 개의 숫자로 구성되어 있습니다. 따라서 요소 번호는 행과 열의 교차점에 의해 결정됩니다. 예를 들어, 21은 두 번째 행과 첫 번째 열에 나타나는 요소입니다.

2차원 파스칼 배열에 대한 설명입니다.

2차원 파스칼 배열을 선언하는 방법에는 여러 가지가 있습니다.

우리는 요소가 어떤 유형이든 될 수 있는 1차원 배열을 설명하는 방법을 이미 알고 있으므로 요소 자체가 배열이 될 수 있습니다. 유형 및 변수에 대한 다음 설명을 고려하십시오.

2차원 파스칼 배열 설명의 예

유형
벡터 = 배열<тип_элементов>;
행렬= 벡터 배열;
Var m: 매트릭스;

우리는 10개의 행과 5개의 열로 구성된 2차원 파스칼 배열 m을 선언했습니다. 이 경우, i번째 행 각각은 m[i]로 접근할 수 있고, i번째 행 내의 j번째 요소는 m[i, j]로 접근할 수 있다.

2차원 파스칼 배열의 유형 정의를 한 줄로 지정할 수도 있습니다.

유형
매트릭스= 배열의 배열< тип элементов >;
또는 더 간단합니다.
유형
행렬 = 배열<тип элементов>;

2차원 배열의 요소에 대한 액세스 형식은 M [i, j]입니다. 이는 i 번째 행과 j 번째 열에 있는 요소를 가져오고 싶다는 의미입니다. 여기서 가장 중요한 것은 행과 열을 혼동하지 않는 것입니다. 그렇지 않으면 존재하지 않는 요소에 다시 액세스하게 될 수도 있습니다. 예를 들어, M 요소에 액세스하면 올바른 표기법이 있지만 프로그램에서 오류가 발생할 수 있습니다.

2차원 파스칼 배열을 사용한 기본 연산

1차원 배열의 기본 연산에 관해 언급된 모든 내용은 행렬에도 적용됩니다. 동일한 유형의 전체 행렬에 대해 수행할 수 있는 유일한 작업은 할당입니다. 즉, 프로그램이 동일한 유형의 두 행렬을 설명하는 경우, 예를 들어 다음과 같습니다.

유형
행렬= 정수 배열;
var
a, b: 행렬;

그런 다음 프로그램 실행 중에 행렬을 할당할 수 있습니다. 행렬 값 (a:=b). 다른 모든 작업은 요소별로 수행되며 배열 요소의 데이터 유형에 대해 정의된 모든 유효한 작업은 요소에 대해 수행될 수 있습니다. 즉, 배열이 정수로 구성되어 있으면 정수에 대해 정의된 작업을 해당 요소에 대해 수행할 수 있지만, 배열이 문자로 구성되어 있으면 문자 작업에 대해 정의된 작업을 해당 요소에 적용할 수 있습니다.

2차원 파스칼 배열의 입력입니다.

1차원 배열의 요소를 순차적으로 입력하기 위해 인덱스 값을 첫 번째부터 마지막까지 변경하는 for 루프를 사용했습니다. 그러나 2차원 파스칼 배열에서 요소의 위치는 두 개의 인덱스, 즉 행 번호와 열 번호에 의해 결정됩니다. 이는 행 번호를 첫 번째부터 마지막까지 순차적으로 변경하고 각 행에서 첫 번째부터 마지막까지 열 요소를 반복해야 함을 의미합니다. 이는 두 개의 for 루프가 필요하며 그 중 하나가 다른 루프 내에 중첩되어 있음을 의미합니다.

키보드에서 2차원 파스칼 배열을 입력하는 예를 살펴보겠습니다.

키보드로 2차원 파스칼 배열을 입력하는 예제 프로그램

유형
행렬= 정수 배열;
var
a, : 매트릭스;
i, j: 정수; (배열 인덱스)
시작하다
for i:=1 to 5 do (모든 행을 반복하는 루프)
readln(a[i,j]); (i번째 행, j번째 열의 요소에 대한 키보드 입력)

2차원 파스칼 배열은 무작위로 채워질 수 있습니다. 랜덤(N) 함수를 사용하고 행렬의 각 요소에 일부 표현식의 값을 할당합니다. 2차원 파스칼 배열을 채우는 방법은 작업에 따라 다르지만 어떤 경우에도 각 행과 열의 각 요소를 정의해야 합니다.

2차원 파스칼 배열을 화면에 인쇄합니다.

2차원 파스칼 배열의 요소 인쇄도 순차적으로 수행됩니다. 각 행과 열의 요소를 인쇄해야 합니다. 동시에 같은 줄에 있는 요소를 나란히 인쇄하고 싶습니다. 행으로, 열 요소는 다른 요소 아래에 위치했습니다. 이렇게 하려면 다음 작업 순서를 수행해야 합니다(이전 예에서 설명한 배열에 대한 프로그램 조각을 고려).

2차원 파스칼 배열을 인쇄하는 예제 프로그램

for i:=1 to 5 do (모든 행을 반복하는 루프)
시작하다
for j:=1 to 10 do (행의 모든 ​​요소를 ​​열별로 반복)
쓰기(a[i,j]:4); (한 화면 라인에 행렬의 i번째 행에 있는 요소를 인쇄하며, 각 요소를 표시하기 위해 4개의 위치가 할당됩니다)
쓰다; (매트릭스의 행 번호를 변경하기 전에 커서를 새 화면 줄의 시작 부분으로 이동해야 합니다)
끝 ;

메모 ( 그건 중요해!): 학생 프로그램에서는 키보드로 입력을 시도하거나 다음과 같은 배열을 표시하려고 할 때 오류가 자주 발생합니다: readln (a), writeln (a), 여기서 배열 변수입니다. 동시에 그들은 이 유형의 변수를 읽거나 인쇄할 수 없다는 컴파일러 메시지에 놀랐습니다. 예를 들어 물 주전자와 같이 N 개의 머그잔이 일렬로 서 있고 손에 있다고 상상하면 이것이 왜 불가능한지 이해할 수 있을 것입니다. “물을 부어주세요” 명령을 사용하여 모든 머그컵을 한 번에 채울 수 있나요? 아무리 노력해도 각 머그에 따로 부어야 합니다. 배열 요소를 채우고 표시하는 작업도 순차적으로 요소별로 수행되어야 합니다. 컴퓨터 메모리에서 배열 요소는 연속적인 셀에 위치합니다.

메모리의 2차원 파스칼 배열 표현

기계 메모리의 추상 배열 요소는 설명에 따라 물리적으로 순차적으로 배치됩니다. 이 경우 각 요소는 해당 크기에 해당하는 메모리 바이트 수를 차지합니다. 예를 들어, 배열이 정수 유형의 요소로 구성된 경우 각 요소는 2바이트를 차지합니다. 그리고 전체 배열은 S^2바이트를 차지합니다. 여기서 S는 배열의 요소 수입니다.

그리고 배열로 구성된 배열이 차지할 공간은 얼마나 됩니까? 행렬? 분명히: S i^S j, 여기서 S i는 라인 수이고 S j는 각 라인의 요소 수입니다. 예를 들어 다음과 같은 배열의 경우

매트릭스 = 정수 배열;

12바이트의 메모리가 필요합니다.

이 배열의 요소는 메모리에 어떻게 위치합니까? 메모리에서 행렬 유형의 배열 M의 레이아웃을 고려해 보겠습니다.

정수 유형의 각 요소 M에 대해 두 개의 메모리 셀이 할당됩니다. 메모리 배치는 상향식으로 수행됩니다. 요소는 중첩 루프 패턴에 해당하는 인덱스 변경 순서로 배치됩니다. 첫 번째 행이 먼저 배치되고, 그 다음 두 번째, 세 번째... 행 내에서 요소는 첫 번째, 두 번째 등의 순서로 배치됩니다.

우리가 알고 있듯이 모든 변수에 대한 접근은 변수가 저장된 메모리 셀의 주소를 아는 경우에만 가능합니다. 프로그램이 로드될 때 변수에 대해 특정 메모리가 할당됩니다. 즉, 변수와 셀 주소 사이에 상호 대응이 설정됩니다. 그러나 변수를 배열로 선언하면 프로그램은 배열의 시작 주소, 즉 첫 번째 요소를 "알게" 됩니다. 배열의 다른 모든 요소에 어떻게 액세스합니까? 2차원 배열의 요소가 저장된 메모리 셀에 실제로 액세스할 때 시스템은 다음 공식을 사용하여 해당 주소를 계산합니다.

Addr + SizeElem * Cols *(I -1)+ SizeElem *(J -1),

여기서 Addr은 배열이 메모리에 위치하는 실제 시작 주소입니다. I, J – 2차원 배열의 요소 인덱스입니다. SizeElem – 배열 요소의 크기(예: 정수 유형 요소의 경우 2바이트) Cols - 줄의 요소 수입니다.

SizeElem * Cols *(I -1)+ SizeElem *(J -1) 표현식을 배열 시작 부분을 기준으로 한 오프셋이라고 합니다.

어레이에 얼마나 많은 메모리가 할당됩니까?

배열에 얼마나 많은 메모리가 할당되는지에 대한 질문(이전 섹션에서 이에 대해 논의함)보다는 제한된 메모리 양을 고려할 때 배열의 최대 허용 크기가 무엇인지 생각해 보겠습니다.

프로그램 동작을 위해 메모리는 각각 64KB의 세그먼트로 할당되며, 그 중 적어도 하나는 다음과 같이 정의됩니다. 데이터 세그먼트. 프로그램이 처리할 데이터가 위치하는 곳이 바로 이 세그먼트입니다. 프로그램 변수는 둘 이상의 세그먼트에 위치할 수 없습니다. 따라서 세그먼트에 배열로 설명된 변수가 하나만 있어도 65536바이트 이상을 수신할 수 없습니다. 그러나 거의 확실하게 배열 외에도 일부 다른 변수가 데이터 세그먼트에 설명되므로 배열에 할당할 수 있는 실제 메모리 양은 공식 65536-S로 찾을 수 있습니다. 여기서 S는 다른 변수에 이미 할당된 메모리입니다.

왜 우리는 이것을 알아야 합니까? 컴파일하는 동안 프로그램이 설명(구문 관점에서 올바른)을 발견할 때 번역기가 너무 긴 배열 선언에 대한 오류 메시지를 표시하더라도 놀라지 않기 위해:

myArray= 정수 배열을 입력합니다.

정수의 2바이트 표현이 주어지면 실제로 65536/2 –1=32767과 같은 요소 수를 가진 배열을 선언하는 것이 가능하다는 것을 이미 알고 있습니다. 그리고 다른 변수가 없는 경우에만 가능합니다. 2차원 배열은 인덱스 범위가 더 작아야 합니다.

2차원 파스칼 배열 문제 해결의 예

일: 0이 아닌 행렬 요소의 곱을 찾습니다.

해결책:

  • 이 문제를 해결하려면 변수가 필요합니다. 예를 들어 정수 요소로 구성된 행렬; P - 0과 다른 원소의 곱 I, J – 배열 인덱스; N, M - 행렬의 행과 열 수입니다.
  • 입력 데이터는 N, M입니다. 키보드에서 해당 값을 입력합니다. 행렬 – 우리는 절차의 형태로 행렬을 입력할 것입니다. 즉, 행렬을 무작위로 채울 것입니다. Random() 함수를 사용합니다.
  • 출력 데이터는 변수 P(제품)의 값이 됩니다.
  • 프로그램이 올바르게 실행되는지 확인하려면 화면에 행렬을 표시해야 합니다. 이를 위해 행렬을 표시하는 절차를 공식화하겠습니다.
  • 문제 해결 진행 상황:

먼저 메인 프로그램의 실행에 대해 논의해 보겠습니다. 프로시저의 구현에 대해서는 잠시 후에 논의하겠습니다.

  • N과 M 값을 입력해 보겠습니다.
  • 2차원 파스칼 배열을 소개하겠습니다. 이를 위해 vvod(a) 절차로 전환합니다. 여기서 a는 행렬입니다.
  • 결과 행렬을 인쇄해 보겠습니다. 이를 위해 인쇄(a) 절차를 사용합니다.
  • 변수 P =1에 초기값을 할당해 보겠습니다.
  • 우리는 첫 번째부터 N번째까지 I의 모든 행을 순차적으로 반복하고, 각 행에서 첫 번째부터 M번째까지 모든 J 열을 반복하고, 행렬의 각 요소에 대해 조건을 확인합니다. a ij ? 0이면 곱 P에 요소 a ij가 곱해집니다(P = P * a ij).
  • 0이 아닌 행렬 요소의 곱인 P 값을 표시해 보겠습니다.

이제 절차에 대해 이야기하겠습니다.

논평 (그건 중요해!) 프로시저 매개 변수는 미리 정의된 유형의 변수일 수 있습니다. 즉, 배열을 프로시저에 매개 변수로 전달하려면 해당 유형을 미리 설명해야 합니다. 예를 들어:

유형
매트릭스=정수 배열;
절차 프라이머(a: 매트릭스);
..............................

이제 절차로 돌아가겠습니다.

행렬을 입력하는 절차를 vvod라고 하며, 절차의 매개변수가 행렬이므로 결과적으로 주 프로그램에 전달되어야 하므로 매개변수는 참조로 전달되어야 합니다. 그러면 절차의 헤더는 다음과 같습니다.

절차 vvod(var m: 행렬);

프로시저에서 중첩 루프를 구현하려면 k 및 h와 같은 로컬 카운터 변수가 필요합니다. 행렬을 채우는 알고리즘은 이미 논의되었으므로 반복하지 않겠습니다.

화면에 행렬을 표시하는 프로시저를 print 라고 하며 프로시저의 매개변수는 행렬이지만 이 경우에는 입력 매개변수이므로 값으로 전달됩니다. 이 절차의 헤더는 다음과 같습니다.

절차 print(m: 행렬);

그리고 다시 한 번, 프로시저 내에서 중첩 루프를 구현하려면 카운터가 필요하며 이를 k와 h로 동일하게 호출합니다. 화면에 행렬을 표시하는 알고리즘은 위에 설명되어 있습니다.

예제 Pascal 2차원 배열 프로그램

프로그램 제작;
유형
매트릭스=정수 배열;
바르
A: 매트릭스;
N, m, i, j: 바이트;
P: 정수;
절차 vvod(var m: 행렬);
Var k, h: 바이트;
시작하다
i:=1 ~ n do(프로시저의 변수 n은 전역이므로 "알려짐")
j:=1 ~ m do의 경우(프로시저의 변수 m은 전역이므로 "알려짐")
M:= 무작위(10);
끝;
절차 print(m: 행렬);
Var k, h: 바이트;
시작하다
i:=1 ~ n의 경우 do
시작하다
j:=1 ~ m의 경우
쓰기(M:4);
쓰기;
끝 ;
끝 ;
시작(메인 프로그램의 시작)
Writeln("행렬 차원을 입력하세요:");
Readln(N, M);
Vvod(a);
인쇄(a);
P:=1;
i:=1 ~ N의 경우
j:=1 ~ M의 경우
만약<>0이면 p:=p*a;
쓰기(p);
끝.