어제 이어서...
[난수 생성 함수]
- 난수 생성 함수
  함수를 호출할 때마다 임의의 숫자를 생성하여 반환하는 함수
  임의의 데이터를 필요로 할 때에 유용
- 난수생성함수 rand()
  #include <stdlib.h>
   ...
   i = rand();                       .... 0부터 RAND_MAX 사이의 임의의 정수 반환
                                             (RAND_MAX는 32767 또는 더 큰 정수로 디폴트)
   i = rand() % N + 1 .....  1부터 N사이의 정수 난수 생성
   d = (double)rand() / (RAND_MAX + 1)    ... 0과 1사이의 실수 난수 생성
- 난수생성 초기화 함수 srand()
   #include <stdlib.h>
   #include <time.h>
    ...
   srand(seed)       ..... 난수생성함수 seed 값 지정
   srand(time(NULL))  .... 현재시간을 seed 값으로 사용

   예제
   #include <stdio.h>
   #include <stdlib.h>
   #include <time.h>

   int main(void)
   {
      int a,b,c;
      double x,y,z;
     
      srand(time(NULL));

      a = rand();
      b = rand();
      c = rand();
      printf("%d %d %d\n", a,b,c);

      a = 1 + rand() % 100;
      b = 1 + rand() % 100;
      c = 1 + rand() % 100;
      printf("%d %d %d\n", a,b,c);

      x = (double)rand() / (RAND_MAX + 1);
      y = (double)rand() / (RAND_MAX + 1);
      z = (double)rand() / (RAND_MAX + 1);
      printf("%g %g %g\n", x,y,z);

      return 0;
    }
==== run ====
14478 16323 23275
91 49 35
0.501465 0.452911 0.260132
=============
※ 실행시킬때마다 늘 새로운 값이 나오는 것을 확인하였다.
=====================================================


4. 제어문: 인위적으로 프로그램을 내가 컨트롤 하겠다.
    선택문: if문, if-else문, switch문
    반복문: while문, for문, do-while문
    연산자: 관계 연산자와 논리 연산자, 증감 연산자, 복합치환연산자, 컴마연산자
    분기문: break, continue, goto

[문장과 실행 순서]
- 문장
   단문: 수식 한 줄 (한 줄의 소스코드, 명령문)
   제어문: 프로그램의 실행순서를 제어
   복합문: 단문들을 여러개로 묶은 단위. 문법적으로는 한 문장으로 취급({ }로 묶음)
- 문장의 실행순서
   기본적으로 순차적으로 수행 (위에서 아래로, 좌에서 우로)
   제어문을 사용하면 순차적인 흐름을 바꿀수도 있다. (선택실행 또는 반복실행 가능)

[if 문]
- if (조건식)  ....조건식이 참일때만
  문장               문장을 실행 (거짓일때는 문장을 생략하고 넘어감)

- 복합문을 사용한 if문 ....조건식이 단문이 아니라면 { }로 묶어서 복합문으로 사용
   if (조건식) {
   문장
   문장
    ...
   }

[관계 연산자]
- 조건식과 연산자
   조건식은 대개 값들의 비교로 이루어짐
   값의 비교에 관계 연산자논리 연산자가 주로 사용됨

- 관계 연산자
   연산자      의미                  예
   >             크다                  x > 100
   <             작다                  y < 0
   >=            크거나 같다       a >= b
   <=            작거나 같다       a <= 500.0
   ==            같다                  c == 'y'
   !=             같지 않다           c != EOF (cf. End of File)

[C언어에서의 참, 거짓]
- C언어에서의 참, 거짓
  nonzero 수식   -> 참
  zero 수식        -> 거짓
  ※ 0이면 거짓, 이외에는 무슨 값이든 참

- 관계 연산 수식의 값
   참이면 1
   거짓이면 0

   printf("%d %d \n", 100 > 50, 100 < 50);

- 조건식으로 임의의 수식을 사용할 수 있음
   1. if (a)                         .... a가 0이 아니면 (참이면)
      printf("nonzero\n");    .... 출력
   2. if (a = 5)                    .... 수식 a = 5 의 값은 5이므로 항상 참
      printf("a is five\n");    .... (잘못된 예: =는 ==으로 고쳐야 함)
   수정. if (a == 5)
      printf("a is five\n");

