'소프트웨어'에 해당되는 글 190건

  1. 2007.02.24 [2003년 기말 4번] 정렬/평균/표준편차 - 수학 함수 사용
  2. 2007.02.24 [2003년 기말 3번] 사칙연산 - 함수 사용
  3. 2007.02.23 [2003년 기말 2번] 나누어 떨어지는 정수 갯수 출력 - 나머지
  4. 2007.02.22 [2003년 기말 1번] 홀수 덧샘 출력 - while 반복문
  5. 2007.02.22 [2005년 기말] 정리
  6. 2007.02.22 [2005년 기말 10번] 문자열 비교 - 문자값 활용
  7. 2007.02.22 [2005년 기말 9번] 정렬 - 찾아보기 표(Lookup table)
  8. 2007.02.22 [2005년 기말 8번] 난수 생성 - 동적 할당
  9. 2007.02.22 [2005년 기말 7번] 구구단 - 다중 for 문
  10. 2007.02.21 [2005년 기말 6번] 성적 처리 - 구조체
  11. 2007.02.21 [2005년 기말 5번] 최대/최소/평균값 출력 - 매계변수 입력
  12. 2007.02.20 [2005년 기말 4번] 순수 문자 정렬 출력 - 문자열 정렬
  13. 2007.02.19 [2005년 기말 3번] 문자열 처리 - 문자열 배열
  14. 2007.02.19 [2005년 기말 2번] 최소공배수/ 최대공약수 - 조건 반복
  15. 2007.02.16 [2005년 기말 1번] 소수 출력 - 사용자 정의 자료형 함수
  16. 2007.02.16 [2005년 중간] 정리
  17. 2007.02.16 [2005년 중간 10번] 원 넓이 - 함수 호출
  18. 2007.02.16 [2005년 중간 9번] 무작위 난수 출력 - 특정 범위 난수 생성
  19. 2007.02.16 [2005년 중간 8번] 사칙 연산 - 함수 호출
  20. 2007.02.16 [2005년 중간 7번] 대/소문자 숫자 갯수 출력 - 문자값(ASCII code)
  21. 2007.02.14 [2005년 중간 6번] 난수 확률 생성 - 난수/반복
  22. 2007.02.14 [2005년 중간 5번] 공배수 갯수 출력 - 나머지
  23. 2007.02.13 [2005년 중간 4번] 공약수 출력 - 반복문
  24. 2007.02.13 [2005년 중간 3번] 범위 계산 - 반복문 사용
  25. 2007.02.12 [2005년 중간 2번] 화면 출력 - 키보드 입력 제어
  26. 2007.02.12 [2005년 중간 1번] 시간 계산 - 단순 출력
  27. 2007.02.12 [2004년 기말] 정리
  28. 2007.02.12 [2004년 기말 10번] 모음 출력 - 조건문
  29. 2007.02.12 [2004년 기말 9번] 반복 계산 - 제어/반복
  30. 2007.02.12 [2004년 기말 8번] 소수 구하기 - 정의/반복문



목적
  - cmath(math.h) 를 사용 한다.
  - 표준편차와 평균을 계산 한다.

문제

사용자 삽입 이미지

풀이

#include <iostream>
#include <cmath>

using namespace std;

int main(void)
{
 int i, j;
 float fScr[5] = {0};
 float fTotal, fDeviation, fSwap;
 fTotal = fDeviation = fSwap = 0.0;
 i = j = 0;
 
 cout << "다섯개의 실수값을 입력 하여라 : ";
 cin >> fScr[0] >> fScr[1] >> fScr[2] >> fScr[3] >> fScr[4];

 for(i = 0; i < 5; i++)
 {
  for(j = i; j < 5; j++)
  {
   if(fScr[i] < fScr[j])
   {
    fSwap = fScr[j];
    fScr[j] = fScr[i];
    fScr[i] = fSwap;

   }

  }

  fTotal += fScr[i];

 }

 for(i = 0; i < 5; i++)
   fDeviation += pow((fScr[i] - fTotal / 5), 2);

 
 fDeviation = sqrt(fDeviation / 5);


 cout << "크기 순으로 정렬한 결과 : " << fScr[0] << ' ' << fScr[1] << ' ' << fScr[2] << ' ' << fScr[3] << ' ' << fScr[4] << endl;
 cout << "입력된 값의 평균 : " << fTotal / 5 << endl;
 cout << "입력된 값의 표준편차 : " << fDeviation << endl;


 return 0;
}

해설
  - cmath 와 math.h 는 동일한 역할을 합니다.
  - 정렬하면서 합계를 구했습니다.

참고
  - 유사 문제
  - 표준편차 구하기

사용자 삽입 이미지

Posted by 카켈




목적
  - 함수를 생성할줄 안다.

문제

사용자 삽입 이미지
풀이

#include <iostream>

float add(float,float);
float sub(float,float);
float mul(float,float);
float div(float,float);

using namespace std;

int main(void)
{
 char cOp = 0;
 float fA, fB, fOut;
 fA = fB = fOut = 0.0;

 cout << "연산자 하나와 두 실수 값을 입력하세요 : ";
 cin >> cOp >> fA >> fB;

 switch(cOp)
 {
  case '+':
   fOut = add(fA, fB);
   break;

  case '-':
   fOut = sub(fA, fB);
   break;

  case '*':
   fOut = mul(fA, fB);
   break;

  case '/':
   fOut = div(fA, fB);
   break;

  default:
   break;

 }

 cout << fA << ' ' << cOp << ' ' << fB << " = " << fOut << endl;
 return 0;

}

float add(float fA, float fB)
{ return fA + fB; }

float sub(float fA, float fB)
{ return fA - fB; }

float mul(float fA, float fB)
{ return fA * fB; }

float div(float fA, float fB)
{ return fA / fB; }


해설
  - 부호에 따른 함수를 별도로 실행하게 했습니다.
  - 맨 윗부분의 껍데기 선언부는 prototype 구문으로써 선언후 정의 하는 부분과 형이 틀리지 않게 형 검사(type checking) 과 linked list 같은 정의가 끝나지 않은 자료를 참조 해야할때 쓰여 집니다. 선택사항으로 조건을 충족시켜도 되지 않은 환경이라면 쓰지 않아도 무방합니다.

참고

  - 유사 문제

Posted by 카켈



목적
  - 키보드로 원하는 값을 입력 받는다
  - 원하는 값을 화면에 출력한다
  - while 반복문을 익힌다
  - 나머지를 이해한다.

