반응형

짝수 홀수를 선택할 수 있도록 생성자를 가진 SelectableRandom 클래스를 작성하고 각각 짝수 10, 홀수 10개를 랜덤하게 발생시키는 프로그램을 작성하라.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cstdlib> //atoi,rand,malloc 등의 메소드가 포함된 라이브러리
#include <ctime> //시간과 관련된 메소드, 상수가 포함된 라이브러리
using namespace std;
 
/*rand()함수만 사용하면 무작위 수가 나오기는 하지만 실행할 때마다 같은 무작위 수가 나온다.
왜냐하면 같은 seed값을 이용하기 때문이다.
따라서 srand를 이용해 프로그램을 시작할 때마다 다른 seed값을 넣어주면 매번 다른 무작위 수가 나올것이다.
time 함수는 매 초 다른 값을 반환하기 때문에 seed로 사용하기가 매우 좋다.*/
 
class SelectableRandom {
public:
    SelectableRandom() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int nexteven() { 
        return ((rand()/2)*2);  //2로나눠서 2를 곱하면 범위 그대로 짝수만 나온다.
    }
    int nextodd() { 
        return ((rand()/2)*2)+1;  //2로나눠서 2를 곱하고 1더하면 범위 그대로 홀수만 나온다.
    }
    int nextevenInRange(int a,int b) {
        return (((rand() % (b - a + 1)) + a)/2)*2//범위 짝수
        
    }
    int nextoddInRange(int a,int b) {
        return ((((rand() % (b - a + 1)) + a)/2)*2)+1;    //범위 홀수
    }
};
 
int main(void) {
    SelectableRandom r; //SelectableRandom 클래스의 객체 r
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 짝수 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.nexteven() << " ";  //10개 랜덤 짝수 정수 출력
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "10까지의 홀수 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextoddInRange(2,9<< " ";  //범위 내 10개 랜덤 홀수 정수 출력
    }
    cout << endl;
    return 0;
}
 
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C++' 카테고리의 다른 글

다수의 클래스 연산자  (0) 2017.10.12
Integer 클래스  (0) 2017.10.12
EvenRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
반응형

문제 3번을 참고하여 짝수 정수만 랜덤하게 발생시키는 EvenRandom 클래스를 작성하고 EvenRandom 클래스를 이용하여 10개의 짝수를 랜덤하게 출력하는 프로그램을 완성하라. 0도 짝수로 처리한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstdlib> //atoi,rand,malloc 등의 메소드가 포함된 라이브러리
#include <ctime> //시간과 관련된 메소드, 상수가 포함된 라이브러리
using namespace std;
 
/*rand()함수만 사용하면 무작위 수가 나오기는 하지만 실행할 때마다 같은 무작위 수가 나온다.
왜냐하면 같은 seed값을 이용하기 때문이다.
따라서 srand를 이용해 프로그램을 시작할 때마다 다른 seed값을 넣어주면 매번 다른 무작위 수가 나올것이다.
time 함수는 매 초 다른 값을 반환하기 때문에 seed로 사용하기가 매우 좋다.*/
 
class EvenRandom {
public:
    EvenRandom() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int next() { //rand()함수는 0~32767 사이 무작위 정수 리턴
        return (rand()/2)*2// rand()의 리턴 밸류는 integer 형이다. 따라서 2로 나눴을 때 무조건정수가 나온다.
    //어떤 정수든 (홀수든 짝수든) 2를 곱하면 짝수가 된다. 그리고 반토막 난 범위도 복원된다.
    }
    int nextInRange(int a,int b) {
        return (((rand() % (b - a + 1)) + a)/2)*2//a이상 b미만 랜덤 정수를 뽑는 알고리즘에 짝수 sifting 알고리즘을 더한다.
        
    }
};
 
int main(void) {
    EvenRandom r; //EvenRandom 클래스의 객체 r
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.next() << " ";  //10개 랜덤 정수 출력
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "10까지의 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextInRange(2,10<< " ";  //범위 내 10개 랜덤 정수 출력
    }
    cout << endl;
    return 0;
}
 
cs



반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C++' 카테고리의 다른 글

Integer 클래스  (0) 2017.10.12
SelectableRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
별 출력  (0) 2017.09.09
반응형

다음과 같은 간단한 기능을 하는 함수들을 작성하고, 사용자로부터 임의의 값을 입력받은 후에 작성한 함수들을 테스트하여 보자.

(a)주어진 정수가 짝수이면 1을 반환하고 홀수이면 0을 반환하는 함수 int even(int n)

{b)주어진 정수의 절대값을 구하는 함수 int absolute(int n)

(c)주어진 정수가 음수이면 -1을, 양수이면 1을 0이면 0을 반환하는 함수 int sign(int n)


나는 여기에 정수를 scan하는 함수와 출력하는 함수도 만들었다. 그리고 기본으로 무한루프를 생성한 후에(여러분에게 모든 가지수를 보여주기 위해서)

999999를 입력하면 프로그램이 종료되게 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
int scan_integer(void);
int even(int n);
int absolute(int n);
int sign(int n);
void printer(int a, int b, int c);
 
int main(void)
{
    int a, b, c, d;
    while(1)
    {
    a = scan_integer(); //정수를 받음
    if(a==999999)
        break;
    b = even(a); //홀수 짝수 판별
    c = absolute(a); //절댓값
    d = sign(a); // 부호 판별
    printer(b, c, d); // 출력 
    }
    return 0;
}
int scan_integer(void)
{
    int x;
    printf("정수를 입력하시오: (그만하려면 999999입력):");
    scanf("%d"&x);
    return x;
}
int even(int n)
{
    int x=0;
    if(n%2==0)
        x=1;
    else
        x=0;
    return x;
}
int absolute(int n)
{
    int x=0;
    if(n<0)
        x=(-n);
    else
        x=n;
    return x;
}
int sign(int n)
{
    int y;
    if(n<0)
        y=-1;
    else if(n==0)
        y=0;
    else
        y=1;
    return y;
}
void printer(int a, int b, int c)
{
    {if(a==1)
        printf("even()의 결과: 짝수\n");
    else
        printf("even()의 결과: 홀수\n");}
    printf("absoulute()의 결과: %d\n", b);
    {if(c==-1)
    printf("sign()의 결과: 음수\n");
    else if(c==0)
    printf("sign()의 결과: 0\n");
    else
        printf("sign()의 결과: 양수\n");}
}
cs




반응형

+ Recent posts