자 저의 생각 플로우를 봅니다 먼저 틀을 만듭니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lottoNumber
{
    class Program
    {
        public Program()
        {
        }
        public void run()
        {
        }
        static void Main(string[] args)
        {
            Program p;
            p = new Program();
            p.run();
        }
    }
}
 
cs

1.배열로 로또 6자리와 보너스번호 1자리를 해서 총 7개를 담을수 있는 배열을 만들겠습니다.

2.랜덤 숫자를 담을 그릇을 넣겠습니다.

3.랜덤으로 숫자를 생성하는 메서드를 만들겠습니다.

4.랜덤에서 중복을 없애는 메서드를 만들겠습니다.

5.다 만든 수를 보여주는 함수를 만들겠습니다.

자 메서드 3개로 만들수 있겠네요! 이번 강좌까지는 보여주기만 했죠?

다음 강좌부터는 내가 직접입력해 보는 것을 해볼겁니다!.

저의소스는 참고용으로만 사용하시고 꼭! 꼭! 혼자 만들어 보세요!

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
73
74
75
76
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lottoNumber
{
    class Program
    {
 
        int[] number;
        Random my_rand;
        public Program()
        {
            number = new int[7];
            my_rand = new Random();
        }
        void MakeNumber()
        {
            int a;
            for (int i = 0; i < number.Length; i++)
            {
                a = my_rand.Next(146);
                if (true == CheckSame(i, a))
                {
                    number[i] = a;
                }
                else
                {
                    i--;
                }
            }
        }
        void ShowNumber()
        {
            Console.WriteLine("생성된 로또 번호는 다음과 같습니다.");
            for (int i = 0; i < number.Length; i++)
            {
                if(i==number.Length-1)
                { 
                    Console.WriteLine(" 보너스 번호는 " + number[i]);
                }
                else
                {
                    Console.Write(" " + number[i]);
                }
                
            }
        }
        bool CheckSame(int index, int value)
        {
 
            for (int i = 0; i < index; i++)
            {
                if (value == number[i])
                {
                    return false;
                }
            }
            return true;
        }
        void run()
        {
            MakeNumber();
            ShowNumber();
        }
        public static void Main(String[] args)
        {
            Program p;
            p = new Program();
            p.run();
        }
    }
}
 
cs





아마 대부분을 친구들이 로또로 대박! 나는 상상을 한번씩 해보셨을 거에요.

그 염원을 담아 이번에는 로또번호를 생성하는 프로그램을 만들어 볼거에요!

1부터 45까지 랜덤한 수를 뽑아오는 방식! 아 물론 보너스 번호도 잊으면 안되겠죠?


먼저 이 로또번호생성을 하기 위해 어떤것들을 알아야 할까요?


1.클래스

네 프로그래밍에서 정말 유명한 클래스가 나왔네요 클래스가 무엇일까요?

레고를 예를 들면 레고를 만들어 내기 위한 틀을 클래스 라고 합니다.

레고를 만드는 회사에 가면 액체로 된 플라스틱을 틀에 넣어 굳혀서 레고를 만든다고 한다면

그 레고를 만들 틀이 클래스가 되겠습니다.

크게 보아 사람을 만들기 위한 틀 비행기를 만들기 위한 틀 성를 만들기 위한 틀 등등이 많지요?

이렇게 내가 만들 틀을 총제적으로 담고 있는것이 클래스라고 합니다.

이 클래스로 만들어진 레고 하나하나를 인스턴스라고 합니다.

C#에서 클래스 선언은 어떻게 할까요?

class Program

{

}

프로그램이라는 클래스는 이렇게 표현 합니다.

그런데 저거 어디서 많이 본것 같지 않나요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DeepCopy
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
 
cs

네 우리 헬로우 월드 프로그램을 만들때 만들었네요 가장 기본프로그램도 클래스를 이용한다는 점~


2. 클래스와 메서

각각 클래스에서 동작을 하거나 부품을 이루는 것들을 모아두는 것을 메서드라고 합니다.

C언어 부터 배우신 분들은 함수라고도 하구요 이 메서드 는 크게 4가지를 통해서 구성됩니다.

