2차원 배열. 행렬의 형성 및 요소의 출력

Pascal에서 2차원 배열은 1차원 배열로 취급되며, 요소의 유형도 배열(배열의 배열)입니다. 2차원 파스칼 배열에서 요소의 위치는 두 개의 인덱스로 설명됩니다. 직사각형 테이블이나 행렬로 나타낼 수 있습니다.

차원이 3 * 3인 2차원 파스칼 배열, 즉 3개의 행이 있고 각 행에 3개의 요소가 있다고 가정해 보겠습니다.

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

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

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

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

2차원 파스칼 배열을 설명하는 예

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

각각 5개의 열이 있는 10개의 행으로 구성된 2차원 파스칼 배열 m을 선언했습니다. 이 경우 각 i번째 라인은 m [ i ], i번째 라인 내부의 각 j번째 요소 - m [ i , j ]에 액세스할 수 있습니다.

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

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

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

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

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

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

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

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

1차원 배열의 요소를 순차적으로 입력하기 위해 인덱스 값을 1번째에서 마지막으로 변경하는 for 루프를 사용했습니다. 그러나 2차원 파스칼 배열에서 요소의 위치는 행 번호와 열 번호라는 두 가지 인덱스에 의해 결정됩니다. 이것은 우리가 첫 번째에서 마지막으로 행 번호를 순차적으로 변경해야 하고 각 행에서 첫 번째에서 마지막으로 열 요소를 반복해야 한다는 것을 의미합니다. 이것은 두 개의 for 루프가 필요하고 그 중 하나가 다른 루프에 중첩된다는 것을 의미합니다.

키보드에서 2차원 파스칼 배열을 입력하는 예를 고려하십시오.

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

유형
행렬 = 정수 배열;
var
a, : 행렬;
i, j: 정수; (배열 인덱스)
시작하다
for i:=1 ~ 5 do (모든 행 반복)
readln(a[ i , j ]); (i번째 줄과 j번째 열에 있는 요소의 키보드 입력)

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

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

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

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

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

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

메모리에 2D 파스칼 배열 표현하기

기계의 메모리에 있는 추상 배열의 요소는 설명된 대로 물리적으로 순차적으로 배열됩니다. 이 경우 각 요소는 크기에 해당하는 바이트 수를 메모리에서 차지합니다. 예를 들어, 배열이 integer 유형의 요소로 구성된 경우 각 요소는 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) 절차로 전환합니다.
  • 변수 P =1에 초기 값을 할당합니다.
  • 우리는 첫 번째에서 N 번째까지의 모든 행 I을 순차적으로 살펴보고 각 행에서 첫 번째부터 M 번째까지의 모든 J 열을 살펴보고 행렬의 각 요소에 대해 조건을 확인할 것입니다. if a ij ? 0이면 곱 P에 요소 a ij를 곱합니다(P = P * a ij).
  • 행렬의 0이 아닌 요소의 곱 값을 표시해 보겠습니다. - P ;

이제 절차에 대해 이야기합시다.

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

유형
행렬 = 정수 배열;
절차 프라이머(a:matrix);
..............................

이제 절차로 돌아가자.

행렬 입력 프로시저를 vvod 라고 하고 프로시저 매개변수는 행렬이므로 주 프로그램에 전달해야 하므로 매개변수를 참조로 전달해야 합니다. 그러면 프로시저의 헤더가 다음과 같이 보일 것입니다.

절차 vvod(var m: 행렬);

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

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

인쇄 절차(m:행렬);

그리고 다시, 프로시저 내에서 중첩 루프를 구현하려면 카운터가 필요합니다. 카운터를 동일한 -k 및 h라고 합니다. 화면에 행렬을 표시하는 알고리즘은 위에서 설명한 대로 이 설명을 사용합니다.

2차원 파스칼 배열 프로그램의 예

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

2차원 배열다음 형식의 직사각형 행렬을 저장하는 데이터 구조:

