The C Programming Language 연습문제 

2007/09/25 02:18

The C Programming Language 예제
예제 1-1
"hello world"를 출력하는 프로그램을 작성해서 실행시켜 보라. 
프로그램에서 문자 하나씩 빼고 실행시켜서 어떤 에러가 발생하는지 알아보라.

예제 1-2
"\"뒤에 여러 가지 문자를 넣어서 각각 어떤 동작을 하는지 시험해 보라.

예제 1-3
온도변환표의 위의 항목의 제목이 붙도록 프로그램을 바꾸어 보라.

예제 1-4
위 프로그램은 화씨를 섭씨로 바꾸는 프로그램이었다.  섭씨를 화씨로 바꾸는 프로그램을 작성해 보라.

예제 1-5
위의 프로그램에서는 화씨온도가 0일 때부터 300일 때까지를 계산했다. 
300도에서 0도 까지를 계산하는 프로그램을 작성해 보라.  즉 온도변환표를 역순으로 만들어 보라.

예제 1-6
Getchar() != EOF 가 0또는 1이 되는지 실험해 보라.

예제 1-7
EOF의 값이 실제로 어떤 값인지 알아내는 프로그램을 작성하라.

예제 1-8
빈칸, tab과 행의 개수를 세는 프로그램을 작성하라.

예제 1-9
한 파일을 읽어서 그 중 빈칸이 연달아 나오면 그것을 모두 한 칸으로 만들어 출력하는 프로그램을 작성하라.

예제 1-10
한 파일을 읽어서 그 중에 tab이 있으면 \t, backspace가 있으면 그것을 \b로
그리고 \가 있으면 그것을 \\로 대치해서 출력하는 프로그램을 작성하라.

예제 1-11
위의 프로그램이 오동작을 하도록 하는 입력파일을 만들어 보라

예제 1-12
파일을 읽어 한 행에 한 단어씩 출력하는 프로그램을 작성해 보라

예제 1-13
입력된 단어의 길이에 대한 히스토그램을 작성하는 프로그램을 작성하라.

예제 1-14
입력된 문자들의 사용빈도를 나타내는 히스토그램을 출력하는 프로그램을 작성하라.

예제 1-15
1.2절의 온도변환 프로그램을 온도변환 함수를 사용해서 다시 작성해 보라.

예제 1-16
위 프로그램의 main을 수정해서, 모든 행의 길이와 문자들을 출력하도록 해 보라.

예제 1-17
길이가 80자 이상인 모든 행을 출력하는 프로그램을 작성하라.

예제 1-18
파일의 각 행에서 뒷부분의 공백과 tab들을 제거하고 전체가 공백인 행을 삭제하는 프로그램을 작성하라.
예제 1-19
문자열 s의 문자순서를 뒤집는 프로그램을 작성하라. 
이 함수의 이름을 reverse라 붙이고, 이 함수를 사용해서 파일의 한 행씩 순서를 뒤집는 프로그램을 작성하라.

예제 1-20
파일 중에 있는 tab을 같은 길이의 빈칸으로 대치하는 프로그램을 작성하라. 
매 n번째 위치에 tab 지점이 있다고 가정한다.  프로그램 이름은 dtab으로 하여라.

예제 1-21
빈칸이 연속으로 나올 때 그것을 tab문자로 바꾸는 프로그램을 작성하라. 
즉 예제 1-20의 역작용을 하는 entab프로그램을 작성하되,
사용되는 tab문자의 개수는 될 수 있는데로 작도록 하라.

예제 1-22
한 행의 n번째 열 앞에 나타나는 빈칸 아닌 문자 중에서 마지막 문자의 뒷부분을 다음 행으로 보내어 한 행을 두 개 이상의 행으로 만드는 프로그램을 작성해 보라.

예제 1-23
C프로그램에서 모든 설명문을 없애는 프로그램을 작성하라.  인용부호 속에 있는 문자열에 주의할 것.