메서드는 수학책에서 말하는 함수와 같습니다. 입력-> 메서드-> 출력 을 통해서 값을 바꾸거나 행위를 하는것을 말합니다

예를들어 피자를 반으로 자르는 메서드가 있다고 하면 피자한판 -> 피자자르는 메서드 -> 피자 반판 두개 이런식 으로요.

그렇다면 이 함수는 어떻게 만들까요? 

일단 기본형을 봅시다

public void test (int  a)

{

메서드 내용

}

2-1. public 은 이 메서드의 범위를 나타내 줍니다 public 공공재 느낌으로 아무나 같은 프로그램의 어떤 곳에서는 이함수는 사용해도 되 이런 느낌이라서  어디에서든 접근 할수 있습니다.

그외에 private protected internal 등이 있지만 이것 추후에 사용할때 봅시다!

2-2 void 는 메서드의 돌려주는 값을 나타냅니다 void는 말그대로 없어 안돌려줘! 이런 뜻이구요 int ,float, 로 하면 이 값을 돌려줍니다.

피자로 예시를 들자면 위에는 피자를 자르는 메서드이기에 피자를 자르고 2개로 내보낸다 기에 무엇인가를 반환해주는 메서드인데요

void가 있는 것은 안돌려 주어도 되! 그냥 실행만 해주어! 이런 뜻입니다. 돌려주는 것에 대해서는 사용할때 한번 봅시다!

2-3 . test 저는 테스트라고 썼지만 이 메서드의 이름이구요 자기 자신이 원하는 값 아무거나 써도 무방 합니다. 하지만 프로그래밍을 유지하고 부족한 부분에 대해서

보수하고 고쳐나가기 위해서는 알기쉽게 이름을 지어야 합니다!

2-4 . 마지막은 파라미터 라고 합니다. 이 매서드를 사용하기 위한 재료라고 생각 하시면 됩니다.

위에 예시로는 피자한판을 넣어야 함수가 실행이 되죠? 이 피자한판을 넣는 부분이 이 부분 입니다.

제가 예시로 만든 메서드는 꼭 숫자 하나(피자를)를 넣어야

작동한다는 뜻이겠네요. 저는 int를 썻지만 어떤 것을 써도 무방합니다!


3.클래스 사용하기

이렇게 레고틀을 만드는 방법을 알았으니 써보아야 겠지요?

Program이라는 메서드에는 '프로그램'을 출력하게

number라는 메서드에는 8을 출력하게 만들어 보겠습니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lottoNumber
{
    class Program
    {
    
        public Program()
        {
            Console.WriteLine("프로그램");
        }
        public void Number()
        {
            int a = 8;
            Console.WriteLine(a);
        }
        static void Main(string[] args)
        {
            Program p;                    //p라는 이름으로 Program 클래스를 예약하고
            p = new Program();            //실제로 만듭니다 Program()메서드가 무조건 1회 실행됩니다 프로그램이 출력됨
            p.Number();                   //. 으로 그 메서드를 쓸수 있습니다 number메서드를 사용해서 8이 출력!
        }
    }
}
 
cs

Main()주석부분을 보시면 이해가 되실겁니다.

클래스의 이름인 Program과 똑같은 메서드가 있죠? 이 메서드를 생성자(Constructor)라고 합니다. 모든 변수를 초기화 해주듯이 클래스도 초기화를 한번 해주는 과정을

해주는 데요 이것을 생성자가 합니다. 클래스의 인스턴스가 생성돨때 꼭 한번 실행해야 합니다. 보통 이 생성자에 변수를 초기화하는 용도로 사용합니다.


4.새로운 레고 가져오기(Using)의 사용

프로그래밍을 레고에 비유해 본다면 우리가 원하는 프로그램을 만드는 것은 우리가 원하는 레고를 만드는 것으로 볼 수 있습니다.

하지만 우리가 레고를 아무것도 안샀는데 만들수 없죠? 해리포터 시리즈라던가 스타워즈 시리즈라던가 를 구입한후 그 레고들을 조립해서

