C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 2.1장 연습문제

꾸준함. 2017. 5. 28. 01:08

[1번 문제]

/*

임의의 영문 문자열에 대해 소문자는 대문자로, 대문자는 소문자로 동시에 변환하는 함수를 작성하시오

*/

#include <stdio.h>

#include <ctype.h> //toupper, tolower

#include <string.h>

 

void change(char str[]);

 

int main(void)

{

        char string[20];

        printf("문자열 입력:");

        scanf("%s", string);

        printf("문자열 변환:");

        change(string);

        printf("바뀐 문자열:%s\n", string);

        return 0;

}

 

void change(char str[])

{

        int i;

        int length = strlen(str);

        for (i = 0; i < length; i++)

        {

               if (str[i] >= 65 && str[i] <= 90) //대문자일 경우

                       str[i] = tolower(str[i]);

               else if (str[i] >= 97 && str[i] <= 122) //소문자일 경우

                       str[i] = toupper(str[i]);

        }

}


[2번 문제]

/*

[예제 2.1.24] 함수 my_strcat 다른 방법으로 개의 문자열을 합치는 함수를 작성하시오

*/

#include <stdio.h>

#include <string.h>

 

void my_strcat2(char *d, char *s);

 

int main(void)

{

        char d[15] = "love";

        char s[6] = "holic";

        my_strcat2(d, s);

        printf("%s\n", d);

        return 0;

}

 

void my_strcat2(char *d, char *s)

{

        int length = strlen(s);

        int length2 = strlen(d);

        memmove(d + length2, s, length); //memcpy 사용해도 무방하다

}

 

/*

기존의 my_strcat

void my_strcat(char *d, char *s)

{

        char length=strlen(d);

        while(*s)

        *(d+length++)= *s++

}

*/


[3번 문제]

/*

임의의 문자열에 대해 특정 단어가 개인지를 계산하는 함수를 작성하시오

*/

#include <stdio.h>

#include <string.h>

 

int count(char *s, char *d);

 

int main(void)

{

        char str[20], letter[10];

        printf("문자열 입력:");

        scanf("%s", str);

        printf("특정단어 입력:");

        scanf("%s", letter);

        printf("특정단어 %s 문자열 %s %d 있다\n", str, letter, count(str, letter));

        return 0;

}

 

int count(char *s, char *d)

{

        int num = 0;

        while (s)

        {

               if (s=strstr(s, d)) //strstr함수는 d 문자열과 일치하는 번째 s 문자열 포인터를 반환한다

               {

                       num++;

                       s++;

               }

        }

        return num;

}

[4번 문제]

/*

임의의 문자열에 대해 알파벳, 숫자, 특수기호의 개수를 출력하는 함수를 작성하시오

*/

#include <stdio.h>

#include <ctype.h>

 

void count(char *s);

 

int main(void)

{

        char str[50];

        printf("문자열 입력:");

        scanf("%s", str);

        count(str);

        return 0;

}

 

void count(char *s)

{

        int number=0, alphabet=0, expression=0;

        for (int i = 0; s[i] != NULL; i++)

        {

               if (isdigit(s[i])) //숫자인지 판별하는 함수

               {

                       number++;

               }

               else if (s[i] >= 65 && s[i] <= 90 || s[i] >= 97 && s[i] <= 122)

               {

                       alphabet++;

               }

               else

               {

                       expression++;

               }

        }

        printf("문자열 %s에서 숫자는 %d, 알파벳은 %d, 특수기호는 %d개였습니다\n", s, number, alphabet, expression);

}



[5번 문제]

/*

임의의 문자열에 대해 특정 문자의 위치를 반환하는 함수 location 작성하시오.

예를 들어 location("abcde", 'c') 결과로 3 반환합니다

*/

#include <stdio.h>

#include <string.h>

 

void location(char *s, char d);

 

int main(void)

{

        char str[50];

        char letter;

        printf("문자열 입력:");

        scanf("%s", str);

        getchar(); //개행문자 생략

 

        printf("특정 문자 입력:");

        scanf("%c", &letter);

 

        location(str, letter);

        return 0;

}

 

void location(char *s, char d)

{

        char *ptr;

        ptr = strchr(s, d);

        printf("문자열 %s에서 특정문자 %c 위치는 %d이다\n", s, d, ptr - s + 1);

}

 

 


[6번 문제]

/*

임의의 문자열에 대해 중간 부분의 문자열을 반환하는 함수 mid 작성하시오.

예를 들어 mid(3, 4, "permutation") 결과로 문자열 "rmut" 반환합니다

*/

#include <stdio.h>

#include <string.h>

 

void mid(int num1, int num2, char *s);

 

int main(void)

{

        int num1, num2;

        char str[50];

 

        printf("문자열 입력:");

        scanf("%s", str);

        printf("문자열의 시작위치 입력:");

        scanf("%d", &num1);

        printf("문자열의 길이 입력:");

        scanf("%d", &num2);

        mid(num1, num2, str);

        return 0;

}

 

