K&R2 연습문제 답안 (1장-4장)

전웅의 이미지

안녕하세요?

나이 들수록 자꾸 머리가 굳어가는 것 같아 짬 날때마다 석화 방지를 위해 풀었던
K&R2 (C Programming Languages, 2nd edition) 연습문제 답안을 공유하고자 합니다.

요즘 5장 문제 정리하고 있는 중이라서 (취미로 정말 짬 날 때에만 진행하는 거라서
시간이 오래 걸립니다), 절반인 1장~4장까지의 답안을 공개합니다.

원래는 제 홈페이지 통해서 공개할 생각이었는데, 홈페이지 엔진 구현 작업 (이 역시
취미라는...) 이 늦어지는 관계로 공개를 위해 일단 이곳에 올립니다.

--------------------------------------------------------------------------------
교과서로 많이 쓰이는 책의 연습문제 답안이기에 상업적인 목적의 사용을 다소 제한
하였습니다. 자세한 내용은 LICENSE 파일을 참고하시면 되며, 영문으로 작성되어 있어
핵심만 이곳에 옮겨둡니다.

1. 비상업적 용도로만 사용이 가능합니다. 여기서 비상업적 용도란, 기본적으로 연구
목적을 의미하며, 특별히 상업적인 제품에 사용하려 하지만 그 제품의 목적이 K&R2
연습문제의 답안과 관련된 것이 아니라면 비상업적 용도로 보려고 합니다. (따라서
이 답안을 사용해 책을 출판하거나 이윤을 추구하는 강의를 하는 행위 등은 허용
되지 않으나, 개발중인 프로그램에 답안에 사용된 코드를 참고해 사용하는 것은
얼마든지 가능합니다.)

2. LICENSE 에 명시되어 있듯이 저작권 표시와 허가 사항을 그대로 보존하기만 한다면
그 이외의 어떤 용도로도 사용이 가능합니다.

--------------------------------------------------------------------------------
현재 K&R2 연습문제 답안은 공식적으로 같은 출판사에서 "The C Answer Book" 이라는
제목으로 책 형태로 출판되어 있으며, Richard Heathfield 가 관리하는 페이지를
통해서도 100% 는 아니지만 대부분 문제의 답이 공유되어 있습니다.

제가 작성한 답안의 차별성이 있다면,

1. 한 문제도 빠짐없이 모든 문제에 대한 답을 제공합니다. 출판된 책의 경우 이를
만족하지만, 홈페이지에 공개된 답안의 경우 (특히 후반부로 갈수록) 빠진 부분이
많습니다. (제 홈페이지를 통해 8장까지의 모든 답안이 공개될 수 있는 시점에
Richard Heathfield 와 상의해 링크를 걸거나 제 답안을 제공하는 형태로 공유할
예정입니다.)

2. 문제 출제자의 의도를 최대한 올바르게 이해해 답을 내려고 노력했습니다. 일부
문제의 경우 문제 자체가 애매한 경우가 있어 앞서 언급한 책에 주어진 답도 저자
의 의도와 다른 답을 제시한 경우가 있습니다.

3. 표준에 입각해 위험한 가정을 최소화하여 답안을 작성했습니다. 이미 공개된 다른
답안의 경우 ASCII 문자셋을 가정하거나 음의 정수 나눗셈의 반올림 방향을
가정하는 등, 표준이 보장해주지 않는 가정에 의존한 답안이 다수 있습니다.
또한, 책에 예제로 나온 코드를 사용하는 답안의 경우에도 책의 예제가 부족
하다면 이를 수정해 사용하였습니다 (예를 들어, 입력 스트림의 마지막 라인이
newline 없이 종료되는 경우에 대한 고려가 되어 있지 않아 수정하였습니다).

4. 난이도가 있는 문제의 경우에도 답을 제시하였습니다. 예를 들어, 문제 2-1 의
경우 사용중인 시스템에서 부동소수점 타입의 특성을 실험적으로 계산해보는 것을
문제의 한 부분으로 제시하고 있으나 쉽지 않은 문제인 까닭에 이미 공개된 다른
답안에서는 이에 대한 답을 제시하지 않고 있습니다.

5. 하나의 문제에 여러 접근 방법이 가능한 경우 가급적 다양한 (그리고 정상적인)
방법으로 작성한 답을 보이기 위해 노력했습니다. 예를 들어, 문제 1-23 의 경우
일종의 state machine 구현을 필요로 하는데, state 변수를 사용하는 방법, 함수
포인터를 사용하는 방법, state table 을 구성해 사용하는 방법을 보여주고
있습니다.

--------------------------------------------------------------------------------
아래는 README 파일 내용을 옮겨 둔 것입니다.

파일명은 "c-nn-v.c" 의 형태를 가지며, "c" 는 장 번호를 (총 1장부터 8장까지
있으며 현재 1장부터 4장까지의 답이 준비되어 있습니다), "nn" 은 문제 번호를, "v"
는 버전 번호를 의미합니다.

