반응형
뇌를자극하는 C#.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter14 연습문제


1. 다음 코드의 출력 결과값은 얼마일까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
namespace Ex14_1
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Func<int> func_1 = () => 10;
            Func<intint> func_2 = (a) => a * 2;
 
            Console.WriteLine(func_1() + func_2(30));
        }
    }
}
cs

출력결과





2. 출력 결과가 다음과 같이 나오도록 다음 코드에 이벤트 처리기를 추가하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
 
namespace Ex14_2
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int[] array = { 1122334455 };
 
            foreach(int a in array)
            {
                Action action = () => Console.WriteLine(a * a);     
                action.Invoke();
            }
        }
    }
}
cs

출력결과




반응형
반응형
뇌를자극하는 C#.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter13 연습문제


1. 출력 결과가 다음과 같이 나오도록 아래의 코드에 익명 메소드를 추가하여 완성하세요.

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
using System;
 
namespace Ex13_1
{
    delegate int MyDelegate(int a, int b);
 
    class MainApp
    {
        static void Main(string[] args)
        {
            MyDelegate Callback;
 
            /* 익명 메소드 선언 1 */
            Callback = delegate (int a, int b)
            {
                return a + b;
            };
 
            Console.WriteLine(Callback(34));
 
            /* 익명 메소드 선언 2 */
            Callback = delegate (int a, int b)
            {
                return a - b;
            };
 
            Console.WriteLine(Callback(75));
        }
    }
}
cs


출력결과






2. 출력 결과가 다음과 같이 나오도록 다음 코드에 이벤트 처리기를 추가하세요.

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
using System;
 
namespace Ex13_2
{
    delegate void MyDelegate(int a);
 
    class Market
    {
        public event MyDelegate CustomerEvent;
 
        public void BuySomething(int CustomerNo)
        {
            if (CustomerNo == 30)
                CustomerEvent(CustomerNo);
        }
    }
 
    class MainApp
    {
        /* 이벤트 핸들러 작성 */
        static public void PrintMessage(int CustomerNo)
        {
            Console.WriteLine("축하합니다! {0}번째 고객 이벤트에 당첨되셨습니다.", CustomerNo);
        }
 
        static void Main(string[] args)
        {
            Market market = new Market();
            market.CustomerEvent += new MyDelegate(PrintMessage);
 
            for (int customerNo = 0; customerNo < 100; customerNo += 10)
                market.BuySomething(customerNo);
        }
    }
}
 
cs


출력결과


반응형
반응형
뇌를자극하는 C#.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter12 연습문제


1. 아래의 코드를 컴파일하고 실행하면 다음과 같이 예외를 표시하고 비정상적으로 종료합니다. try~catch 문을 이용해서 예외를 안전하게 잡아 처리하도록 코드를 수정하세요.


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;
 
namespace Ex12_1
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];
 
            for (int i = 0; i < 10; i++)
                arr[i] = i;
 
            for (int i = 0; i < 11; i++)
                try
                {
                    Console.WriteLine(arr[i]);
                }
                catch(IndexOutOfRangeException e)
                {
                    Console.WriteLine("에러 : " + e.Message);
                }
        }
    }
}
cs


출력결과




반응형
반응형
뇌를자극하는 C#.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter11 연습문제


1. 다음 코드에서 문제를 찾고, 그 원인을 설명하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections;
using System.Collections.Generic;
 
namespace Ex11_1
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Queue queue = new Queue();
            queue.Enqueue(10);
            queue.Enqueue("한글");
            queue.Enqueue(3.14);
 
            Queue<int> queue2 = new Queue<int>();
            queue2.Enqueue(10);
            queue2.Enqueue("한글");
            queue2.Enqueue(3.14);
        }
    }
}
cs


18, 19줄이 문제이다. 16줄 Queue<int> queue2 = new Queue<int>();를 보면 queue2는 형식 매개 변수로 입력한 형식인 int형 외에 입력을 허용하지 않는다. 따라서 queue2에는 int형 외에는 입력할 수 없다.