문제
사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 int iIn, iCount,iDiv3, iDiv5;
 iIn = iDiv3 = iDiv5 = 0;
 iCount = 1; // Div 0 방지

 cout << "100 보다 큰 정수값을 입력하세요 : ";
 cin >> iIn;

 if(iIn < 100)
 {
  cout << "100 보다 작습니다" << endl;
  exit(-1); // 강제 종료

 }

 while(iCount <= iIn)
 {
  iDiv3 = iCount % 3 == 0 ? iDiv3 + 1 : iDiv3;
  iDiv5 = iCount % 5 == 0 ? iDiv5 + 1 : iDiv5;
  iCount++;
 }

 cout << "3으로 나누어 떨어지는 정수의 수 : " << iDiv3 << "개" << endl;
 cout << "5  로 나누어 떨어지는 정수의 수 : " << iDiv5 << "개" << endl;

 return 0;
}

해설
  - % 연산자는 나머지를 계산하는 연산자로써 5 % 3 = 2 입니다.
  - exit 함수는 프로그램을 강제 종료 하는 함수 입니다. 함수를 종료하는 return 과는 조금 차이가 있습니다.

참고
  - 유사 문제 : 나머지 관련 , http://cakel.tistory.com/search/나머지

Posted by 카켈




목적
  - while 반복문을 익힌다.

문제

사용자 삽입 이미지


코드 풀이

#include <iostream>

using namespace std;

int main()
{
 int i, iOut;
 long lTotal = 0;
 i = iOut = 0;

 cout << "정수 값을 입력하세요 : ";
 cin >> i;
 iOut = i;
 
 while(i > 0)
 {
  lTotal = i % 2 == 1 ? lTotal + i : lTotal;
  i--;

 }

 cout << "1 부터 " << iOut << "까지의 홀수 합은 " << lTotal << "입니다." << endl;

 return 0;
}

해설
  - C++ 는 C 보다 더 간소하면서도 더 강력한 기능을 제공합니다. 하위호환성(backward compatibility)도 최대한 지원합니다.
Posted by 카켈




  기말 고사 정리 끝났습니다. 이번 회차에 남는 것은 구조체를 포인터로 연결한 것과 최소 공배수 입니다. 그 이외에는 이전 차와 동일하거나 유사 합니다.

  저작권 공지
  문제/해답 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com 

  교육용을 목적으로 한다면 자유롭게 쓸수 있습니다.

Posted by 카켈



1. 목적

  - 문자열 배열에 속한 문자값을 이해한다.

2. 문제
(점수 : 30 점)
  - string.h 를 활용하지 않고 문자열을 입력 받아서 문자의 크기를 비교하여라.
  - 대문자 > 소문자 > 띄어 쓰기 이며 크기값은 ASCII 코드 값을 의미 한다.
  - 출력 화면
1차)
첫번째 문자열을 입력하세요 : Hello
두번째 문자열을 입력하세요 : Hello World
Hello World 가 더 크다.
Press any key to continue
2차)
첫번째 문자열을 입력하세요 : ABCDEF
두번째 문자열을 입력하세요 : AABCDE
ABCDEF 가 더 크다.
Press any key to continue
3차)
첫번째 문자열을 입력하세요 : abd c
두번째 문자열을 입력하세요 : abc d
두 문자열은 동일하다.
Press any key to continue

3. 이해
  - ASCII 코드 값을 실제 계산을 할줄 아는가?
  - 문자열을 받아서 배열로 저장할 수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 char in_a[255] = {0};
 char in_b[255] = {0};
 long scr_a, scr_b;
 int i;
 scr_a = scr_b = i = 0;
 
 printf("첫번째 문자열을 입력하세요 : ");gets(in_a);
 printf("두번째 문자열을 입력하세요 : ");gets(in_b);

 while(in_a[i] != 0 || in_b[i] != 0)
 {
  scr_a += (int)in_a[i];
  scr_b += (int)in_b[i];
  i++;

 }

 if(scr_a > scr_b) printf("%s 가 더 크다.\n",in_a);
 if(scr_a < scr_b) printf("%s 가 더 크다.\n",in_b);
 if(scr_a == scr_b) printf("두 문자열은 동일하다.\n");

 return 0;
}


5. 해설
  - 두 문자열이 NULL 될때 까지 ASCII 코드 값의 합을 저장하는 내용입니다. 0 으로 초기화 시켰기 때문에 한 문장이 끝났을때에 뒷자리를 계속 더해도 0 이기 때문에 계속 더할수 있습니다.
  - ASCII 코드 값을 int 형으로 형변환 시켜 더하면 크기에 따른 숫자 값을 입력 받아 쓸수가 있습니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적

  - 정렬에 대한 찾아 보기 표(Lookup table)을 이해한다.
  - 반복문에서 탈출하는 기법을 익힌다.

2. 문제 (점수 : 30 점)  - 문제를 수정했습니다.
  - 두 문자열을 입력 받아 공통적으로 포함되는 문자와 첫번째 문자열을 정렬한 문자들을 출력하라
  - 출력 순서는 AaBbCcDd ... 순으로 대문자가 우선으로 오고 다음 소문자이며 알파벳 순으로 한다.
  - 부호나 띄어쓰기 같은 비알파벳 문자는 생략한다.
  - 출력 화면

첫번째 문자열을 입력하세요 : Visual C++ Objective Oriented Programming
두번째 문자열을 입력하세요 : Hello I Love You I need You I Miss You

두 문자열에 공통적으로 포함된 문자 : abCcdegHIijLlMmnOoPrstuVvY
첫번째 문자열을 정렬한 문자 : abCcdegijlmnOoPrstuVv
Press any key to continue

  - 참고 : 두 문자열에 공통적으로 포함된 문자가 문제에서 틀려서 수정했습니다. 아래 첫번째 문자열을 정렬한 문자가 문제 파일에서 출력 결과물에 나오지만 위 결과에서 보듯이 맞지 않습니다.

3. 이해
  - 검색이나 계산을 편하게 하기 위한 표 작성을 이해하는가?
  - 문자열에 대한 정확한 이해를 하였는가?

4. 코드

#include <stdio.h>
#include <string.h>

int main()

