// 경우의수.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include "경우의수.h"
#include <conio.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 유일한 응용 프로그램 개체입니다.

CWinApp theApp;
#define MAX 5
using namespace std;
unsigned long cnt=0;
int monoselect(int curser,char monocode[MAX],int cnt);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;

 // MFC를 초기화합니다. 초기화하지 못한 경우 오류를 인쇄합니다.
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 오류 코드를 필요에 따라 수정합니다.
  _tprintf(_T("심각한 오류: MFC를 초기화하지 못했습니다.\n"));
  nRetCode = 1;
 }
 else
 {
  char monocode[MAX];
  for(int i=0;i<MAX;i++){
   monocode[i]='0';
  }
  int cnt=0;
  cnt = monoselect(MAX,monocode,cnt);
  printf("%ld",cnt);
  getch();
  // TODO: 응용 프로그램의 동작은 여기에서 코딩합니다.
 }
 
 return nRetCode;
}

int monoselect(int curser,char monocode_s[MAX],int cnt){
 char monocode[MAX];

 for(int i=curser-1;i>=0;i--){
  for(int a=0;a<MAX;a++){
   monocode[a] = monocode_s[a];
  }
  monocode[i]='1';
  cnt++;
  for(int j=0;j<MAX;j++){
   printf("%c",monocode[j]);
  }
 
   printf("\n");
  cnt=monoselect(i,monocode,cnt);
 }
 return cnt;
}


중복되지 않는 경우의 수 조합을 구하는 프로그램입니다.
재귀호출을 이용한 순환알고리즘으로 쉽게 풀 수 있습니다.

대략 5자리의 수라고 하면  11111 / 11110 / 11101 / 11011 / 10111 / 01111 이런 조합들을 출력하는거죠.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/09/08 20:24 2007/09/08 20:24
─ tag  ,

WM_COPYDATA 전송용 클래스.

Set_message // 보낼 메세지 dwData , CString
Set_destination // 목적지의 창이름. 프로세스이름도 오버로딩시켜야겠지.
Set_messagetype // 메세지타잎 WM_COPYDATA 기본 초기화. 다른것도 쓸수있겠지만. Param으로 들어가는 기본자료형이 PCOPYDATASTRUCT로 되어있다.

Send_message // 보내기. 위의 (destination,dwdata,message)바로입력도 오버로딩되어있다.(세팅후 바로전송.)
Clear // 초기화.

를 쓰면 이용가능하다.

COPYDATA에 종속적이라는게 큰문제. (정작본인은 COPYDATA용으로만 만들었으니까;)
선언시엔 Static으로 선언하여 이용전에 delete(해제)된 메모리를 참조하여 삐꾸나는일이 없도록 하자.

Set_message 에 PCOPYDATASTRUCT도 쓸수있도록 오버로딩 되어있다.
destination이 Null 일경우 전송이 안된다. (Send_message -1  반환.)

클래싱에관한 책을 많이 읽어보면서 처음으로 객체지향이라는 느낌으로 만들어본 클래스.
앞으로 만드는 클래스는 계속이렇게 보관해야겠다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/01/13 17:22 2007/01/13 17:22
트리, 리스트 컨트롤에서 deleteallitem() 함수를 사용후에 새 아이템을 insert해도 화면에서 데이터가 갱신이 안되는 문제발생.

컨트롤멤버함수중 SetRedraw(); 를 이용하면 해결이 가능하다.

SetRedraw(FALSE);는 갱신안함.

SetRedraw(TRUE);는 갱신함.

대량의 데이터를 입력할때는 상당한 깜박거림이 발생할수 있는데 이때는 의도적으로

데이터 입력전에 SetRedraw(FALSE); 로 맞춰둔 후

입력이 끝나면 SetRedraw(TRUE); 해주면 한번의 깜빡임으로 결과물을 볼 수 있다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2006/12/11 14:34 2006/12/11 14:34
─ tag  ,
공용체를 잠깐 봐보고, 암호화를 해보았다.
간단하게 각 1바이트의 4비트를 2개로 쪼개어, 앞뒤만 섞어준다.

||||||||  -> ||||||||

