지금까지 까만 화면에 하얀 글자만 보느라 지루하셨죠?

이제부터는 간단한 키보드 입력을 받아서 가지고 놀수 있는 프로그램을 만들어 볼거에요

바로 가위 바위 보!

먼저 프로그램을 볼까요?

플레이어는 (0)가위 (1)바위 (2)보 중에 하나를 내고 컴퓨터도 임의로 하나를 내어서 승패를 결정하는 게임입니다. 입력시 -1 을 입력하면 게임을 종료합니다.

게임이 종료되면 총 게임횟수와 이긴횟수 진횟수 비긴횟수 및 승률을 출력해 줍니다.



1.키보드 입력 받기

출력은 Console.WriteLine(); 이었는데 직관적으로 입력은 Console.ReadLine 이 아닐까요?

네 맞습니다. 이런 클래스와 이런 매서드 다 사람들이 만들어서 직관적으로 만듭니다!

Console.ReadLine()은 키보드의 입력은 모두 문자열로 인식합니다. 만약 문자를 쓴다면 그냥 써도 되지만

숫자를 쓴다면? 내 앞에배웠던 캐스팅으로 바꾸어 주어야 합니다. 자 한번 해볼까요?

int a; 숫자로 변환할 변수

String msg; 입력 받을 변수

a= 0; 초기화

msg = " "; 초기화

msg = Console.ReadLine(); 값 입력 받기

a = int.Parse(msg); String 값을 int 값으로 전환하기(문자를 숫자로)

Console.Writeline(a); 입력받은 숫자 a 출력하기


2.한 프로젝트에서 두개 이상의 클래스를 사용하기

C#으로 프로그램을 작성하다보면 한 파일에 모든 클래스와 매서드를 입력하게 된다면 나중에 알아보기도 힘들고 뭐가 뭔지도 모르게 됩니다.

