5 - If

<학습하기>

MIPS = Million Instruction Per Seconds

1MIPS : 1초에 100만개의 명령어를 처리할 수 있는 컴퓨터.


제어문

일반적인 프로그램 흐름은 위에서 아래로 일직선으로 진행하는 형태이다.

그런 프로그램의 흐름을 제어해서 어떤 명령을 반복해서 실행하거나,

조건에 따라 다른 방향으로 흐르도록 하는 것을 제어문이라 한다.


1.반복문 : 특정한 명령을 반복해서 실행하도록 하는 명령어.

while, do-while, for


2.분기문 : 조건에 따라 다른 부분의 명령어들을 실행하도록 하는 명령어.

if, switch


반복문이든 분기문이든 프로그램의 제어는 블럭단위로 일어난다.


-if문

 형식

  if(조건식)

  {


    True블럭



  }


  조건식이 맞으면 [True블럭] 실행.

 맞지 않으면 [Ture블럭] 무시.


  조건식에 사용되는 연산자

  식A == 식B [식A]와 [식B]가 같으면 true, 다르면 false.

                  =가 하나면 우측을 계산해서 왼쪽에 넣으라는 의미.

  식A != 식B

  식A  > 식B

  식A >= 식B [식A]와 [식B]의 크기 비교

  식A  < 식B

  식A <= 식B

 주의 : C에서는 본질적으로 bool이란 데이터형이 없으므로 int로 대신한다.

         C에서는 정수식의 값이 0이면 false, 0이 아니면 true로 판단한다.


  ex) if(1+2)

     {


   printf("1+2는 참이다\n");


      }


-if else문

 형식

  if(조건식)

  {

   True블럭

  }

  else
  {

   False블럭

  }


  [조건식]의 결과가 true면 [True블럭]실행

     flase면 [False블럭] 실행



-if else if else 문

 형식

  if(조건식A) [조건식A]의 결과가 참이면 [True블럭A]실행 후 다음 문장 실행.
여기서 다음 문장이라는것은 if 다음 문장을 의미한다.
  { 거짓이면 [조건식B] 계산.
True 블럭B [조건식B]의 결과가 참이면 [True블럭B]실행 후 다음 문장 실행.
  } 거짓이면 [조건식C] 계산.
  :
  : 만약 하나의 조건식이 참이면 그 이후의 모든 조건식은 무시된다.
  : 그러므로 맞을 가능성이 적은 조건문을 앞에 놓아야 한다.
  else [False블럭]이 필요 없다면 else부분은 생략할 수 있다.
  {
False 블럭
  }

블럭 안에 명령어가 단 하나라면, {}를 생략할 수 있다.




-switch문

형식

  switch(수식)
  {
   case 상수A: 여기서의 [수식]은 정수가 나오는 수식이어야 한다.
명령어A; [수식]의 결과와 [상수A], [상수B] 등을 비교해서
break; 일치하는 부분부터 실행.
   case 상수B: break문을 만나면 switch문 끝냄.
명령어B; 일치하는 상수가 없으면 default부분 실행
break;

   :
   :
   :
   default;
명령어;
  };

switch문에서 만약 break가 없으면 case문을 지나쳐 그냥 실행 될 수 있다.

ex)

  switch(varA)
  {
  case 0:
명령어1;    //varA가 0일 때만 실행해야하는 명령어.
명령어2;    //varA가 0일 경우는 명령어 3,4까지 실행해야 하므로 break를 뺐음.
  case 1:
명령어3;    //varA가 0이거나 1일 때 실행해야 하는 명령어.
명령어4;
break;
  :
  :
이 경우 varA == 1이라면 명령어 3,4가 실행되지만
varB == 0이라면 명령어 1,2,3,4가 실행된다.
그런데 varA == 0일 경우 명령어 1,2,3,4를 모두 실행해야 해서 일부러 break를 뺐다면,
보는 사람이 버그로 오인할 수 있으니 주석을 달아주자.
코멘트로 break을 확실하게 뺐다는 것을 알려주는 것이 좋다.


-논리 연산자에 대하여.
논리 연산자란 둘 이상의 논리값 (true, false)를 결합해서 하나의 논리값으로 만드는 연산자를 말한다.

&& : and연산자. 두 논리값이 모두 참일 경우에만 참이 된다.
ex)
if ( 늦잠을 잤다. && 1교시 수업이 있다.) // 늦잠을 잤고, 1교시 수업이 있을 때 택시를 타고 달려가겠지
택시를 타고 달려간다.