우리가 원하는 새로운 세계관을 만들수 있죠? 그 새로운 레고를 가져 오는 것을 Using 이라고 생각하시면 됩니다.

지금 우리가 만들려는 프로그램은 Using System;에 전부 있으므로 지금은 사용하지 않아도 되구요 나중에 사용할때 자세히 보겠습니다.


6.단순형 자료와 클래스형 자료

단순한 자료는 선언하면서 할당이 됩니다 예를 들어서

int a; int형 변수 a가 메모리에 할당이 됩니다.

하지만 클래스형 자료는 명시적으로 선언을 하고 할등을 합니다 그예로 배열과 클래스등등 이 있습니다

Program p;  선언만 됨

p = new program(); 할당도 됨

int[] c;      선언만 됨

c = new int[10]; 할당도 됨


6.랜덤값(난수)생성과 어디까지?

로또 번호 생성을 하기 위해서는 System에 있는 레고에서 Random부분을 사용하면 됩니다!

어떻게 Random을 정말 균일하게 Random하게 나오게 할까? 하는 알고리즘은 수많은 대학의 전산학자들이 고민하는 문제구요

저희는 그걸 사용하면 됩니다!

명시적 선언 배웠죠? 해볼까요?

Random my_rand; 선언

int r_number;       랜덤하게 나온 수를 넣을 변수 할당

my_rand = new Random(); 랜덤한 수를 할당

r_number = myrand.Next(); 랜덤한 수를 r_number에 저장해 줍니다

하지만 저렇게 해주면 범위가 없죠? 우리 범위를 만들어 줍시다. Next() 메서드는 인자가 2개 입니다!

r_number = myrand.Next(1,11); 바로 어디부터 어디까지 랜덤하게 나와라! 하는 메서드 입니다. 그래서 이 소스는 1~10까지 랜덤하게 나오는 소스 입니다.

최대값인 11은 제외하고 그 아래수중 그러니까 1~10까지만 들어가게 되는것이죠! 그럼 로또번호로 하려면?

r_number = myrand.Next(1,46); 이렇게 하면 되겠죠?!?! 


7.전체 마법(변수)과 지역 마법(변수)

변수를 선언하는 자리에 따라서 이 변수가 전체 마법을 쓴느 변수인지 그 지역에서만 마법을 쓰는 변수인지 나눌수 있습니다.

이 것은 간단한 코드를 보면서 알아 보겠습니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lottoNumber
{
    class Program
    {
 
        int Computer; //전역변수입니다 클래스가 시작될때 생겨나 없어질때 소멸됩니다
        public Program()
        {
            Console.WriteLine("프로그램");
        }
        public void Number()
        {
            int a = 8;        //이 메서드에서 나가면 없어집니다.
            Console.WriteLine(a);
        }
        static void Main(string[] args)
        {
            Program p;                    //p라는 이름으로 Program 클래스를 예약하고
            p = new Program();            //실제로 만듭니다 Program()함수가 무조건 1회 실행됩니다 프로그램이 출력됨
            p.Number();                   //. 으로 그 함수를 쓸수 있습니다 number함수를 사용해서 8이 출력!
        }
    }
}
cs

아까의 코드에서 전역변수만 추가해 보았습니다 클래스 선언후에 바로 사용하는 전역변수!

메소드 내에서만 사용하는 지역변수 이제 이해가 가시겠죠?


8.이거 아니면 이거! Boolean형 변수

숫자를 막막 선언하는 변수와 글자를 선언하는 변수만 했는데 모든변수를 흑과 백으로만 보는 변수가 있습니다

바로

Boolean 입니다 이 변수는 True False만 가지는 변수로

Boolean isCheck = false;

if(true == isCheck)

{


}

if문의 조건문이나 값을 돌려줄때 많이 쓰입니다.


Tip! Tip

첫번째 팁 동일한 숫자 체크

에를 들어  a에 1~5까지 수가있고 b값을 하나 선언한후 동일한 값이 있으면 True 없으면 False값을 저장하려고 한다. 어떻게 하면 될까?

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
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DeepCopy
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 12345 };
            int b = 3;
            Boolean isFind;
            isFind = false;
            for(int i=0;i<a.Length;i++)
            {
                if(a[i]==b)
                {
                    isFind =  true;
                }
            }
            
        }
    }
}
cs

