오늘은 입력으로 수를 받든 아니면 랜덤으로 수를 받는 10개의 정수를 가지고 5번째 수를 구하는 프로그램을 짜보도록 하겠습니다.
난수를 이용하는 아래와 같은 코딩으로 난수를 만듭니다.
#include
#include
srand((unsigned)time(NULL));
난수=rand()%범위수+1;
이렇게 시간값으로 srand()함수를 이용하여 초기 난수를 랜덤수로 초기화 시킵니다. 그래야 rand()함수의 초기값이 랜덤수로 추출 됩니다.난수는 원하는 범위의 숫자를 추출 할 수 있게 세팅 했네요.
예) 1~10사이의 난수
난수=rand()%10+1;
이렇게 범위수가 10으로 나눈 나머지값으로 하면 됩니다. +1을 시킨 이유는 10으로 나눈 나머지는 0~9까지이기 때문에 +1을 함으로서 난수 범위를 1~10으로 수정됩니다.
이제는 10개의 정수가 난수로 만들어 졌다면 몇번째 수인지 찾아내는 방법을 알아 봅시다.
10개의 정수에는 중복 정수를 포함 되었을 경우 3번째 정수를 구하고자 한다면 우선 조건을 코딩하는 분이 결정해야 합니다. 중복을 허용 한 데이터 3번째 수를 추출 할 것인지 아니면 중복은 부시하고 데이터 3번째 수를 추출할 것인지를 코딩을 하는 분이 정하고 수를 추출해야 합니다.
제 경우는 다음과 같은 조건으로 정했습니다.
cnt=0;
for(int i=0;i<10;i++){
if(arr[i]>output){
output=arr[i];
cnt++;
}
if(cnt==3) break;
}
10개의 데이터 arr[10]의 들어 있는 정수 값에서 cnt은 몇번째 수인지를 결정하게 됩니다. if문에서 첫번째로 작은수 값보다 큰수가 나오면 번째(cnt) 값을 1씩 증가해서 몇번째인지를 결정하게 됩니다. 만약 비교 수가 같을 때에는 cnt값을 증가시키지 않고 현재 상태값을 유지시키는 방법을 선택했네요.
1,2,2,3, 4, 5, ...
이렇게 데이터가 입력이 되면 3번째 수를 추출 한다면 3이 나오게 됩니다. 그냥 오름차순으로 정렬해 놓고 3번째 데이터를 추출 한다면 2의 값이 나오게 됩니다. 그러지 않고 데이터 수를 비교해서 3번째 수를 구하는 방식을 선택했네요.
위 코딩으로 해당 순서의 수를 찾기 위해서는 데이터를 정렬 이 필요합니다.
위 원리를 이용하여 원하는 결과가 나오는지 코딩해 봅시다.
[전체소스]
#include
#include
#include
using namespace std;
int main(int argc, char** argv) {
int arr[10];
int cnt=0;
int temp;
int output=0;
srand((unsigned)time(NULL));
while(cnt<10){ //10개 난수 입력
arr[cnt]=rand()%10+1;
cnt++;
}
for(int i=0;i<10-1;i++){
for(int j=i+1;j<10;j++){
if(arr[i]>arr[j]){
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
cout<<"전체 수 : ";
for(int i=0;i<10;i++){
cout<<arr[i];
if(i<9) cout<<" ";
}
cout<<endl;
cnt=0;
for(int i=0;i<10;i++){
if(arr[i]>output){
output=arr[i];
cnt++;
}
if(cnt==5) break;
}
if(cnt<5) cout<<"오름차순 "<<cnt<<"번째가 마지막 번째이고 수는 "<<output<<endl;
else cout<<"오름차순 "<<cnt<<"번째 수 : " <<output<<endl;
return 0;
}
위 코딩이 꽤 길게 코딩이 되었습니다. 정렬 코딩도 들어가고 마지막에는 10개의 데이터 중 서로다른 수가 5개 이상이 되어 야하는데 그렇지 못했을 경우는 마지막 번째 수를 출력하고 5개 이상일 때에는 5번째 수를 출력하도록 했네요.
[결과]
오늘의 난수, 정렬, 원하는 위치의 수를 추출하는 원리를 이용하여 실습 주제에 맞는 결과를 만들어 냈습니다. 참고로 for문에서 10개의 데이터를 난수를 만들거나 정렬을 하거나 출력을 할 때 10이라는 숫자는 변수로 선언하셔야 더 좋은 코딩입니다. 될 수 있으면 특정 수를 직접적으로 숫자로 표기하는 것은 안좋습니다. 변수로 선언해 놓아야 나중에 원하는 개수의 데이터로 수정이 쉽게 됩니다. 변수값만 바꾸면 되니깐요.
int m_max=10;
for(int i;i<m_max;i++){ }
이런식으로 말이죠. 몇번째의 정수를 찾는 것도 마찬가지입니다. 5번째의 수를 찾기 위해서 그냥 5라고 표기 했는데 이 역시 변수로 선언 해 놓으면 나중에 해당 변수값만 수정하면 됩니다.
처음부터 이렇게 안한 이유는 우선 내부 코딩을 자체 내에서 어떻게 변화하는지 이해하기 쉽게 하기 위해서 숫자로 표현했네요. 10이라고 직접 쓰면은 해당 for문이 10까지 루프 돌구나 하고 알 수 있고 5라는 숫자를 이용하여 5번째 데이터까지 비교되는 구나 하고 우선 각 코딩 라인 라인을 쉽게 보기 위해서 숫자로 표기 했습니다.
암튼 오늘 실습 내용을 가지고 응용 할 곳은 많습니다. 예를 들면 재미로 로또 같은 숫자를 무작위로 일정 수 만큼 데이터를 추출하여 통계를 내어 6개의 데이터를 만들어 낼 때 응용하면 좋습니다. 저같은 경우는 무작위 수에서 많이 출현 할 수를 누적 카운트를 이용하여 해당 누적 수를 만들었는데 여기에 상위 빈도수를 기준으로 6개의 수를 만들어 보았던 기억이 문득 떠오르네요.