|| : or연산자. 두 논리값이 하나 이상만 참이면 참이 된다. (\에 같이 있는 기호.)
ex)
if(지갑에 돈이 있다. || 지갑에 카드가 있다.) //둘중에 하나만 있어도 밥을 살 수 있음.
밥을 산다.


<실습하기>

#include <stdio.h>
/*어느학교 전산과에서 c언어와 파이썬, 자바 시험을 보았다.
전산과 교수인 파스칼교수는 세 과목의 평균이 60점 이상인 학생들만 합격시키기로 했다.
뉴턴교수는 세 과목 평균이 60점 이상일 뿐 아니라 C언어 성적도 60점 이상인 학생들만 합격시키기로했다.
아인슈타인교수는 세 과목중 어느 한 과목만 80점 이상이면 합격시킨다.
이름과 각 과목 성적을 입력해서 학점(A~F)을 출력한 후 합격/불합격 여부를 출력하는 프로그램을 만들어라.*/
main()
{
//입력을 받을 변수 만들기
char name[20]; //한글 한글자는 char 두개에 해당
int cLang; //c언어 성적
int java;  //자바 성적
int python;//파이썬 성적
double avg;//평균 성적
char grade;

// 이름 입력하기
printf("이름을 입력해 주세요 : ");
gets(name);

//성적입력
printf("C언어와 자바, 파이썬 성적을 입력해주세요 : ");
scanf("%d %d %d", &cLang, &java, &python);


// 임시 출력
printf("%s님의 성적은 각각 %d, %d, %d점입니다.\n", name, cLang, java, python);

//평균 구하기
avg = (cLang + java + python) / 3.0; //캐스팅을 하기 싫으면 3으로 나누지말고 3.0으로 나누면 됨.


/*학점을 계산 if-esle-if
if(avg >= 90)
{
grade = 'A';
printf("%s님은 %c학점입니다. \n", name, grade);
   //이렇게 grade로 바꾸면 더 쉽게찌
}
else if(avg >= 80)

printf("%s님은 B학점입니다.\n", name);

else if(avg >= 70)

printf("%s님은 C학점입니다.\n", name);

else if(avg >= 60)

printf("%s님은 D학점입니다.\n", name);

else if(avg >= 50)

printf("%s님은 F학점입니다.\n", name);

*/


//switch 문을 통한 학점 계산

/*switch((int)avg)  //switch문에는 반드시 정수형만 사용가능.
{
case 100:
case 99:
case 98:
:
:
case 90:
grade = 'A';
break;
case 89:
case 88:
case 87:
:
grade='B';
break;

*/

//너무 힘드니까 나머지 변수 이용하자

switch ((int)avg / 10)
{
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
case 5:
grade = 'F';
break;

}

printf("%s님은 %c학점입니다.\n", name, grade);
 // 프린트는 스위치 블럭에서 빼서 쓰기.



//파스칼 교수에 대한 처리.
if(avg>=60) //avg가 60점일 때도 합격이므로 >=사용.
{
printf("%s님은 평균%f점으로 파스칼 교수에게 합격하셨습니다.\n", name, avg);
}
else
{
printf("%s님은 평균%f점으로 파스칼 교수에게 불합격하셨습니다.\n", name, avg);

}

//뉴턴 교수에 대한 처리. - 평균 60점 이상과 C언어성적.
if(avg >= 60 && cLang >= 60)
 // 두 조건을 모두 만족 시켰을 경우 합격.
{
printf("%s님은 평균%f점, C언어 %d점으로 뉴턴 교수에게 합격하셨습니다.\n", name, avg, cLang);
}
else
{
printf("%s님은 평균%f점, C언어 %d점으로 뉴턴 교수에게 불합격하셨습니다.\n", name, avg, cLang);

}


//아인슈타인 교수에 대한 처리
if(cLang >=80 || java >= 80 || python >= 80)
{
printf("%s님은 C언어 %d점, 자바%d점, 파이썬%d점으로 아인슈타인 교수에게 합격하셨습니다.\n", name, cLang, java, python);
}
else
{
printf("%s님은 C언어 %d점, 자바%d점, 파이썬%d점으로 아인슈타인 교수에게 불합격하셨습니다.\n", name, cLang, java, python);

}





}

















댓글

이 블로그의 인기 게시물

11 - Scanf

JAVA - Day3 - Scanner, if, if else

JAVA - Day5 - Array,Random