예제 1-24
기본적인 C문법을 검사하는 프로그램을 작성하라.
검사 대상은, 짝이 맞지 않는 괄호, 중괄호, 그리고 인용부로, escape문자, 설명문표시 등이다.

예제 2-1
표준헤더(standard headers)에서 적당한 값을 취하거나, 직접적인 계산을 통하여
부호형(signed)과 무부호형(unsigned) 의 char, short, int, long변수의 범위를 구하는 프로그램을 작성하라.  여러 가지 부동소수형의 범위를 구해보자.

예제 2-2
위의 for 순환문과 동등한 순환문을 &&나 ||를 사용하지 않고 작성하시오.

예제 2-3
16진수 문자열(0x 또는 0x 모두 포함하는)을 정수로 변화하는 함수 htoi(s)를 작성하라.
사용할 수 있는 숫자는 0에서 9, a에서 f, A에서 F까지임

예제 2-4
문자열 s2의 문자 중 문자열 s1에 있는 문자들을 지우는 squeeze(s1, s2) 를 작성하라.

예제 2-5
문자열 s1에 있는 임의의 문자 s1의 첫 번째 위치를 리턴하고,
s2 중에 s1이 없을 경우 -1을 리턴하는 함수 any(s1, s2)를 작성하라
(표준 라이브러리 함수 strpbrk는 같은 작용을 하고, 단지 그 위치에 대한 포인터를 리턴한다.)

예제 2-6
x의 우측 p번째부터 n개의 비트를 y의 최우측 n개의 비트로 대체하고
다른 비트는 그대로 두고 리턴 하는 함수 setbits(x, p, n, y)를 작성하라.

예제 2-7
x의 p번째 n비트를 역전(즉, 0은 1로, 1은 0으로) 시키고
나머지는 그대로 두는 함수 invert(x, p, n)을 작성하라.

예제 2-8
정수 x를 우측으로 n비트 만큼 이동한 값을 리턴 하는 함수 rightrot(x, n)을 작성하라.

예제 2-9
2의 보수계에서, x&(x-1)은 x의 최우측 1비트를 지운다.  그 이유를 설명하라. 
이 결과를 가지고 bitcount 프로그램을 작성하라.

예제 2-10
대문자를 소문자로 바꾸는 함수 lower를 if-else대신 조건문을 써서 다시 작성하라.

예제 3-1
위의 프로그램에서 이분탐색(biary search)부분은 루프(loop)내에서 두 번의 비교를 수행한다. 
이 부분에서 한번만 비교하도록 프로그램을 수정하고, 계산 시간을 비교해 보라.

예제 3-2
문자 s를 t로 변환할 때 newline이나 tab문자를 \n이나 \t 와 같은
escape sequene로 바꾸는 함수 escape(s,t)를 switch문을 사용하여 작성하라.

예제 3-3
S1에 a-d로 입력하면 S2에 abcd로 변환되는 함수 expand(S1, S2) 를 작성하라. 
대, 소문자 처리가 가능해야 하고 A-B-C, A-Z0-9, -a-z 같은 것도 처리되도록 해야 하며
앞이나 뒤에 붙여진 -는 문자로 처리되어야 한다.

예제 3-4
2의 보수 표현에 있어서, 앞에서 설명한 itoa 함수는 가장 큰 음수 즉 n값이 -(2워드크기-1)이상은 다를 수 없다. 그 이유를 설명하고, 결과가 정확하게 나오도록 수정하라.  기종에 관계없이 실행되도록 작성하라.

예제 3-5
문자열 s를 b진법으로 정수 n으로 변환하는 itob(n,s,b)함수를 작성하라.
 itob(n, s, 16)일 경우 문자열 S를 16진수 n으로 바꾸는 것이다.

예제 3-6
itoa 함수에서 2개의 변수대신 3개의 변수를 사용하도록 프로그램을 재작성하라. 
3번째 변수는 최소 필드 크기를 나타내도록 하라. 
즉 변환된 숫자는 문자열의 오른쪽에 채워지고 왼쪽은 공백으로 채워지게 하라. 

