iOS/정보처리기사

[정보처리기사] C언어 - 배열의 이해와 배열 문제풀이

Chafle 2022. 6. 3. 19:42
반응형

 

배열이란

 

- 같은 크기의 기억공간을 연속적, 물리적으로 나열한 것

다른말로, 같은 자료형의 변수를 연속적으로 묶어 놓은 저장공간

 

 

배열의 선언

 

자료형 배열명 [개수]

int a [ ] ;

 

ex. int a [5];

 

a[0] a[1] a[2] a[3] a[4]
         

 

 

이렇게 5개 공간으로 나뉘어지고, 0부터 시작한다.

 

 

 

이차원 배열

 

같은 자료형의 변수를 행과 열의 연속적인 공간으로 묶어 놓은 것

 

ex. int a[2][3];

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]

 

 

 

 

ex.1


void main() {

char msg[50] = "Hello world! Good Luck!";

int i = 2, number = 0;

while(msg[i] != '!') {

if(msg[i] == 'a' || msg[i] =='e' || msg[i] == 'i' || msg[i] == 'o' || msg[i] =='u')

number++;

i++;

}

printf("%d", number);

return0

}

 

 

 

해설

- msg[0] = "H",msg[1] = "e",msg[2] = "l", msg[3] = "l", msg[4] = " " ....  msg[22] = "!" 

- msg[i] != '!'  -> 배열의 i번째가 !와 같지 않으면 if를 실행하라 /=> !가 나오면 ! = ! 니까 false이므로 while문을 빠져나온다.

- if(msg[i] == 'a' || msg[i] =='e' || msg[i] == 'i' || msg[i] == 'o' || msg[i] =='u') -> i번째 문자열이 하나라도 a,e,i,o,u와 동일하면

 

주의

if문의 구조가
if(조건)

number++;

i++;

이기 때문에

if값이 참값이면 number++를 수행하고 거짓이면  i++를 수행하라라고 착각할 수 있음.

 

그러나 원래는

if(조건) {

조건이 참일 때 실행

그 외 실행하는 구문 이지만

 

 

여기서는 명확히 하자면

if(조건) {

조건이 참일 때

number++;

}

i++;

 

이 구문을

중괄호가 없는 표현으로 위처럼 표현 한 것입니다.

if다음줄 한 줄만 조건이 참일 때 처리하고, 그 다음줄은 그 외 처리로 생각하고 풀어야겠습니다.

 

 

  i msg[i] != '!' msg[i] number number++ i++ printf("%d", number) 
초기값 2     0      
  2 l != '!' -> 다르므로 참임. if문 수행 msg[2] = l ->a,e,i,o,u 없으니깐  거짓일 때 수행 값 i++수행     3  
  3 l != '!' -> 다르므로 참임.if문 수행 msg[3] = l ->a,e,i,o,u 없으니깐 거짓일 때 수행 값 i++수행     4  
  4 o != '!' -> 다르므로 참임. if문 수행 msg[4] = o -> 있으니깐 number++ 0 1 5  
  5 ' ' != '!' -> 다르므로 참임. if문 수행 msg[5] = ' ' -> a,e,i,o,u 없으니깐 거짓일 때 수행 값 i++     6  
  ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙
a,e,i,o,u에서만 number가 증가하니까
!나오기 전에 a,e,i,o,u값만 정리하면
7 o != '!' -> 다르므로 참임. if문 수행 msg[7] = o -> 있으니깐 number++ 1 2 8  
  11 ! != '!' -> 같으므로 while문 빠져나온다   2     2

 

 

number = 2

 

 

반응형

 


 

ex.2

 

void main() {

int i;

char ch;

char str[7] = "nation";

for(i=0; i<4; i++) {

ch = str[5-i];

str[5-1] = str[i];

str[i] = ch;

}

printf("%s₩n", str);

return 0;

}

 

 

 

해설

 

ch = str[5-i];

str[5-1] = str[i];

str[i] = ch;

 

는 눈에 익혀두면 좋다 -> 스왑 알고리즘

컵 A엔 물, 컵 B엔 식용류가 담겨있고, 컵A에 식용류, 컵 B에 물을 넣고 싶을 때

다른 새 컵에 물을 를 옮기고, 식용류를 A로 옮기고 새 컵에 있는 물을 B로 다시 붓는 알고리즘과 동일하다

 

 

 

 

 

- %s는 문자열을 출력하는 것.

- 문자열을 출력하는 것은 주소값을 받게 돼있다.

- str은 배열의 시작점인 [0]의 주소값을 가지고 있다. -> str를 출력하라고 하면 그 주소값에 할당된 배열 쭉 출력하면 된다.

 

str [0] [1] [2] [3] [4] [5]
n a t i o n

 

  i i<4 ch=str[5-i] str[5-i] = str[i] str[i] = ch   i++
초기값 0 0<4참 ch = n 할당 str[5] = str[0] 값인 n할당 str[0] = n할당 결과적으로 n->n바꾼격이므로 똑같이 nation 1
  1 1<4참 ch = o str[4] = str[1] 값인 a할당 str[1] = o할당 str = notian 2
  2 2<4참 ch = i str[3] = str[2] 값인 t할당 str[2] = t할당 str = noaitn 3
  3 3<4참 ch = i str[2] = str[3] 값인 t할당 str[3] = i할당 str = notian 4
  4 4<4거짓 for문 빠져나온다          

 

str   [0] [1] [2] [3] [4] [5]
  n a t i o n
  i=0 n a t i o n
  i=1 n o t i a n
  i=2 n o i t a n
  i=3 n o t i a n

 

정답 notian

반응형