완숙의 블로그

배열 2(Array) 본문

Programing Language/C

배열 2(Array)

완숙 2019. 1. 11. 14:09

배열 2

문자배열

  • char 형 문자를 여러 개 모아놓은 문자 집합

    • 문자 : 작은 따옴표 ' '
    • 문자열 : 큰 따옴표 " "
    • '\0' (NULL) : 문자열 끝에 항상 문자코드 '\0'을 덧붙여야 함

 

char str[5] = {'A', 'B', 'C', 'D', '\0'};	// 옳은 선언
char str[4] = {'A', 'B', 'C', 'D'}			// 잘못된 선언
char str[] = "ABCD";						// 옳은 선언

char str[5];								// 옳은 선언
str[0] = 'A';
str[1] = 'B';
...
str[4] = '\0';

 

  • 이러한 특징 때문에 배열의 크기는 실제 문자열의 크기 + 1 로 선언해야 함

 

#include <stdio.h>
int main() {
	int i;
	char str[4] = {'A', 'B', 'C', '\0'};
	char student[] = "john";
	
	printf("문자열을 동시에 출력하는 경우\n");
	printf("학생의 이름은 %s이다.\n\n", student);
	printf("문자열을 한 글자씩 출력하는 경우\n");
	
	for(i = 0; str[i] != '\0'; i++)
		printf("%c\n", str[i]);
	
	return 0;
}

// 프로세스가 시작되었습니다..
> 문자열을 동시에 출력하는 경우
학생의 이름은 john이다.

문자열을 한 글자씩 출력하는 경우
A
B
C

// 프로세스가 종료되었습니다.

 

반복문에서 문자열의 종료 조건

for (i = 0; str[i]; i++)
    printf("%c\n", str[i]);

while(str[i])
    ... ... 

 

  • 문자열 끝에 제어 문자 NULL이 있기에 가능함

 

문자와 문자열의 차이

2019-01-11 11 40 23

  • \0이 추가된 형태로 존재함

 

 

배열과 주소

메모리가 할당된 변수에 접근하는 방법

  1. 변수명으로 접근
  2. 변수의 주소값으로 접근 : 변수 앞 &를 붙임

 

2019-01-11 11 54 25

 

scanf

int a;
scanf("%d", &a);

 

  1. a라는 변수를 선언해라. 자료형은 int로
  2. 10을 입력했다면 a라는 변수를 선언한 주소에 넣어라

 

Problem

#include <stdio.h>
int main() {

	int a[4] = {10, 20, 30, 40};
	int i, aryLength;
	
	aryLength = sizeof(a) / sizeof(int);
	
	printf("배열의 원소값을 출력하면\n");
	for (i = 0; i < aryLength; i++)
	{
		printf("a[%d] = %d\n", i, a[i]);
	}
	
	printf("배열 원소의 주소를 출력하면\n");
	
	for(i = 0; i < aryLength; i++)
	{
		printf("&a[%d] = %p\n", i, &a[i]);
	}
	
	return 0;
}

// 프로세스가 시작되었습니다..
> 배열의 원소값을 출력하면
a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
배열 원소의 주소를 출력하면
&a[0] = 0x7ffea13627a0
&a[1] = 0x7ffea13627a4
&a[2] = 0x7ffea13627a8
&a[3] = 0x7ffea13627ac

// 프로세스가 종료되었습니다.

 

 

 

배열과 주소와의 관계

  • 배열은 동일한 자료형을 동시에 선언하는 것
  • 메모리에 배열의 원소 개수만큼의 공간이 동시에 할당됨

 

배열명으로 주소를 표시하는 방법

2019-01-11 12 34 04

 

Problem 1

#include <stdio.h>
int main() {
	
	double b[] = {2.3, 3.0, 4.1, 5.5};
	int a[4] = {10, 20, 30, 40};
	int i, aryLenDouble, aryLenint;
	
	aryLenDouble = sizeof(b) / sizeof(double);
	aryLenint = sizeof(a) / sizeof(int);
	
	printf("double형 배열 원소의 주소를 출력하면\n");
	
	for (i = 0; i < aryLenDouble; i++)
	{
		printf("b + %d = %p\n",i, b+i);
	}
	
		printf("int형 배열 원소의 주소를 출력하면\n");
	
	for (i = 0; i < aryLenint; i++)
	{
		printf("a + %d = %p\n",i, a+i);
	}
	
	
	return 0;
}