CFileException e;
CFile file,file2;
#pragma pack(1)
struct dbbit{
 unsigned int one:4; // 앞 4비트
 unsigned int two:4; // 뒤 4비트
}b;
union crpyt{
 char input[1];
 dbbit a;  // 1byte char와 공유하는 8비트
}temp;
#pragma pack()
if(!file.Open("c:\\temp\\1.txt",CFile::modeRead,&e)){
 return;
}
if(!file2.Open("c:\\temp\\2.txt",CFile::modeCreate|CFile::modeWrite,&e)){
 return;
}
int i=0;
while(file.GetLength()>i){
 file.Read(temp.input,1);  // 비트 교환
 b.two = temp.a.one;
 b.one = temp.a.two;
 temp.a.one=b.one;
 temp.a.two=b.two;
 i++;
 file2.Write(temp,input,1);
}
file.Close();
file2.Close();

1.txt - > 2.txt 암호화.
단순하게 텍스트정도는 뭔지 모르게 암호화할 수 있다.
바이너리도 간단하지만-_-; 암호화방법을 모르면 못풀겠고...
이올린에 북마크하기(0) 이올린에 추천하기(0)
2006/09/12 18:00 2006/09/12 18:00
─ tag  ,

군대에서 다시 처음부터 공부하고 있는 C.

사실 언어를 목적으로만 배웠지 언어자체를 공부한 건 얼마 되지도 않기 때문에 확실히 기초가 매우 부실한 프로그래머다.

그래서 요즘엔 C부터 시작해서 C++까지 싹 훑어보고 있다.

전혀 벗어나지 못한 구조적 프로그래밍 습관과 클래스 개념에 대한 무지. 공부할수록 확 와닿는다.


#include "stdafx.h"

class number{
private:  // private는 외부에서 절대 접근할수 없다. 멤버함수와 friend 선언된 함수 제외
int a;  
protected: // protected는 외부에서는 접근할수 없으나, 상속된 클래스의 멤버에서는
int b;       // 접근이 가능하다.
public:     // 말그대로 공용,
number(int k=5,int j=4);  // 생성자 매개변수없이 생성할경우 적용되는 초기값 설정
int c;
};

number::number(int k, int j){ // 생성자.
a=k;
b=j;
c=k+j;
}

class plus : public number{  // 상속 부분 number를 상속해서 plus 클래스를 생성
private:                               // 상속하는 순간 number클래스를 하나 생성하여서
int sum;                             // number클래스를 토대로 plus의 내용을 덧붙인다.

public:
void add(); // 상속받은 number클래스의 public 멤버변수 b,c를 더해서 sum에 넣는다.
void print(); // 출력
void incre(); // protected 멤버변수 b를 1증가시킨다.

plus operator+(plus a); // + 연산자 오버로딩. 함수내부를 일반함수처럼 코딩가능하다.

};

plus plus::operator+(plus a){
plus temp;
temp.c = this->c + a.c;
temp.b=0;
return temp;
}

void plus::add(){
sum = b+c;
//sum= a+b+c;
}

void plus::incre(){
b++;
}

void plus::print(){
printf("%d",sum);
}

void main(){

plus p,k,m; // number를 상속받아 plus클래스를 3개 생성하였다.

p.incre(); //상속받은 protected 멤버변수에 접근이 가능한지 체크


p.add(); // 상속받은 protected , public 멤버변수의 합을 plus클래스의 멤버변수에 넣는다.

k.add(); // p , k 의 sum값이 다르게 나오는 것을 확인. 상속받는 클래스(number)는 상속받은 각 클래스(plus k,m)에 독립적으로 선언&할당 된다는것을 알 수 있다.


m=p+k; // 연산자 오버로딩. + 연산자를 오버로딩해서 일반함수처럼 적용했다. 오버로딩 이기때문에 당연히 자료형이 일치하면 사용된다. 현재 오버로딩된 형태는 (plus) = (plus) + (plus)

// 2번째 클래스 (plus)는 클래스안에서 연산자 오버로딩을 하였을땐 자동으로 자신의 형태가 적용되는 것 같다. 일반 함수에서는 operator+(클래스 , 클래스) 이렇게 매개변수를 2개로 선언해서 사용한다.

m.add();
m.printf();

return;
}

http://www.sosc.nuri.cc/ (새 창으로 열기) 이곳의 강의를 보고 있습니다.
꽤 가볍고, 재밋게 설명해 놓았더라구요. 멘트 센스는 2004년도의 그것이지만. 하핫.
이제 virtual을 쓸때까지 열공을...
그러고 보니 요새는 글쓰는일이 거의 없네요; 귀차니즘인지. 점점 쇠퇴해가는 느낌-_-;

이올린에 북마크하기(0) 이올린에 추천하기(0)
2006/09/04 16:25 2006/09/04 16:25
openclose