KOREA University/C++2008. 12. 28. 16:47
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT("Hello world");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst=hInstance;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);
 hWnd=CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);
 ShowWindow(hWnd, nCmdShow);
 while(GetMessage(&Message, NULL, 0, 0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 switch(iMessage) {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

윈도우즈프로그래밍(API)의 가장 기본적인 소스다.
흔히 말해 이런걸 Hello world 라고 하지...

학습적인 차원에서 이런건 통째로 외워주는 센스
Posted by 정훈승
KOREA University/C++2008. 12. 7. 12:38

#include <iostream>
using namespace std;

const int MaxSize = 100;

class Set {
private:
 int len; // 집합의 원소개수
 char members[MaxSize]; // 집합을 저장하는 배열
 int find(char ch); // 원소를 찾는다
public:
 Set() { len = 0; } // 공집합 생성자
 int getLength() { return len; } // 집합에 있는 원소의 개수를 반환
 void showset(); // 집합 출력
 bool isMember(char ch); // 집합의 원소인지 검사

 Set operator +(char ch); // 원소 추가
 Set operator -(char ch); // 원소 제거
 Set operator +(Set ob2); // 합집합
 Set operator -(Set ob2); // 차집합
 bool operator <(Set ob2); // 부분집합 확인
 bool operator >(Set ob2); // 부분집합 확인
 Set operator &(Set ob2); // 교집합
 Set operator |(Set ob2); // 대칭차집합
};

int Set::find(char ch) // ch에 명시된 원소의 색인을 찾아서 반환, 없으면 -1를 반환
{
 for (int i=0; i<len; i++) { if(members[i] == ch) return i; }
 return -1;
}

void Set::showset() // 집합의 원소들 출력
{
 cout << "{ ";
 for(int i=0; i<len; i++) { cout << members[i] << " "; }

 cout << "}\n";
}

bool Set::isMember(char ch) // ch가 집합이면 트루, 아니면 폴스
{
 if(find(ch) != -1) return true;
 return false;
}

Set Set::operator +(char ch) // 집합에 유일한 원소 추가
{
 Set newset; // 객체생성
 if(len == MaxSize)
 {
  cout << "Set is Full.\n";
  return *this; // 현재 집합을 반환
 }

 newset = *this; // 현재 집합을 복사

 if(find(ch) == -1) // 추가하려는 원소가 이미 존재하는지 검사하고, 존재하지않으면 추가
 {
  newset.members[newset.len] = ch;
  newset.len++;
 }

 return newset; // 갱신된 집합을 반환
}

Set Set::operator -(char ch) // 집합으로부터 원소 하나 제거
{
 Set newset;
 int i = find(ch); // 원소가 없다면 i는 -1

 for(int j=0; j<len; j++) // 남아있는 원소들을 복사하고 제거된 원소의 빈자리를 채움
 {
  if(j != i) newset = newset+members[j];
 }
 return newset;
}

Set Set::operator +(Set ob2) // 합집합
{
 Set newset = *this; // 첫번째 집합 복사

 for(int i=0; i<ob2.len; i++) { newset = newset + ob2.members[i]; } // 유일한 원소들 추가

 return newset; // 갱신된 집합 반환
}

Set Set::operator -(Set ob2) // 차집합
{
 Set newset = *this; // 첫번째 집합 복사

 for(int i=0; i<ob2.len; i++) newset = newset-ob2.members[i]; // 두번째 집합의 원소들 제거

 return newset; // 갱신된 집합 반환
}

bool Set::operator <(Set ob2) // 좌변의 집합이 우변의 집합의 부분집합인가? 트루 or 폴스
{
 if(len > ob2.len) return false; // ob1의 원소의 개수가 더 많으면 폴스
 for(int i=0; i<len; i++) { if(ob2.find(members[i] == -1)) return false; }

 return true;
}

bool Set::operator >(Set ob2) // 우변의 집합이 좌변의 집합의 부분집합인가? 트루 or 폴스
{
 if(len < ob2.len) return false; // ob1의 원소의 개수가 더 적으면 폴스
 for(int i=0; i<ob2.len; i++) { if(ob2.find(members[i] == -1)) return false; }

 return true;
}

Set Set::operator &(Set ob2) // 교집합
{
 Set newset;

 for(int i=0; i<len; i++)
  if(ob2.find(members[i]) != -1) // 두 집합에 모두 포함되어있는 원소 추가
   newset = newset + members[i];

 return newset;
}

Set Set::operator |(Set ob2) // 대칭차집합
{
 Set newset = *this;

 for(int i=0; i<ob2.len; i++)
 {
  newset = newset + ob2.members[i]; // 일단 합집합을 하고
 }

 Set newset2;

 for(int j=0; j<len; j++)
 {
  if(ob2.find(members[j]) != -1)
  {
   newset2 = newset2 + members[j]; // 합집합 한거에서 교집합 뺀다
   newset = newset - newset2;
  }
 }

 return newset;
}

int main()
{
 Set s1;
 Set s2;
 Set s3; // 공집합 3개 생성

 s1 = s1 + 'A';
 s1 = s1 + 'B';
 s1 = s1 + 'C';

 cout << "s1 after adding A B C: ";
 s1.showset();

 cout << "\n";

 cout << "Testing for membership using isMember().\n";
 if(s1.isMember('B'))
  cout << "B is a member of s1.\n";
 else
  cout << "B is not a member of s1.\n";

 if(s1.isMember('T'))
  cout << "T is a member of s1.\n";
 else
  cout << "T is not a member of s1.\n";

 cout << "\n";

 s1 = s1 - 'B';
 cout << "s1 after s1 = s1 - 'B' : ";
 s1.showset();

 s1 = s1 - 'A';
 cout << "s1 after s1 = s1 - 'A' : ";
 s1.showset();

 s1 = s1 - 'C';
 cout << "s1 after s1 = s1 - 'C' : ";
 s1.showset();

 cout << "\n";

 s1 = s1 + 'A';
 s1 = s1 + 'B';
 s1 = s1 + 'C';
 cout << "s1 after adding A B C: ";
 s1.showset(); // A B C

 cout << "\n- - - - - - - - - - - - - - - - - - - -\n\n";

 s2 = s2 + 'A';
 s2 = s2 + 'X';
 s2 = s2 + 'W';
 cout << "s2 after adding A X W: ";
 s2.showset(); // A X W

 cout << "\n- - - - - - - - - - - - - - - - - - - -\n\n";

 s3 = s1 + s2;
 cout << "s3 after s3 = s1 + s2: ";
 s3.showset(); // A B C W X

 cout << "\n";

 s3 = s3 - s1;
 cout << "s3 after s3 = s3 - s1: ";
 s3.showset(); // X W

 cout << "\n";

 cout << "s2 after s2 = s2 - s2: ";
 s2 = s2 - s2;
 s2.showset(); // s2에서 s2빼니까 아무것도 안남는다
 
 cout << "\n";

 s2 = s2 + 'C';
 s2 = s2 + 'B';
 s2 = s2 + 'A'; // ABC를 역순으로 추가

 cout << "s2 after adding C B A: ";
 s2.showset(); // C B A

 cout << "\n\n━━━━━━━━━━━━━━━━━━━━━━\n\n\n";

 Set s4;
 Set s5;
 Set s6;
 Set s7;

 s4 = s4 + 'A';
 s4 = s4 + 'B';
 s4 = s4 + 'C';
 s4 = s4 + 'D';
 cout << "s4: ";
 s4.showset(); // A B C D

 s5 = s5 + 'B';
 s5 = s5 + 'C';
 s5 = s5 + 'S';
 s5 = s5 + 'P';
 cout << "s5: ";
 s5.showset(); // B C S P

 cout << "\n";

 s6 = s4 & s5;
 cout << "s4와 s5의 교집합: ";
 s6.showset(); // B C

 cout << "\n";

 s7 = s4 | s5;
 cout << "s4와 s5의 대칭차집합 ";
 s7.showset(); // A D S P

 return 0;
}


이런 기초적인 프로그래밍 이론들은
나중에 큰 프로젝트에 디딤돌이 될 것이다...

진짜다 구라 아님 -_-
Posted by 정훈승
KOREA University/C++2008. 11. 12. 16:32
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
 int com;
 char choise;
 for(;;)
 {
  cout << "**** [1.가위, 2.바위, 3.보, 프로그램종료(q)] : ";
  cin >> choise;
  if (choise == 'q') return 0;
 
  com=rand()%3;
 
  switch(choise)
  {
   case '1' :
    cout << "나 : 가위\n" ;
    if(com==0) cout << "컴퓨터 : 가위 ▶▶▶ 비겼습니다.\n";
    if(com==1) cout << "컴퓨터 : 바위 ▶▶▶ 졌습니다.\n";
    if(com==2) cout << "컴퓨터 : 보 ▶▶▶ 이겼습니다.\n";
    break;
   case '2' :
    cout << "나 : 바위\n";
    if(com==0) cout << "컴퓨터 : 가위 ▶▶▶ 이겼습니다.\n";
    if(com==1) cout << "컴퓨터 : 바위 ▶▶▶ 비겼습니다.\n";
    if(com==2) cout << "컴퓨터 : 보 ▶▶▶ 졌습니다.\n";
    break;
   case '3' :
    cout << "나 : 보\n";
    if(com==0) cout << "컴퓨터 : 가위 ▶▶▶ 졌습니다.\n";
    if(com==1) cout << "컴퓨터 : 바위 ▶▶▶ 이겼습니다.\n";
    if(com==2) cout << "컴퓨터 : 보 ▶▶▶ 비겼습니다.\n";
    break;
  }
 
  cout << "\n";
 }
 return 0;
}

가위바위보 소스는 여러가지가 있다.
하지만 내가 직접 최소한으로 심플하게 작성해봤다.
Posted by 정훈승
KOREA University/C++2008. 10. 22. 11:50
1. 두 수를 입력받아 절대값으로 더하라
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 int no1, no2;
 cout << "두 수를 입력하세요 : ";
 cin >> no1;
 cin >> no2;
 cout << sqrt(no1*no1)+sqrt(no2*no2) << "\n";
 return 0;
}


2. 50부터 150까지 소수를 뽑아서 다 더해라
#include <iostream>
using namespace std;

int main()
{
 int sum=0, i, j, k;
 for(i=50; i<=150; i++)
 {
  k=0;
  for(j=2; j<=(i/2); j++)
  {
   if(i%j==0)
   {
    k=1;
   }
  }
  if(k==0)
  {
   cout << i << " is prime number."<< "\n";
   sum=sum+i;
  }
 }
 cout << "\nsum of prime number = " << sum << "\n";
 return 0;
}


3. 2차원배열을 입력받아 최대값과 최소값을 구하라
#include <iostream>
using namespace std;
int main()
{
 int num[4][5];
 int val[20];
 int a, b, t, size;
 size=20;
 cout << "input num[0][0] : "; cin >> num[0][0];
 cout << "input num[0][1] : "; cin >> num[0][1];
 cout << "input num[0][2] : "; cin >> num[0][2];
 cout << "input num[0][3] : "; cin >> num[0][3];
 cout << "input num[0][4] : "; cin >> num[0][4];
 cout << "input num[1][0] : "; cin >> num[1][0];
 cout << "input num[1][1] : "; cin >> num[1][1];
 cout << "input num[1][2] : "; cin >> num[1][2];
 cout << "input num[1][3] : "; cin >> num[1][3];
 cout << "input num[1][4] : "; cin >> num[1][4];
 cout << "input num[2][0] : "; cin >> num[2][0];
 cout << "input num[2][1] : "; cin >> num[2][1];
 cout << "input num[2][2] : "; cin >> num[2][2];
 cout << "input num[2][3] : "; cin >> num[2][3];
 cout << "input num[2][4] : "; cin >> num[2][4];
 cout << "input num[3][0] : "; cin >> num[3][0];
 cout << "input num[3][1] : "; cin >> num[3][1];
 cout << "input num[3][2] : "; cin >> num[3][2];
 cout << "input num[3][3] : "; cin >> num[3][3];
 cout << "input num[3][4] : "; cin >> num[3][4];
 val[0] = num[0][0];
 val[1] = num[0][1];
 val[2] = num[0][2];
 val[3] = num[0][3];
 val[4] = num[0][4];
 val[5] = num[1][0];
 val[6] = num[1][1];
 val[7] = num[1][2];
 val[8] = num[1][3];
 val[9] = num[1][4];
 val[10] = num[2][0];
 val[11] = num[2][1];
 val[12] = num[2][2];
 val[13] = num[2][3];
 val[14] = num[2][4];
 val[15] = num[3][0];
 val[16] = num[3][1];
 val[17] = num[3][2];
 val[18] = num[3][3];
 val[19] = num[3][4];
 for(a=1; a<size; a++)
 {
  for(b=size-1; b>=a; b--)
  {
   if(val[b-1] > val[b])
   {
    t = val[b-1];
    val[b-1] = val[b];
    val[b] = t;
   }
  }
 }
 cout << "max is " << val[19] << "\n";
 cout << "min is " << val[0] << "\n";
 return 0;
}


교수님이 의도한 100%정답이 아닐 수도 있지만,
어찌되었건 결론에 도달했기 때문에, 난 정답이라고 생각한다 -ㅅ-;;;;
Posted by 정훈승
KOREA University/C++2008. 10. 3. 02:40
#include <iostream>
#include <cstring>
using namespace std;
void QuickSort(char *element, int len);
void Run(char *element, int left, int right);
int main()
{
 char str[100];
 
 cout << "Insert 문자열 : ";
 cin >> str;
 cout << "퀵정렬 前 : " << str << "\n";
 
 QuickSort(str, strlen(str));
 cout << "퀵정렬 後 : " << str << "\n";
 return 0;
}
void QuickSort(char *element, int len) // 퀵정렬 소환
{
 Run(element, 0, len-1);
}
void Run(char *element, int left, int right) // 실제 퀵정렬의 원리
{
 int i, j;
 char x, y;
 i = left;
 j = right;
 x = element[(left+right)/2];
 while(i<=j)
 {
  while((element[i] < x) && (i < right)) i++;
  while((x < element[j]) && (j > left)) j--;
  if(i<=j)
  {
   y = element[i];
   element[i] = element[j];
   element[j] = y;
   i++; j--;
  }
 }
 if(left < j) Run(element, left, j);
 if(i < right) Run(element, i, right);
}

옛날에 자료구조 수업들을때 교수님이 그랬다.
퀵정렬이 현존 가장빠른 정렬방법이고,
아마 여러분들 중에 퀵정렬보다 더 빠른 정렬을 만든다면 아마도 노벨상 받을꺼라고...

무슨수로 만드냐 ㅡ,.ㅡ;;;
어쨋든 그 유명한 퀵정렬이다.

왼쪽과 오른쪽 경계가 만날 때까지 순서가 어긋난 element들을
서로 교환하면서 왼쪽과 오른쪽 부분을 탐색한다.
Posted by 정훈승
KOREA University/C++2008. 10. 3. 02:36
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
 int nums[50];
 int a, b, t;
 int size;
 size = 50;
 for(t=0; t<size; t++) nums[t] = rand();
 cout << "Original array is : \n ";
 for(t=0; t<size; t++) cout << nums[t] << " ";
 cout << "\n";
 for(a=1; a<size; a++)
  for(b=size-1; b>=a; b--)
  {
   if(nums[b-1] > nums[b])
   {
    t = nums[b-1];
    nums[b-1] = nums[b];
    nums[b] = t;
   }
  }
 cout << "\nSorted array is : \n ";
 for(t=0; t<size; t++) cout << nums[t] << " ";
 cout << "\n";
 return 0;
}