{
 char in_a[255] = {0};
 char in_b[255] = {0};
 char temp[255] = {0};
 char out[255] = {0};
 
char ref[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";

 int i, j;
 i = j = 0;
 
 printf("첫번째 문자열을 입력하세요 : ");gets(in_a);
 printf("두번째 문자열을 입력하세요 : ");gets(in_b);

 putchar('\n');
 strcat(temp,in_a);
 strcat(temp,in_b);

 while(temp[i] != 0)
 {
  if(temp[i] != ' ')
  {
   out[j] = temp[i];
   j++;

  }

  i++;

 }

 i = j = 0;

 printf("두 문자열에 공통적으로 포함된 문자 : ");
 while(ref[j] != 0)
 {
  while(out[i] != 0)
  {
   if(out[i] == ref[j])
   {
    putchar(out[i]);
    break;
   }
   i++;

  }

  i = 0;
  j++;
 }

 
 i = j = 0;

 putchar('\n');

 printf("첫번째 문자열을 정렬한 문자 : ");
 while(ref[j] != 0)
 {
  while(out[i] != 0)
  {
   if(in_a[i] == ref[j])
   {
    putchar(in_a[i]);
    break;
   }
   i++;

  }

  i = 0;
  j++;
 }

 putchar('\n');

 return 0;
}


5. 해설
  - 표본 표인 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz 는 이상적인 검색 결과 표이며 이에 대응하여 검색 결과를 계산하지 않고 빠르게 찾을수 있습니다.
  - 두 문자열에 공통적으로 포함 된걸 찾기 위해 strcat 함수로 두 문자열을 합친후 띄워쓰기 문자를 없애버리고 A 부터 한글자씩 대응하며 검색합니다. 즉 글자를 계산으로 하지 않고 찾기를 수행함으로써 복잡한 알고리듬을 간소화 했습니다.
  - 첫번째 문자열을 정렬한 문자는 문제에서 제시하는 결과를 나타내기 위해 만들었으며 in_a 만 검색하여 출력했습니다.
  - 검색된 글자가 2번 이상 나오지 않게 하기 위해 break; 문으로 탈출 합니다.
  - char ref[] 에서 [] 한 것은 위의 경우 처럼 바로 정의시에 자동으로 크기를 만들어 주라는 의미 입니다. 자동으로 최적화된 ref[53] : ref[0] = 'A' ~ ref[52] = 'z' / ref[53] = 0 가 생깁니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/9-3-4.htm - Lookup table

Posted by 카켈




1. 목적

  - 배열의 동적 할당에 대해 이해한다.

2. 문제 (점수 : 15 점)
  - -50 ~ 100 사이의 임의이 값을 5만개 생성하여 배열에 저장하되 배열은 동적 메모리에 할당하여 사용하라.
  - 각 범위 ( -50~0 / 1~50 / 51~100 ) 에 따른 개수와 생성된 난수의 평균 또한 구하여라
  - 출력 화면

-50 ~   0 범위의 개수 : 16823 개
  1 ~  50 범위의 개수 : 16724 개
 51 ~ 100 범위의 개수 : 16453 개

생성된 난수의 평균 : 24.963620
Press any key to continue


3. 이해
  - 난수를 만들 줄 아는가?
  - 동적 할당에 대해 이해하고 생성할줄 아는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

 int *gen;
 int cMinus, cZero, cFifty, i;
 long total;
 total = cMinus = cZero = cFifty = i = 0;

 srand((unsigned)time(NULL));
 rand();

 gen = (int*)calloc(50000,sizeof(gen));

 while(i<50000)
 {
  gen[i] = (rand() % 151) - 50;
  total += gen[i];
  if(gen[i] >= -50 && gen[i] <= 0) cMinus++;
  if(gen[i] >= 1 && gen[i] <= 50) cZero++;
  if(gen[i] >= 51 && gen[i] <= 100) cFifty++;

  i++;

 }

 printf("-50 ~   0 범위의 개수 : %d 개\n",cMinus);
 printf("  1 ~  50 범위의 개수 : %d 개\n",cZero);
 printf(" 51 ~ 100 범위의 개수 : %d 개\n",cFifty);

 printf("\n생성된 난수의 평균 : %f\n",(float)total/50000);

 gen = NULL;
 free(gen);
 return 0;
}


5. 해설
  - 이전에 공부 한 것이 있어서 쉽게 동적 할당에 대해 접근 할수 있었습니다.
  - calloc 함수로 간단하게 생성했습니다. 보통은 malloc 을 씁니다만 초기화 때문에 calloc 을 썼습니다.
  - 마지막엔 NULL 에 맞추고 free 함수로 동적 할당된 자원을 반환 합니다. 그렇지 않으면 메모리 누수가 발생합니다. 요즘은 메모리 자원이 풍부하여 부족될 일은 자주 없지만 free 함수나 delete (C++) 로 비우는 에티켓이 필요합니다.

6. 참고
  - 유사 문제

Posted by 카켈




1. 목적
  - 다중 for 문을 이해한다.

2. 문제 (점수 : 10 점)
  - 중첩된 for 문을 이용하여 구구단의 일부를 출력하라.
  - 출력 화면

4 * 5 = 20      5 * 5 = 25      6 * 5 = 30      7 * 5 = 35
4 * 6 = 24      5 * 6 = 30      6 * 6 = 36      7 * 6 = 42
4 * 7 = 28      5 * 7 = 35      6 * 7 = 42      7 * 7 = 49
4 * 8 = 32      5 * 8 = 40      6 * 8 = 48      7 * 8 = 56
4 * 9 = 36      5 * 9 = 45      6 * 9 = 54      7 * 9 = 63
Press any key to continue


3. 이해
  - 다중 for 문을 정확히 쓸줄 아는가?

4. 코드

#include <stdio.h>

int main()
{
 int i, j;
 i = j = 0;

 for(i = 5; i <10; i++)
 {
  for(j = 4; j < 8; j++)
  {
   printf("%d * %d = %d\t", j, i, j*i);
  }

  printf("\n");

 }

 return 0;
}


5. 해설
  - 이전에 있던 미니 구구단과 크게 다를게 없습니다.
  - for 조건이 j < 8 일때에는 j 가 8일때 까지만 작동하고 9 부터는 조건이 안 맞기 때문에 for 문을 넘어가 다음 for 문을 적용 받습니다.
  - for 문을 실행할때 가장 안 쪽의 for 문에서 시작 하며 인수를 차례차례 적용 받습니다. 실행단계를  생각하면 이해하기가 쉽습니다.

6. 참고

  - http://www.winapi.co.kr/clec/cpp1/4-2-4.htm : 다중 루프
  - 유사 문제
Posted by 카켈




1. 목적
  - 구조체를 자유롭게 다룰줄 안다.

2. 문제 (점수 : 30 점)
  - 학생의 이름과 성적 학점을 맴버로 가지는 구조체를 만들어라.
  - 세 사람의 이름과 성적을 키보드로 입력받아 학점을 판단하여 화면에 출력하라.
  - 판단 기준 : 90점 이상 / A . 70 ~ 90점 / B . 50 ~ 70점 / C . 50점 이하 / F
  - 출력 화면

세 학생의 이름을 입력하세요 : 이순신 홍길동 임꺽정
세 학생의 성적을 입력하세요 : 98.7 76.5 54.3
이순신 의 학점 : A
홍길동 의 학점 : B
임꺽정 의 학점 : C
Press any key to continue


3. 이해
  - 구조체를 이해하고 맴버 변수를 자유롭게 쓸줄 아는가?

4. 코드

#include <stdio.h>