void mid(int num1, int num2, char *s)

{

        memmove(s, s+num1-1, num2);

        s[num2] = '\0'; //문자열의 끝은 NULL

        printf("결과물은 %s이다\n", s);

}



[7번 문제]

/*

임의의 문자열에 대해 마지막 부분의 문자열을 반환하는 함수 right 작성하시오

예를 들어 right(6, "table tennis") 결과로 문자열 "tennis" 반환합니다

*/

#include <stdio.h>

#include <string.h>

 

void right(int num, char *s);

 

int main(void)

{

        char str[50];

        int num = 0;

        printf("문자열 입력:");

        fgets(str, sizeof(str) / sizeof(char), stdin); //scanf 공백 입력을 허용하지 않는다

        printf("반환하고 싶은 위치 입력:");

        scanf("%d", &num);

        right(num, str);

        return 0;

}

 

void right(int num, char *s)

{

        memmove(s, s + num, num);

        s[num] = '\0'; //문자열의 끝은 NULL이다

        printf("반환할 문자열은 %s\n", s);

}



[8번 문제]

/*

시간을 입력하면 시분초 단위로 구분하여 출력하는 함수 time_division 작성하시오

예를 들어 time_devision("13:7:25") 또는 time_division("130725") 결과로 "오후 1 7 25" 출력합니다

*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

void time_devision(char *s);

 

int main(void)

{

        char str[50];

        printf("시간을 입력:"); //, , 두자리수로 입력

        scanf("%s", str);

        time_devision(str);

        return 0;

}

 

void time_devision(char *s)

{

        int hour, min, sec;

        char AMPM[5];

        char time[50] = { NULL, };

        //문자열을 통일 XX:XX:XX 형식으로

        if (strchr(s, ':'))

        {

               if (s[4] == ':') //분이 한자리수일 경우

               {

                       memmove(s + 4, s + 3, 5); //널문자까지

                       memmove(s + 3, "0", 1);

               }

        }

        else //: 없을 경우

        {

               memmove(s + 6, s + 4, 3); //널문자까지

               memmove(s + 3, s + 2, 2);

               memmove(s + 2, ":", 1);

               memmove(s + 5, ":", 1);

        }

 

        memmove(time, s, 2);

        hour = atoi(time);

        memmove(time, s + 3, 2);

        min = atoi(time);

        memmove(time, s + 6, 2);

        sec = atoi(time);

 

        if (hour > 23 || min > 59 || sec > 59)

        {

               printf("문자열을 잘못 입력하셨습니다\n");

               return -1;

        }

 

        if (hour > 12)

        {

               strcpy(AMPM, "오후");

               hour -= 12;

        }

        else

               strcpy(AMPM, "오전");

 

        printf("%s %d %d %d\n", AMPM, hour, min, sec);

}

 

case 1:분을 한자리로 적었을 때

case 2:분을 두자리로 적었을 때



[9번 문제]

/*

지역번호가 포함된 전화번호를 입력하면 해당 지역, , 번을 분리하여 출력하는 함수  phone_division 작성하시오

예를 들어 phone_division("0315551745") 결과 "경기도 555 1745"으로 출력합니다*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

void phone_division(char *s);

 

int main(void)

{

        char str[100];

        printf("전화번호 입력(서울이여도 002 붙일것):");

        scanf("%s", str);

 

        phone_division(str);

        return 0;

}

 

void phone_division(char *s)

{

        int first = 0; //전화번호를 세부분으로 나눈다

        char phone[100];

        char middle[5];

        char last[5];

        char division[10];

        memmove(phone, s, 3);

        first = atoi(phone);

        switch (first)

        {

        case 2:

               printf("서울 ");

               break;

        case 51:

               printf("부산 ");

               break;

        case 53:

               printf("대구 ");

               break;

        case 32:

               printf("인천 ");

               break;

        case 62:

               printf("광주 ");

               break;

        case 42:

               printf("대전 ");

               break;

        case 52:

               printf("울산 ");

               break;

        case 44:

               printf("세종 ");

               break;

        case 31:

               printf("경기 ");

               break;

        case 33:

               printf("강원 ");

               break;

        case 43:

               printf("충북 ");

               break;

        case 41:

               printf("충남 ");

               break;

        case 63:

               printf("전북 ");

               break;

        case 61:

               printf("전남 ");

               break;

        case 54:

               printf("경북 ");

               break;

        case 55:

               printf("경남 ");

               break;

        case 64:

               printf("제주 ");

               break;

        }

        memmove(middle, s + 3, 3);

        middle[3] = '\0';

        memmove(last, s + 6, 4);

        last[4] = '\0';

        printf("%s %s\n", middle, last);

}

 


[10번 문제]


/*

휴대번호를 입력하면 다음과 같은 형식으로 출력하는 함수 phone_division 작성하시오

*/

#include <stdio.h>

#include <string.h>

 

void phone_division(char *s);

 