두번째 팁 for에서 카운트 무시

for문에서 지정된 횟수까지 시행알 합니다. 하지만 중복이 있다면? 카운트 하기 싫다면?

for(int i=0;i<6;i++)

{

if(횟수를 가운팅 하지 말아야 할 조건)

{

}

}

세번째 팁! 클래스를 사용하는 기본틀

첫번째 메인에 주로 코딩하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DeepCopy
{
    class Program
    {
        public Program()
        {
        }
        static void Main(string[] args)
        {
            //여기에 주로 코딩
        }
    }
}
 
cs

두번째는 Program 클래스를 프로그램의 주체를 하는 경우입니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DeepCopy
{
    class Program
    {
        public Program()
        {
        }
        public void run()
        {
            //여기에 주로 작성
        }
        static void Main(string[] args)
        {
            //객체생성 시작점만 지정
            Program p;
            p = new Program();
            p.run();
        }
    }
}
 
cs

첫번째 방법은 함수지향적 두번째 방법은 객체 지향적이라고 합니다 과거에는 객체지향적으로 해서 두번째가 많이 쓰이지만

요즘 새롭게 함수형 언어가 뜨면서 함수지향적도 괜찮은 방법입니다. 하지만 C#은 객체지향 언어이기 때문에 저는 객체지향중심으로

두번쨰 방법을 위주로 사용하겠습니다!

자 이제 본격적으로 만들어 봅시다

문제를 다시 볼까요?

5명의 스파르탄에 대해서 사격 전투 운전 세과목의 성적을 임의로 저장하고 각각의 대해서 총점과 평균을 계산하여 화면에 출력하고

일등한 사람의 번호를 출력하라. 단 동점인 경우 번호가 빠른사람이 승리한 것으로 한다.

음 저는 일단 이렇게 생각 했습니다.

1.각각 세과목의 배열 5개를 지정하고

2.총점이 나와야 하니까 총점도 배열로 만들고

3.평균도 나와야 하니까 평균도 배열로 만들고

4.배열중에 가장 잘한 1등을 저장하기 위한 변수 하나 이렇게 할것 같습니다.

5. 총점을 구하기 위해 각 수들을 더할 것 입니다..

6.평균을 구하기 위해 총점을 3으로 나눌 것 입니다.(나누기에서 캐스팅을 해야 분수도 나오겠죠?)

7.if문을 이용해서 가장 높은 값을 1등을 저장하기로 할 것같습니다.

8. 각각 수들을 출력하면 완료!

그래서 저는 이렇게 생각하고 푼것인데요 어차피 프로그래밍이라는 것이 정답이 없습니다!

어떤 경로든 답이 나오는게 중요하니까요!! 제소스는 참고로만 봐주시고 꼭! 직접 해보세요!





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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ScoreProcess
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] gun = { 7090506080 };
            int[] war = { 3050809070 };
            int[] drive = { 2030709090 };
 
            int[] total = { 00000 };
            float[] average = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
 
            int maxindex;
 
            for(int i = 0; i<total.Length;i++)
            {
                total[i] = gun[i] + war[i] + drive[i];
                average[i] = total[i] / (float)3.0f;
 
            }
            maxindex = -1;
            for(int i=0;i<total.Length;i++)
            {
                if(0==i)
                {
                    maxindex = i;
                }
                else
                {
                    if(total[maxindex]<total[i])
                    {
                        maxindex = i;
                    }
                }
            }
            Console.WriteLine("---------------------");
            Console.WriteLine("번호 총점 평균");
            Console.WriteLine("---------------------");
            for(int i=0;i<total.Length;i++)
            {
                Console.WriteLine(i + " " + total[i] + " " + average[i]);
            }
            Console.WriteLine("----------------------");
            Console.WriteLine("최고 득점자 번호"+maxindex);
            Console.WriteLine("----------------------");
        }
    }
}
cs

자 저는 이렇게 했습니다 여러분은 어떤가요?

+ Recent posts