# 기본과제 및 제출 양식
1. 무작위의 수를 출력하는 프로그램을 만드시오. https://reakwon.tistory.com/63 를 참조하시오. (1시간 소요)
가. stdlib.h 를 include 하시오
나. rand(); 를 int형 변수에 담아 출력하여 프로그램을 실행해보시오. 0~32767 사이의 수 중 하나가 뽑히게 됨을 확인하시오.
다. 프로그램을 종료 후 다시 실행해 보시오. 아까 나왔던 수가 다시 나오고, rand()값이 갱신되지 않음을 확인하시오
: 계속 41이 나오게 된다.
라. '다'의 문제점을 해결하기 위해 time.h 를 include하고 rand()함수 호출 직전에
srand(time(NULL)) 을 삽입하시오. 또한 이를 암기하시오.
마. '라'에서 만든 프로그램을 실행하여 0~32767 사이의 수 중 하나가 뽑히게 됨을 확인하시오.
바. 프로그램을 종료 후 다시 실행해 보시오. 아까 나왔던 수가 아닌 임의의 새로운 수가 뽑혀짐을 확인하시오.
사. srand(time(NULL))를 삽입하면 임의의 수를 뽑을때마다 새로운 수가 뽑히는 이유를 50자 이내로 설명해보시오.
rand함수는 srand함수에 의존적. srand의 s는 seed라는 뜻으로 이 seed값에 따라 rand의 값이 바뀌게 됩니다. srand는 rand함수와 같이 stdlib.h 헤더파일에 존재함.
따라서 srand(1) 이나 srand(2) 로 seed 를 다르게 주면 새로운 수가 뽑히게 되지만, srand(1) 에서 뽑힌 수는 프로그램을 다시 시작하지 않는 한 계속 같은 값이 나오게 된다. 따라서 seed를 매번 변화시키기 위해 time() 함수를 사용하게 된다.
2. 무작위의 수를 뽑는 방법을 적절히 편집하여 보시오. (1시간 소요)
가. 1번 문항이 해결된 상태에서, rand() 값을 %100 으로 나눈 나머지를 구하면 0~99 사이의 수가 뽑혀짐을 확인하시오. % 연산자를 통해 뽑을 수의 범위를 결정할 수 있음을 확인하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
for (int i = 1; i <= 10; i++)
{
printf("%d\n", rand()%100);
}
return 0;
}
나. '가' 문항이 해결된 상태에서, 뽑은 난수에 -50을 하면 -50~49 사이의 수가 뽑혀짐을 확인하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
for (int i = 1; i <= 10; i++)
{
printf("%d\n", rand() % 100 - 50);
}
return 0;
}
다. '가' 문항이 해결된 상태에서, 뽑은 난수를 double로 캐스팅 후 100으로 나누면 0~1 사이의 수가 0.01 단위로 뽑혀짐을 확인하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
for (int i = 1; i <= 10; i++)
{
printf("%.2lf\n", double(rand() % 100) / 100);
}
return 0;
}
라. -1~1 사이의 수를 0.001 단위로 뽑아보시오. 10개를 동시에 뽑아보시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
for (int i = 1; i <= 10; i++)
{
printf("%.3lf\n", double(rand() % 2001 - 1000) / 1000);
}
return 0;
}
3. 가위바위보 게임을 만드시오. (2시간 소요)
가. 가위(0), 바위(1), 보(2) 중 사용자의 입력을 scanf로 받으시오.
나. 가위(0), 바위(1), 보(2) 중 컴퓨터의 임의 출력을 만드시오.
다. 사용자:가위 컴퓨터:바위, 사용자:바위 컴퓨터:보, 사용자:보 컴퓨터:가위 이면 컴퓨터의 승리를 출력하시오.
라. 사용자:바위 컴퓨터:가위, 사용자:보 컴퓨터:바위, 사용자:가위 컴퓨터:보 이면 사용자의 승리를 출력하시오.
마. 사용자와 컴퓨터의 입력이 같으면 비겼다를 출력하고, '가'로 돌아가 새로운 입력을 받은 후 승부가 날 때 까지 새 입력을 받도록 하시오. while 문을 이용하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#pragma warning (disable:4996)
int main()
{
int userRSP, comRSP;
srand(time(NULL));
printf("ㅡㅡㅡ가위 바위 보 게임ㅡㅡㅡ\n");
do
{
printf("가위(0) 바위(1) 보(2) 중 임의의 숫자를 입력하세요: ");
scanf("%d", &userRSP);
comRSP = rand() % 3;
if ((userRSP == 0 && comRSP == 2) || (userRSP == 1 && comRSP == 0) || (userRSP == 2 && comRSP == 1))
{
printf("사용자 : %d 컴퓨터 : %d 사용자 승리\n", userRSP, comRSP);
}
else if ((userRSP == 0 && comRSP == 1) || (userRSP == 1 && comRSP == 2) || (userRSP == 2 && comRSP == 0))
{
printf("사용자 : %d 컴퓨터 : %d 컴퓨터 승리\n", userRSP, comRSP);
}
else
printf("비겼습니다. 다시\n");
} while (userRSP == comRSP);
return 0;
}
# 심화과제 제출 양식( 안해도 됨 )
1. 이차함수 x2+2x+3 최소값을 구하시오.
가. 랜덤워크 방식에 대해 조사하고 50자 이내로 정리해 보시오.
: 어떤 공간에서 매 순간 확률적으로 이동하는 모습을 수학적으로 표현한 것이며 확률론이 발전하면서 무작위로 움직이는 거의 대부분의 것들을 설명하는데 사용되는 이론이다.
나. -2~2 사이에서 0.001단위로 난수를 만드시오.
다. 만든 난수값을 이차함수에 넣으시오. 이차함수의 값을 받아놓으시오.
라. -2~2 사이에서 0.001단위로 새 난수를 만드시오.
마. 만든 난수값에 의한 이차함수의 값이 더 작아졌는지 확인하고, 더 작아졌다면 값을 저장하고 그렇지 않으면 새 난수를 만들어 값을 확인하시오.
바. '마'를 100번 수행한 후 해를 구하여 보시오. 실행할때마다 결과가 다르므로 여러번 확인하시오. 수기로 구한 값과 오차를 비교하여 보시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
double diff(double x) {
double y1;
y1 = pow(x, 2) + 2 * x + 3;
return y1;
}
int main()
{
double x = 0;
double y = diff(x);
double tempx=x; double tempy=y; // 초기의 x,y값 임시 변수에 저장
srand(time(NULL));
for (int i = 0; i < 100; i++) {
double x = double(rand() % 4001 - 2000) / 1000;
double y = diff(x);
if (tempy >= y){ // 새로 구해진 y가 초기 y보다 작으면
tempx = x; // 그때의 x,y값으로 새로 초기화
tempy = y;
}
printf("%.4lf %.4lf\n", tempx, tempy);
}
return 0;
}
수기 : (-1, 2)에서 최솟값을 가진다.
2. rand는 0~32767 까지밖에 나오지 않는다. 32767 이상의 난수를 뽑기 위하여 다음의 항목을 구현해보시오.
rand()를 %2로 나눈 나머지를 구하여, 나머지가 0이면 rand를 그대로 사용하고, 나머지가 1이면 32767+rand를 구하여 int형 변수에 넣으시오. 이렇게 하면 0~65535까지의 난수를 구할 수 있음을 확인하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main()
{
srand(time(NULL));
int x, y;
for (int i = 0; i < 10; i++) {
x = rand() % 2;
y = 32768 * x + rand();
printf("%d\n", y);
}
return 0;
}
또, rand()를 %3으로 나눈 나머지를 구하여, 나머지가 0이면 rand를 그대로 사용하고, 나머지가 1이면 32767+rand를 구하고, 나머지가2이면 65535+rand를 int형 변수에 넣으시오. 이렇게 하면 0~98303까지의 난수를 구할 수 있음을 확인하시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main()
{
srand(time(NULL));
int x, y;
for (int i = 0; i < 10; i++) {
x = rand() % 3;
y = 32768 * x + rand();
printf("%d\n", y);
}
return 0;
}
위의 아이디어를 활용하여 0 ~ 3276800-1 사이의 난수를 뽑아주는 프로그램을 구현하고, 10개의 난수를 뽑아보시오.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main()
{
srand(time(NULL));
int x, y;
for (int i = 0; i < 10; i++) {
x = rand() % 100;
y = 32768 * x + rand();
printf("%d\n", y);
}
return 0;
}
'프로그래밍 > C' 카테고리의 다른 글
C언어 12주차 과제 (0) | 2020.12.16 |
---|---|
C언어 11주차 과제 (1) | 2020.12.12 |
C언어 9주차 과제 (0) | 2020.11.30 |
C언어 8주차 과제 (0) | 2020.11.22 |
C언어 7주차 과제 (0) | 2020.11.11 |