int main()
{

 typedef struct student
  {
   char name[255];
   float scr;
   char grade;
  };


 int i = 0;
 struct student Stu[3];
 struct student* pStu;
 pStu = Stu;


 printf("세 학생의 이름을 입력하세요 : ");
 scanf("%s %s %s", Stu[0].name, Stu[1].name, Stu[2].name);


 printf("세 학생의 성적을 입력하세요 : ");
 scanf("%f %f %f", &(pStu->scr), &((pStu+1)->scr), &(pStu+2)->scr);

 while(i<3)
 {
  if(pStu->scr >= 90) pStu->grade = 'A';
  if(pStu->scr >= 70 && pStu->scr < 90) pStu->grade = 'B';
  if(pStu->scr > 50 && pStu->scr < 70) pStu->grade = 'C';
  if(pStu->scr <= 50) pStu->grade = 'F';

 
  printf("%s 의 학점 : ",pStu->name);
  putchar(pStu->grade);
  putchar('\n');

  pStu++;
  i++;
 }

 pStu = NULL;
 return 0;
}


5. 해설
  - 구조체를 선언하고 포인터로 맴버 변수를 가리키게 만들어서 접근을 용이하게 만들었습니다.
  - -> 연산자는 원래 (*pStu).grade 를 pStu->grade 로 만들어 괄호를 없애기 위해 만들었었습니다. 우선순위가 * < . 입니다. 따라서 괄호를 두어서 dereference (역참조) 하게 했습니다.
  - 포인터를 한단계 더한다는 의미는 그 자료형에 맞게 주소를 한자리 더한다는 의미 입니다. 따라서 배열을 기준으로 하나 상승한다는 의미가 의미가 됩니다.
  - 마지막 부분에 pStu = NULL 은 주소를 지우는 의미일뿐 그 이상 역할을 하지 않습니다. 동적 할당과는 관계가 없습니다.

6. 참고
  - http://winapi.co.kr/clec/cpp1/10-1-3.htm : 포인터 연산
  - 유사 문제

Posted by 카켈




1. 목적
  - 외부 실행시 매개변수 입력되는 방법을 이해한다.

2. 문제 (점수 : 20 점)
  - main() 함수의 인자로 다섯 개의 실수값을 받아들여서 최대/최소/평균값을 출력하는 프로그램을 만들어라
  - 출력 화면

C:\Work\2005_final_5\Debug>2005_final_5.exe 12.34 56.78 90.12 34.56 78.90
최대값 : 90.120000
최소값 : 12.340000
평균값 : 54.540000

C:\Work\2005_final_5\Debug>

3. 이해
  - 프로그램 실행시 매개변수로 입력 받을줄 아는가?
  - 최대/최소/평균값을 이해하는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
 int i = 0;
 double total, max, min;
 total = 0.0;

 if(argc > 6) puts("입력된 값 초과!");
 else
 {
  if(argc < 6) puts("입력된 값 부족!");
  else
  {
   min = (float)atof(argv[1]);
   max = (float)atof(argv[1]);


   for(i = 1; i < 6; i++)
   {
    min = min > (float)atof(argv[i]) ? (float)atof(argv[i]) : min;
    max = max < (float)atof(argv[i]) ? (float)atof(argv[i]) : max;
    total += (float)atof(argv[i]);
   
   }
   printf("최대값 : %f\n", max);
   printf("최소값 : %f\n", min);
   printf("평균값 : %f\n", total / 5);


  }

 }

 return 0;
}


5. 해설
  - double 형으로 자료를 받아 출력해야지 소숫점 자릿수가 깨끗하게 나옵니다.
  - argc 는 인수의 개수를 argv 는 인수의 내용을 가리키는 포인터로 쓰입니다.
  - 자세한 디버깅 방법은 이전 포스트를 참조 하시기 바랍니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적

  - 문자열에 대한 추가적인 이해를 한다.

2. 문제 (점수 : 25 점)
  - 문자열을 입력받아 처음에는 대문자로 변환하고 다음에는 크기 순으로 내림차순 정렬하여 출력하여라.
  - 출력 화면

문자열을 입력하세요 : Here I Stand For You !!
입력된 문자열 : Here I Stand For You !!
변환된 문자열 : HERE I STAND FOR YOU !!
정렬된 문자열 : YUTSRROONIHFEEDA!!
Press any key to continue


3. 이해
  - 문자열과 각 문자의 특성을 이해하는가?
  - 내림차순에 대한 정렬의 개념을 아는가?

4. 코드

#include <stdio.h>
#include <ctype.h>

int main()
{
 char in[255] = {0};
 char out[255] = {0};
 char swap;
 int i, j, length;
 i = j = length = 0;
 
 printf("문자열을 입력하세요 : ");
 gets(in);
 printf("입력된 문자열 : ");puts(in);
 printf("변환된 문자열 : ");while(in[length] != 0)
 {
  putchar(toupper(in[length]));
  length++;
 
 }

 i = 0;
 j = 0;

 while(in[i] != 0)
 {
  if( !(isspace(in[i])) )
  {
   out[j] = toupper(in[i]);
   j++;

  }

  i++;

 }

 printf("\n정렬된 문자열 : ");
 for(i = 0; i < length; i++)
 {
  for(j = i; j < length; j++)
  {
   if(out[i] < out[j])
   {
    swap = out[i];
    out[i] = out[j];
    out[j] = swap;

   }

  }
 }

 puts(out);

 return 0;
}


5. 해설
  - 이전 문제에서 띄워 쓰기를 없애는 기능을 추가했습니다. isspace 함수가 띄워쓰기(엔터/탭/스페이스) 값을 구별하는 역할을 합니다.
  - 내림차순은 큰 값에서 작은 값으로 내려가는 의미로 쓰입니다. 당연히 작은값 - 큰값으로 되어 있다면 그 위치를 바꿔줌으로써 정렬을 완성 시킵니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적
  - 문자열 배열을 글자 단위로 처리 한다.

2. 문제 (점수 : 15 점)
  - 키보드로 문자열을 입력 받되 strlen() 함수를 쓰지 않고 문자의 개수를 출력하며 반대로도 출력한다.
  - 출력 화면

문자열을 입력하세요 : C Programming Language
문자열의 길이 : 22
역순으로 출력 : egaugnaL gnimmargorP C
Press any key to continue

3. 이해
  - 문자열 배열을 정확히 이해하는가?
  - 문자가 저장되는 방식을 이해하는가?
  - 문자를 불러낼수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 char in[255] = {0};
 int length = 0;
 printf("문자열을 입력하세요 : ");
 gets(in);

 while(in[length] != 0) length++;

 printf("문자열의 길이 : %d\n",length);
 printf("역순으로 출력 : ");

 while(length > 0)
 {
  putchar(in[length-1]);
  length--;
 }

 
 putchar('\n');

 return 0;
}

5. 해설
  - 문자열은 문자형 자료를 배열형으로 저장했기 때문에 자유롭게 불러 쓸수 있으며 저장할수 있습니다.
  - 0 값이 NULL 문자로써 문자의 끝을 의미하기 때문에 문자의 경계를 짓는데 중요한 계념을 가집니다.
  - 문자에 대해 잘 다룰수 있으면 string.h 에 있는 함수를 쓰지 않고도 기초적인 문자열을 다룰수 있습니다.

