글
어제 이어서...
[난수 생성 함수]
- 난수 생성 함수
함수를 호출할 때마다 임의의 숫자를 생성하여 반환하는 함수
임의의 데이터를 필요로 할 때에 유용
- 난수생성함수 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
#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;
}