11 12 13 14 15 ...ㅏ 1m21 22 23 24 25 ...ㅏ 2m31 32 33 34 35 ...ㅏ 3m41 42 43 44 45 ...ㅏ 4m51 52 53 54 55 ...ㅏ 5m... ... ... ... ... ... ... ㅏ n1n2n3n4n5...ㅏ nm

  • 행렬에서 각 요소는 해당 요소가 위치한 교차점의 행 번호와 열 번호에 의해 결정됩니다.
  • Pascal에서 2차원 배열은 요소가 선형 배열(배열의 배열)인 배열로 처리됩니다. 2차원 배열에 대한 다음 두 설명은 동일합니다. var 질량:실수 배열의 배열; var 질량:실수 배열;
  • 행의 개수가 열의 개수와 같은 행렬을 호출합니다. 정방행렬.
  • 행렬 요소를 참조하려면 행 번호와 열 번호를 나타내는 두 개의 인덱스를 사용해야 합니다. 예를 들어 MyArr1. 이 경우 배열 요소(MyArr1)는 네 번째 행과 다섯 번째 열에 있습니다.
  • 1차원 배열의 기본 연산에 대해 설명한 모든 내용은 행렬에도 해당됩니다. 루프의 요소별로 배열 요소를 반복할 때 정수 유형의 변수는 인덱스 역할을 합니다. 전통적으로 식별자 " " 및 열 - " 제이 “.
  • 행렬의 처리는 처음에 첫 번째 행(열)의 요소가 차례로 고려된 다음 두 번째, 마지막 행까지 계속 고려된다는 사실에 있습니다.
  • 요소의 행 번호가 열 번호( 나는 = 제), 이는 요소가 다음에 있음을 의미합니다. 주 대각선 행렬.
  • 요소가 측면 대각선에 있는 경우 인덱스는 요소 수( N) 다음 등식에 의해: 나는 + j = n + 1

2차원 배열에 대한 설명

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

배열 유형에 대한 예비 설명

유형 행렬 = 정수 배열; (정수 배열) var mass:matrix;

배열의 유형을 먼저 선언하지 않고 변수를 배열로 정의하기

var 질량: 정수 배열;

2차원 배열 초기화

2차원 배열을 초기화할 때 각 줄은 추가 괄호 쌍으로 묶입니다.

const 질량:배열 = ((2,3,1,0), (1,9,1,3), (3,5,7,0));

2차원 배열 요소 값의 입출력

매우 자주 배열 요소의 값은 키보드에서 입력됩니다. 정보를 지정하는 이 방법은 큰 크기의 배열로 작업할 때 시간이 너무 많이 걸립니다. 다양한 종류의 알고리즘을 디버그하려면 이러한 정보 입력을 임의의 방식으로 배열 요소를 형성하는 것으로 대체해야 합니다. 이렇게 하려면 절차를 사용하십시오. 무작위화기능 무작위의. 2차원 배열로 작업할 때 중첩 루프가 사용됩니다(일반적으로 매개변수가 있는 루프 ~을위한).

난수로 배열 채우기

상수 n = 5; m = 10; var i, j: 정수; 행렬: 정수 배열; 무작위 시작; for i:= 1 ~ n do(배열 행 액세스) for j:= 1 ~ m do(열에 대한 요소별 액세스) matrix := random(100); (간격 :4의 난수를 현재 요소에 입력); writeln (내부 루프에서 나갈 때 새 줄로 점프) end;

문제 해결의 예

실시예 1

문제의 공식화. 양의 정수 M과 N이 주어지면 J번째 열의 모든 요소가 5·J 값을 갖는 M × N 크기의 정수 행렬을 생성합니다(J = 1, …, N).

상수 m = 7; n = 10; var i, j:바이트; 행렬: 정수 배열; i:= 1 to m do for j:= 1 to n do matrix := 5 * j; ... (배열 출력)

실시예 2

문제의 공식화. 양의 정수 M, N 및 M 숫자 세트가 제공됩니다. 원래 집합의 모든 숫자를 포함하는 각 열로 M × N 행렬을 형성합니다(같은 순서로).

상수 m = 5; n = 7; 벡터: 정수 배열 = (3, 5, 2, 7, 4); var i, j:바이트; 행렬: 정수 배열; j에 대해 시작:= 1에서 n까지 do(j번째 열을 취함) i:= 1에서 m까지 do(j번째 열의 요소에 행 단위로 액세스) matrix := vector[i]; (구현) ... (결과 2차원 배열의 출력)