6. 참고
  - http://winapi.co.kr/clec/cpp1/3-5-3.htm : 문자열

Posted by 카켈




1. 목적

  - 최소공배수 / 최대공약수 를 C 로 구현한다.

2. 문제 (점수 : 15 점)
  - 크기와 관계 없는 두개의 정수를 입력 받아 최대공약수와 최소공배수를 찾는다.
  - 실행결과

정수값 두개를 입력하세요 : 120 750
최대 공약수 : 30
최소 공배수 : 3000
Press any key to continue

3. 이해
  - 최소공배수와 최대공약수를 이해하는가?
  - 조건에 맞는 반복문을 구현할수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 int a, b, start, end;
 a = b = start = end = 0;
 printf("정수값 두개를 입력하세요 : ");
 scanf("%d %d", &a, &b);

 start = a > b ? b : a;
 end = a < b ? b : a;

 a = b = 1;

 for(a = 1; a <= start; a++)
 {
  if(start % a == 0 && end % a == 0)
   b = a > b ? a : b;
 }

 printf("최대 공약수 : %d\n", b);

 a = start;
 b = 0;

 while(a <= start * end)
 {
  if(a % start == 0 && a % end == 0)
  {
   b = a;
   break;

  }

  a++;

 }

 printf("최소 공배수 : %d\n", b);

 return 0;
}

5. 해설
  - 최대공약수는 1 부터 큰수 까지 두수 모두 나머지가 0이 되는 가장큰수를 의미합니다.
  - 최소공배수는 작은수에서 시작하여 두수 모두 나머지가 0이 되는 가장 작은 수를 의미합니다.
  - 두가지 모두 for 문 / while 문으로 구현했습니다.

6. 참고
  - 유사 문제 (다른 것)

Posted by 카켈



1. 목적
  - 소수를 이해한다.
  - 사용자 정의 자료형 함수를 출력한다.

2. 문제 (점수 : 15 점)
  - 두 정수 사이에 존재하는 소수(prime)를 출력한다.
  - 입력 순서에 따른 크기 순서는 상관치 않는다.
  - 마지막에 소수의 개수를 출력한다.
  - 출력 화면

정수값 두개를 입력하세요 : 541 23
소수 : 23       29      31      37      41      43      47      53      59
61      67      71      73      79      83      89      97      101     103
107     109     113     127     131     137     139     149     151     157
163     167     173     179     181     191     193     197     199     211
223     227     229     233     239     241     251     257     263     269
271     277     281     283     293     307     311     313     317     331
337     347     349     353     359     367     373     379     383     389
397     401     409     419     421     431     433     439     443     449
457     461     463     467     479     487     491     499     503     509
521     523     541

23 와 541 사이의 소수의 개수 : 92
Press any key to continue


3. 이해
  - 소수를 정확히 이해하고 C 에 적용 시킬수 있는가?

4. 코드

#include <stdio.h>

enum bool {false, true};
enum bool isprime(int detect)
{
 int i = 2;

 if(detect <= 1) return false;

 while(i < detect)
 {
  if (detect % i == 0) return false;
  i++;
 }

 return true;

}

int main()
{
 int a, b, start, end, count;
 a = b = start = end = count = 0;

 printf("정수값 두개를 입력하세요 : ");
 scanf("%d %d", &a, &b);

 start = a < b ? a : b;
 end = a < b ? b : a;

 a = start;
 b = end;
 
 printf("소수 : ");

 while(start <= end)
 {
  if(isprime(start))
  {
   printf("%d\t",start);
   count++;
  }
  start++;
 
 }

 printf("\n\n%d 와 %d 사이의 소수의 개수 : %d\n", a, b, count);

 return 0;
}

5. 해설
  - 이전 문제와 다르게 풀기 위해서 isprime 이라는 판정 함수를 만들었습니다.
  - 사용자 정의형 bool 을 만들어서 isprime 해서 나온 값을 false / true 로 구분해서 사용했습니다.

6. 참고
  - 유사 문제

Posted by 카켈



  2005년 중간고사 정리 입니다. ctype.h 라이브러리를 쓰지 않고 글자의 속성을 구하는 것과 Ctrl+Z 입력 받는 것이 새로웠습니다. 전 Ctrl+Z 입력을 할때 버퍼에 대한 개념이 잡혀있는게 없어서 많이 혼났습니다. 나머지는 이전 년도차를 계속 해 오셨으면 크게 문제는 난이도 입니다.

  저작권 표기
  문제/풀이 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com
  교육용을 목적으로 자유롭게 사용하셔도 됩니다.
Posted by 카켈



1. 목적

  - 함수 호출을 하고 원하는 값을 얻는다.

2. 문제 (점수 : 30 점)
  - 키보드로 원의 반지름(실수) 값을 입력 받아 넓이를 출력한다.
  - 넓이를 계산하는 area 라 불리는 함수를 만들어 쓴다.
  - 0을 입력하면 프로그램이 종료 된다.
  - do-while 제어문을 써서 반복한다.
  - 출력 화면

원의 반지름을 입력하세요 : 10
원의 면적 : 314.159

원의 반지름을 입력하세요 : 12.34
원의 면적 : 478.388

원의 반지름을 입력하세요 : 89.90
원의 면적 : 25390.379

원의 반지름을 입력하세요 : 0
Press any key to continue

3. 이해
  - 원하는 값을 얻을수 있는 함수를 만들수 있는가?
  - 반복을 원하는 범위내에 할수 있는가?

4. 코드

#include <stdio.h>

double area(float rad)
{
 return 3.141592 * rad * rad;

}

int main()
{
 float in = 0;
 
 do
 {
  printf("원의 반지름을 입력하세요 : ");
  scanf("%f", &in);
  if(in != 0)printf("원의 면적 : %0.3f\n\n",(float)area(in));
 
 }while(in);

 return 0;

}

5. 해설
  - 이전 문제에 유사한 문제가 있습니다.
  - float 형으로 출력해야 하므로 double(배정도 실수형) 리턴형 함수에 float(단정도 실수형) 형으로 형변환(casting) 했습니다.
  - area 함수가 원의 넓이를 구하는데 사용되었습니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적
  - 난수 생성을 정확히 이해한다.

2. 문제 (점수 : 30 점)
  - -4.99 ~ 14.99 사이의 정수 50개를 출력하고 최대값과 최소값을 구하여라.
  - 출력 화면

생성된 난수 :      6.23    6.48    0.97    5.90   -4.82   -1.18   -3.05    5.32
   1.35   -3.78    1.50   13.14    6.66   -0.35   10.38   12.43   -4.26   12.50
   8.68   -2.89   14.23    2.65   14.47   -2.31    9.29    4.31    5.16    8.88
  -3.16   13.22    9.65    7.01   10.40    2.10    3.09   -0.28   11.39   12.97
   9.35   12.87   12.49    0.87    1.36   -4.49    9.71    1.28    9.29    1.88
   9.79    4.74
