*본 포스팅은 한빛미디어의 '혼자공부하는 C언어(1판)'기준으로 작성되었습니다.
Chapter5. 제어문
5-1. if문
기본 형식:
#include <stdio.h>
int main() {
int a = 50;
int b;
printf("정수 하나를 입력하세요:\n");
scanf("%d", &b);
if(a>b)
{
printf("입력한 값은 50보다 작습니다.");
}
else if (a = b)
{
printf("입력한 값은 50입니다.");
}
else
{
printf("입력한 값은 50보다 작습니다.");
}
return 0;
}
이런 식으로 if/else if/ else로 입력한 값이 a(=50)보다 작으면, 같으면, 크면으로 분기점을 나눌 수 있다.
else문은 위의 if, else if 문과는 달리 조건 ((a=b)등) 없이, '나머지 조건에 해당하지 않는 모든 케이스'를 싹 다 해당시키기 때문에 조건이 없다.
*가장 중요한 사항은, if/ else/ else if 뒤에 실행할 문장이 두 줄 이상이면 반드시 중괄호{}로 묶어야 한다. 위의 예시에서는 한 줄이라도 {}로 묶었는데, 두 줄 이상일 때 묶지 않으면 에러가 나므로 차라리 한 줄일 때도 그냥 묶는 습관을 들이자.
5-2. if문 활용과 switch ~ case문
먼저 if문 활용을 알아보자. 예를 들어 학점이 4.3 이상이고 토익 점수가 950점을 넘으면 장학금이 등록금의 100% 지급되고, 4.3 이상이고 토익 점수가 950이하면 장학금이 50% 지급, 4.3미만이면 토익점수와 상관없이 장학금이 지급되지 않는 장학 제도가 있다고 가정해보자.
이 경우 조건이 2개인데, 어떻게 if문으로 나타낼 수 있을까?
이럴 때 if문을 if문 안에 중첩해서 사용한다.
#include <stdio.h>
int main() {
double score;
int toeic;
int scholar;
printf("학점을 입력해주세요:");
scanf("%lf", &score);
printf("\n토익 점수를 입력해주세요:");
scanf("%d", &toeic);
if (score>=4.3){
if (toeic > 950){
scholar = 100;
}
else{
scholar = 50;
}
}
else{
scholar = 0;
}
printf("장학금은 등록금의 %d%%만큼 지급됩니다.",scholar);
return 0;
}
그러나 if문을 중첩해서 사용하는 것보다는, if ~ else if를 적극적으로 사용하는 편이 더 처리 속도가 빠르다. 따라서 위와 같은 경우는 score >= 4.3 && toeic > 950 같이 표시하는게 더 효율적이다.
물론 위 예시는 간단해서 컴퓨터가 신속히 처리할 수 있으므로, 크게 속도에 연연할 정도는 아니니 본인이 편한 방법으로 코딩해도 무방하다.
switch ~ case문
요즘 닌텐도 스위치를 많이 해서 그런지 switch하면 누르는 스위치가 아니고 닌텐도가 계속 떠오른다
switch ~ case문은 은근 많이 쓰이는데, 특히 교수님들이 좋아하시는 것 같다. if문만 죽어라 파고 switch문은 공부 하나도 안하다가 기말고사 때 한 문제를 통째로 아무말 대잔치했었다.
흐름 자체는 if문이랑 거의 유사하니, if문을 이해했다면 switch문은 형식만 알아두면 충분히 쉽게 활용할 수 있을 것이다.
//switch문 형식
#include <stdio.h>
int main() {
int age;
printf("인원수를 입력하세요:");
scanf("%d", &age);
switch(age){
case 1:
printf("1인석으로 안내하겠습니다. ");
break;
case 2:
printf("2인석으로 안내하겠습니다.");
break;
case 3:
printf("4인석으로 안내하겠습니다.");
//위에 4인석 오타 아님, 보통 식당에는 3인석이 없음
break;
case 4:
printf("4인석으로 안내하겠습니다.");
break;
default:
printf("인원수에 맞게 앉아주세요.");
break;
}
return 0;
}
이런 식으로 case를 정수로 표현 한 후, 그 정수를 매개변수로 문장을 실행한다. else와 같은 느낌으로 default를 사용한다.
Chapter 6. 반복문
반복문이란, 특정 조건을 달성하기 전까지 계속 구문을 실행시키는 것을 말한다. 예를 들어, 반 학생들 전체의 평균을 알기 위해 점수를 계속 더하려고 하는데 한명 더하고 프로그램 실행이 끝나고, 또 한명 더하고 프로그램 실행이 끝나면 정상적으로 평균을 알기 어렵다. 이런 상황에 반복문을 사용한다.
while과 for로 학생들의 평균을 구하는 간단한 예제를 통해 구문에 대해 살펴보자.
1) while문을 이용한 평균 구하기
#include <stdio.h>
int main() {
int num,score; //학생 수, 점수 선언
int a, total = 0; //while문의 매개변수 점수, 값을 모두 더할 변수 선언
printf("학생 수 입력:");
scanf("%d", &num);
while (a<num){
a ++;
printf("학생%d의 점수 입력:", a);
scanf("%d", &score);
total = total+score;
}
double avg;
avg = (double)total/(double)num;
printf("평균 점수: %.2lf", avg);
return 0;
}
형식은 while(조건){실행문}이다. 여기서 (조건)부분에 (1)을 넣으면 1이 True라는 의미로, 특정 조건 전에는 무한히 반복한다는 뜻이다. 이 부분은 아래 break와 continue부분에 있으니, 일단은 이런게 있구나~만 알고 넘어가자.
while을 통하여 반복될 범위(학생 수)를 정해주고, 그 동안 a를 1씩 증가시킨다. 이렇게 증가된 a가 학생 수 보다 많을 때, 즉 학생 수만큼 점수를 받았다면 더한 점수를 학생 수만큼 나누어서 평균 점수를 만들어준다.
2) for문을 이용하여 평균점수 구하는 코드:
#include <stdio.h>
int main(){
int num,score; //num: 학생 수, score: 점수
int total = 0; //점수들을 모두 더할 변수 선언
printf("학생 수 입력:");
scanf("%d", &num);
for (int a = 0; a<num; a++){
printf("학생%d의 점수 입력:", a+1);
scanf("%d", &score);
total = total+score;
}
double avg;
avg = (double)total/(double)num;
printf("평균 점수: %.2lf", avg);
return 0;
}
for문의 형식은 'for (초기식, 조건식, 증감식) {실행할 구문}'이다.
여기서 while문과 다른 점으로 printf("학생 %d의 점수 입력:", a+1)을 찾았다면 상당히 관찰력이 좋다고 할 수 있다. 원래 a = 0부터 시작했으므로, 만약 a+1이 아니라 a로 썼다면 가장 먼저 "학생 0의 점수 입력"이 출력된다.
그러나 while문에서는 a++를 먼저 해주고, 다음에 a를 사용했기 때문에 '학생 0'이 아니라 '학생 1'로 출력된다. 시작이 헷깔리지 않게 주의하자.
여기서 for문은 몇 가지 주의사항이 있다:
1. 초기식, 조건식, 증감식은 반복횟수를 알기 쉽게 작성하자.
for (i = 0; i < 5; i++)나 for (i = 3; i < 8; i++)나 for (i = 0; i < 10; i+=2)은 모두 같은 작용을 한다. 그러나 서술 방식에 따라 같은 내용도 혼란을 줄 수 있으므로, 가장 이해하기 쉬운 방법을 사용하자. 위의 예시 중 가장 널리 쓰이는 방법은 당연히 첫 번째 예시다.
2. 반복 횟수를 세는 변수를 반복문 안에서 바꾸지 말자.
for (i = 0; i < 5; i++)에서 i를 최대한 중괄호 안에서 증감시키지 말자. 참고로 위에 a+1은 증가 시키긴 하나, 그 값이 a에 반영되는 것이 아니므로 괜찮고, 자주 쓰이는 방법이다. 그러나 만약 a= a+1, a++가 중괄호 안에 있다면 이건 지양해야 할 점이며, 차라리 변수가 많이 쓰이더라도 다른 변수를 하나 더 만들자.
3) do~while문
do~while문의 핵심은 일단 실행하고 다음에 조건을 알아보자이다.
예를 들어, 휴대폰을 잃어버렸을 때 잃어버린 곳이 확실히 거실 안이라면 의사코드(문법을 맞춘 건 아니지만, 읽기 쉬운 코드)로
while (room = "거실")
search(휴대폰)
으로 나타낼 수 있다. 그러나 도저히 어디에서 잃어버렸는지 모르겠다면, 일단 모든 곳을 찾아봐야 한다. 이럴 때 do ~while문을 이용하고, 의사코드는 다음과 같다.
do{
search
}
while (휴대폰 not found){
buy new 휴대폰};
이렇게 일단 search를 실행하고, 찾을 수 없다면 새 휴대폰을 찾는 매커니즘이다.
break와 continue
위에 switch문을 보면, break;가 계속 등장하는 것을 볼 수 있다. break문은 무엇일까? 겸사겸사 continue도 같이 알아보자.
구문 | 사용처 | 의미 |
break | 반복문 안에서 반복 즉시 끝낼 때 | 반복문을 부수고 나가겠다 |
continue | 반복문의 끝으로 이동 후 다시 반복한다. | 내가 있는 부분은 뛰어넘고 계속 가라(continue) |
말로만 하면 이해가 잘 안되니 역시 예시코드로 알아보자.
#include <stdio.h>
int main(){
int total = 0; //총 더한 값을 넣을 변수 선언
for (int i = 1; i<=20; i++){
total += i; //
if(total>10){ //만약 더한 값이 10을 넘어가면
break; //반복문을 부수고 끝내라
}
}
printf("누적한 값: %d\n", total);
printf("마지막으로 더한 값: %d", i);
return 0;
}
//결과:
//누적한 값: 15
//마지막으로 더한 값: 5
위 코드를 보면, i를 for의 매개변수로 20까지 반복하려 했지만 마지막으로 더한 값은 5에서 끝나버린다. 그 이유는 조건에
break; 즉 특정 조건(지금까지 더한 값이 10을 넘는다)을 가 있어서, i 값이 20이 되지 않아도 마지막으로 total이 10이 넘었기 때문에 반복문에서 탈출한 것이다.
continue문도 예시를 통해 알아보자.
#include <stdio.h>
int main(){
int sum = 0;
for (int i = 1; i<= 20; i++){
if ((i%3) == 0){ //만약 i가 3의 배수라면
continue; //아래에 있는 sum +=i를 실행하지 말고 반복문 끝으로 이동해라
}
sum +=i;
}
printf("3배수를 제외한 20이하 숫자들의 합계: %d", sum);
return 0;
}
//3배수를 제외한 20이하 숫자들의 합계: 147
간단히 설명하자면, i%3==0, 즉 i의 나머지가 0이면(i가 3의 배수이면) for문 안에 있는 sum += i는 실행하지 않고 넘어가게 된다.
3주차 기본미션: 혼공C 용어노트 활용하기
3주차 추가미션: p.123 크리스마스 소개팅 예문 if문 실행화면 캡처
참고로 코드는 다음과 같다:
#include <stdio.h>
int main() {
int Girlfriend;
int Christmas;
printf("오늘은 크리스마스인가요?: 맞으면 1, 틀리면 0 입력: ");
scanf_s("%d", &Christmas); //visual stdio에서 _CRT_SECURE_NO_WARNINGS 오류가 발생하는 것을 방지하기 위해 사용
//scanf와 의미 자체는 같다.
printf("여자친구가 있나요?: 맞으면 1, 틀리면 0 입력: ");
scanf_s("%d", &Girlfriend);
if (Girlfriend == 0 && Christmas == 1) {
printf("친구가 소개팅을 주선해 준다\n");
}
else {
printf("친구가 소개팅을 주선해주지 않는다.\n"); //소개해주면 큰일난다.
}
return 0;
이상으로 3주차도 완료했다!
'혼공학습단 C' 카테고리의 다른 글
C언어 W5(8강 배열) (0) | 2023.08.08 |
---|---|
C언어 W4(7강 함수) (0) | 2023.07.24 |
C언어 W2-2(4강) (0) | 2023.07.13 |
C언어 W2-1 (3강) (0) | 2023.07.11 |
혼공학습단 10기 C언어 W1 (0) | 2023.07.06 |