배열이란
- 같은 크기의 기억공간을 연속적, 물리적으로 나열한 것
다른말로, 같은 자료형의 변수를 연속적으로 묶어 놓은 저장공간
배열의 선언
자료형 배열명 [개수]
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
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - scanf 와 변수(feat. 포인터 변수) (0) | 2022.06.09 |
---|---|
[정보처리기사] C언어 - 포인터의 이해(feat. 포인터변수, 주소, 주소값) (0) | 2022.06.09 |
[정보처리기사] C언어 - continue, break 개념과 for 반복문이 섞인 문제 박살내기 (feat. 다중for문) (0) | 2022.06.01 |
[정보처리기사] C언어 - while과 if문이 같이 있는 문제 박살내기 (0) | 2022.06.01 |
[정보처리기사] C언어 - for, while, do~while 차이 모르겠다면..(for while차이, for while복합문제) (0) | 2022.05.30 |