'소프트웨어/C'에 해당되는 글 70건

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


 
C 와 C++ 에 대해 마무리 하고 한동안 다른데에 매진 해야겠습니다. 이번 학기가 너무 힘들군요. C 와 C++ 은 공돌이에게 있어서 기본적인 도구가 될 경우가 많습니다. 저역시 그 중에 하나인데요. 이번에 확실히 기초는 다져진거 같습니다. 풀다 보니 많이 부족하더군요.

  저처럼 막힐때 어떻게 할까 아니면 처음부터 시작 하고 싶은데 어떻게 할까 싶으신 분들을 위해 강의 노트를 올렸습니다. 전 이때 포트란이라는 전설의 언어를 배웠기 때문에 관계 없는 노트지만 정말 좋은 내용입니다. 받아서 실습해보시고 많은 경험을 얻으시기 바랍니다.

  저작권 공지 : 고려대학교 신호처리연구실 에서 나온 강의 자료 입니다. 내용이 귀중하기 떄문에 요청으로 지워질수 있습니다. 원 저작자의 허락없이 변경하는 건 저도 책임 못집니다; http://signal.korea.ac.kr/~ychlee
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 카켈



1. 목적

  - 필요한 만큼 자료를 정의 하는 동적 할당에 대해 이해한다.
  - 구조체에 따른 자료 구조를 이해한다.

2. 문제 (점수 : 40 점)

 - 학생에 대한 정보(이름,성적)을 구조체로 하여 성적을 입력후 평균을 구하는 프로그램을 작성한다.
  - 키보드로 학생 정보를 입력받는다.
  - 실행화면

학생의 수 : 4
1 번째 학생의 이름과 성적 : 홍길동 67.89
2 번째 학생의 이름과 성적 : 장길산 46.75
3 번째 학생의 이름과 성적 : 너바보 23.79
4 번째 학생의 이름과 성적 : 나잘난 99.84

입력된 학생들에 대한 정보
홍길동 : 67.89
장길산 : 46.75
너바보 : 23.79
나잘난 : 99.84

학생들의 평균 성적 : 59.57
Press any key to continue

3. 이해
  - 구조체를 정확히 이해하는가?
  - 동적할당을 할수 있는가?
 
4. 코드

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

int main()
{
 struct stu_data
 {
  char name[6];
  float score;
 };

 int i,count;
 float total;
 struct stu_data* stu = NULL;
 
 i = 1;
 count = 0;
 total = 0.0;
 
 printf("학생의 수 : ");
 scanf("%d", &count);

 stu = calloc(count, sizeof(stu));
 while(i<=count)
 {
  printf("%d 번째 학생의 이름과 성적 : ", i);
  scanf("%s %f", stu[i-1].name, &(stu[i-1].score));
  i++;

 }
 
 i = 0;
 
 printf("\n입력된 학생들에 대한 정보\n");
 while(i<count)
 {
  printf("%s : %0.2f\n",stu[i].name, stu[i].score);
  total += stu[i].score;
  i++;
 }

 printf("\n학생들의 평균 성적 : %0.2f\n", total/count);

 stu = NULL;
 free(stu);

 return 0;
}

5. 해설
  - calloc 함수는 C 언어에서 메모리를 할당 받아 변수에게 주는 함수 입니다. malloc 과 유사합니다.
  - while 문으로 자료를 입력 받고 출력합니다.
  - NULL 로 맞춘후에 free 함수로 비우게 합니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/10-3-4.htm : 재할당(malloc, calloc 연관)
  - 네이버 지식인
  - 유사 문제

Posted by 카켈




1. 목적
  - 반복문에 대해 이해한다.
  - 내림차순 숫자 정렬을 이해한다.

2. 문제 (점수 : 25 점)
  - -10 ~ 10 사이의 임의의 정수 10개를 생성하여 출력후 다시 크기가 큰 순서대로 정렬하여 출력하는 프로그램을 작성하라.
  - 중복에 대한 처리는 하지 않고 느야 같이 정렬한다.
  - 출력 화면

정렬전 : -1 -9 -3 9 -6 4 -10 0 3 4
정렬후 : 9 4 4 3 0 -1 -3 -6 -9 -10
Press any key to continue

3. 이해
  - 내림차순 정렬을 아는가?
  - 난수를 원하는 범위에서 출력할수 있는가?
  - 정렬을 위한 알고리듬을 이해하는가?

4. 코드

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

int main()
{
 int i,j,swap;
 int in[10] = {0};

 i = j = swap = 0;

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

 printf("정렬전 : ");
 for(i = 0; i < 10; i++)
 {
  in[i] = rand() % 21 - 10;
  printf("%d ", in[i]);

 }

 printf("\n정렬후 : ");

 for(i = 0; i < 10; i++)
 {
  for(j = i + 1; j < 10; j++)
  {
   if(in[i] < in[j])
   {
    swap = in[i];
    in[i] = in[j];
    in[j] = swap;

   }

  }

  printf("%d ", in[i]);

 }

 putchar('\n');

 return 0;
}