버전 번호는 한 문제에 대한 여러가지 답이 가능할 때 이를 구분하기 위한 용도로,
특히 버전 번호 1 은 해당 문제가 나오는 시점까지 소개된 기술만을 사용해 답을 낸
소스입니다. 예를 들어, 포인터 연산은 5장에서야 제대로 설명되기 때문에 2-05-1.c
는 배열 첨자를 사용한 방법을 보여주고, 2-05-2.c 와 2-05-3.c 에서는 그러한 제약
없이 포인터 연산을 사용한 방법을 보여줍니다.

c-nn-v.c 에서 개선의 여지가 있거나 다른 접근 방법이 있는 경우 주석을 통해 이를
설명하고 다음 버전 파일인 c-nn-(v+1).c 에서 이전 버전에 소개한 방법을 사용한
코드를 보여줍니다. 따라서 한 문제에 대해서 공부하실 때 버전 번호가 증가하는
순서대로 보시면 도움이 되리라 생각합니다.

모든 코드는 허용되는 한도 내에서 표준(C90, C99)을 준수하도록 노력했습니다.
하지만, 불가피한 경우도 있음에 유의하시기 바랍니다: 예를 들어, 1장 후반부까지
main() 함수에서 return 0; 를 사용하지 않기 때문에 버전 번호 1 의 풀이에서도 사용
하지 않았습니다. 또한, 문제 자체가 표준이 이미 예약하고 있는 명칭을 사용해 함수
를 구현하도록 요구하는 경우도 있어 그런 경우에도 엄밀한 의미에서는 표준을 따르는
코드라고 이야기하기 어렵습니다. 하지만 그 외에는 표준에서 보장해 주는 범위
안에서 작성하였으며, 특별한 가정이 필요한 경우 주석을 통해 설명해 두었습니다.

일부 답안의 경우 C 표준은 예약하지 않으나, 다른 표준 혹은 환경에서 예약해 둔
명칭을 사용해 컴파일이 제대로 되지 않는 경우가 있을 수 있습니다 (예: 4장의 여러
답안에서 사용된 index). 이 경우 표준 모드로 컴파일할 경우 (gcc 의 경우: gcc
-ansi -pedantic 혹은 gcc -std=c99) 문제 없이 컴파일됩니다.

일부 답안은 앞서 언급한 책이나 홈페이지를 통해 공개된 답안과 유사한 형태를 가질
수 있으나 이는 어디까지나 우연의 일치입니다. 답안을 작성할 때 제 답안을 모두
작성할 때까지 다른 사람의 답안을 확인하지 않았습니다.

--------------------------------------------------------------------------------
책 내용과 문제, 답안을 보시면 아시겠지만, K&R2 는 1장부터 마지막 8장까지 꼼꼼히
공부하시면 실력 향상에 크게 도움이 되는 책입니다. (하지만 여전히 초급자가 입문서
로 보기에는 부적절하다고 생각합니다!) 아무쪼록 이 답안이 악용되지 않고 공부에
도움될 수 있기를 바랍니다.

답안에 대한 질문, 제안 등은 언제나 환영합니다. 메일 주시면 가급적 빨리 답변드릴
수 있도록 하겠습니다.

감사합니다.

File attachments: 
첨부파일 크기
Binary Data knr2sol_1to4-20091016.tar.gz49.4 KB
Forums: 
GunSmoke의 이미지

웅이님! 이게 얼마만인가요!!!
잘 지내시죠?

좋은 자료 공개해주셔서 고맙습니다.

ps. 홈페이지의 그 사이클 선수 보조는 픽션인가요? 아님 사실인가요?

大逆戰

大逆戰

전웅의 이미지

넵, 정말 오랜만입니다. 건강하시죠? ^^

홈페이지 내용은, 마지막에 나온 동영상을 보고 누군가가
상상력으로 꾸며 그린 이야기인 것 같습니다.
사내 게시판에 올라왔던 건데 재미있어서 공유하느라
임시로 올려둔 것입니다.

저도 그동안 이런 저런 일이 많아서 드릴 말씀이 많은데
언제 얼굴 뵙고 말씀 나눌 기회가 있었으면 좋겠네요.

그 전에 온라인으로든 오프라인으로든 연락 한번 드리겠습니다. ^^

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

c0d3h4ck의 이미지

좋은 자료 공개해 주셔서 감사합니다.

전웅의 이미지

넵, 정말 오랜만인 것 같습니다.

좋은 자료로 생각해주셔서 감사드립니다.

부족하겠지만 공부하시는 분들께 도움이 되었으면
하는 바람입니다. ^^

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

winner의 이미지

이 답안을 보기 위해 K&R2를 사고 싶은 욕구가...

전웅의 이미지

이미 다 보셨다면 오로지 문제 때문에 다시 구입하시기에는
조금 아까운 면이... ^^

일부(?) 문제(특히 4장의 계산기 관련 문제)를 제외하면
주석에 문제를 모두 옮겨 놓아서 본문 없이도 문제만 읽고
답을 확인하시기에는 큰 어려움은 없으리라 생각합니다.

그보다 K&R2 의 난이도를 고려하면 winner 님이 보시기에는
심심하시지 않을까 생각되네요...

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.