{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# scanf 의 이해\n", "jupyter notebook에서는 scanf가 구현이 안되어 있음. 문제가 있으면 질문 하기 바랍니다.\n", "\n", "# scanf\n", "문자를 입력받기 위해 사용되는 명령은 ```scanf```이다. ```printf```에서 변수를 출력할 때 사용한 서식표시자를 똑같이 사용할 수 있다. 아래의 예를 살펴보자.\n", "\n", "기억해야 할 용법은 쌍따옴표 안에 서식지정자를 넣어야 하고, 변수 명 앞에 & 가 있어야 한다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "input excercise\n", "\n", "input a character type data: \n", "input a integer type data: \n", "input a float type data: \n", "input string type data: character type data character: \t\u0000\n", "integer type data int_num: \t0\n", "float type data float: \t0.000000\n", "string type data string: \t\n" ] } ], "source": [ "#include \n", "\n", "int main()\n", "{\n", " int int_num;\n", " char character;\n", " float float_num;\n", " char string[25];\n", " \n", " printf(\"input excercise\\n\");\n", "\n", " // insert data\n", " printf(\"\\ninput a character type data: \");\n", " scanf(\"%c\", &character);\n", " \n", " printf(\"\\ninput a integer type data: \");\n", " scanf(\"%d\", &int_num);\n", " \n", " printf(\"\\ninput a float type data: \");\n", " scanf(\"%f\", &float_num);\n", "\n", " printf(\"\\ninput string type data: \");\n", " scanf(\"%s\", string);\n", " \n", " // print data\n", " printf(\"character type data character: \\t%c\\n\", character);\n", " printf(\"integer type data int_num: \\t%d\\n\", int_num);\n", " printf(\"float type data float: \\t%f\\n\", float_num);\n", " printf(\"string type data string: \\t%s\\n\", string);\n", " \n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "다음과 같이 여러 값을 입력 받을 수 도 있다. 아래 코드를 실행하고 ```1 -20 .3 -4.0e3```을 적어 결과를 확인해보자. ```printf```문장은 직접 작성해보자. 숫자들 사이에 공백을 넣어서 입력해보자. 어떤 경우에 의도한대로 숫자가 표현되는지 차이를 확인해보자. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#include \n", "\n", "int main()\n", "{\n", " int i, j;\n", " float x, y;\n", " scanf(\"%d%d%f%f\", &i, &j, &x, &y);\n", " // printf(\"\");\n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 문제 1\n", "\n", "다음 코드는 사용자로부터 입력을 받지 않는 코드이다. 높이, 넓이, 길이의 값을 사용자가 입력하도록 코쳐보자. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#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", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 문제 2\n", "\n", "다음의 코드는 UPC 의 체크 비트 계산 방법이다. UPC는 통일 상품 코드로서 바코드 아래 적힌 숫자들이다. 이 숫자는 제품을 분류하는데 사용된다. 총 12 자리로 된 숫자인데, 마지막 숫자는 검산용 체크 비트이다. \n", "\n", "UPC 계산 방법은 다음과 같다.\n", "* 1, 3, 5, 7, 9, 11 번째 숫자를 더해서 첫 번째 결과로 저장 (a)라고 하자\n", "* 2, 4, 6, 8, 10 번째 숫자를 더해서 두 번째 결과로 저장 (b)라고 하자\n", "* 3x(a) + (b), 결과를 (c)라고 하자\n", "* ((c)-1) % 10, '%' 은 나머지 연산자, 계산 결과를 (d)라고 하자\n", "* 9 - (d) = 검산 용 체크 비트\n", "\n", "예를 들어보자. UPC가 0 13800 15173 5 라고 할 때 다음과 같이 계산하여 UPC 체크 비트를 구한다.\n", "* 0 + 3 + 0 + 1 + 1 + 3 = 8\n", "* 1 + 8 + 0 + 5 + 7 = 21\n", "* 3 x 8 + 21 = 45\n", "* (45 - 1) % 10 = 4\n", "* 9 - 4 = 5, 체크 비트\n", "\n", "다음의 기본 뼈대를 토대로 UPC 체크 비트를 계산하는 코드를 작성해보자.\n", "\n", "단, 세 부분으로 나눠서 입력을 한다. (위의 예제의 수를 그대로 이용하면)\n", "* 첫 번째 입력: 첫 번째 비트 0\n", "* 두 번째 입력: 그 다음 다섯 비트 13800\n", "* 세 번째 입력: 마지막 다섯 비트 15173\n", "\n", "위와 같이 숫자를 입력받으면 UPC 체크 비트를 계산하고 다음과 같이 출력한다.\n", "check digit: 5\n", "\n", "힌트: 형식지정자에 '%1d'라고 쓰면 정수 1의 자리 수만 입력된다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "/* Computes a Universal Product Code check digit */\n", " \n", "#include \n", " \n", "int main(void)\n", "{\n", " int first_sum, second_sum, total;\n", " \n", " printf(\"Enter the first (single) digit: \");\n", " \n", " printf(\"Enter first group of five digits: \");\n", " \n", " printf(\"Enter second group of five digits: \");\n", " \n", " first_sum = ;\n", " second_sum = ;\n", " total = 3 * first_sum + second_sum;\n", " \n", " printf(\"Check digit: %d\\n\", );\n", " \n", " return 0;\n", "}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 문제 3\n", "\n", "사용자가 입력하는 두 개의 분수를 더하는 하는 프로그램을 작성하려고 한다.\n", "\n", "* 입력 형식의 예는 5/7 + 7/8 이고\n", "* 출력 형식의 예는 89/56 이다. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "/* Adds two fractions */\n", " \n", "#include \n", " \n", "int main(void)\n", "{\n", " \n", "\n", " printf(\"Enter fractions to compute (eg. 5/7+7/8): \");\n", "\n", " \n", " printf(\"The sum is %d/%d\\n\", );\n", "\n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 문제 4\n", "\n", "다음의 몇 개의 코드에서는 공백과 엔터 등의 글자들이 값의 저장에 어떤 영향을 주는지 살펴보고자 한다. 이 때 공백은 스페이스키, 엔터는 엔터키를 뜻한다. 다음의 입력 조건에 따라 코드를 실행 해보자.\n", "\n", "입력 조건\n", "* 공백 공백 1 공백 엔터 -20 공백 공백 공백 .3 엔터 공백 공백 공백 공백 -4.0e3\n", "* 1-20.3-4.0e3엔터\n", "\n", "위의 입력을 바탕으로 `scanf` 가 공백과 엔터를 어떻게 처리하는지 정리해보자." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#include \n", "int main()\n", "{\n", " int i, j;\n", " float x, y;\n", " scanf(\"%d%d%f%f\", &i, &j, &x, &y);\n", " printf(\"i:%d\\tj:%d\\tx:%f\\ty:%f\\n\", i, j, x, y);\n", " return;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 번에 입력할 조건은 다음과 같다.\n", "* 38 / 공백 28\n", "* 38 공백 / 28\n", "\n", "두 값 중 하나는 이상한 값이 나온다. 왜 그럴지 예상해보자. 예상한 이유가 맞는지 확인을 원하면 질문하기 바랍니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#include \n", "int main()\n", "{\n", " int i, j;\n", " scanf(\"%d/%d\", &i, &j);\n", " printf(\"i:%d\\tj:%d\\n\", i, j);\n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 번에 입력할 조건은 다음과 같다.\n", "* 38/ 공백 28\n", "* 38 공백 /28\n", "* 38 공백 / 공백 28\n", "* 38/hel 공백 lo/ 공백 28\n", "* 38/hello/ 공백 28\n", "\n", "scanf에 다른 문자가 포함되어 있을 때 처리 방식을 이해해보자. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#include \n", "int main()\n", "{\n", " int i, j;\n", " scanf(\" %d/hello/%d\", &i, &j);\n", " printf(\"i:%d\\tj:%d\\n\", i, j);\n", " return;\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 }