2. 다음 코드에서 1)에 들어갈 내용은 무엇입니까?

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
using System;
using System.Collections.Generic;
 
namespace Ex11_2
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Dictionary<string,string> dic = new Dictionary<string,string>();
 
            dic["하나"= "one";
            dic["둘"= "two";
            dic["셋"= "three";
            dic["넷"= "four";
            dic["다섯"= "five";
 
            Console.WriteLine(dic["하나"]);
            Console.WriteLine(dic["둘"]);
            Console.WriteLine(dic["셋"]);
            Console.WriteLine(dic["넷"]);
            Console.WriteLine(dic["다섯"]);
        }
    }
}
 
cs

출력결과




반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter10 연습문제


1. 다음 배열 선언 문장 중 올바르지 않은 것을 고르세요.

  1. int[] array = new string[3]{“안녕”, “Hello”, “Halo”};
  2. int[] array = new int[3]{1, 2, 3};
  3. int[] array = new int[]{1, 2, 3};
  4. int[] array = {1, 2, 3};

1번이 올바르지 않다. int형 배열 array를 만들겠다고, 알려줬는데 실제 객체를 만들 때는 string형으로 생성하기 때문에 올바르지 않다. 즉, 만들겠다고 선언한 형과 실제 생성하는 객체 형이 달라서 안된다.



2. 두 행렬의 곱은 다음과 같이 계산합니다. 다음 두 행렬 A와 B의 곱을 2차원 배열을 이용하는 계산하는 프로그램을 작성하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
namespace Ex10_2
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int[,] A = new int[22]{{32},{14}};
            int[,] B = new int[22]{{92},{17}};
            int[,] result = new int[22];
 
            result[00= A[00* B[00+ A[01* B[10];
            result[01= A[00* B[01+ A[01* B[11];
            result[10= A[10* B[00+ A[11* B[10];
            result[11= A[10* B[01+ A[11* B[11];
 
            Console.WriteLine("{0}, {1}", result[00], result[01]);
            Console.WriteLine("{0}, {1}", result[10], result[11]);
        }
    }
}
cs

출력결과




3. 다음 코드의 출력 결과는 무엇일까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections;
 
namespace Ex10_3
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Stack stack = new Stack();
            stack.Push(1);
            stack.Push(2);
            stack.Push(3);
            stack.Push(4);
            stack.Push(5);
 
            while (stack.Count > 0)
                Console.WriteLine(stack.Pop());
        }
    }
}
cs

출력결과



4. 다음 코드의 출력 결과는 무엇일까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections;
 
namespace Ex10_4
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Queue que = new Queue();
            que.Enqueue(1);
            que.Enqueue(2);
            que.Enqueue(3);
            que.Enqueue(4);
            que.Enqueue(5);
 
            while (que.Count > 0)
                Console.WriteLine(que.Dequeue());
        }
    }
}
cs

출력결과



5. 다음과 같은 결과를 출력하도록 아래의 코드를 완성하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections;
 
namespace Ex10_5
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Hashtable ht = new Hashtable();
 
            ht["회사"= "Microsoft";
            ht["URL"= "www.microsoft.com";
 
            Console.WriteLine("회사 : {0}", ht["회사"]);
            Console.WriteLine("URL : {0}", ht["URL"]);
        }
    }
}
cs

출력결과




반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter9 연습문제


1. 다음 코드에서 NameCard 클래스의 GetAge(), SetAge(), GetName(), SetName() 메소드들을 프로퍼티로 변경해 작성하세요.

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
using System;
 
namespace Ex9_1
{
    class NameCard
    {
       public int Age
        {
            set;
            get;
          
        }
 
        public string Name
        {
            set;
            get;
        }
 
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            NameCard MyCard = new NameCard()
            {
                Age = 24,
                Name = "상현"
            };
            
            Console.WriteLine("나이 : {0}", MyCard.Age);
            Console.WriteLine("이름 : {0}", MyCard.Name);
        }
    }
}
 
cs


출력결과




2. 다음 프로그램을 완성해서 다음과 같은 결과를 출력하도록 하세요. 단, 무명 형식을 이용해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
namespace Ex9_2
{
    class MainApp
    {
        static void Main(string[] args)
        {
            var nameCard = new {Name = "박상현", Age = 17 };
            Console.WriteLine("이름:{0}, 나이:{1}", nameCard.Name, nameCard.Age);
 
            var complex = new { Real = 3, Imaginary = -12  }; ;
            Console.WriteLine("Real:{0}, Imaginary:{1}", complex.Real, complex.Imaginary);
        }
    }
}
cs


출력결과


반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter8 연습문제


1. 인터페이스와 클래스가 다른 점은 무엇입니까?

  • 인터페이스는 접근 제한 한정자를 사용할 수 없다. 모든 것이 public으로 선언된다.
  • 인터페이스는 인스턴스를 만들 수 없다.

인터페이스를 상속받은 파생 클래스는 반드시 인터페이스에 선언되어 있는 모든 메소드 및 프로퍼티를 구현해줘야 하며, 이 메소드들은 public 한정자로 수식해야 한다.




2. 인터페이스와 추상 클래스가 다른 점은 무엇입니까?

  • 추상 클래스는 인터페이스와는 달리 메소드나 프로퍼티의 "구현"을 가질 수 있다.
  • 인터페이스에서는 모든 메소드가 public으로 선언, 반면 추상 클래스는 한정자를 명시하지 않으면 모든 메소드가 private로 선언.


반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter7 연습문제


1. 클래스와 객체, 인스턴스는 서로 어떤 점이 다른가요?

객체는 이 세상에 존재하는 사물이나 개념을 지칭합니다. 예를들면, 키보드, 사과, 스피커, 사람, 붕어빵 모든 것이 객체입니다. 클래스는 비유하자면 붕어빵을 만드는 틀입니다. 붕어빵은 객체입니다. 클래스는 객체를 만들 수 있는 틀을 갖추고 있지만, 실체화된 객체는 아닙니다. 이 붕어빵 틀(클래스)을 이용하여 붕어빵이라는 객체(실체)를 만들어 내는 것을 인스턴스화(실체화)라고 합니다. 따라서 클래스를 이용하여 만들어진 객체를 인스턴스라고 합니다.



2. 다음 코드에서 오류를 찾고, 오류의 원인을 설명하세요.

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
using System;
 
namespace Structure
{
   class A
    {
    }
 
    class B : A
    {
 
    }
 
    class C
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            A c = new B();
            B d = new A();
        }
    }
}
 
 
cs

B d = new A();에서 오류가 발생한다. 왜냐하면 파생 클래스를 생성하는데, 기반 클래스의 생성자만을 호출하기 때문이다. 파생클래스 생성과정에서 내부적으로 기반 클래스의 생성자를 호출하고, 파생 클래스 생성자를 호출하여 객체를 생성한다. 그러나 위 코드에서는 파생 클래스의 생성자를 호출하지 않고, 기반 클래스의 생성자만 호출하기 때문에 오류가 발생한다.



3. this 키워드와 base 키워드에 대해 설명하세요.

this 키워드는 객체 내부에서 자신의 필드나 메소드에 접근할 때 사용하는 키워드이다. 사용하는 이유는 클래스 필드와 클래스 내의 메소드 매개변수의 이름이 같을 때, 클래스 필드에 this 키워드를 붙여서 서로 구별하기 위해서이다. 아래코드는 사용예시이다.

1
2
3
4
5
6
7
8
9
10
class Employee
    {
        private string Name;
 
        public void SetName(string Name)
        {
            this.Name = Name; //this.Name은 필드의 Name. 우측의 Name은 매개변수 Name
        }
    }
 
cs


base키워드는 상속받은 파생 클래스에서 기반 클래스로 접근할 때 사용하는 키워드이다. 아래코드는 사용예시이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Base
    {
        public void BaseMethod()
        {
 
        }
    }
 
    class Derived : Base
    {
        public void DerivedMethod()
        {
            base.BaseMethod(); //base 키워드를 통해 기반 클래스에 접근
        }
    }
cs



4. 구조체에 대한 다음 설명 중 틀린 것을 모두 찾으세요.

  1. struct 키워드를 이용하여 선언한다.
  2. 복사할 때 얕은 복사가 이루어진다.
  3. 참조 형식이다.
  4. 메소드를 가질 수 있다.

2,3이 틀렸다. 구조체는 얕은 복사(Shallow Copy)를 하는 클래스와 다르게 깊은 복사(Deep Copy)를 한다. 그리고 형식은 값 형식을 가진다.



5. 다형성은 무엇이며, 오버라이딩과 무슨 관계가 있는지 설명하세요.

다형성을 한 문장으로 표현하면, "같은 모양의 다른 행동, 다른 모양의 같은 행동"이라고 정의할 수 있다. C#에서 좀 더 설명하자면, 상속받은 클래스의 메소드와 같은 이름의 파생 클래스의 메소드인데, 다른 행동을 하는 메소드이다.

C#에서 다형성을 구현하려면, 오버라이딩을 해야한다. 즉, 기반 클래스에서 상속 받은 파생 클래스에서 다형성을 실현하기 위하여 메소드를 재정의(오버라이딩) 해야한다. 따라서 오버라이딩은 다형성을 구현하는데 필요한 행위라고 말할 수 있다.

반응형
반응형
프로젝트 오일러.md

프로젝트 오일러 23번 문제


자신을 제외한 약수(진약수)를 모두 더하면 자기 자신이 되는 수를 완전수라고 합니다. 예를 들어 28은 1 + 2 + 4 + 7 + 14 = 28 이므로 완전수입니다. 또, 진약수의 합이 자신보다 작으면 부족수, 자신보다 클 때는 초과수라고 합니다.

12는 1 + 2 + 3 + 4 + 6 = 16 > 12 로서 초과수 중에서는 가장 작습니다. 따라서 초과수 두 개의 합으로 나타낼 수 있는 수 중 가장 작은 수는 24 (= 12 + 12) 입니다.

해석학적인 방법을 사용하면, 28123을 넘는 모든 정수는 두 초과수의 합으로 표현 가능함을 보일 수가 있습니다. 두 초과수의 합으로 나타낼 수 없는 가장 큰 수는 실제로는 이 한계값보다 작지만, 해석학적인 방법으로는 더 이상 이 한계값을 낮출 수 없다고 합니다.

그렇다면, 초과수 두 개의 합으로 나타낼 수 없는 모든 양의 정수의 합은 얼마입니까?



파이썬 코드

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
# -*- coding: utf-8 -*-
import math
 
#진약수를 모두 더한 값을 반환하는 함수
def divisors_sum(num):
    result = 0
    temp = math.sqrt(num)
       
    #n의 약수를 구할 때, 1부터 루트 n까지만 나눠본다. 나눠서 약수이면, n에서 해당 약수를 나눈 수도 약수이다.
    for i in range(1,int(temp)+1):
        if (num % i == 0):
            result += i + num/i
            if(temp == int(temp) and i == temp): #루트num 중복제거
                result -= i
    
    result -= num #자기자신을 뺀다
    return result
    
 
#num이 초과수이면 true, 아니면 false를 반환하는 함수
def Is_abundant_number(num):
    if(num < divisors_sum(num)): #num의 진약수의 합이 num보다 크면 초과수
        return True                                                                                       
    else:
        return False
        
abundant_list = [] #초과수를 저장할 리스트
sum_abundant_set = set() #2개의 초과수 합을 저장하는 집합
 
for n in range(12,28123):
    if(Is_abundant_number(n) == True): #n이 초과수이면 초과수 리스트(abundant_list)에 저장
            abundant_list.append(n)
    
 
#2개의 모든 초과수 합을 구함
for i in abundant_list:
    for j in abundant_list:
        if(i+< 28123):
            sum_abundant_set.add(i+j)
        
 
result = sum(range(1,28123)) - sum(sum_abundant_set)
print result
cs


풀이


초과수 리스트를 만든다. 초과수 리스트를 이용하여 2개의 초과 수 합 집합을 만든다. 집합을 사용한 이유는 자동으로 중복제거를 하기 위해서이다. 마지막으로 1부터 28123까지 합에서 2개의 초과 수 합을 빼면 답을 구할 수 있다. 

반응형
반응형
Untitled Document.md

뇌를 자극하는 C# 5.0 프로그래밍 Chapter6 연습문제


1. 다음 코드에서 Square() 메소드를 구현해서 프로그램을 완성하세요. Square() 함수는 매개 변수를 제곱하여 반환합니다. 프로그램의 실행 예는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
namespace Csharp_practice
{
    class Program
    {
        static double Square(double arg)
        {
            //이 메소드를 구현해주세요.
            return arg * arg;
        }
 
        static void Main(string[] args)
        {
            Console.Write("수를 입력하세요: ");
            string input = Console.ReadLine();
            double arg = Convert.ToDouble(input);
 
            Console.WriteLine("결과: {0}", Square(arg));
        }
    }
}
cs


출력결과




2. 다음 코드에서 Mean() 메소드를 실행하고 난 후의 mean은 얼마의 값을 가질까요? 3이라고요? 아닙니다. 0입니다. 자, 문제 나갑니다. mean이 0을 갖게되는 원인과 이를 바로잡으려면 다음 코드에서 어떤 부분을 고쳐야 할까요?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            double mean = 0;
 
            mean = Mean(12345, mean); //반환한 값을 mean에 저장
 
            Console.WriteLine("평균 : {0}", mean);
        }
 
        //double형을 반환하는 메소드로 고친다.
        public static double Mean(double a, double b, double c, double d, double e, double mean) 
        {
            return (a + b + c + d + e) / 5;
        }
    }
}
cs


출력결과


처음에 결과가 0으로 나오는 이유는 변수 mean이 처음에 초기화 값인 0이 그대로 출력되기 때문이다. 원하는 값을 연산하기 위해서, Mean메소드를 void형이 아닌 나눗셈 연산결과 값(double)을 반환하는 메소드로 바꾸었다. 그리고 Main 부분에서 Mean함수로 반환된 값을 mean에 저장하면 원하는 결과를 얻을 수 있다.




3. 다음 코드에 Plus() 메소드가 double 형 매개 변수를 지원하도록 오버로딩하세요. 이 프로그램이 완성된 후의 실행 결과는 다음과 같아야 합니다.

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
using System;
namespace Csharp_practice
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 3;
            int b = 4;
            int resultA = 0;
 
            Plus(a, b, out resultA);
 
            Console.WriteLine("{0} + {1} = {2}", a, b, resultA);
 
            double x = 2.4;
            double y = 3.1;
            double resultB = 0;
 
            Plus(x, y, out resultB); //오버로드가 필요한 메소드입니다.
 
            Console.WriteLine("{0} + {1} = {2}", x, y, resultB);
        }
 
        public static void Plus(int a, int b, out int c)
        {
            c = a + b;
        }
 
        // 이 아래에 double 형 매개 변수를 받을 수 있도록
        // 오버로딩된 Plus() 메소드를 작성하세요.
        public static void Plus(double a, double b, out double c)
        {
            c = a + b;
        }
    }
}
cs


출력결과




반응형

+ Recent posts