int main(void)

{

        char str[50];

        printf("전화번호 입력:");

        scanf("%s", str);

        phone_division(str);

        return 0;

}

 

void phone_division(char *s)

{

        char phone[50] = { NULL };

        int length = strlen(s);

        if (length == 10)

        {

               memmove(phone, s, 3);

               printf("%s-", phone);

               memmove(phone, s + 3, 3);

               printf("%s-", phone);

               memmove(phone, s + 6, 4);

               printf("%s\n", phone);

        }

        else if(length==11)

        {

               memmove(phone, s, 3);

               printf("%s-", phone);

               memmove(phone, s + 3, 4);

               printf("%s-", phone);

               memmove(phone, s + 7, 4);

               printf("%s\n", phone);

        }

        else

        {

               printf("문자열을 잘못 입력하셨습니다\n");

               return;

        }

}

case 1:가운데 자리수가 3자리일 경우

case 2:가운데 자리수가 4자리일 경우



[11번 문제]

/*

문제 10 대해 다음과 같은 형식으로 문자열을 반환하는 함수 phone_division 작성하시오

*/

#include <stdio.h>

#include <string.h>

 

void phone_division(char *s);

 

int main(void)

{

        char str[50];

        printf("전화번호 입력:(-까지 붙인다)");

        scanf("%s", str);

        phone_division(str);

        return 0;

}

 

void phone_division(char *s)

{

        memmove(s + 3, s + 4, strlen(s) - 3);

        memmove(s + strlen(s) - 5, s + strlen(s) - 4, 5); //끝자리는 항상 4자리이므로

        printf("%s\n", s);

}

case 1:가운데 자리수가 3자리일경우

case 2:가운데 자리수가 4자리일 경우



[12번 문제]

/*

자동차번호에 대해 차종별, 용도별, 사업용으로 구분하여 출력하는 함수를 작성하시오

 

조사결과:

앞에 두자리가 70 미만인 경우 승용차, 70~79인경우 승합차, 80~97 화물자동차, 98~99 특수자동차!

아바사자->택시, 버스

가나다라마거너더러머버서어저고노도로모보소오조구누두루무부수우주->개인자동차

->렌트카

*/

#include <stdio.h>

#include <string.h>

 

void CarNumber(char *s);

 

int main(void)

{

        char *str[50];

        printf("자동차 번호 입력:(XX XXXX 형식):");

        scanf("%s", str);

        CarNumber(str);

        return 0;

}

 

void CarNumber(char *s)

{

        int number = 0;

        char car[3] = { NULL };

        char car1[] = { "아바사자" };

        char car2[] = { "가나다라마거너더러머버서어저고노도로모보소오조구누두루무부수우주" };

        memmove(car, s, 2);

        number = atoi(car); //한글 자리 숫자

        memmove(car, s + 2, 2); //한글

        if (number < 70)

        {

               printf("승용차");

        }

        else if (number < 80)

        {

               printf("승합차 ");

        }

        else if (number < 98)

        {

               printf("화물차 ");

        }

        else if (number < 100)

        {

               printf("특수차 ");

        }

        else

        {

               printf("차가 아닙니다\n");

               return;

        }

        if (strstr(car1, car) && number < 70)

               printf("택시입니다\n ");

        else if (strstr(car1, car))

               printf("버스입니다\n");

        if (strstr(car, ""))

               printf("렌트카입니다\n");

        for (int i = 0; i < strlen(car2) - 1; i++)

        {

               if (car[0] == car2[i])

               {

                       if (car[1] == car2[i + 1])

                       {

                              printf("자가용입니다\n");

                       }

               }

        }

}


[13번 문제]

/*

다음과 같이 한글과 영문이 혼합된 문자형 배열 text[] 대해 문제에서 요구하는 함수를 작성하시오

char text[]="program 실행하기 전에 compile 해야 한다.";

1) 문자형 배열 text[] 역으로 출력하는 함수를 작성하시오

2) 영문 "compile" 한글 "컴파일" 대체하는 함수를 작성하시오

*/

#include <stdio.h>

#include <string.h>

 

void reverse(char *s);

void replace(char *s);

 

int main(void)

{

        char str[50] = "program 실행하기 전에 compile 해야 한다.";

        reverse(str);

        replace(str);

        return 0;

}

 

void reverse(char *s)

{

        int length = strlen(s);

        for (int i = length - 1; i >= 0; i--)

        {

               if (s[i]>=0&&s[i]<=127)

               {

                       printf("%c", s[i]);

               }

               else //한글은 2바이트

               {

                       printf("%c%c", s[i - 1], s[i]);

                       i--;

               }

        }

        printf("\n");

}

 

void replace(char *s)

{

        memmove(s + 30, s + 31, 14); //뒤로 땡긴다

        memmove(s + 24, "컴파일", 6);

        printf("%s\n", s);

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저, 13번 replace 함수는 http://blog.naver.com/jungtosu2 참고

반응형