Egloos | Log-in


[C#] 정규분포(가우스 분포) 생성기


C++ Builder에는 gauss 난수 발생 함수가 내장함수로 제공되었는데, (randG())
Visual C#에서는 직접 만들어 써야 한다.

===============================================================
        private double gauss_N(Random rnd)
        {
            // 평균이 0이고, 표준편차가 1 가우스 난수를 발생
            double v1, v2, s;

            do
            {
                v1 = rnd.Next(-500000, 500001) / 500000.0;   // -1.0 ~ 1.0 까지의 값을 v1에 저장
                v2 = rnd.Next(-500000, 500001) / 500000.0;   // -1.0 ~ 1.0 까지의 값을 v1에 저장
                s = v1 * v1 + v2 * v2;
            } while (s >= 1 || s == 0);

            s = Math.Sqrt((-2.0 * Math.Log(s)) / s);

            return v1 * s;
        }
=================================================================

난수를 생성하려면, Random 변수를 사용하여야 하는데 변수 생성시마다 동일한 seed 값으로 초기화 되므로
gauss 함수 내에서 Random 변수를 선언하는 것은 좋지 않다.

따라서, Random 변수 rnd는 메인 class의 글로벌 변수로 1번만 초기화 한다.

==================================================================
        Random rnd = new Random(Convert.ToInt32(DateTime.Now.Hour) * 360000 + Convert.ToInt32(DateTime.Now.Minute) * 6000 + Convert.ToInt32(DateTime.Now.Second) * 100 + Convert.ToInt32(DateTime.Now.Millisecond));
==================================================================
       // 함수 호출시에..
          double x = gauss_N(rnd);
==================================================================

by 헤이즐넛 | 2009/06/13 08:04 | 프로그래밍 | 트랙백 | 덧글(0)

[C#] 윈도우즈 프로그램에서 로그인 처리 하기

윈도우즈 폼 프로그램에서 사용자 아이디와 패스워드 확인 처리를 하기 위하여,
메인 폼의 Load 이벤트에 아래와 같이 추가한다.

        private void Form1_Load(object sender, EventArgs e)
        {
            Login login_form1 = new Login();

            if (login_form1.ShowDialog() != DialogResult.OK) // 사용자 아이디, 패스워드 확인이 실패할 경우 프로그램 종료
                this.Close();
        }

아래와 같이 로그인 처리를 할 새로운 폼(class Login)을 프로젝트에 추가한다.

Login 버튼(Button1)의 클릭 이벤트는 아래와 같다.

        private void button1_Click(object sender, EventArgs e)
        {
            if (textID.Text.Trim() == "" || textPwd.Text.Trim() == "")
            {
                if (MessageBox.Show("아이디와 암호를 입력해 주세요.", "아이디 입력 오류", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Retry)
                {
                    textID.Text = "";
                    textPwd.Text = "";
                }
            }
            else
            {
                int res = Authenticate(textID.Text.Trim(), textPwd.Text.Trim());
                if (res > 0)
                {
                    this.DialogResult = DialogResult.OK;
                }
                else
                {
                    switch (res)
                    {
                        case -1:
                            if (MessageBox.Show("아이디를 잘못 입력하였습니다.", "사용자 로그인 오류", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning) == DialogResult.Retry)
                            {
                                textID.Text = "";
                                textPwd.Text = "";
                            }
                            else
                                this.DialogResult = DialogResult.Cancel;
                            break;
                        case -2:
                            if (MessageBox.Show("암호를 잘못 입력하였습니다.", "사용자 로그인 오류", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning) == DialogResult.Retry)
                            {
                                textPwd.Text = "";
                            }
                            else
                                this.DialogResult = DialogResult.Cancel;
                            break;
                        default:
                            MessageBox.Show("ISM-DVS 시스템 오류입니다. 관리자에게 문의하세요.", "사용자 로그인 오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            this.DialogResult = DialogResult.Cancel;
                            break;
                    }
                }
            }
        }

위 코드 중에서 아이디,패스워드를 확인하는 Authenticate() 함수는 아래와 같이 구현된다.

        private int Authenticate (string id, string pwd)
        {
            string con_str = "server=127.0.0.1; database=xxx; user id = sa; password=1111;";


            SqlConnection con = new SqlConnection(con_str);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "select pwdcompare(@pwd,passwd), idx from users where userid = @id";

            cmd.Parameters.Add("@id", SqlDbType.VarChar, 20);
            cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 50);
            cmd.Parameters["@id"].Value = id;
            cmd.Parameters["@pwd"].Value = pwd;
            SqlDataReader reader = null;

            try
            {
                con.Open();

                reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    if ((int)reader[0] > 0)
                        return 1;
                    else
                        return -2; // 암호 오류
                }
                else
                    return -1; // 아이디 오류
            }
            catch
            {
                MessageBox.Show("데이터 베이스 접속 오류", "사용자 확인");
                return -99;
            }
            finally
            {
                if (reader != null) reader.Close();
                con.Close();
            }
        }

by 헤이즐넛 | 2009/06/12 13:37 | 프로그래밍 | 트랙백 | 덧글(0)

[C#] 파일에서 숫자데이터 읽어들이기

아래와 같은 숫자 데이터가 기록된 파일을 읽어들이기 위해서는..

data.txt
-------------------------
1.0  2.2   4.4 5.5 // sample data
-------------------------

C++에서는 아래와 같이 간단히 읽을 수 있다.
===============
FILE *fi;
double x[4];
fi = fopen("data.txt","r");
for (int i=0; i<4; i++) fscanf(fi,"%lf", &x[i]);
fclose(fi);
================

C#에서는 스트링으로 먼저 읽은 후에 숫자로 변환한다.
=================
using System.IO;

StreamReader fi = new StreamReader("data.txt");
double x[4];
string line = fi.ReadLine();
char[] split = {' '}; // 문자열 분리할 character. {' ', ',', '/'} 와 같이 여러 캐릭터를 지정하여도 됨
string[] var = line.Split(split, 4, StringSplitOptions.RemoveEmptyEntries);
for(int i=0; i<4; i++) x[i] = (double)var[i];
fi.Close()
==================
위의 StringSplitOptions.RemoveEmptyEntries 옵션이 중요하다.
이 옵션을 생략하면.. 읽어들인 문자열 line의 데이터 1.0과 2.2 사이에 1개이상의 공백이 있으면
첫번째 공백은 Split 함수에 의해 제거되지만, 두번째 공백부터는  null string으로 var array에 담기게 된다.

by 헤이즐넛 | 2009/05/29 08:39 | 프로그래밍 | 트랙백 | 덧글(0)

2009년 읽은 책들

1. 섀클턴의 위대한 항해
- 섀클턴의 남극 도전기. 섀클턴과 팀원들의 남극탐험 준비과정부터 남극해에서의 조난, 사우스조지아 섬 귀환까지의 여정
2. 99번째 주검
 - 중세 유럽을 배경으로 한 캐드팰 수사가 주인공으로 나오는 앨리스 피터스의 소설
3. W - 세계를 보는 새로운 창
4. 열번찔러 안넘어 가는 당뇨 없다
 - 당뇨병에 걸린 서울대 유방암 전문의 유상영 교수의 식사와 혈당의 상관관계
5. 식사와 운동만으로 당뇨병을 고친다.
 - 일본 당뇨 전문가 와타나베쇼 박사의 조언
6. 암살자 - 이원호
 - 신개발 무기를 뺏기 위한 아랍 회교 단체, 미국간의 첩보전과 한국 해병대 대위의 활약을 소재로한 작가 이원호의 소설.
7. 나쁜 사마리아인들
 - 세계적 경제학자 장하준 교수의 신간
8. 4의 규칙
9. 일본전산 이야기
- 소형 모터분야의 세계 1위 업체인 일본전산(NIDEC)의 성공 신화와 나가모리 사장의 경영 철학
10. 귀환병 이야기
 - 이수영의 판타지 소설
11. 닌텐도의 비밀 - 데이비드 셰프
12. 암흑제국의 패리어드 - 이수영
 - "귀환병 이야기" 속편
13. 경제학 콘서트 2 (The Logic of Life) - 팀 하포드
14. 소녀의 인디아 - 정윤
15. 육일약국 갑시다 - 김성오
16. 이누가미 일족 - 요코미조 세이시
  - 긴다이치 코스케가 나오는 요코미조 세이시의 대표작
17. 다섯번째 여자 - 헤닝 만켈
18. 다크 문
19. The Appeal - John Grisham
20. 커피 경제학 - 김민주
21. 미소지은 남자 - 헤닝 만켈
22. 죽음을 연구하는 여인 - 아리아나 프랭클린

by 헤이즐넛 | 2009/04/14 14:29 | 영화, 책 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