버블정렬은 아주 간단한 원리이기 때문에 함수를 쓸 필요가 없다.
Posted by 정훈승
KOREA University/C++2008. 9. 26. 15:00
#include <iostream>
#include <cctype> // isupper를 위해서
#include <cstring> // strcpy를 위해서
using namespace std;
int main()
{
 char str[100], insert[100];
 int i, count;
 cout << "Insert : ";
 gets(insert); // cin을 쓰면 공백을 무시해버린다
 strcpy(str, insert); // insert값을 받는다
 count = 0;
 for(i=0; str[i]; i++)
 {
  if(isupper(str[i])) count++; // 대문자 개수를 샌다
 }
 cout << str << " contains " << count << " uppercase letters.\n";
 return 0;
}


입력한 문자열에서 대문자 개수를 구하는 소스다.
이런 졸라 쉬운 소스를 올리는 이유는?
숙제였으니까 ㅋㅋㅋ

사실 C++가 객채지향 개념이 나올때까지는 C랑 완전 똑같다고 보면 된다.
그러므로 cout과 printf를 바꿀 줄만 안다면 C언어배우는 학생들은 내 쏘스 그대로 갖다붙혀도 됨
(물론 객채지향 개념이 없을 경우에만)
Posted by 정훈승
KOREA University/C++2008. 9. 25. 22:16
#include <iostream>
#include <cctype> // touuper 또는 tolower를 위해
using namespace std;
int main()
{
 char str1[100], str2[100]; // 100글자까지
 char *p1, *p2;
 /* 포인터를 주는 이유는 문자열이 같다고 쳐도 실제 컴퓨터에 저장된 주소가
    다르기 때문이다. 컴퓨터는 문자열이 달라도 주소가 같으면 같다고 한다. */

 int i;
 cout << "첫번째꺼 입력 : ";
 cin >> str1;
 cout << "두번째꺼 입력 : ";
 cin >> str2;
 for(i=0; str1[i] && str2[i]; i++)
 {
  str1[i] = toupper(str1[i]);
  str2[i] = toupper(str2[i]); // 대문자로 일괄 변경
 }
 p1 = str1;
 p2 = str2; // 포인터로 해줘야 컴퓨터가 주소값이 같은줄 안다
 while(*p1, *p2)
 {
  if(*p1!=*p2)
  {
   cout << "다르다\n";
   goto exit; // 다르다 값이 1개라도 나오면 바로 exit
  }
  p1++;
  p2++;
 }
 cout << "같다\n";
 exit: // 다르다 값이 1개라도 나오면 같다 값 재끼고 바로 끝
 
 return 0;
}

