프로그래밍은 환상적인 "코딩" 보다는 완벽한 "문제 해결"에 마음을 두어야 할 것입니다. 요구사항(문제)을 잘 분석해서 핵심을 파악하는 것이 시간과 노력을 아끼는 첩경입니다. 초보 개발자 일수록 빨리 끝내려는 조급함이 오히려 함정에 빠지는 기폭제가 될 수 있으므로 "어떻게 문제를 풀 것인가?" 하는 설계가 잘 나오도록 마음을 두어야 합니다. 이번 문제는 간단하지만 방심하면 곳곳에 빈틈이 생길 수 있습니다. 완성도를 높일 수 있도록 노력해야 할 것입니다. ■ 문제 1. 프로그램 형태 및 규칙 - 콘솔 프로그램 형태이며 프로그램 아규먼트로 년도 및 월을 입력받아 해당 월의 달력을 표준 출력(화면)으로 출력합니다. - 1년 1월 1일은 월요일. 4년마다 윤년으로 2월을 29로 처리 - 4년마다 윤년이지만 10..
C언어를 이제 막 배우기 시작한 병아리 개발자를 위해서 실습을 위한 과제를 내주고 이에 대한 피드백을 코드와 함께 메모로 남깁니다. 코드 실습 환경은 "C언어 배우기를 위한 준비"를 참조하세요. ■ 문제마방진 출력 프로그램 작성프로그램 형태 - 콘솔 프로그램 - 프로그램 아규먼트 입력, 화면 출력 형태입력 - 3 ~ 15의 홀수를 받음 - 오류 입력에 대처해야 함출력 - 입력 오류 발생시 오류 내용과 사용방법을 출력함 - 정상 입력시 N 마방진을 가로/세로 폭을 맞추어 출력 - 자체 검증을 위해서 가로, 세로 및 한쪽 대각선 방향의 함께를 출력함 ■ 코드와 해설다른 사람의 코드를 보지 않고 문제 내용만으로 코딩하는 연습이 실력을 키우는 첩경입니다. 홀수 마방진 작성 프로그램 연습은 2차원 배열을 기반으로..
IPO(Input Process Output) 모델은 프로그램을 분석하거나 설명하는데 사용하는 가장 기본적인 모델입니다. 프로그램으로 들어오는 입력 자료의 구조와 형태, 처리 내용과 방식, 출력 자료의 구조와 형태를 명확하게 분석하거나 설계하는 것은 안정적인 프로그램의 시작이라 할 수 있습니다. [49-50] 다음과 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하시오. 무게가 서로 다른 개의 물건이 있다. 각 물건은 1부터 까지 번호가 매겨져 있다. 우리는 일부 물건 쌍에 대해서 양팔 저울로 어떤 것이 무거운 것인지를 측정한 결과표를 가지고 있다. 이 결과표로부터 직접 측정하지 않은 물건 쌍의 비교 결과 를 알아낼 수도 있고 알아내지 못할 수도 있다. 예를 들어, 총 6개의 물건이 있고, ..
이번 글에서는 함수가 코드의 핵심 역할을 하는 문제들을 골라 보았습니다. C언어를 기반으로 프로젝트를 수행하다보면 개인적으로 자주 적용하는 프로그래밍 기법 중에 하나가 바로 모듈화 프로그래밍입니다. 모듈화 프로그래밍은 기능 단위로 코드를 나누어 작성하는 것으로 개별 기능을 함수 단위로 나눌 수도 있고 소스 코드 자체를 분할 할 수도 있습니다. C++과 같은 OOP(객체지향프로그래밍) 언어에서는 클래스를 사용해서 기능과 데이터등도 분리하여 묶을 수 있지만 C언어 에서는 데이터를 바라보는 범위(Scope)가 함수 내부인가 외부인가로 단순하게 나누어 지고 함수 외부의 경우 같은 소스인가 아닌가 정도로 나뉘어 지므로 C언어에서의 모듈화는 함수로 기능 나누기가 그 시작이 될 수 있습니다. 실제로 프로그램 작성 과..
프로그램 소스를 대하는 학생들의 입장에서는 올림피아드 문제들이 무슨 수수께기 푸는 놀이도 아니고 머리만 아픈 이 일을 굳이 왜 해야할까? 하는 사람들이 있을지도 모르겠습니다. 그렇지만 "프로그램 읽기(Reading source code)"는 프로그래머(개발자)에게는 숙명과 같은 일 입니다. 그렇지만 개발자의 생리 자체가 자신이 구상한 것을 프로그램 코드로 일단 작성하고 나면 다시 보려하지 않는 특성이 있습니다. 프로그램을 읽는 경우는 버그를 찾아야 하거나 다른 사람이 작성한 것을 수정해야 하는 경우, 또는 조직에 프로그램 리뷰 프로세스가 있는 경우 리뷰할 목적으로 읽는 정도입니다. 그러나, 프로그래밍 기술을 성장시키는 가장 좋은 방법 중에 하나는 잘 작성된 프로그램을 읽는 것입니다. 예를 들면 가장 널리..
복합 대입 연산자는 +=, -=, *=, /= 처럼 산술연산자(+, -, *, /, %)나 비트연산자(>>, 2) { tot += (n / 10 + 1) * i; } else { tot += (n / 10) * i; } a += i * (n % 10); i *= 10; n /= 10; } printf("%d\n", tot); ① 616 ② 617 ③ 618 ④ 619 ⑤ 620 위의 문제는 정수 연산과 복합 대입 연산자를 잘 알고 있다면 어렵지 않게 풀 수 있습니다. while문의 조건이 n이 0보다 클동안이므로 n의 값이 0이거나 음수면 루프를 빠져나갑니다. n의 값을 10으로 나누면서 루프를 수행하므로 결과적으로 n의 값이 2015, 201, 20, 2일 동안 총 4회 수행하면서 tot의 값을 더해 ..
프로그래밍을 C언어로 시작하는 분들은 한편으로는 가장 핵심적이면서도 기반 기술이 되는 프로그래밍 언어를 배운다는 장점이 있는 반면 "개발자를 위한 프로그래밍 언어"라는 별명에서 유추할 수 있는 것과 같이 컴퓨터 시스템에 대한 배경 지식을 가지고 있는 "개발자"가 아니라면 재미없고 복잡한 마치 "암호"와 같은 언어가 될지도 모르겠습니다. C언어를 처음으로 접한지 어언 20여년이 지나가고 있는 세월이지만 그 때나 지금이나 C언어는 "단순함"과 "자유로움", 그리고 무한한 "확장성"을 두고 개발자를 위한 프로그래밍 언어라 하지 않았나 생각합니다. C언어를 비롯해서 파이썬(Python), Java, C++, C#, Visual Basic등을 비롯한 프로그래밍 언어와 PHP, ASP, JSP, JavaScript..
C언어로 프로그램을 개발하면서 오류를 찾다가 의외의 장소에서 문제를 찾는 경우가 몇번 있었는데 바로 매크로 입니다. C언어에서는 "#define 매크로이름 매크로내용"의 형식으로 매크로를 정의하는데 이 매크로는 실행 과정에 영향을 미치는 것이 아니라 컴파일 과정에만 영향을 미칩니다. 컴파일러가 C 소스 코드를 본격적으로 컴파일하기에 앞서 전처리 과정을(precompile) 거치는데 이때 다루어지는 것이 #define문을 사용하는 매크로입니다. C언어에서는 #define 말고도 #include, #ifdef등의 전처리 문장이 있습니다. 2015년 정보 올림피아드 예선에서도 이 매크로를 다루었습니다. 위의 문제에서는 sq(x)라는 매크로를 정의했는데 이 매크로는 프로그램 실행 과정에 동작하는 것이 아니고 컴..
문제를 보니 올해 처음 참여한 아들이 C언어 공부를 좀더 열심히 했더라면 하는 아쉬움이 남습니다. C언어 기초만 잘 다졌어도 쉽게 맞출 수 있는 문제들이 꽤 있었는데 아쉬움이 있지만 C언어의 기초부터 잘 다져야 한다는 "교훈"을 마음에 새겼으면 하는 바램입니다. C언어 기초와 관련한 몇가지 문제를 풀어보면서 기초를 잘 다졌으면 합니다.18. 다음 중 변수의 이름으로 사용할 수 없는 것은?① thisway ② int_char ③ star*star ④ that_way ⑤ _6_C언어의 변수명은 다음과 같은 특성이 있습니다.영문과 숫자 그리고 밑줄(_ Underscore라 부릅니다)로 구성할 수 있습니다.영문 대문자와 소문자를 구별합니다(Case Sensitive라 합니다) C, C++, Java와 같은 프로..
제가 처음 C언어를 공부할때는 터보 C 2.0을 가지고 C언어도 공부하고 심지어 업무에도 사용했던 기억이 있습니다. 도트(dot) 프린터로 연속 용지를 가지고 인쇄하던 시절 터보 C 2.0으로 업무에 활용하여 도넛 그래프를 업무 보고에 사용했던 기억이 새롭습니다. 혹시나 해서 찾아보니 누군가 오픈 소스 프로젝트를 올려놓는 소스포지(sf.net)에 Turbo-C 2.0과 3.0을 올려두었군요. 교육용 목적으로 올려두었다는데 참고할만 합니다. http://sourceforge.net/projects/borlandtubroc/files/Borland%20Software/Turbo-C 2.0을 다운로드 받으셨다면 tc.exe를 실행하시면 아래와 같은 화면을 통해서 최근의 이클립스나 비주얼스튜디오 같으 IDE가 ..
아들의 이번 질문은 머리를 "콩"하고 쥐고 박고 싶은 문제입니다, 시간이 들지만 조금 집중하면 프로그램을 읽고 답할 수 있는 수준의 문제인데 아직 C언어 초보인 것을 감안하면서 차분하게 설명해 보겠습니다. 다음 프로그램의 출력 결과는 무엇인가? int x[10],y[10]; int i,j; int n = 10; for (i = 0; i < n; i++) x[i] = i + 1; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { y[j] = x[(i + j) % n]; } for (j = 0; j < n; j++) x[j] = y[j]; } printf("%d %d %d\n", x[3], x[6], x[9]); ① 10 3 6② 7 10 3③ 8 1 4④ 9 2 ..