예제 4-1
s내에서 t의 가장 오른쪽 위치를 나타내는 함수 strindex(s,t)를 작성해 보라. 
만일 t가 없다면 -1을 리턴 시키도록 작성하라.

예제 4-2
소수 뒤에 e나 E가 오고, 그 뒤에는 부호생략이 가능한 지수부분이 오도록 atof 함수를 확장하여
프로그램을 작성하여라.  즉 123.45e-6와 같은 형태의 수를 다룰 수 있도록 atof 함수를 확장하라.

예제 4-3
계산기 프로그램에 modulus 연산자(%)와 음수 계산기능을 첨가하라.

예제 4-4
pop 연산을 거치지 않고 스택의 제일 위쪽의 요소를 화면에 출력하는 명령을 추가하라. 
스택을 비우는 명령도 추가하라.

예제 4-5
sin, exp, pow등과 같은 라이브러리 함수를 사용할 수 있도록 프로그램을 수정하라.  부록 B를 참조하라.

예제 4-6
변수를 취급할 수 있도록 프로그램을 수정하라. (하나의 문자로 된 26개의 변수를 설정하는 것이 쉬울 것이다.)

예제 4-7
전체 문자열 s를 input으로 되돌려주는 ungets(s)루틴을 작성하여 보라. 
ungets루틴이 ungetch를 사용해야 하는가?  또한 buf와 bufp에 대한 정보가 있어야 하는가?

예제 4-8
리턴해 줄 문자가 오직 하나뿐인 경우 getch와 ungetch를 수정하여 보라.

예제 4-9
우리가 작성한 getch나 ungetch는 EOF pushed-back을 처리하지 못한다. 
가능하도록 하려면 어떻게 하여야 하는지 구상하여 프로그램을 작성하여 보라.

예제 4-10
입력라인 전체를 읽어들이는 getline을 사용하면 getch와 ungetch는 필요가 없어진다.
getline을 사용하여 계산기 프로그램을 다시 작성하여 보라.

예제 4-11
getop 프로그램을 ungetch를 사용하지 않는 구조로 개선하라.  힌트: 내부 정적 변수를 사용하라

예제 4-12
printd의 개념을 이용하여 itoa의 순환형을 작성하여라.  즉 되부름을 사용하여 정수를 문자열로 변환하라.

예제 4-13
순환 루틴을 사용하여 문자열 s를 거꾸로 하는 함수 reverse(s)를 작성하라.

예제 4-14
두개의 첨자 x, y를 t형으로 상호 치환하는 매크로 swap(t, x, y)를 작성하라.

예제 5-1
위의 프로그램에서 숫자 앞이 아닌 다른 곳에 있는 +와 -는 0으로 취급되었다. 
입력으로 읽을 수 있도록 해 보라.

예제 5-2
부동소수점을 출력하고 getint와 같은 동작을 하는 함수 getfloat를 작성하라.  함수값은 어떤 형의 값이 될까?

예제 5-3
2장에 있는 함수인 strcat(s,t)- 문자열 t를 s의 끝에 첨가하는 함수 -를 포인터를 사용한 함수로 바꾸어 보라

예제 5-4
문자열 t가 문자열 s의 끝에 있으면 1을 그렇지 않으면 0을 리턴하는 함수 strend(s,t)를 작성하라.

예제 5-5
라이브러리 함수인strncpy, strncat과 strncmp 함수를 함수의 매개변수로 들어 오는 문자열의 처음 n문자에 동작하도록 바꾸어 보라.  예를 들어 strncpy(s,t)은 문자열 t의 최대 n문자를 s에 복사하도록 한다.  부록B 에 프로그램의 설명이 있다.

예제 5-6
앞의 장에 나왔던 배열 사용 함수들을 포인터를 사용한 것으로 고쳐라.  고칠만한 것은 다음과 같다.  getline(1장, 4장), atoi, itoa와 변형된 함수들(2,3,4장), reverse(3장), strindex와 getop(4장)

예제 5-7
readlines 프로그램을 고쳐서, alloc 함수를 사용하지 않고 main에서 사용 가능한 배열에 입력을 저장하도록
해 보라.  프로그램 수행이 얼마나 빨라지는지 보라.

예제 5-8
day_of_year와 month_day 함수에 에러 검사하는 부분을 첨가해 보라.

예제 5-9
day_of_year와 month_day 함수를 포인터를 사용하도록 고쳐라.

예제 5-10
reverse polish(4.3절 참조) 식을 계산하는 프로그램 expr을 작성하라.
오퍼랜드는 명령문 라인에서 받아들여지고
expr 2 3 4 + *
와 같이 하면 계산은 2*(3-4)와 같이 된다.

예제 5-11
1장에서 나왔던 entab과 detab 프로그램을 고쳐서 tab 위치를 매개변수로 받아들이도록 하라.
매개변수를 정해주지 않으면 컴퓨터의 기본 설정값을 그대로 이용해야 할 것이다.

예제 5-12
entab과 detab을 고쳐서
entab -m +n
과 같이 하면 m열부터 n열 간격으로 tab 이 설정되도록 해 보라.

예제 5-13
입력의 마지막 n행만을 출력하는 프로그램 tail을 작성하라.

예제 5-14
선택매개변수 -r을 다룰 수 있도록 sort를 수정하라.  -r를 쓰면 정렬을 역순으로 하라는 것을 뜻한다. 물론 -r은 -n 과 함께 동작해야 한다.

예제 5-15
정렬을 할 때 대문자와 소문자를 구별하지 않도록 하는 -f를 sort프로그램에 참가하라.
예제 5-16
문자와 숫자, 공백에 대해서만 비교를 수행하는 -d(사전식 순서)를 sort에 첨가하라.  -f와 함께 동작해야 한다.

예제 5-17
한 행을 몇 개의 필드로 나누어 이 필드들에 대해 정렬이 수행되도록 하는 기능을 첨가해 보라.

예제 5-18
dcl의 입력 에러를 점검할 수 있도록 해 보라.

예제 5-19
undcl을 수정해서 결과로 나온 선언문에 필요 없는 괄호가 들어가지 않도록 하라.

예제 5-20
dcl을 보강해서 함수 매개변수나 그 외 const등도 처리할 수 있도록 만들어라.

예제 6-1
현재의 getword는 밑줄_나 문자열상수나 코멘트, 또는 프로프로세싱에 사용하는 제어행을 적당히 다루지 못한다.  프로그램을 개선하여 보라.

예제 6-2
C프로그램을 읽어서 처음 6자가 같고 나머지가 다른 변수명을 각 그룹별로 알파벳 순서로 프린트하는
프로그램을 작성하라. 문자열이나 코멘트 안에 있는 단어는 세지 않기도 한다. 
명령어 라인에서 검사할 문자수를 정해줄 수 있도록 6을 매개변수로 할 것.

예제 6-3
문장안에 있는 모든 단어의 리스트를 출력하고 각 단어에 대해 그 단어가 나타나는 문장번호를 출력하는 전후참조(cross-reference)를 작성하라. 단 "the"나 "and"같은 단어는 제외 할 것.

예제 6-4
입력에 있는 서로 다른 각 단어에 대해 그 단어가 나타나는 수가 많은 것부터 차례대로 그 단어가 나타난 회수와 함께 출력하는 프로그램을 작성하라.

예제 6-5
lookup와 install에 의해 유지되는 테이블에서 어떤 이름과 정의를 없애는 루틴인 undef라는 함수를 작성하라.

예제 6-6
이 장의 루틴에 근거를 두고 C프로그램을 사용하기에 적당한 인자가 없는 #define 프로세서를 간단하게 구현하라.  getch와 ungetch를 참조하면 도움이 될 것이다.

예제 7-1
대문자는 소문자로 또는 소문자는 대문자로 변환시키는 프로그램을 작성하되,
argv[0] 에서 찾아낸 이름을 사용하라.

예제 7-2
임의의 입력을 출력시키는 프로그램을 작성하라. 
최소한 그것은 그래픽 문자가 아닌 8진수나 16진수를 출력시켜야 하며, 긴 행은 적당한 길이로 끊어서 출력하여야 한다.

예제 7-3
printf의 다른 기능들을 더 추가하여 minprintf를 재작성 하라.

예제 7-4
이전의 절에서의 minprintf와 비슷한 scanf의 기본적인 프로그램을 작성하라.

예제 7-5
4.3절의 계산기 프로그램을 scanf, sscanf를 사용하여 다시 작성하라.

예제 7-6
두 파일을 비교하여 내용이 다른 첫 번째 행을 출력하게 하는 프로그램을 작성하라.

예제 7-7
5장의 패턴 찾는 프로그램을 수정하되 입력은 이름이 정해진 파일에서 받아들이거나,
파일이름이 아무런 매개변수로 명명되지 않으면, 표준 입력으로 받아들이도록 하라. 
패턴이 일치하는 행이 발견될 때 파일 이름을 출력하게 할 수 있는가를 알아 보라.

예제 7-8
파일 집합을 출력시키는 프로그램을 작성하되 각각의 새로운 페이지마다 제목과 페이지 일련번호를 찍어 낼 수 있는 프로그램을 작성하라.

예제 7-9
isupper와 같은 함수가 공백을 절약하거나 시간을 절약하기 위한 형태로 구현이 가능하다. 
두 가능성을 조사하라.

예제 8-1
7장의 cat프로그램을 표준 라이브러리를 사용치 말고, read, write, open, close 을 사용하여 재작성 해 보라.  두 개 버전간의 수행속도도 비교해 보라.

예제 8-2
fopen과 _fillbuf를 비트 조작 없이 할 수 있는 것으로 고쳐보라.  코드의 크기와 수행속도를 비교해 보라

예제 8-3
flushbuf와 fflush와 fclose을 디자인하고 작성하라.

예제 8-4
표준 라이브러리 함수인
 int fseek(FILE *fp, long offset, int origin)
는 fp가 파일 설명자가 아니고 파일 포인터라는 점과 리턴되는 값이 위치를 나타내지 않고
상태(status)를 나타내는 int라는 점을 제외하면 lseek와 동일하다.  fseek함수를 작성하라. 
이 fseek가 라이브러리내의 다른 함수에 의한 버퍼링과 잘 조화되는지를 확인해 보라.

예제 8-5
fsize프로그램을 inode 엔트리에서 얻을 수 있는 다른 정보를 표시하는 프로그램으로 다시 작성하라.

예제 8-6
표준 라이브러리 함수 calloc(n, size)는 기억장소를 0으로 초기화한 채
size 크기만큼의 n개에 대한 포인터를 가리킨다.  malloc를 호출하거나 수정해서 calloc를 작성하라.

예제 8-7
malloc는 크기요청에 대해 타당성 검토 없이 그 값을 받아들인다.  또한 free는 재사용 가능하도록
요청 받은 블록이 유효한 크기의 size 필드값을2004-12-01 가졌다고 가장해서 작동한다. 
이 루틴들을 에러검사를 하는 기능을 부가시켜 개선시켜 보라.

예제 8-8
malloc와 free에 의해 유지되는 빈 공간 리스트(free list)에 n 문자중 한 임의의 블록 p를 재사용 가능케 만들어주는 bfree(p, n)루틴을 작성하라. 
bfree를 사용함으로 해서 사용자는 언제라도 빈 공간 리스트에 정적 배열(static array)이나
외부 배열(external array)을 추가할 수 있게 된다.

wans study/c

Trackback Address: http://wans.kr/trackback/332 관련글 쓰기