최대값 : 14.47
최소값 : -4.82
평  균 : 5.27
Press any key to continue


3. 이해
  - 난수를 특정 범위 내에서 원하는 갯수 만큼 만들줄 아는가?
  - 최대/최소/평균값을 이해하는가?

4. 코드

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
 int i = 0;
 float cal, max, min, total;
 cal = max = min = total = 0.0;

 srand((unsigned)time(NULL));
 rand();

 printf("생성된 난수 :\t");
  for(i = 0; i < 50; i++)
  {
   cal = (float)(rand() % 2000) / 100 - 5;
   printf("%7.2f\t", cal);

   max = max < cal ? cal : max;
   min = min > cal ? cal : min;
   total += cal;
   
  }

 printf("\n최대값 : %0.2f\n최소값 : %0.2f\n평  균 : %0.2f\n",max, min, total / 50);

 return 0;
}

5. 해설
  - 특정 범위를 구하는 난수 문제는 이전에도 많이 출제 되었습니다. rand() 링크를 클릭하세요.
  - 반복문은 for 문으로 하였습니다.
  - 최대/최소/평균값은 특별히 삼항 연산자 등으로 간단하게 구할수 있어 어렵지 않습니다.

6. 참고
  - 유사 문제
Posted by 카켈



1. 목적

  - 함수를 만들줄 안다.

2. 문제 (점수 : 20 점)
  - 실수 두개를 입력 받아서 사칙연산을 한 각각의 결과를 출력하라.
  - 함수를 이용한 (add, sub, mul, div) 계산 결과를 활용하라.
  - 출력 화면

두개의 실수를 입력하세요 : 987.654 321.098
987.654 + 321.098 = 1308.752
987.654 - 321.098 = 666.556
987.654 * 321.098 = 317133.713
987.654 / 321.098 = 3.076
Press any key to continue

3. 이해
  - 함수 출력을 활용할 수 있는가?

4. 코드

#include <stdio.h>

float add(float a, float b)
{
 return a + b;
}

float sub(float a, float b)
{
 return a - b;
}

float mul(float a, float b)
{
 return a * b;
}

float div(float a, float b)
{
 return (b = 0 ? 0 : a / b);
}

int main()
{
 float a, b;
 a = b = 0.0;

 printf("두개의 실수를 입력하세요 : ");
 scanf("%f %f", &a, &b);
 printf("%0.3f + %0.3f = %0.3f\n", a, b, add(a,b));
 printf("%0.3f - %0.3f = %0.3f\n", a, b, sub(a,b));
 printf("%0.3f * %0.3f = %0.3f\n", a, b, mul(a,b));
 printf("%0.3f / %0.3f = %0.3f\n", a, b, div(a,b));
 return 0;
}

5. 해설
  - 함수 호출은 선언시 [리턴 자료형] [함수이름]([인수 변수형] [임의 변수명], [인수 변수명] [임의 변수명] ...) 이런 식으로 합니다.
  - main 내 add , sub, mul, div 넣을때 인수를 a, b 넣는거와 함수 호출시에 쓰는 a,b 는 다름니다. 인수를 복사해서 쓰기 때문에 변수 이름이 달라도 무방합니다.
  - return 을 써서 [리턴 자료형]에 맞게 값을 되돌려 받습니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적

  - 문자값을 이해한다.

2. 문제 (점수 : 20 점)
  - ctype.h 함수를 쓰지 않고 입력된 문자의 속성의 갯수를 출력하라.
  - 대문자 / 소문자 / 숫자의 갯수를 각각 출력하라.
  - Ctrl + Z (EOF : ^Z) 값을 입력하면 종료 되도록 하라.
  - 출력 화면

KOREA Univ. 2007 C Programming
^Z
대문자의 개수  : 8
소문자의 개수  : 13
숫자의 개수    : 4
Press any key to continue

3. 이해
  - ASCII 코드값을 이해하는가?
  - 문자를 입력 받아 계산할수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 char in = 0;
 int cap, num, small;
 cap = num = small = 0;

 while( (in = getchar()) != EOF )
 {
  if(in >= 48 && in <= 57) num++;
  if(in >= 65 && in <= 90) cap++;
  if(in >= 97 && in <= 122) small++;
 }

 printf("대문자의 개수  : %d\n소문자의 개수  : %d\n숫자의 개수    : %d\n",cap,small,num);
 
 return 0;
}

5. 해설
  - 아스키 코드(ASCII code)는 char 형 자료에 저장된 정수화된 글자 값에 대응합니다.
  - 48부터 과 57까지 숫자에 65에서 90까지 대문자와 97부터 122까지 소문자에 각각 대응합니다.

6. 참고

  - 문자 받는 유사 문제
  - http://www.asciitable.com/ : 아스키 코드(ASCII code)표
Posted by 카켈




1. 목적
  - 원하는 횟수 만큼 특정 범위의 난수를 난수를 만들줄 안다.

2. 문제 (점수 : 20 점)
  - 1부터 4까지의 정수를 가지는 난수를 100개 생성하여 그 확률을 출력하라
  - switch-case 문을 사용 하여라 (if-else 문 사용하지 말것)
  - 출력 화면

1이 나올 확률 : 0.230
2가 나올 확률 : 0.230
3이 나올 확률 : 0.180
4가 나올 확률 : 0.360
Press any key to continue

3. 이해
  - 난수 생성 원리를 아는가?
  - 필요한 확률을 출력할수 있는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 float one, two, three, four;
 int gen, i;
 one = two = three = four = 0.0;
 gen = i = 0;

 srand((unsigned)time(NULL));

 while(i<100)
 {
  gen = rand() % 4 + 1;
  switch(gen)
  { 
   case 1:
    one++;break;

   case 2:
    two++;break;

   case 3:
    three++;break;

   case 4:
    four++;break;

   default:
    break;

  }

  i++;
 }
 
 printf("1이 나올 확률 : %0.3f\n2가 나올 확률 : %0.3f\n3이 나올 확률 : %0.3f\n4가 나올 확률 : %0.3f\n", one/100, two/100, three/100, four/100);

 return 0;
}

5. 해설
  - switch-case 문을 써서 특정 확률을 계산 할수 있습니다.
  - float 형 자료를 써서 소숫점 출력을 할수 있습니다.
  - 100개가 계산 되기에 한번도 나오지 않을 확률을 0으로 했습니다. 나온다면 오류가 납니다.

6. 참고
  - 유사 문제

Posted by 카켈



1. 목적
  - 공배수와 배수의 처리 방법을 이해한다.

2. 문제 (점수 : 20 점)
  - 두 정수를 입력 받아 그 사이에 존재하는 5의 배수와 7의 배수 그리고 5와 7의 최소 공배수(35)의 배수의 갯수를 구하여라
  - for / do-while 말고 while 문으로 구현하라.
  - 출력 화면