[논리 연산자]
- 논리 연산자
   연산자       의미
   &&            논리곱(AND) - 두 피연산자가 모두 참일 때 결과가 참이다.
   ||             논리합(OR) - 두 피연산자 중 한 개 이상이 참일 때 결과가 참이다.
    !              부정(NOT) - 피연산자의 참, 거짓 값의 반대 결과를 제공한다.

- 연산자 우선 순위 (외워라..)
   1. 괄호
   2. 단항연산자
   3. 곱셈, 나눗셈
   4. 덧셈, 뺄셈
   5. 관계연산자   >  >=  <  <=
   6. 동등연산자   ==  !=
   7. 논리곱         &&
   8. 논리합         ||
   9. 치환연산자

예제
  a가 0이상, 100미만이다.                      a>=0 && a<100
  a가 0미만이거나 100이상이다.              a<0 || a>=100
  x.y.z 중이서 x가 가장 작은 수이다.       z <= y && x <= z
  a와 b의 합이 c와 d의 차보다 작다         a + b < c - d

  if ( a >= 0 && a < 100)
  print("a is between 0 and 100\n");

예제2: 문자 c가 영문자가 아니면 에러메시지 출력
  if( ! ( c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') )
  printf("c is not alphabet\n");
      또는
  if( ! ( c >= 'A' && c <= 'Z') && ! (c >= 'a' && x <= 'z') )
  printf("c is not alphabet\n");

[논리 연산의 단축평가]
  나머지 수식의 결과에 관계없이 연산 결과를 알 수 있을 때에 나머지 수식의 평가를 하지 않는다.

   수식1 && 수식2    -> 수식1이 거짓이면 (수식2에 관계없이) 연산결과가 거짓
   수식1 || 수식2     -> 수식1이 참이면 (수식2에 관계없이) 연산 결과가 참

    if (a! = 0 && b / a >10)  --> a가 0이 아닐때만 b/a >10을 계산한다.

[if - else 문]
- if (조건식)
  문장1     .... 참일 때 수행
  else
  문장2     .... 거짓일 때 수행

- y를 x로 나눈 몫을 출력
  if(x==0)
     printf("0으로 나눌 수 없습니다.\n);
  else
     printf("몫 = %d\n", y/x);

[조건 연산자]
- 조건 연산자: ? :        .... 조건식이 참이냐?
   조건식 ? 수식1 : 수식2      .... 참이면 수식1 선택, 거짓이면 수식2 선택
   3항 연산자: 피연산자가 3개
   조건식: 참    -> 수식값 = 수식1
   조건식: 거짓 -> 수식값 = 수식2

- 두 수의 a, b의 최대값을 max에 저장
   1. max = (a > b)? a : b;
   2. (a>b)?(max = a) : (max = b);   .... 뒤의 두 관호는 반드시 필요함
   3. if (a > b)
         max = a;
       else
         max = b;
※ 조건식을 주고 if-else로 바꾸거나 반대인 경우 모두 할 수 있어야 한다.

예제: 연도를 입력 받아서 평년과 윤년을 판단하는 프로그램
       (윤년: 4로 나누어지고 100으로 나누어지지 않는 연도 / 400으로 나누어지는 연도)

#include <stdio.h>

int main(void)
{
   int year;
   int isleep;

   printf("연도는 ? ");
   scanf("%d",&year);
   isleep = (year%4==0 && year%100 !=0) || (year % 400 == 0);
   if(isleep)
      printf("%d년은 윤년입니다. \n", year);
   else
      printf("%d년은 평년입니다. \n", year);
}
=== run ===
연도는 ? 2006(enter)
2006년은 평년입니다.
===========
연도는 ? 2004(enter)
2004년은 윤년입니다.
===========

[중첩된 if문]
- 중첩된 if문
   if와 else의 목표문으로 if 또는 if-else문을 사용한 것

- 예) 변수 a, b의 부호에 따라서 다음 표와 같이 출력
   a       b       출력
   a>=0  b>=0  Group1
   a>=0  b<0    Group2
   a<0    b>=0  Group3
   a<0    b<0    Group4

   if (a >= 0) {
      if ( b >= 0) printf("Group1\n");
      else printf("Group2\n);
   } else {
      if ( b >= 0) printf("Group3\n");
      else printf("Group4\n");
   }

[중첩된 if문 - 다단계 if문]
- 다단계 if문
  if (조건식)
     문장1
  else if (조건식2)
     문장2
      ......
  else if (조건식n)
     문장n
  else
     문장 n+1

예제: 점수에 따른 등급 부여
        (A: 90점 이상, B: 80점 이상, C: 70점대, D: 60점대, F: 60점 미만)

int score    /*점수*/
int grade    /*등급*/
   ...
if(score >= 90) grade = 'A';
else if(score >= 80) grade = 'B';
else if(score >= 70) grade = 'C';
else if(score >= 60) grade = 'D';
else grade ='F';

프로그램으로 만들기
-------------------

#include <stdio.h>

int main(void)
{
 int score;
 char grade;

 printf("점수를 입력하시오 ex)최대값 100 :");
 scanf("%d",&score);

 if (score >= 90) grade = 'A';
 else if (score >= 80) grade = 'B';
 else if (score >= 70) grade = 'C';
 else if (score >= 60) grade = 'D';
 else grade = 'F';

 printf("당신의 학점은 %c 입니다.",grade);

 return 0;
}
=== run ===
점수를 입력하시오 ex) 최대값 100 :0(enter)
당신의 학점은 F 입니다.
===========

[switch 문]
- switch (정수식)   .... 정수식의 값에 따라 선택 실행
  {
      case 값1 : 문장1; ...
                      break;                .... break: switch문 종료 / break가 없으면 다음 문장 실행
      case 값2 : 문장2; ...
                      break;
            .....
      case 값n : 문장n; ...
                      break;
      default : 문장 n+1; ...
   }

   정수식 값에 해당하는 case의 문장부터 실행
   해당하는 case가 없으면 default의 문장부터 실행

예제: 점수에 따른 등급부여

switch(score / 10)
{
    case 10:                  ..... break가 없으므로 다음 문장을 실행
    case 9: grade = 'A'; break;
    case 8: grade = 'B'; break;
    case 7: grade = 'C'; break;
    case 6: grade = 'D'; break;
    default: grade = 'F';   ..... 밑에 아무것도 없기에 break를 안써도 됨
}
※ break를 하나도 안썼다면, 모든 학점은 F다.

프로그램으로 만들기
-------------------
#include <stdio.h>

int main(void)
{
 int score;
 char grade;

 printf("점수를 입력하세요 :");
 scanf("%d",&score);

 switch (score/10)
 {
 case 10:
 case 9: grade = 'A';
  break;
 case 8: grade = 'B';
  break;
 case 7: grade = 'C';
  break;
 case 6: grade = 'D';
  break;
 default: grade = 'F';
 }

 printf("학점은 %c 입니다.\n", grade);
 return 0;
}
=== run ===
점수를 입력하세요 :79(enter)
학점은 C 입니다.
===========

더 배워보기

switch(ch)                  -> 문자로 지정하면..
{
    case 'A': .....           -> '  ' 붙여야 인식
    case 'B': .....
}

예제: 소득에 따른 세금 계산

사용자 삽입 이미지



실습시간
문제 1
 
srand 함수와 time 함수를 사용하여 rand함수의 seed 값을 지정하고 1에서 10사이의 정수 난수 5개를 생성하여 출력하는 프로그램을 작성하시오. 프로그램을 여러 실행하여 결과를 비교해 보시오


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 int a,b,c,d,e;

 srand(time(NULL));

 a = 1 + rand()%10;
 b = 1 + rand()%10;
 c = 1 + rand()%10;
 d = 1 + rand()%10;
 e = 1 + rand()%10;

 printf("%d %d %d %d %d", a,b,c,d,e);

 return 0;
}

사용자 삽입 이미지

#include <stdio.h>
#include <math.h>

int main(void)
{
 int a,b,c,d;
 double x,y,z;

 printf("계수 a를 입력하세요(단, a는 0이 아님) :");
 scanf("%d",&a);
 printf("계수 b를 입력하세요 :");
 scanf("%d",&b);
 printf("계수 c를 입력하세요 :");
 scanf("%d",&c);

 d=b*b-4*a*c;

  if(d>0)
  {
   x=(-b+sqrt(d))/(2*a);
   y=(-b-sqrt(d))/(2*a);
   printf("근은 %f와 %f 이다.",x,y);
  }
  else if(d<0)
  {
   x=-(b/(2*a));
   z=+(sqrt(-d)/(2*a));
   y=-(b/(2*a));
   printf("근은 %f+%fi와 %f-%fi이다.", x,z,y,z);
  }
  else
  {
   y=-b/(2*a);
   x=y;
   printf("근 x와 y는 각각 %f, %f 이다.", x,y);
  }
 return 0;
}

by Joe & Soohy 2006. 12. 29. 09:52