그래서 한 클래스당 하나의 cs파일(C# 파일)을 만들어서 사용합니다. 두 파일이 하나의 프로젝트 안에 있으면 서로의 클래스를 선언하고 사용할 수 있습니다.

이제 새 cs파일을 추가해 보겠습니다


비주얼 스튜디오에서 Solution Explorer에서 프로젝트를 오른쪽 클릭 ADD->New Item 을 클릭해주세요!


맨위에 C#초록색 Class 파일이 보이시죠? 클릭하고 원하는 클래스명을 적어줍니다.저는 플레이어라고 했어요 하고 Add를 누르면?


네 생성되었습니다. 이제 새로운 클래스는 여기서 적어주시면 됩니다!


3.while()문을 통해서 계속하기

반복을 할때 우리가 전에 배웠던 for문이 있습니다 for문은 반복할 횟수가 정해져 있을때 유용하지만 특정조건을 만족할때는 무한정 할때는 까다롭습니다.

이럴때 쓰는 반복문이 While문 입니다. 무한이 반복하다가 일정 조건이 되면 나오는 While문 을 사용해 볼까요?

While(조건)

{

//조건이 맞으면 계속 실행

}


While(true)

{

if(종료 조건)

{

break;

}

}


4.Switch case

이럴때는 이렇게 저럴때는 저렇게 할때 우리는 if문과 else를 배웠습니다. 하지만 조건이 많으면?

if(0==a)

{

}

else if(1==a)

{

}

else if(3==a)

{

}

else

{

}...

너무 많게 되고 가독성이 좀 떨어지게 되죠? 이럴 때 쓸수 있는 것이 Switch- case 문입니다

저 코드와 똑같은 기능을 하는것을 switch-case문으로 써보겠습니다.

switch(a) //a가

{

case 0:   //0일때 콤마 꼭 붙여주어야 합니다

//하는일

break;    //일만 하고 나오기

case 1:   //1일때 콤마 꼭 붙여주어야 합니다

//하는일

break; //일만 하고 나오기

....

default:  //콤마 꼭 붙여주어야 합니다

위 조건중 아무것도 만족 하지 않을때 else만 쓰는 것과 같습니다.

break;

}

5.논리 연산자

어떤 일을 두개 일어날때는 어떻게 쓰면 좋을까요? 아니면 둘중 하나만 일때는? 이럴때 쓰는 기호가 있습니다. 예를 들어 볼게요

and 연산자

a가 1보다 크고 8보다 작을때

if(a>1 && a<8)

{

그때만 일어나는 일

}

OR 연산자

a와 b와 c중 하나라도 1과 같을때

if(a == 1 || b== || c== 1)

{

그때만 일어나는 일

}

그럼 반대로 a가 1이 아닐때? 는 어떻게 표현 할까요? 이럴대 Not 연산자를 사용할수 있습니다.

Not 연산자는 !을 이용해 if(a=! 1) 이렇게 표현 할 수 있습니다. 또 만약 변수가 Boolean형 이라면

Boolean a;

a = true;

c = !a //이렇게 앞에 느낌표를 붙임으로 반대를 표현할수 있습니다. 그래서 이 값은 false입니다.




Tip Tip

변수 이름 짓기

변수이름은 매우매우매우 중요합니다. 코드와 변수를 읽을수 있고 그만큼 유지 보수가 쉬워집니다.

작은 프로그램은 덜해도 규모가 커지면 며칠전에 짠 코드도 기억이 안납니다. 더해서 만약 다른사람이 짠코드를 보게 된다면 ㅜㅜ

하지만 변수를 가독성 잇게 써 놓는다면 이 변수가 무슨역할을 하는지 어떻게 되는지 볼수 있습니다. 꼭 변수 를 가독성 있게 이름을 지으세요!

과거에는 헝가리안 표기법이라는 이름을 많이 사용했지만

이제 MS에서 공식적으로 권장하지 않네요 MS에서 권장하는 변수명명법!

https://msdn.microsoft.com/ko-kr/library/ms229002(v=vs.100).aspx

MSDN을 링크합니다.

요약을 해보자면 파스칼식(단어의 시작은 대문자로 BlockColor)과 첫단어만 소문자인 카멜식을(blockColor) 주로 사용합니다.

저도 헝가리안을 주로 사용했지만 이렇게 혼자 강좌해보면서 알게 되었네요 저도 MSDN에서 권장하는 대로 사용해야 겠습니다.


가위바위보 승패 로직

가위를 0 바위를 1 보를 2 라고 하고 com은 컴퓨터 player는 플레이어라고 해보자 ab 값에 따라 승자를 경정하는 방법은?

일단 같으면 비기기로 하고 (0,1)(0,2)(1,0)(1,2)(2,0)(2,1) 이렇게 6가지만 조사하면 됩니다.

if(com==player)

{

비기기

}

else if( 0 == a && 1== b)

{

b가 승자

}

else if(0==a&& 2==b)

{

a가 승자

}

...

이런식으로 하면 됩니다


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

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

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

처음 프로그램은 헬로우 월드로 했다면

간단한 변수와 사칙연산을 하는 프로그램을 만들어 볼게요

먼저 우리가 만들 프로그램부터 봅시다

5명의 스파르탄 병사의 세과목 을 임의로 저장하고 각각에 대하여 총점 및 평균을 계산하여 화면에 출력하고 일등한 사람을 구하여 그 사람의 번호를 출력하라.

단 동점인 경우 번호가 빠른 사람이 승리한 것으로 한다.




1.틀 알기

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 ScoreProcess
{
    class Program
    {
        static void Main(string[] args)
        {
 
        }
    }
}
 
cs

프로그램을 실행하면 Main 함수 {}안이있는 명령문을 실행합니다.

지금 이 프로그램을 실행하면 도스창(까만화면)에서 실행되는데 이 프로그램을 콘솔형 프로그램이라고 합니다.

Using 이나 namespace등은 class는 다음에 설명 하겠습니다.


2. 숫자 변수의 할당과 출력


C#에서 코드 한줄이 끝나면 끝네 ; 세미 콜론을 붙입니다. 한 라인에 여러개 쓸 수 있지만 보통 한라인에 한 개의 문장을 씁니다.

컴퓨터는 숫자와 문자를 구별하여 다룹니다. 변수는 저장할수 있는 데이터에 따라 구분하여 사용해야 합니다.

숫자형 변수는 int , float , double 등이 있고 문자형 변수는 다음 프로그램을 만들때 자세히 설명하겠지만 char ,string 등이 있습니다.

int , float , double로 나누는 이유는 더 메모리의 크기 때문인데요. 비유를 하자면 레고같은 것을 담을 수 있는 그릇 이라고 생각하시면 될듯 합니다.

예를들어 int라는 그릇에 너무 많은 레고(숫자)담으면 레고(숫자)가 넘치겠죠? 그래서 이렇게 넘치는 현상을(overflow)라고 합니다.

그러면 무조건 큰것만 쓰면 되지 않나요? 하시는 분들 있는데. 그릇이 클수록 숫자의 대한 정확도가 떨어지기도 하고 컴퓨터의 메모리를 많이 잡아먹기 때문에

적절하게 써줍시다!(라고 하지만 사실 지금 컴퓨터가 좋아져서 double로 써도 될듯한데 관습인지 습관인지 int형을 많이 쓰더라구요 이것에 대해서는 생각해봅시다!)

가장 많이 쓰이는 그릇 int 하고 이름을 지어줍시다

변수형 변수이름;

int a;

a라는 그릇을 만들어 주세요! 라고 하는 뜻입니다.

이렇게 그릇을 만들었으니 숫자를 넣어 볼까요? 넣고 싶은 숫자를 넣으면 됩니다

a = 8;

이런식으로요! 다른 친구들도 해볼까요?

int a;

float b;

double c;

a = 2;

b = 4.0f; //float는 float 그릇이에요! 라고 알려주는 f를 써줍니다.

c = 8;

이것을 도스창에 출력하고 싶다면?

앞에서 했던

Console.Writeline(a);

이렇게 해주면 8이 출력됩니다.


3. 그릇 여러개 만들기 - 배열


예를 들어 구구단을 만들어 볼게요 그럼 2단부터 9단까지 72개까지 숫자변수를 선언해야 하는데

int a,b,c,d.. 72개를 전부? 너무 불편하죠? 그걸 방지 하기 위해서 프로그래머들이 이런것들은 한꺼번에! 선언하자면서 배열을 만들어 놓았습니다.

연속된 변수들을 선언하는 것이죠 물론 숫자 변수는 int, float,double 이 가능하고 char,string 또한 가능합니다. 어떻게 사용할까요?

변수형[] 변수이름 = new 변수형[숫자];

int[] gugudan = new int[72];

gugudan 이라는 숫자 그릇이 72개가 선언되었어요  여기서 주의 할것은 컴퓨터는 숫자 0부터 세기 때문에

gugudan[0]~gugudam[71]까지 선언 됩니다! 만약 비슷한 변수라면 이렇게 선언하는 것이 좋겠죠?

어떤 변수든 선언하고 그 수를 정해주어야 합니다. 보통 0이나 1로 많이 합니다!

배열의 초기화는 어떻게 할까요?

int[] gugudan = { 2, 3, 4, 5, 6, 7, 8, 9};

이런식으로 합니다. 그럼 자동으로 gugudan[0] = 2 ,gugudan[1] = 3 이런식으로 저장됩니다.

배열의 길이 알기

만약 이렇게 배열이 하나라면 하나하나 기억하지만 만약 변수 수가 많으면 어떻게 할까요?

일일하게 기억하기 힘들겠죠? 그럴때 변수의 길이를 자동으로 알려주는 기능이 있습니다. 바로 Length 입니다.

어떤 배열이든 길이를 알고 싶을때 .Length를 붙여주면 됩니다.

에를 들어

int a;

a = gugudan.Length

이렇게 해주면 8이 나옵니다. 배열의 숫자를 일일하게 모를때 유용합니다!


4.사칙 연산 하기 와 주의점

이렇게 숫자들을 그릇에 넣을 수 있으니 그 숫자들을 조물딱 조물딱 해서 숫자를 변형 할수 있어야 겠죠?

(여담이지만 저는 프로그래밍은 데이터의 변형이라고 생각합니다. 선언해서 조물딱 조물딱 해서 제가 원하는 것을 만드는 것이 프로그래밍!)

+ 더하기 - 뺴기 * 곱하기 /나누기 %나머지 값만 구하기! 기본적으로 int 는 int끼리 float는 float끼리 사칙연산하는 것이 기본입니다.

하지만 프로그래밍을 하다보면 그렇지 않을수도 있죠? 그럴때는? 계산할때 변경해주면 됩니다! 예를들어

int  a;
int  b;
float c;
a = 3;
b = 2;

c=a/b;                      나머지는 버리기 때문에 1이 저장
c=(float)a/b;             1.5f가 저장됨
c=a/(float)b;             1.5f가 저장됨
c = (float)a/(float)/b; 1.5f가 저장됨

(원하는형)을 넣고 선언해주시면 됩니다!

5.변수 1찍 증가 하기와 감소하기

기본적으로 숫자변수 a값을 1씩 증가시킬때는

a = a+1;을 사용합니다

그런데 더 간단히 할수 없을까 하던중 네 더 간단히 할수 잇습니다.

a++;

a += 1;

이런식으로요 더 쉽고 간단하죠?

그럼 더하기도 되는데 빼기도 될까요?

네 됩니다

a--;

a -= 1;

아 그럼 곱하기나 나누기도 되냐구요?

1씩 곱하거나 1씩 나누는게 의미가 있을까요? *^^*

(여담입니다만 컴퓨터 언어 중에 C++이라고 있죠? 네 C언어에 +1을 했다는 의미에서 C++라고 붙였다고 하네요

본래 이름은 C withd Class라고 했다하네요

그럼 C++에 또 ++하면 C#이 되지 않을까? 하시는 (아래에 ++ 하면) 분들이 있으시다면... 그렇게도 말이 되지만

본래 의미는 음악에서 따왔다고 하네요)


6.반복 반복 하기 - for문

자 구구단을 봅시다 저 72개를 일일하게 숫자 넣고 계산하면 너무 시간낭비도 심하고 힘들겠죠?

컴퓨터는 계산기 내가 명령을 내릴테니 너는 반복하거라! 해서 나온게 for 입니다

for(처음값;이값이 될때까지;값을 변경해라)
{

}

예를 들어 C#을 100번 출력한다고 합시다

for(int i=0;i<100;i++)  // i를 0부터 i가 100이 될때 까지 i를 계속 하나씩 더해줍니다.
{
   Console.WriteLine("C#");
}
이렇게 하면 C#이 100번 출력됩니다.!

이렇게 비슷한 작업을 반복 수행 하고자 할때 사용합니다.

7.그릇을 여러개 만들어서 반복하기 배열과 for문

그럼 아까 여러개 보았던 배열과 for문을 같이 사용할수 있지 않을 까요?

각 배열에 1부터 100까지 숫자를 하나씩 넣어 볼게요!

int[] a = new int[100] //a 100개 만들기

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

{

a[i] = i;

Console.writeLine(a[i]);

}

이렇게 하면 200줄을 써야 할지도 모르는 것을 6줄에 끝냈습니다!

이렇게 배열과 for문은 자주 쓰이니 잘 알아두셔요!

8. 이럴땐 이렇게 저럴땐 저렇게 if문

아내가 남편에게 말했습니다 올때 우유 사와! 아 계란도 있으면 6개 사오고~

컴퓨터도 이렇게 조건을 줄수 있습니다. 바로 if문입니다.

if(계란이 있으면)  //조건이 참일때
{
6개 사온다   //실행
}
else                 //조건이 참이 아닐때
{
그외에는 우유만 사온다 //실행
}

이렇게요! 자그럼 숫자로 표현해볼까요?

int a;
int b;

a = 3;
b = 5;

if(a<b)
{
Console.WriteLine(a);
}
else
{
Console.WriteLine(b)
}

출력은 항상 5가 나옵니다! 한번씩 해보세요!

자 그러면 이럴때 이렇고 저럴땐 저렇게하고 그럴땐 그럴때는 어떻게 할까요?

if(이럴때)
{
이렇게
} else if(저럴때)
{
저렇게
}
else if(그럴때)
{
그렇게
}

자 그럼 코드로 볼까요?

if(0==a)
{
//0일때
}
else if(1==a)
{
//1일때
}
else
{
//그외 나머지
}

TIP! TIP!

Tip

혼란을 줄이는 코딩기법들

변수 a가 b보다 크다는 두가지로 표현할수 있습니다 b<a,a>b 동일하지만 부등호 방향이 반대여서 혼란스럽기도 합니다.

이럴때 저는 b<a 작은숫자는 왼쪽에 큰숫자는 오른쪽에 넣고 부등호는 <만을 사용합니다. 만약 제 코드에서 >표기가 나오면 이것은 오류!

은근 햇갈릴때가 많으니 알아두시면 유용합니다.


두번째

a==3은 가끔 코드에서 a=3과 같다 라고 착각해서 사용하는 경우가 있습니다 그래서 저는 3 == a 이렇게 사용합니다. 상수를 먼저 쓰는 것이죠

만약 3=a라고 쓰면 컴파일러는  오류를 나타내어 주고 바로 문제를 알수 있게 합니다.

이 팁들을 사용할지 말지는 자유입니다!



Visual Studio Community 2015 를 실행해 봅시다.

File->New->Project 를 클릭해 줍니다



Visual C#->Windows->Console Application 을 눌러줍니다 저같은 경우는 HelloWorld 라고 했습니다. 아무거나 해도 상관없어요!

자 우리 이제 세계에서 가장 유명한 프로그램을 만들어 봅시다.

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 ScoreProcess
{
    class Program
    {
        static void Main(string[] args)
        {
           Console.WriteLine("Hello World!");
        }
    }
}
 
cs

아마 Console.WriteLine("Hello World!"); 를 적어봅시다

그리고 실행 CTRL+F5를 누르면!


Hello World!

이프로그램이 왜 유명 하냐고 하면 지금 모든 프로그래밍 언어의 모체가 된 C언어를 데니스 리치라는 분이 만드셨는데 그분이 이 언어에 대한 책을 내고

그 책에서 처음 한 프로그래밍이 바로 Hello World라는 것을 출력하는 프로그램이었습니다. 그래서 대부분의 사람들이 처음 테스트를 해볼때

저 프로그램을 실행해 본다고합니다.

일단 기본적인 것을 해 보았으니 다음부터는 뭔가 계산하고 조작하는 프로그램을 만들어 보도록 하겠습니다!


요리를 하려면 재료가 있어야 하고 프로그래밍을 하려면 프로그래밍 도구가 있어야하겠죠?

C#을 배우기 위한 도구 비주얼스튜디오를 설치해 봅시다!

사실 자바언어의 경우는 이클립스,인텔리제이,넷빈즈 그외 여러가지...

벌써부터 공부하고 선택해야 합니다. C언어야 말할것도 없구요

그러나 C#은? 네 그냥 비주얼 스튜디오 쓰시면 됩니다.

C#도 MS에서 만들고 비주얼 스튜디오도 MS에서 만듭니다. 지네들? 이 만든거에 도구 까지 쓰니 얼마나 좋게 잘 만들겠어요? 실제로도 잘만들기도 했구요! 그러나! 나 이거 정말 싫어 딴거 쓰고 싶어 하시는 분들은 monodevelper 라는 게 있지만 이거 쓰시다가 비주얼 스튜디오 쓰시면 신세계가 펼쳐질것 입니다. 어쨋든 그 비주얼 스튜디오를 설치해 봅시다.

https://www.visualstudio.com/ko-kr/visual-studio-homepage-vs.aspx

에 접속합니다

여러가지가 있네요! 보라색의 비주얼스튜디오 커뮤니티 다운로드를 눌러줍니다.

Visual Studio Community 2015 다운로드 를 눌러줍니다

그러면 vs_community.exe 가 다운됩니다. 다운받고 실행해 줍니다.

저는 C++을 설치하기 위해 사용자 지정설치를 눌렀는데요

C#만 설치할 경우에는 표준 설치를 체크하고 다음버튼을 눌러주세요

설치중...

설치 완료!

네 저는 마이크로소프트 빠입니다.

마이크로소프트 과련 대외활동도 했고 MS관련 기기도 많이 가지고 있고 뭐 어쨋든!

마이크로소프트가 밀고 있는 강력한 언어인 C#을 공부겸 강좌 해보려 합니다!

그러기 위해서 만들었던 블로그인데 역시 하기가 쉽지 않네요!

아마 여러가지 책을 참조하여 무엇인가를 만들어 보는 방식!으로 할 예정이구요

1~6까지는 콘솔 에서 프로그래밍을

7~13 은 GUI에서 프로그래밍을 해볼 예정입니다. 윈폼을 이용할지 WPF를 할지는 고민중 인데요.. 뭐 두개다 필요하면 두개다 하죠 하하;;

뭐 어쨋든 얼마나 보실지 모르겠지만... 시작!

+ Recent posts