[JW0004-3] 중간고사 답

Post Reply
kiwoon Moon
Posts: 12
Joined: Mon Dec 29, 2014 5:29 pm

[JW0004-3] 중간고사 답

Post by kiwoon Moon »

문제 1: 단어 정렬 및 출력 프로그램

Code: Select all

  1 	#include <stdio.h>
  2 	#include <string.h>
  3
  4 	int input (char word[50]);
  5 	void print_arr (char word[50]);
  6 	void swap (char word1[50], char word2[50]);
  7
  8 	int main (void){
  9
 10     	char word1[50];
 11     	char word2[50];
 12     	char word3[50];
 13
 14     //첫 번째 단어
 15     printf("단어 입력: ");
 16     if(!input(word1)){  //input함수의 리턴 값을 이용해 return값이 0이면 EOF입력이 들어왔다는 것을 구분
 17                         //!을 이용해 역으로 변경하면 1, 조건을 만족시키므로 프로그램 종료
 18             return 0;
 19   	  }
 20     printf("정렬 된 단어: ");
 21     print_arr(word1);   //총 단어의 갯수가 1개이므로 정렬과정을 생략
 22     putchar('\n');
 23     printf("현재까지의 문자열: ");
 24     print_arr(word1);
 25     putchar('\n');
 26
 27     //두 번째 단어
 28     printf("단어 입력: ");
 29     if(!input(word2)){  //input함수의 리턴 값을 이용해 return값이 0이면 EOF입력이 들어왔다는 것을 구분
 30                         //!을 이용해 역으로 변경하면 1, 조건을 만족시키므로 프로그램 종료
 31             return 0;
 32     }
 33     int r;  //정렬 결과를 저장할 변수(strcmp의 반환값)
 34     r = strcmp(word1,word2);
 35     printf("정렬 된 단어: ");
 36     if(r > 0){  //반환 값이 0보다 클 경우, 두 번째 입력받은 단어가 사전순으로는 앞에 위치함을 의미
 37         print_arr(word2);   //word2 문자열을 먼저 출력해줌
 38         print_arr(word1);
 39     }
 40     else{   //반환값이 0이거나 0보다 작을 경우는 출력순서를 변경할 필요가 없으므로 입력순으로 출력
 41         print_arr(word1);
 42         print_arr(word2);
 43     }
 44     putchar('\n');
 45     printf("현재까지의 문자열: ");
 46     print_arr(word1);
 47     print_arr(word2);
 48     putchar('\n');
 49
 50     //세 번째 단어
 51     printf("단어 입력: ");
 52     if(!input(word3)){  //input함수의 리턴 값을 이용해 return값이 0이면 EOF입력이 들어왔다는 것을 구분
 53                         //!을 이용해 역으로 변경하면 1, 조건을 만족시키므로 프로그램 종료
 54             return 0;
 55     }
 56     printf("정렬 된 단어: ");
 57     char copy1[50];     //배열은 복사해 copy로 저장
 58     char copy2[50];     //사전순과 입력받은 순 두 가지를 출력해야하므로 전용 배열을 생성
 59     char copy3[50];
 60     strcpy(copy1,word1);
 61     strcpy(copy2,word2);
 62     strcpy(copy3,word3);
 63
 64     if(strcmp(copy1,copy2) > 0){    //뒤에 있는 문자열을 앞 단어와 교환해야 하는 경우만 교환
 65         swap(copy1,copy2);          //입력순으로 저장되어있는 단어들을 사전순으로 정렬
 66     }
 67     if(strcmp(copy1,copy3) > 0){    //(1,2),(1,3)비교로 맨 먼저 나와야하는 copy1을 고정
 68         swap(copy1,copy3);          //(2,3)비교를 통해 2,3번째 자리를 지정
 69     }
 70     if(strcmp(copy2,copy3) > 0){
 71         swap(copy2,copy3);
 72     }
 73     print_arr(copy1);           //사전순 출력
 74     print_arr(copy2);
 75     print_arr(copy3);
 76     putchar('\n');
 77     printf("현재까지의 문자열: ");
 78     print_arr(word1);
 79     print_arr(word2);
 80     print_arr(word3);
 81     putchar('\n');
 82
 83     return 0;
 84 }
 85 int input (char word[50]){  //문자열 입력받아오는 함수
 86     if(gets(word)== 0){     //반환값이 0이면 EOF
 87         putchar('\n');
 88         return 0;
 89     }
 90     else return 1;
 91 }
 92
 93 void print_arr (char word[50]){     //문자열 배열 출력함수
 94     printf("%s ",word);
 95 }
 96 void swap (char word1[50], char word2[50]){
 97
 98     char temp[50];      //사전순 배열에서 순서를 교환할 때 쓰이는 중간 문자열
 99     if(strcmp(word1,word2) > 0){    //뒤에 있는 문자열을 앞 단어와 교환해야 하는 경우만 교환
100         strcpy(temp,word1);         //입력순으로 저장되어있는 단어들을 사전순으로 정렬
101         strcpy(word1,word2);
102         strcpy(word2,temp);
103     }
104 }
문제 2: 소수 판단 프로그램

