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 정훈승
KOREA University/C++2008. 9. 18. 16:19
x = 10
y = 3
z = 3
일때

x - ++y = 6 이고, x - z++ = 7 이다.

++(증가연산)가 앞에 붙으면 +1을 해주고
뒤에 붙으면 계산이 모두 끝난 후에 비로소 +1을 해준다.

++가 앞에 붙는다면 그냥 간단하게 +1을 해주면 된다.

++가 뒤에 아무리 붙었다면, 계산할때 무시해도 좋다.
단, 실제값은 +1씩 해줘야 한다. 결과값으로 보여질땐 +1이 적용되지 않는다.

이는 C나 C++의 시험문제 중에 주로 나오는 패턴으로
정확히 이해하지 않으면 아주 햇깔리다.
이 기회에 아주 정확하게 원리를 이해해야 한다.
Posted by 정훈승
KOREA University/C++2008. 9. 11. 21:56
#include <iostream>
using namespace std;
int main()
{
 int number,i,j,k;
 
 cout << "입력해봐 : ";
 cin >> number;
 if (number == 1)
 {
  cout << "1\n"; // 1도 소수다
 }
 else if (number <= 0)
 {
  cout << "에러!\n"; // 0이나 음수는 에러!
 }
 else
 {
  cout << "1 "; // 1도 포함해주는 센스
  for(i=2; i<=number; i++)
  {
   k = 0;
   for(j=2; j<=(i/2); j++)
   {
    if ( i%j == 0 )
    {
     k = 1; // 이해안되면 그냥 외워주는 센스
    }
   }
   if (k == 0) cout << i << " ";
  }
  cout << "\n"; // 마지막에 줄바꿈 해주는 센스
 }
 return 0;
}

그대로 복사-붙여넣기 했는데 안돌아가는 잡소스때문에 빡돌았다면,
그대로 복사-붙여넣기 했을때 바로바로 돌아가는 소스를 찾고 있었다면,
내 글을 본 순간 비명을 질러도 좋다.

하지만 그대로 배끼기만 하고 연구를 게을리 하면 소인배다.
Posted by 정훈승