두 정수를 입력하세요 : 890 123
5 의 배수 : 154개
7 의 배수 : 110개
공배수    : 22개
Press any key to continue

3. 이해

  - 공배수를 정확히 이해하는가?

4. 코드
#include <stdio.h>

int main()
{
 int a,b,i,max,min,five_count,seven_count, common_count;
 a = b = min = max = five_count = seven_count = common_count = 0;
 i = 1;

 printf("두 정수를 입력하세요 : ");
 scanf("%d %d", &a, &b);

 max = a;
 max = max < b ? b : max;

 min = a;
 min = min > b ? b : min;

 i = min;

 while(i <= max)
 {
  if(i % 5 == 0) five_count++;
  if(i % 7 == 0) seven_count++;
  if(i % 35 == 0) common_count++;

  i++;
 }

 printf("5 의 배수 : %d개\n7 의 배수 : %d개\n공배수    : %d개\n",five_count,seven_count,common_count);


 return 0;
}


5. 해설
  - 어렵지는 않으나 문제를 정확히 이해하지 않으면 틀린 답이 나올 가능성이 충분한 문제 입니다.
  - 최소(작은)값과 최대(큰)값 사이에 존재하는 5 / 7 / 35 의 배수의 개수를 구하면 됩니다. 5와 7과 35로 나누었을때 나머지가 0이 되는 갯수를 각각 구하면 쉽습니다.

6. 참고

  - 유사 문제
Posted by 카켈




1. 목적
  - 공약수의 원리 안다.
  - 반복문을 안다.

2. 문제 (점수 : 15 점)
  - 세수를 입력 받아서 모든 공약수들을 찾아내는 프로그램을 만든다.
  - 출력 화면

세개의 정수를 입력하세요 : 100 200 300
공약수 : 1      2       4       5       10      20      25      50      100

Press any key to continue

3. 이해
  - 공약수를 이해하고 C 에 적용할 수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 int a,b,c,i,max;
 a = b = c = 0;
 i = 1;


 printf("세개의 정수를 입력하세요 : ");
 scanf("%d %d %d", &a, &b, &c);

 max = a;
 max = max < b ? b : max;
 max = max < c ? c : max;

 printf("공약수 : ");
 while(i <= max)
 {
  if(a % i == 0 && b % i == 0 && c % i == 0) printf("%d\t",i);
  i++;
 }

printf("\n");

 return 0;
}

5. 해설
  - 이전 문제들과 동일한 패턴으로 하시면 됩니다.
  - while 문으로 반복문을 최대한 짧게 표현했으며 삼항 연산자로 코드의 가독성을 높였습니다.

6. 참고
  - 동일 문제

Posted by 카켈



1. 목적
  - 특정 범위 사이에 계산을 반복하는 반복문을 이해한다.

2. 문제 (점수 : 15 점)
  - 키보드로 두 개의 정수를 입력받아 짝수/홀수의 개수와 합 그리고 전체의 합을 출력한다.
  - 시작 끝 범위가 반대로 입력 되어도 같은 결과가 나오게 하라.
  - for 문을 사용하되 do-while / while 문은 쓰지 않는다.
  - 출력 화면

두 정수를 입력하세요 : 890 123
123~890 사이의 짝수 개수 : 384, 합 : 194688
123~890 사이의 홀수 개수 : 384, 합 : 194304
123~890 까지의 총 합 : 388992
Press any key to continue

3. 이해
  - for 제어/반복문을 적당하게 쓸수 있는가?
  - 짝수와 홀수를 따로 계산할수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 int from, to, i, total, even, odd, swap;
 long even_total, odd_total;
 from = to = i = total = even = odd = even_total = odd_total = 0;

 printf("두 정수를 입력하세요 : ");
 scanf("%d %d", &from, &to);

 if (from > to)
 {
  swap = from;
  from = to;
  to = swap;

 }

 for(i = from; i <= to; i++)
 {
  if(i % 2  == 0)
  {
   even++;
   even_total += i;
 
  }
  else
  {
   odd++;
   odd_total += i;

  }

 }

 printf("%d~%d 사이의 짝수 개수 : %d, 합 : %d\n", from, to, even, even_total);
 printf("%d~%d 사이의 홀수 개수 : %d, 합 : %d\n", from, to, odd, odd_total);
 printf("%d~%d 까지의 총 합 : %d\n", from, to, odd_total+even_total);

 return 0;
}

5. 해설
  - for 문은 시작 부터 일정 범위씩 증가하면서 범위내로 실행하는 구문입니다.
  - 짝수와 홀수 따로 변수를 만들어서 계산 합니다.

6. 참고
  - http://tc.pukyung.co.kr/CBasic/c-12.html : for 구문

Posted by 카켈




1. 목적
  - 키보드 입력을 이해한다.

2. 문제 (점수 : 15 점)
  - 키보드를 입력 받은 문자들을 기준으로 특수문자 공백문자를 제거 하고 대문자로 출력하는 프로그램을 작성하라.
  - Ctrl + Z 키를 입력하면 종료 되도록 한다.
  - 출력 화면

문자들을 입력하세요(마침 : Ctrl+Z) : Hello World !! 2007 Korea Univ. !@#$%
HELLOWORLD2007KOREAUNIV
^Z
Press any key to continue

3. 이해
  - 키보드 입력할 줄 아는가?
  - 글자 속성을 이해하고 원하는 방식으로 출력할 줄 아는가?

4. 코드

#include <stdio.h>
#include <ctype.h>

int main()
{
 char in = 0;
 printf("문자들을 입력하세요(마침 : Ctrl+Z) : ");

    while( (in = getchar()) != EOF)
    {
  if(isalnum(in)) putchar(toupper(in));
  if(in == '\n') putchar('\n');

 }
 return 0;
}

5. 해설
  - 키를 입력받은 값을 엔터키가 나오기 전까지는 출력이 되지 않습니다.
  - 엔터키는 isalnum 함수에서 걸러져서 출력이 되지 않기 때문에 따로 검색하여 출력하게 합니다.

getchar 에서 여러값을 입력할 때 버퍼를 비우지 않으면 앞에 한자만 꺼내 써지고 다음 getchar() 명령시 키보드에 입력된 버퍼중 다음 글자를 읽어서 그냥 들어 저장이 됩니다.

 예를 들어 '1234'를 입력했을때 첫번째 getchar() 에서 1 을 두번째 getchar() 명령어에서는 키보드입력을 받지 않고 2 를 받으며 세번쨰 getchar() 함수에서는 3 을 ... 비워지지 전까지 getchar() 명령어는 계속 할당 받습니다. 따라서 getchar() 함수는 엔터키 치기 전까지 입력된 모든 문자를 입력 받아 버퍼에 저장하고 첫번째 문자를 꺼내 할당 받고 비우는 함수 입니다.

