[사전캠프 7일차] 반복문 복습, Random 클래스
1. 오늘 학습 키워드
목표 1. 팩토리얼 계산을 할 수 있는 콘솔 프로그램 만들기
목표 2. 컴퓨터에서 임의로 숫자 하나를 정하고, 해당 숫자를 맞추는 게임 제작
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
2-1. 팩토리얼
팩토리얼. n! 의 형태를 말한다. n부터 1까지의 모든 수를 곱하라는 수식이다.
오늘은 우선 반복문을 이용해 팩토리얼을 계산하는 코드를 만들어 볼 것이다. 일종의 팩토리얼 계산 전용 계산기이다.
코드 1
Console.WriteLine("팩토리얼을 계산할 숫자를 입력해주세요.");
string xs = Console.ReadLine();
int x; //입력한 수를 정수로 형변환할 값을 x로 지정.
bool xb = int.TryParse(xs, out x); // xs: 입력한 값을 x로 지정.
for문
int fac; //이후 for문 밖에서 결과값을 출력하기 위해, int fac을 미리 지정해둠.
for (fac = 1; x > 0; x--) //초기 fac값을 1로 두고, x는 0초과여야 하며, x를 계속 1씩 감소 시킨다.
{
fac = fac * x;
}
while 문
int fac = 1; //팩토리얼로 계산될 값을 fac으로 지정. 초기값은 1로 하여 x를 곱했을 때 fac=x가 되도록 함
while (x > 0)
{
fac = fac * x;
x--; //곱해주는 수, x가 반복하면서 1씩 감소하도록 명령.
}
do-while문
int fac = 1; //팩토리얼로 계산될 값을 fac으로 지정. 초기값은 1로 하여 x를 곱했을 때 fac=x가 되도록 함
do
{
fac = fac * x;
x--; //곱해주는 수, x가 반복하면서 1씩 감소하도록 명령.
}while (x>0); // 마지막이 ×1로 끝나도록 x가 0초과일 때까지만 곱하도록 지정. x>=1로 작성해도 상관없다.
Console.WriteLine("결과:");
Console.WriteLine(fac); //반복문이 끝난 팩토리얼의 결과값 출력
번외:
if문을 이용하여 정수 외의 값이 입력될 경우 정수를 입력하라고 출력하도록 만들 수 있다.
번외 코드
if (xb) //xb(즉, 입력값 x가 정상적으로 정수로 형변환 되었을 경우) 참일 때 실행.
{
//위에서 작성한 반복문 중 무엇이라도 가져다 두면 된다.
}
else
{
Console.WriteLine("정수를 입력해주세요.");
}


위 코드는 사실상, 어제의 반복문의 복습이다. '//주석' 에 익숙해지면, 차례대로 무엇을 할 것인지 기록해가면서 작성할 수 있으므로 더 쉽게 코드를 짤 수 있다.
언뜻 봤을 때는 팩토리얼...?어떻게 구성하지? 싶은 것도, 팩토리얼의 계산식을 차례대로 끊어서 생각하면 쉬워진다.
예시
1. 팩토리얼=n!=n×(n-1) ×(n-2) ×(n-3)… ×2 ×1=입력한 수부터 1까지의 곱셈
2. n=입력한 수 ( 입력된 값을 int로 형변환할 것.)
3. 1 ×n=n 이므로, 초기값을 1로 지정하고 입력된 수 n부터 n이 1이 될 때까지 반복적으로 곱한다.(fac=1, fac=fac*n)
4. 곱해지는 n값은 계속 1씩 줄어들어 마지막엔 1이된다.(n>0인 동안 계속 곱셈을 반복한다.)
5. 입력된 값이 정수가 아니라면, 팩토리얼 계산이 불가능하다. (형변환 성공여부의 bool값을 확인해 if 조건문 작성)
2-2. 숫자맞추기 게임
조건 1: 프로그램 내에서 매번 임의로 수를 지정.
조건 2: 정답을 맞출 때까지 지정된 수가 고정되며, 맞출 때까지 계속 입력가능.
우리는 여기서 또 새로운 것을 사용할 것이다. 바로 Random 이다.
Random은 난수 생성에 사용된다. 즉, 내가 지정한 수의 범위에서 하나를 컴퓨터가 임의로 골라두는 것이다.
Random을 이용한 난수 형성은 아래와 같이 진행된다.
Random num = new Random(); //새로운 Random 클래스를 생성. 해당 랜덤 클래스의 이름은 num으로 만들었다.
int Rnum = num.Next(1, 101);
//임의의 수가 지정될 정수를 Rnum이라는 이름으로 지었다. 범위는 1~100까지다.(101이 아니다.)
코드 2
Random num = new Random();
int Rnum = num.Next(1, 101); //어떤 Random클래스를 사용할지 작성.
//1부터 100까지 랜덤한 수를 만들어, Rnum라는 이름으로 생성함
Console.WriteLine("1부터 100까지의 수 중에서 맞춰야 할 수가 결정되었습니다.");
Console.WriteLine("숫자를 맞춰주세요.");
Console.WriteLine("입력:");
int x; //입력값으로 들어갈 int를 x로 지정, 미리 만들어둠.
do //이제부터 반복문 시작
{
string xs = Console.ReadLine();
//입력값을 xs라는 이름으로 1차 저장. 정답이 아닐 경우 반복해서 값을 입력해야함.
bool xb = int.TryParse(xs, out x); //입력된 데이터를 x라는 정수로 변경. xb는 정수 외의 데이터를 판별
if (xb) //1차로 입력된 x값이 정수인지 판별함
{
if(x > Rnum) //x가 Rnum보다 크다면
{
Console.WriteLine(x + "보다 더 작습니다."); //내가 입력한 수보다 설정된 수가 더 작음을 알려줌
}
else if (x<Rnum) //x가 Rnum보다 작다면
{
Console.WriteLine(x + "보다 더 큽니다."); //내가 입력한 수보다 설정된 수가 더 큼을 알려줌
}
else //남는 경우의 수는 입력값이 임의 지정값과 동일할 때.
{
Console.WriteLine("맞춰야할 수는" + x + "이(가) 맞습니다!");
//이 칸을 비우고 같은 코드를 while 뒤에 붙여도 됨.
}
}
else //만약 입력된 데이터가 정수가 아닐 경우, 이쪽으로.
{
Console.WriteLine("1부터 100까지의 숫자를 넣어주세요.");
}
}
while (x != Rnum); //Rnum이 x와 같으면 반복은 정지함.

3. 학습 요약
오늘은 반복문을 재차 복습했다.
1. 팩토리얼 계산프로그램을 통해 반복되는 계산이 아무리 길어져도, 같은 방식으로 계속 반복된다면 얼마든지 반복문으로 만들 수 있다는 것을 확인했다.
2. Random 클래스는 난수 생성(랜덤 숫자 뽑기)을 하는 방법이다.
주의: Next(1, 101)로 작성할 경우, 뽑히는 수는 1부터 100까지다. Next(a,b)일 경우 (a ≤ x<b)의 범위를 가지므로 작성에 주의할 것,
4. 내일 학습 할 것은 무엇인지
아직 벗어나지 못한 반복문의 늪... 이중반복문이 나타날 차례이다.
그리고 배열의 최소값괴 최대값 찾기도 할 예정이다.
곧 Unity를 사용할 수 있을 것 같다.