숙제

  1. 양의 정수 M과 N이 주어졌을 때 크기가 M × N인 정수 행렬을 생성합니다. 여기서 I 번째 행의 모든 ​​요소는 값 10·I(I = 1, …, M)을 가집니다.
  2. 양의 정수 M, N 및 N개의 숫자 세트가 제공됩니다. 원래 집합의 모든 숫자를 포함하는 각 행으로 M × N 행렬을 형성합니다(같은 순서로).
  3. 추가적으로.양의 정수 M, N, 숫자 D 및 M 숫자 집합이 제공됩니다. 첫 번째 열이 원래 숫자 집합과 일치하고 각 다음 열의 요소가 이전 열의 해당 요소와 숫자 D의 합과 같은 M × N 행렬을 생성합니다. 행렬의 행은 산술 진행의 요소를 포함합니다.
  4. 추가적으로. M × N 행렬이 주어지면 짝수(2, 4, ...)가 있는 행에 있는 요소를 인쇄합니다. 요소를 한 줄씩 표시하고 조건 연산자를 사용하지 마십시오.

지난 파스칼 수업은 이미 3월 7일에 작성되었으며 분석했습니다. 오늘 우리는 그것이 무엇인지 알아볼 것입니다 파스칼의 2차원 배열그것이 어떻게 설명되고 그것이 무엇인지. 자세한 내용은 아래를 참조하세요.

그렇다면 2차원 배열이란 무엇일까요?이해를 쉽게 하기 위해 모든 요소가 가로로 차례로 나열되는 1차원 배열을 선으로, 2차원 배열에서 요소가 가로와 세로 모두에 위치하는 정사각형을 상상해 보겠습니다. 2차원 배열은 행과 열로 구성되며 행렬 또는 행렬 배열이라고도 합니다.

2차원 배열은 어떻게 설명됩니까? 2차원 배열을 작성하는 방법에는 여러 가지가 있으며 그 중 2가지를 고려할 것입니다.

배열을 설명하는 첫 번째 방법: 배열의 변수 유형 배열(정수/실수/바이트)

배열을 설명하는 2가지 방법: 배열에 있는 변수 유형의 배열 배열;

먼저 행(1..m)이 설명된 다음 열(1..n)이 설명됩니다.

두 번째 방법에서는 2개의 1차원 배열이 있는 그대로 기술되어 하나의 2차원 배열을 형성합니다.

2차원 배열은 다음에 여러 번 액세스하기 위해 Type 섹션에서 설명하거나 Var 변수 설명 섹션에서 m 및 n 대신 숫자를 대체하거나 상수를 사용할 수 있다는 점에 유의하고 싶습니다.

변수 선언 섹션에서 2차원 배열을 지정하는 예:

상수
m = 100;
n=100;
var
a: 정수 배열

이 경우 크기가 100 x 100인 2차원 배열 a가 주어졌습니다. 즉, 정사각형 행렬이 있습니다.

Type 섹션을 사용하여 행렬 배열을 지정하는 예:

상수
m = 100;
n=100;
유형
행렬 = 정수 배열;
var
a: 매트릭스;
b: 매트릭스;

두 번째 예에서는 차원이 100 x 100인 두 개의 동일한 행렬 배열을 지정했으며 배열 b를 설명할 때 차원과 데이터 유형을 다시 설명할 필요가 없었습니다.

2차원 배열의 셀 변수에 액세스하는 방법은 무엇입니까?

2차원 배열을 참조하려면 다음과 같이 행 번호를 먼저 지정한 다음 열 번호를 지정해야 합니다.

x는 임의의 변수, a는 배열의 이름, i는 행 번호, j는 열 번호입니다.

또한 i와 j는 변수와 정수가 될 수 있습니다.

배열에 데이터를 쓰는 예:

For i:= 1 to n do // 루프의 줄 번호 설정
For j:=1 to m do // 루프의 열 번호 설정
a:=무작위(100); //행 번호가 i이고 열 번호가 j인 셀에 임의의 값 할당

배열을 1에서 100까지의 난수로 채웠습니다.

2차원 배열을 사용하는 예제 프로그램에서 배열을 난수로 채우고 화면에 인쇄합니다.

Var // 변수 및 배열에 대한 설명
행렬: 정수 배열;
i, j: 정수;

시작 //메인 프로그램의 시작
writeln("2차원 배열: "); //사용자와의 대화

i:= 1 ~ 10의 경우 // 배열 채우기
j:= 1 ~ 10의 경우
행렬:=무작위(100);

i:= 1 ~ 10의 경우 // 출력 배열 시작
j:= 1 ~ 10의 경우
쓰기(행렬, " ");
쓰기
writeln("사이트"); // 원하는 경우 삭제할 수 있습니다.
끝; // 프로그램 종료

//readln //터보 파스칼에서 사용



관련 기사: