7장 [쉽게 풀어쓰는 c언어 express]
SW융합코딩
강의를 수강하며 네이버 블로그에 기록해 두었다. 그게 벌써 작년이라니 🥲
시간은 순식간에 흘러가는데 내 실력은 왜 … 🤦♀️
네이버 블로그 글들 중 조회수가 유난히 많은 글들을 옮겨놓으려고 한다. 그 중에서도 조회수가 1500이 넘은 이 글부터 옮기기…
🐬 do while 문
적어도 한 번은 무조건 실행하고, while의 조건이 참이라면 do 안의 문장들을 반복한다.
do{
문장1;
문장2;
...
} while (조건);
# 예제 1 : 사용자가 0을 입력할 때 까지 숫자를 더한다.
#include <stdio.h>
int main(){
int number, sum = 0;
do{
printf("정수를 입력하시오.: ");
scanf("%d", &number);
sum += number;
} while(number != 0);
printf("입력받은 숫자 합 = %d\n", sum);
return 0;
}
_# 예제 2_ : do while 문을 이용한 메뉴 구성
#include <stdio.h>
int main(){
int i = 0;
do {
printf("1--- 새로만들기\n");
printf("2--- 파일열기\n");
printf("3--- 파일닫기\n");
printf("하나를 선택하시오.\n");
scanf("%d", &i);
} while(i < 1 || i > 3);
printf("선택된 메뉴 = %d\n", i);
return 0;
}
# lab : 숫자 추측 게임
프로그램이 가지고 있는 정수를 사용자가 맞추는 게임. (up down게임)
#include <stdio.h>
int main(){
int answer = 59;
int guess;
int tries = 0;
do {
printf("number? ");
scanf("%d", &guess);
tries++;
if(guess > answer)
printf("down\n");
if(guess < answer)
printf("up\n");
} while (guess != answer);
printf("correct! tires: %d\n", tries);
return 0;
# 도전문제!
위의 프로그램이 게임이 되려면 난수를 발생시키는 것이 좋다. 난수는 (rand()%100)으로 발생이 가능하다. stdlib.h 헤더 파일도 포함시켜야 한다.
를 위한 난수 생성의 개념과 적용 👇
🐳 난수 생성
-
라이브러리 함수를 이용한 난수 생성
-
주어진 범위 안에서 난수 생성
-
실수형 난수의 생성
난수(random number): 특정한 배열순서나 규칙을 가지지않는, 연속적인 임의의 수 (로또복권 당첨번호)
난수는 주로 컴퓨터 게임이나 모의실험(simulation)에 사용 됨.
- 라이브러리 함수를 이용한 난수 생성
rand라는 라이브러리 함수를 사용.
함수 rand는 0 <= rand() <= 32767 범위 내에서 임의의 정수 난수 한 개를 반환
난수와 관련된 라이브러리 함수
함수 원형 | 사용 | 반환 값 | 컴파일러 |
---|---|---|---|
int rand(void); | 난수 생성 | 0~32767사이의 정수 | visual c++, turbo c/c++ |
void srand (unsigned int seed); | 난수 초기화 | 없음 | visual c++, turbo c/c++ |
void randomize (void); | 난수 초기화 | 없음 | turbo c/c++ |
매 실행마다 다른 난수를 생성하려면 함수 srand의 인수를 실행마다 다르게 설정해야 하는데 이때 현재의 시간값을 이용. 시간은 함수 time을 이용.
# 예시
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i;
srand(time(NULL));
for(i = 1; i <= 10; i++){
printf("%2d: %d\n", i, rand());
}
return 0;
}
- 범위 내의 난수 생성
로또 복권과 같이 1부터 45사이 또는 0부터 99사이와 같이 특정한 범위(구간) 내에서의 난수를 생성하는 방법.
특정한 범위
내의 정수 난수를 생성하려면 함수 rand
에 대해 아래와 같이 나머지 연산자 %
와 덧셈
또는 뺄셈을 적절히 사용.
|정수 난수 생성범위|프로그램 연산식|설명|
|-----|-------|----|
|1 <= 정수난수 <= 6|rand()%6 + 1;|6으로 나눈 나머지 값의 범위는 05인데 이 값에 1을 더하므로 16 사이의 난수 생성.|
|1 <= 정수난수 <= 45|rand()%45 + 1;|45로 나눈 나머지 값의 범위는 044인데 이 값에 1을 더하므로 145 사이의 난수 생성.|
|0 <= 정수난수 <= 99|rand()%100;|100으로 나눈 나머지 값의 범위는 099이므로 099 사이의 난수 생성.|
|10 <= 정수난수 <= 30|rand()%21 + 10;|21으로 나눈 나머지 값의 범위는 020인데 이 값에 10을 더하므로 1030 사이의 난수 생성.|
|-5 <= 정수난수 <= +5|rand()%11 - 5;|11으로 나눈 나머지 값의 범위는 010인데 이 값에 5을 감해주면 -5+5 사이의 난수 생성.|
# 예시 : 주사위 10번 던져서 나온 눈금의 출력.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i;
srand(time(NULL));
for(i = 1; i<= 10; i++){
printf("%2d: %d\n", i, rand()%6+1);
}
return 0;
}
# 출력값1
1: 4
2: 5
3: 3
4: 1
5: 4
6: 6
7: 4
8: 4
9: 3
10: 5
# 출력값2
1: 1
2: 3
3: 3
4: 2
5: 6
6: 1
7: 4
8: 6
9: 3
10: 5
이처럼, 매번 다른 값으로 출력이 됩니다.
- 실수형 난수의 생성
함수 rand 는 int형 함수
0 이상 32767(RAND_MAX)이하의 정수 난수를 생성.
0이상 1이하의 실수 난수를 생성해야 한다면 RAND_MAX를 이용하여 나눗셈 연산으로 처리.
0 <= rand() <= 32767 👉 0 <= rand()/RAND_MAX <= 1
RAND_MAX도 정수형이므로 실제 프로그램에서는 cast 연산자를 이용하여 명시적 형변환을 사용해야 함.
# 예시
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i;
double rnd;
srand(time(NULL));
for(i =1; i<= 5; i++){
rnd = rand()/(double)RAND_MAX;
printf("%6.4f\n", rnd);
}
return 0;
}
# 난수발생
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int x, y, answer, i;
srand(time(NULL));
for(i = 0; i < 10; i++){
x = rand()%10;
y = rand()%10;
printf("%d + %d =", x, y);
scanf("%d", &answer);
if(x + y == answer){
printf("correct!\n");
}
else {
printf("no.......\n");
}
return 0;
}
}
🌊 도전문제
- 위의 프로그램이 게임이 되려면 난수를 발생시키는 것이 좋다. 난수는 (rand()%100)으로 발생이 가능하다. stdlib.h 헤더 파일도 포함시켜야 한다.
// number game
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(NULL));
int answer = (rand()%100 + 1);
int guess;
int tries = 0;
do {
printf("number? ");
scanf("%d", &guess);
tries++;
if(guess > answer)
printf("down\n");
if(guess < answer)
printf("up\n");
} while (guess != answer);
printf("correct! tries: %d\n", tries);
return 0;
}
# 출력값
number? 50
down
number? 25
up
number? 46
down
number? 36
down
number? 29
correct! tries: 5
이 글의 원문
으로!👇