5. 해설
  - 숫자를 넣을때 같이 출력을 했고 정렬을 하면서 같이 출력을 해서 반복문 사이에 printf 문이
    있습니다.
  - swap 가 교환을 위해 임시로 담은 변수 입니다.
  - rand() 로 -10 ~ 10 의 숫자를 만드는 원리는 ( 32767 ) % 21 => ( 0 ~ 20 )- 10 =>
     -10 ~ 10 입니다.
  - 내림차순 정렬은 큰값이 작은 값으로 내려가는 모습이 폭포수 처럼 아래로 내리는 모양을 하였기
    에 내림차순이라 하며 오름차순은 큰값이 밑에 있고 작은수 방향으로 올라가는 모습을 하여 오름
    차순이라 하면 이해하기 쉽습니다.

6. 참고
  - http://mwultong.blogspot.com/2006/10/c-int-sort.html : 내림차순 정렬
  - 유사 문제

Posted by 카켈




1. 목적

  - 프로그램 외부에서 실행시 인수를 입력 받을 줄 안다.

2. 문제 (점수 : 25 점)
  - command line (명령줄) 에서 argument (인수/파라메터)로 main() 함수에 전달된 정수값들의
    합을 구하는 프로그램을 작성하라.
  - 실행 화면 (콘솔창/도스창)

C:\Work\2004_final_5\Debug>2004_final_5 12 34 56 -10 78 -25 90
입력된 수 : 12 34 56 -10 78 -25 90
총합 : 235
평균 : 33.571429

3. 이해
  - 명령줄 인수를 받을수 있는가?
  - 합계/평균을 구할수 있는가?

4. 코드

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

int main(int argc, char* argv[])
{
 int i, sum;
 i = sum = 0;

 i = 1;

 printf("입력된 수 : ");
 while(i<argc)
 {
  printf("%s ",argv[i]);
  sum += atoi(argv[i]);
  i++;

 }

 printf("\n총합 : %d\n",sum);
 printf("평균 : %f ", (float)sum / --i);

 return 0;

}

5. 해설
  - int main(int argc, char* argv[]) 이 핵심 구문입니다. 인수(파라메터)를 입력 받았을때 인수의 갯수를 argc 에 받고, 인수의 순서대로 argv 에 저장됩니다. 첫번째 배열에는 파일이름의 전체경로가 문자열로 저장되며 띄워 쓰기 단위로 다음 문자열의 주소를 받아 저장합니다. 마지막 배열엔 NULL 값이 저장이 됩니다. 아래 디버그창을 보시면 이해가 되실겁니다.

  - 동적으로 부여된 문자열의 주소를 가져 오는 것이므로 만약 이 문장을 변경하고 싶으면 따로 변수를 생성하여 저장 하시면 됩니다. 주소는 변경할수 없는 형식(l-value) 이기 때문입니다. 동적 할당 부분은 malloc 함수가 있지만 C++ 에서는 new 라는 명령어가 있습니다. (아직 참고만 하세요.)

  - atoi 는 문자열을 정수형 문자로 형 변환 하는 함수 입니다.
  - 평균을 낼때 받는 sum 이 정수형이기 때문에 소숫점을 얻기 위해서 float 형으로 형변환 했습니다.

6. 참고
 - 디버그시 인수를 받는 방법과 인수가 직접 저장된 모습을 보여 드리겠습니다.
 - 우선 실행 화면입니다.(OS : WinXP SP2 / IDE, 컴파일러 : Microsoft Visual C++ 6.0)

사용자 삽입 이미지

개발툴 화면입니다.



  - return 0 구문에 Break point (디버그시 잠시 실행을 쉬어 가는 장소, 이 점 이전까지 실행을 합니다.)을 걸어 둡니다. F9 키나 오른쪽 버튼을 눌러 Insert/Remove Breakpoint 를 선택합니다.

사용자 삽입 이미지

Break point 를 걸었습니다.
 
  - 빨간점()이 보이는게 Break point 입니다. 정확히 걸렸습니다.
  - 입력 인수(파라메터)를 입력하기 위해 메뉴에 보시면 Project -> Setting (Alt + F7) 있습니다.
     선택을 하시면


사용자 삽입 이미지

사용자 삽입 이미지

  - Debug 라는 탭이 있습니다. 거기서 Program arguments 란이 있습니다. 거기에 원하는 인수를 넣으시면 됩니다.

  - 다하시고 F5 을 누시거나 Build 메뉴에 Start Debug -> Run (F5) 라는 메뉴가 있습니다. 실행하시면 Break point 가 걸린 곳 까지 수행되며 정지됩니다. 이떄 메모리 내용을 확인 할수 있습니다.

사용자 삽입 이미지
 
  - Watch 항목에 원하는 인수명 또는 계산식을 넣으시면 위 화면과 같은 값들이 나옵니다.
  - 콘솔(커멘드)창에서 위의 내용을 직접 수행한 결과 입니다.


사용자 삽입 이미지

  - http://blog.naver.com/ljyhs/30009619656 : int main(int argc, char* argv[])에 대한 간략한 설명
Posted by 카켈
이전페이지 123 다음페이지