6. 참고
  - 네이버 지식인
  - 유사 문제

Posted by 카켈




1. 목적
  - 시간을 이용한 계산을 이해한다.

2. 문제
(점수 : 15 점)
  - 현재 시간을 입력하고 오늘 하루 중 몇 초가 남았는지 계산하는 프로그램을 만든다.
  - 출력화면

현재 시간을 입력하세요 (시 분 초) : 19 45 32
오늘은 15268초가 남았습니다.
Press any key to continue

3. 이해
  - 시간을 이해하고 이를 계산을 할수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 int hour, min, sec;
 hour = min = sec = 0;

 printf("현재 시간을 입력하세요 (시 분 초) : ");
 scanf("%d %d %d", &hour, &min, &sec);

 printf("오늘은 %d초가 남았습니다.\n", 24*3600 - (hour*3600 + min*60 + sec));

 return 0;
}


5. 해설
  - printf 구문에서 바로 계산하여 풀이 하였습니다.

6. 참고
  - 유사 문제

Posted by 카켈




  2004년 기말고사 C 언어 정리 입니다. 전체적으로 콘솔창에서 명령줄(커맨드라인) 상에서 인수를 넣는거와 최대공약수/소수/동적할당 이 조금 어려웠습니다. 그 이외에는 평이한 난이도 입니다.

  자세한 풀이는 해당 포스트를 검색하여 주시기 바랍니다.

  저작권 표기
 문제/해답 : http://signal.korea.ac.kr/~ychlee
 코드 http://cakel.tistory.com
 교육용을 목적으로 자유롭게 사용이 가능합니다.

Posted by 카켈



1. 목적

  - 문자열 속의 문자 제어를 이해한다.

2. 문제 (점수 : 10 점)
  - 키보드로부터 문자열을 입력 받아 모음(a/A, e/E, i/I, o/O, u/U)만을 출력하고 그 갯수를 출력
    하는 프로그램을 작성하라.
  - 출력 화면

문자들을 입력하세요 : Hello World. Hi there. I'm a boy..
eooieeIao
모음의 개수 : 9개

3. 이해
  - 문자를 다룰줄 아는가?
  - 조건문을 쓸줄 아는가?

4. 코드

#include <stdio.h>

int main()
{
 char in[255];
 int i,count;
 i = count = 0;

 printf("문자들을 입력하세요 : ");
 gets(in);

 while(in[i] != 0)
 {
  if ((in[i] == 'a' || in[i] == 'e' || in[i] == 'i' || in[i] == 'o' || in[i] == 'u') || (in[i] == 'A' || in[i] == 'E' || in[i] == 'I' || in[i] == 'O' || in[i] == 'U'))
  {
   putchar(in[i]);
   count++;
  }

  i++;

 }

 putchar('\n');
 printf("모음의 개수 : %d개\n", count);

 return 0;

}

5. 해설
  - if 문으로 모음이 되는 조건을 or 연산자(||)를 써서 구분했습니다.
  - gets 문으로 띄워 쓰기 포함(whitespace) 문장을 받을수 있습니다.

6. 참고
  -
http://www.winapi.co.kr/clec/cpp1/4-1-2.htm : 조건문
  - 유사 문제
 

Posted by 카켈



1. 목적
  - 다양한 반복/제어문에 대한 이해를 한다.

2. 문제 (점수 : 10 점)
  - 세가지 반복문(for/while/do-while) 을 써서 1부터 100까지 합을 계산하는 프로그램을 작성한다.
  - 출력 화면
1부터 100까지의 누적합 계산
for      문만을 이용한 결과 : 5050
while    문만을 이용한 결과 : 5050
do-while 문만을 이용한 결과 : 5050
Press any key to continue

3. 이해
  - 다양한 반복문을 이해하는가?

4. 코드
#include <stdio.h>

int main()
{
 int i, total;
 i = total = 0;

 puts("1부터 100까지의 누적합 계산");
 for(i = 1; i <= 100; i++) total += i;
 printf("for      문만을 이용한 결과 : %d", total);
 putchar('\n');

 total = 0;
 i = 1;

 while(i <= 100)
 {
  total += i;
  i++;

 }

 printf("while    문만을 이용한 결과 : %d", total);
 putchar('\n');

 total = 0;
 i = 1;

 do
 {
  total += i;
  i++;

 }while(i <= 100);

 printf("do-while 문만을 이용한 결과 : %d", total);
 putchar('\n');

 return 0;
}


5. 해설
  - 각각 선언하는 형식은 다르지만 작동 방식(메카니즘)은 동일합니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/4-3-2.htm : for/while/do-while 제어문 비교
  - 유사 문제
Posted by 카켈



1. 목적

  - 소수를 출력하는 알고리듬을 안다.

2. 문제 (점수 : 30 점)
  - 입력된 두 양의 정수 사이에 존재하는 소수(prime number)를 찾아내는 프로그램을 작성한다.
  - 발견된 모든 소수를 출력한다.
  - 실행 화면

시작값과 끝값을 입력하세요 : 100 1000
100과 1000사이에 존재하는 소수들 :
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313
317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439
443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691
701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829
839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997
Press any key to continue

3. 이해
  - 소수의 정의를 이해하고 C 코드로 구현할줄 아는가?
  - 반복문을 정확히 이해 하는가?

4. 코드

#include <stdio.h>

int main()
{
 int i, start, end;
 typedef enum {false, true}bool;
 bool prime = true;
 i = start = end = 0;

 printf("시작값과 끝값을 입력하세요 : ");
 scanf("%d %d", &start, &end);

 printf("%d과 %d사이에 존재하는 소수들 : \n", start, end);

 while(start <= end)
 {
  for(i = 2; i < start; i++)
  {
   prime = ( start  % i == 0 ? false : true);
   if(prime == false) break;

  }

   if(prime && start != 1) printf("%d ", start);
  start++;
 }

 return 0;
}

5. 해설
  - enum 은 열거형으로 괄호 안에 있는 순서대로 값이 되는 유용한 선언문입니다. 외부에서 그 값을 쓸려고 할때 특별한 정의가 없다면 그 자료는 0,1,2 ... 로 값이 쓰여됩니다.
  - 소수(prime number, 0이 아니고 -1 과 1 사이의 유리수인 소수와는 다른 계념입니다.)는 1을 초과 하는 수 중에 1과 수 자신의 약수 외에 1과 수 사이에 약수가 있으면 소수가 아닙니다. 특수한 수열입니다. (예 : 2 3 5 7 11 13 17 ... )
 - 2 에서 출발하여 해당수 전까지 진행하면서 나머지가 0 이면 그 수는 약수가 되므로

6. 참고
 - http://www.cinsk.org/cfaqs/html/node11.html : boolean 자료 정의 및 선언
 - 소수 설명

Posted by 카켈