아...이거 하는데 은근히 머리 굴렸다.
네이버나 구글에 똑바로된 쏘스 하나도 없네. (내가 못찾은 것일까)

어쨋든 내 쏘스는 갖다 붙혔을때 100% 돌아가는 안전빵 쏘쓰다.
Posted by 정훈승
KOREA University/C++2008. 9. 23. 16:42
#include <iostream>
using namespace std;
int main()
{
 int dan, no;
 for(dan=2; dan<=9; dan++)
 {
  cout << dan << "단\n";
  for(no=1; no<=9; no++)
  {
   cout << dan << " x " << no << " = " << dan*no << "\n";
  }
  cout << "\n";
 }
 return 0;
}


그냥 넘어가기 쉬우면서도 실제로도 졸라 쉬운 이중 for문
가장 대표적인 예가 바로 구구단이다.
Posted by 정훈승
KOREA University/C++2008. 9. 19. 14:55
#include <iostream>
using namespace std;
int main()
{
 char no;
 for(;;)
 {

  cout << "      ━━━━━━\n";
  cout << "        뮤직차트\n";
  cout << "      ━━━━━━\n";
  cout << " ━━━━━━━━━━━━━\n";
  cout << "   1위. 서태지 - 난 알아요\n";
  cout << "   2위. 쿨 - 해변의 여인\n";
  cout << "   3위. 박효신 - 눈의 꽃\n";
  cout << "   4위. 이효리 - 유고걸\n";
  cout << "   5위. 빅뱅 - 하루하루\n";
  cout << " ━━━━━━━━━━━━━\n\n";
  cout << " 순위를 입력하시면 해당 정보를 볼 수 있습니다.\n";
  cout << " ('q'를 누르면 종료됩니다.)\n\n";
 

  cout << " 순위를 입력하세요 : ";
  cin >> no;
  switch(no)
  {
   case '1' :
    cout << "  1위. 서태지 - 난 알아요\n";
    cout << " ㆍ가수 : 서태지\n";
    cout << " ㆍ작곡 : 서태지\n";
    cout << " ㆍ작사 : 서태지\n"; break;
   case '2' :
    cout << "  2위. 쿨 - 해변의 여인\n";
    cout << " ㆍ가수 : 쿨\n";
    cout << " ㆍ작곡 : 이재훈\n";
    cout << " ㆍ작사 : 김성수\n"; break;
   case '3' :
    cout << "  3위. 박효신 - 눈의 꽃\n";
    cout << " ㆍ가수 : 박효신\n";
    cout << " ㆍ작곡 : 외국곡\n";
    cout << " ㆍ작사 : 박효신\n"; break;
   case '4' :
    cout << "  4위. 이효리 - 유고걸\n";
    cout << " ㆍ가수 : 이효리\n";
    cout << " ㆍ작곡 : 옥주현\n";
    cout << " ㆍ작사 : 옥주현\n"; break;
   case '5' :
    cout << "  5위. 빅뱅 - 하루하루\n";
    cout << " ㆍ가수 : 빅뱅\n";
    cout << " ㆍ작곡 : 양현석\n";
    cout << " ㆍ작사 : 양현석\n"; break;
   case 'q': goto stop; // 여기가 포인트
   default :
    cout << " ***잘못입력하셨습니다. 1부터 5까지 중에서 선택하세요.\n";
  }
 }
 stop: cout << "종료되었습니다.\n"; // 이렇게 써먹는다
 return 0;
}


인덱스에서 해당 번호를 입력하면 번호에 대한 정보가 나오게 하는 소스다.
정상적인 이론에 의하면 for문을 여러번 써서 쪼끔(?) 복잡해지게 되는데
단 1번의 for문을 이용해서 강제종료 시킬 수 있다.

바로 goto 를 쓰면 된다. 이거 존나 유용하다.
Posted by 정훈승