Code: Select all

  1 #include<stdio.h>
  2
  3 int check_prime(int num);
  4 void print_prime(int num);
  5
  6 int prime[1000];
  7
  8 int main(void) {
  9     int x=0;            //자연수를 입력 받기 위한 변수 x
 10     int count_all=0;    //소수의 개수
 11     int is_prime=0;     //입력 값 x의 소수 여부
 12
 13     printf("자연수 입력: ");
 14     scanf("%d",&x);
 15     printf("\n");
 16
 17
 18     //is_prime을 체크하여 소수 여부를 알려줌
 19     if(check_prime(x)) printf("%d는 소수입니다.\n\n",x);
 20     else printf("%d는 소수가 아닙니다.\n\n",x);
 21
 22
 23
 24     //논의 사항
 25     //최대값 이 int 자료형을 벗어나면 연산 불가능 -> 자료구조
 26     //구한 각 소수를 메모리에 저장하여 비교하면 비교적 빠른 연산가능 -> 알고리즘
 27 }
 28
 29 int check_prime(int num) {
 30     int i,j, det;
 31     int count_prime=0, is_prime=0;
 32
 33     //이중포문 i는 x보다 작은 모든 정수에대해서
 34     //각 i가 약수를 갖는지
 35     for(i=1; i<=num; i++) {
 36         det = 0;
 37         for(j=1; j<=i; j++) {
 38             //1과 j==i인경우만 판별식 값이 2가 됨
 39             if(i%j == 0) det ++;
 40         }
 41         //det가 2 이상이면 제외 소수가 아니다.
 42         if(det == 2) {
 43             prime[count_prime++] = i;
 44             //마지막으로 i==x 인경우에 소수라고 판단하면 x는 소수
 45             if(i==num) is_prime=1;
 46         }
 47     }
 48     printf("1부터 입력받은 소수%d 까지의 소수의 개수는 %d개 입니다.\n\n", num, count_prime);
 49
 50     print_prime(count_prime);
 51     return is_prime;
 52 }
 53
 54 void print_prime(int num) {
 55     int i;
 56     for(i = 0; i< num; i++) printf("%d ", prime[i]);
 57     printf("\n");
 58 }
문제 3: 문자열 검색 프로그램

Code: Select all


  1 #include<stdio.h>
  2 #include<string.h>
  3
  4 void search(char *word, char *sentence);
  5
  6 int main(void) {
  7     char line[100]; //최초 문장 입력
  8     char temp[30];  //검색할 단어(토큰) 입력
  9
 10     printf("문장 입력: ");
 11     gets(line);
 12
 13     while(1) {
 14         printf("검색할 문자열 입력(종료는 end): ");
 15         if(0 == gets(temp)) break;                  //EOF 입력 받으면 반복문 탈출
 16         if(0 == strcmp(temp,"end")) break;          //end를 입력 받으면 반복문 탈출
 17         search(temp, line);                         //검색 함수 호출
 18     }
 19
 20     /*
 21        논의 사항
 22        더 효율적인 계산 방법은?
 23        strstr() 함수를 각자 구현할 수 있는가?
 24      */
 25 }
 26
 27 void search(char *word, char *sentence) {
 28     char *t[100];
 29     int cnt = 1;
 30     int i;
 31
 32     //0번지는 원문 저장, 1번지부터 검색된 문자의 포인터를 저장
 33     t[0]=t[cnt]=sentence;
 34
 35     while(1) {
 36         t[cnt] = strstr(t[cnt-1], word);    //이전 검색된 위치 다음부터 찾아야함, 무한 루프 방지
 37         if(t[cnt] == NULL) break;           //검색되지 않은경우 반복문 탈풀
 38         cnt++;                              //검색된 개수를 카운트
 39         t[cnt-1]++;                         //검색된 포인터를 1 더해줌, 무한루프 방지
 40     }
 41     printf("%d개", cnt-1);
 42     for(i=1; i<cnt; i++) {
 43         printf(", %d번째", t[i]-sentence);  //포인터 위치의 차를 이용해서 몇번재에 위치하는지 계산
 44     }
 45     printf("\n");
 46 }

Post Reply