// 프로세스가 시작되었습니다..
> double형 배열 원소의 주소를 출력하면
b + 0 = 0x7fff85c209b0		// 8씩 증가
b + 1 = 0x7fff85c209b8
b + 2 = 0x7fff85c209c0
b + 3 = 0x7fff85c209c8
int형 배열 원소의 주소를 출력하면
a + 0 = 0x7fff85c209a0		// 4씩 증가
a + 1 = 0x7fff85c209a4
a + 2 = 0x7fff85c209a8
a + 3 = 0x7fff85c209ac

// 프로세스가 종료되었습니다.

 

Problem 2

#include <stdio.h>
int main() {
	
	int i, j;
	int s1[4][3], s2[4][3];
	
	int x[4][3] = {{46, 79, 78},
								 {35, 57, 28},
								 {43, 68, 76},
								 {56, 78, 98}};
	
	int y[4][3] = {{78,35,99},
								 {85, 82, 34},
								 {58, 69, 29},
								 {34, 59, 35}};
	
	// 합
	
	for (i = 0; i < 4; i++){
		for (j = 0; j < 3; j++){
			s1[i][j] = x[i][j] + y[i][j];
		}
	}
	
	// 합 출력
	printf("\n두 행렬 합\n");
	
	printf("--------------\n");
	
	for(i=0; i<4; i++){
		for (j = 0; j<3; j++){
			printf("%4d", s1[i][j]);
		}
		printf("\n");
	}
	
	printf("--------------\n");
	
	
	// 차
	for (i = 0; i < 4; i++){
		for (j = 0; j < 3; j++){
			s2[i][j] = x[i][j] - y[i][j];
		}
	}
	
	// 차 출력
	printf("\n두 행렬 차\n");
	
	printf("--------------\n");
	for(i=0; i<4; i++){
		for (j = 0; j<3; j++){
			printf("%4d", s2[i][j]);
		}
		printf("\n");
	}
	printf("--------------\n");

	return 0;
}

// 프로세스가 시작되었습니다..
>
두 행렬 합
--------------
 124 114 177
 120 139  62
 101 137 105
  90 137 133
--------------

두 행렬 차
--------------
 -32  44 -21
 -50 -25  -6
 -15  -1  47
  22  19  63
--------------

// 프로세스가 종료되었습니다.

 

 

실습

Problem 1

#include <stdio.h>
int main() {

	int check = 0;
	char def[5] = {"1234"};
	char pw[5];
	
	do{
		printf("비밀번호 4자리를 입력하시오!");
		scanf("%s", &pw);
		
		check = 0;
	
		for (int i = 0; i<4; i++){
			if (pw[i] != def[i]){
				check = 1;
				break;
			}
		}
		if (check == 0)
		printf("비밀번호가 일치합니다!");
		
	}while(check);
	
	return 0;
}

// 프로세스가 시작되었습니다..
> ev비밀번호 4자리를 입력하시오!ekv
비밀번호 4자리를 입력하시오!vrvr
비밀번호 4자리를 입력하시오!rvrv
비밀번호 4자리를 입력하시오!rvrvr
비밀번호 4자리를 입력하시오!rrrrrr
비밀번호 4자리를 입력하시오!1234
비밀번호가 일치합니다!
프로세스가 종료되었습니다.

// 프로세스가 종료되었습니다.

 

Problem 2

#include <stdio.h>
int main() {
	
	int matrix1[3][2] = {{3,5},
											 {7,9},
											 {1,3}};
	int matrix2[2][3] = {{2,4,6},
											 {8,2,4}};
	int ans[3][3] = {0};
	
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			for(int k = 0; k < 2; k++){
				ans[i][j] += matrix1[i][k] * matrix2[k][j];
			}
		}
	}
	
	
	for (int i = 0; i < 3; i++){
		for (int j = 0; j < 3; j++){
			printf("%2d  ", ans[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

// 프로세스가 시작되었습니다..
> 46  22  38
86  46  78
26  10  18

// 프로세스가 종료되었습니다.

 

'Programing Language > C' 카테고리의 다른 글

함수 2 (재귀함수)  (0) 2019.01.15
함수 1  (0) 2019.01.14
배열 1(Array)  (0) 2019.01.10
반복문 2  (0) 2019.01.08
반복문 1  (0) 2019.01.07
Comments