{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# C 기초, 서식있는 입력과 출력\n", "\n", "\n", "Jupyter Notebook 은 직접 컴파일 명령을 내리는 기능은 없습니다. 여러 파일들에 나뉘어 있는 있는 코드를 하나의 실행 파일로 컴파일하는 기능도 없습니다. 하지만, 터미널에서 컴파일하는 방법에 익숙해져야 합니다. \n", "\n", "Linux를 사용한다면 터미널은 `Ctrl+Alt+t`를 눌러 실행할 수 있습니다. 내 위치가 어디인지 확인하기 위해서는 `pwd`, 현재 있는 위치에 어떤 파일들이 있는지 보려면 `ls`를 타이핑합니다. 디렉터리를 바꾸려면 `cd 디렉터리명`을 쓰면 됩니다. 한글과 띄어쓰기가 있으면 입력이 불편하기 때문에 영어로 디렉터리와 파일명을 만드는 것이 좋습니다. Linux의 에디터에 코드를 작성한 후 바탕화면(Desktop)에 파일(pun.c)을 작성했다고 가정해봅시다. 컴파일하는 과정을 보도록 하겠습니다.\n", "\n", " > pwd \n", " /user/home/GNU\n", " > ls\n", " Documents Downloads Desktop ...\n", " > cd Desktop\n", " > ls\n", " pun.c\n", " > gcc -o foo pun.c\n", " > ./foo\n", " ...\n", " \n", " \n", "컴파일하는 명령은 `gcc ` 입니다. 그 뒤로 몇 개의 다른 글자들이 따라오는데, `-o`는 컴파일한 결과의 이름을 지정하는 옵션이고, `foo`은 사용자가 선택한 컴파일한 결과 파일의 이름입니다. 다른 이름으로 선정해도 상관 없습니다. 코드가 하는 일을 잘 표현하는 이름이면 더욱 좋습니다. 마지막의 `pun.c`는 작성한 코드가 있는 파일입니다. 한 줄의 명령을 말로 풀어 쓰면 다음과 같이 됩니다. \n", "> `pun.c`의 코드를 gcc로 컴파일하여 `foo`라는 실행 파일을 만들어라\n", "\n", "실행하는 방법은 `./foo`라고 쓰면 됩니다. 실행 파일명 앞의 `./`은 **현재 디렉터리 내에 있는** 이라는 표현입니다. \n", "\n", "## printf의 이해" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "/* 파일 이름: pun.c */\n", "\n", "#include \n", "\n", "int main(void)\n", "{\n", " printf(\"To C, or not to C: that is the question.\\n\");\n", " return 0;\n", "}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jupyter Notebook에서는 플레이 버튼만 누르면 되서 또는 `shift+enter`만 누르면 되지만, 컴파일 명령을 꼭 익혀 두기 바랍니다. \n", "\n", "`printf`는 쌍따옴표 내에 있는 모든 글자를 그대로 출력합니다. 그렇기 때문에 줄바꿈이나, 변수의 값을 표현하기, 서식 지정하기 등을 하려면 특수한 처리를 해야 합니다. `printf`의 가장 뒤에 `\\n`라는 문자가 그 특수한 처리 중 하나 입니다. `n`은 newline의 약자입니다. 기호 `\\`는 뒤에 나오는 글자를 텍스트가 아닌 특수 기호로 처리하라는 신호 입니다. 그 둘이 합하여 줄 바꿈 기호로 바뀝니다. \n", "\n", "다음의 코드를 실행해보기 전에 위의 코드와 어떤 차이가 있는지 확인해봅시다.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#include \n", "\n", "int main(void)\n", "{\n", " printf(\"To C\");\n", " printf(\", or not to C:\");\n", " printf(\" that i\");\n", " printf(\" s the question. \");\n", " printf(\" \\n\");\n", " return 0;\n", "}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 익힘 1\n", "\n", "항공사는 용적중량을 계산해서 요금을 과금합니다. 다음의 코드는 용적중량을 계산하는 코드입니다. 용적을 계산하고 166으로 나눠서 용적중량을 계산합니다. 166은 상수로 파운드 내에 넣을 수 있는 1인치 큐빅의 수를 말합니다. \n", "\n", "`printf` 가 어떻게 활용되는지 살펴봅시다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "/* Computes the dimensional weight of a 12\" x 10\" x 8\" box */\n", "\n", "#include \n", " \n", "int main(void)\n", "{\n", " int height, length, width, volume, weight;\n", " \n", " height = 8;\n", " length = 12;\n", " width = 10;\n", " volume = height * length * width;\n", " weight = (volume + 165) / 166;\n", " \n", " printf(\"Dimensions: %dx%dx%d\\n\", length, width, height);\n", " printf(\"Volume (cubic inches): %d\\n\", volume);\n", " printf(\"Dimensional weight (pounds): %d\\n\", weight);\n", " \n", " return 0;\n", "}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 특수 기호들은 무엇이 있는지 조사해봅시다. 형식지정자를 검색해서 정리하기 바랍니다. `\\n`과 같은 제어문자는 무엇이 있는지 정리해봅시다.\n", " \n", "**`printf`에서 사용할 수 있는 형식지정자와 그 의미**\n", "* 여기에 나열해 보기 바랍니다.\n", "\n", "**`printf`에서 사용할 수 있는 제어문자와 그 의미**\n", "* 여기에 나열해 보기 바랍니다.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## scanf의 이해\n", "\n", "컴파일된 코드는 항상 똑같은 동작만 하기 때문에 지정된 변수는 변하지 않습니다. 사용자로부터 값을 입력받아 좀 더 보편적인 동작을 수행시킬 수 있습니다. 이 때 사용되는 명령이 `scanf`입니다. 용법을 살펴봅시다.\n", "\n", "*주의: Jupyter Notebook에서는 `scanf`가 구현되지 않았습니다. 터미널에서 직접 컴파일 해보기 바랍니다.* " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#include \n", "\n", "int main(void){\n", " int height;\n", " scanf(\"%d\", &height);\n", " printf(\"%d\", height);\n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`scanf` 함수는 두 개의 인자를 받습니다. 앞의 인자 `%d`는 사용자가 입력할 수 있는 값의 형태를 한정하는 형식지정자입니다. 앞에서 조사했듯이 `%d`는 정수를 뜻합니다. 사용자는 정수만 입력할 수 있습니다. 정수 이외의 값은 무시 됩니다. 예를 들어 3.14를 입력해도 3만 인식하고 저장됩니다. 사용자가 입력한 3은 그러면 어디에 저장될까요? 설명을 안한 두 번째 인자에 저장됩니다. 여기서 두 번째 인자는 `height`라는 정수형 변수 입니다. `&`는 앞으로 배우게 될 주소를 나타내는 기호입니다. `scanf(\"%d\", &height);`을 말로 풀어 쓰면 다음과 같습니다. \n", "> 사용자가 입력한 정보를 정수형으로 변환하여 변수 `height`에 저장하라\n", "\n", "`scanf`에도 `printf`의 형식지정자를 같은 의미로 모두 사용할 수 있습니다.\n", "\n", "앞에서 봤던 용적중량 계산하는 코드에 `scanf`를 적용해봅시다. 마찬가지로 `scanf`가 동작하지 않기 때문에 터미널에서 직접 컴파일 하기 바랍니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "/* Computes the dimensional weight of a box from input provided by the user */\n", " \n", "#include \n", " \n", "int main(void)\n", "{\n", " int height, length, width, volume, weight;\n", " \n", " printf(\"Enter height of box: \");\n", " scanf(\"%d\", &height);\n", " printf(\"Enter length of box: \");\n", " scanf(\"%d\", &length);\n", " printf(\"Enter width of box: \");\n", " scanf(\"%d\", &width);\n", " volume = height * length * width;\n", " weight = (volume + 165) / 166;\n", " \n", " printf(\"Volume (cubic inches): %d\\n\", volume);\n", " printf(\"Dimensional weight (pounds): %d\\n\", weight);\n", " \n", " return 0;\n", "}\n" ] } ], "metadata": { "kernelspec": { "display_name": "C", "language": "c", "name": "c" }, "language_info": { "file_extension": ".c", "mimetype": "text/plain", "name": "c" } }, "nbformat": 4, "nbformat_minor": 2 }