'C#/Problems'에 해당되는 글 5건

  1. 2019.10.18 JSon 역질렬화할때 컬럼명이 클래스의 데이터를 찾아가는 과정
  2. 2019.10.17 상속 클래스 부모클래스와 자식클래스의 멤버 변수는 다를수 없다.
  3. 2019.09.27 String.Format을 이용하지않은 중앙정렬
  4. 2019.09.27 한글과 영문,숫자의 바이트 인식
  5. 2019.09.24 최대 공약수 구하기

JSon 역질렬화할때 컬럼명이 클래스의 데이터를 찾아가는 과정

C#/Problems 2019. 10. 18. 13:49

클래스 생성자에 매개변수가 없을때에는 클래스의 멤버 변수와 Json 파일의 컬럼명을 비교하며 대입을 한다.

클래스 생성자에 매개변수가 있을 때에는 그 생성자의 매개변수의 이름과 Json 파일의 컬럼명을 비교하며 대입한다.

:

상속 클래스 부모클래스와 자식클래스의 멤버 변수는 다를수 없다.

C#/Problems 2019. 10. 17. 23:14

10.17일에 실습때 했던 LootBox 만들기 때 자식클래스인 WeaponBox 에 List<Weapon> 타입을 멤버 변수에 넣으려고 시도했지만 LootBox 클래스의 멤버 변수의 타입이 List<Equipment> 였기 떄문에 오류가 났다. 결국 어쩔 수 없이 Weapon박스의 멤버변수는 따로 설정 하지않고 LootBox의 데이터 안에서 색출 해 내는 방법으로 문제를 해결했다. (GetType() 과 typeof() 메소드를 이용해 부모클래스의 배열 내 요소의 클래스를 비교할 수 있었다.)

:

String.Format을 이용하지않은 중앙정렬

C#/Problems 2019. 9. 27. 11:45

Console.WriteLine(String.Format("{0,42}", "길동"));

String.Format 메소드를 사용하면 입력하고자 하는 문자열("길동")의 길이를 .Length 를 이용해 자동 인식한다.

자동 인식한 문자열의 길이에서 총길이 (42)에서 문자열 길이만큼을 뺀 나머지를 공백으로 오른쪽을 채워넣는다.

여기서 문제는 자동인식할때 문자열이 한글일때도 한글자당 길이를 1로 인식한다.

자동으로 문자열 길이를 인식하므로 Encoding. Default. GetBytes(문자열) 이 문을 사용해 따로 문자열의 길이를 지정해줄 수가없다. 

따라서 String.Format을 사용하지 않고 임의적으로 공간을 앞에 주는데 그 공간의 갯수는 총 길이 - 문자열바이트값 이다.

앞에 두는 빈공간을 뒤에도 똑같이 두게되면 문자는 중앙으로 오게된다.

총길이가 16칸인 칸에 앞뒤로 같은 빈공간을 두면서 문자를 정렬을 하기위한 식:

int bytelen = Encoding.Default.GetBytes(name[i]).Length;

int padlen = 8 - (bytelen / 2);

하지만 여기서 input 값이 영문일 경우, input의 byte길이 나누기 2를 하는 과정에서 소수가 발생할 수 가있다.

예를 들어 문자열이 영문 "a' 한글자 일때 2를 나누면 0.5가 된다.

여기서 padlen 의 타입은 int이기 때문에 0.5를 1로 반환한다.

1로 반환하게되면 반올림된 0.5의 값이 앞뒤로 두개가 되어 총 길이가 한칸이 늘어나는 현상이 생긴다

bytelen % 2 != 0 일때의 상황을 따로 만들어 뒤에 오는 빈공간이 한칸 줄게 만들어줬다.

if (bytelen % 2 != 0) 
                {
                    Console.WriteLine("{0}", "".PadLeft(padlen) + name[i] + "".PadRight(padlen-1) + "1");
                }
                else 
                {
                    Console.WriteLine("{0}", "".PadLeft(padlen) + name[i] + "".PadRight(padlen) + "1");
                }

:

한글과 영문,숫자의 바이트 인식

C#/Problems 2019. 9. 27. 10:23

format.string 을 이용해 정렬을 하려고 할때 시스템은 한글 한글자와 영문 한글자의 길이를 똑같이 1로 인식해서 정렬할때 문제가 생긴다.

이 문제를 해결하기 위해 새로운 변수를 만들어 그 변수의 값에 input 문자열의 바이트 값을 구하여 padingleft 의 값을 조절해주면 된다.

코드:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _09._27_step1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] name = new string[] { "홍길동" , "길동""abc""ab"};
            
            for (int i = 0; i < name.Length; i++)
            {
                int padlen = 10 - Encoding.Default.GetBytes(name[i]).Length;
                Console.WriteLine("{0}","".PadLeft(padlen)+ name[i]);
            }
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

출력:

 

 

:

최대 공약수 구하기

C#/Problems 2019. 9. 24. 17:34

공약수는 

            int num1 = int.Parse(Console.ReadLine());
            int num2 = int.Parse(Console.ReadLine());            
            for (int i = 1; i < num1 || i<num2; i++)
            {
                if (num1 % i == 0 && num2 % i == 0) //공약수
                {
                    Console.WriteLine(i);
                }                         
            }
코드를 통해 구할수 있었지만 최대 공약수를 구하려면 공약수 끼리 비교를 해야한다는 생각때문에 난관에 부딪혔었다.

정답 코드:

int num1 = int.Parse(Console.ReadLine());
            int num2 = int.Parse(Console.ReadLine());
            int sum = 0;
            for (int i = 1; i < num1 || i<num2; i++)
            {
                if (num1 % i == 0 && num2 % i == 0) //공약수
                {
                    sum = i;
                }                         
            }
            Console.WriteLine(sum);
            

하지만 새로운 변수 sum을 만들어 공약수가 높아지면서 이를 갱신 할수있었고, 더이상 갱신 할 값이 없을때 포문이 종료되는것을 이용해 포문 밖에 출력 메세지를 써서 최대공략수만 쓸수 있게 되었다.

: