본문 바로가기

C/C++26

[C언어 연습문제]강좌 20. Querying the Document(문자열 분해 - 문단, 문장, 단어 조작) 학습(Study) & 목표(Objective) & 과제(Task) 문서는 문단이 모여서 표현되고, 문단은 문장의 모음으로, 문장은 단어의 모음으로 표현됩니다. 단어는 문자(영어는 소문자와 대문자 알파벳으로 표현이 되지요. 원본 텍스트 문서를 구성요소로 문단, 문장, 단어로 변환하는 과제입니다. 결과를 테스트하기 위한 쿼리는 아래 설명되어 있는 대로, 특정 문단, 문장, 단어를 반환하도록 요청하는 쿼리가 있습니다. 엘리시아는 덩케르크 대학교에서 C 프로그래밍 언어를 공부하고 있는데, 포인터를 사용하여 단어, 문장, 단락 및 문서를 나타내려고 합니다. 표현 방법은 다음과 같이 정의합니다. 단어 : char* 문장 : char** (문장의 단어는 하나의 공백(" ")으로 구분합니다. 마지막 단어는 공백(" ".. 2020. 4. 23.
[C Console] 윤년을 고려하여, 내일의 날짜를 출력하는 프로그램 윤년? 윤년은 보통 4년에 한 번씩 찾아옵니다. 2월이 29일까지 있는 날짜라고 생각하시면 될 것 같습니다. 정확한 윤년의 공식은 4로 나누어 떨어지지만, 100으로는 나누어 떨어지지 않는 년도입니다. 1900년도는 4로 나누어 떨어지지만, 100으로도 나누어 떨어지기 때문에 윤년이 아니죠. 룩업테이블(LUT, Look-Up Table) 날짜를 계산하는 API, 라이브러리, 알고리즘은 다양하게 있습니다. 그중에서 룩업테이블을 만들어 프로그램을 작성해보려고 합니다. 순 한글로는 순람표, 대조 테이블이라고도 하는 룩업 테이블(LUT)은 자료를 다른 형태로 변환시키기 위해 컴퓨터 프로그램이 빠른 시간 내에 접근이 가능하도록 만든 자료의 대역으로 볼 수 있습니다. 특정 값을 대응시키는 키와 그에 관한 정보를 갖.. 2019. 6. 3.
[C Console] 시그마 팩토리얼 수식 계산 프로그램(재귀, 이중 for문, 단일 for문) 팩토리얼과 시그마( ∑ ) 팩토리얼(Factorial)은 계승이라고도 하며, 수학에서 특정 자연수의 수보다 작거나 같은 모든 양의 정수의 곱을 의미합니다. ∑(시그마)는 급수라고도 하며, 수열의 모든 항을 더하는 기호입니다. 여기서 C언어로 아래의 수식을 3가지 방법으로 표현해보겠습니다. 팩토리얼 k! = 1 * 2 * 3 * ... * (k-1) * k로 나타낼 수 있습니다. 따라서 위의 구하고자 하는 수식은 아래와 같이 풀어서 쓸 수 있습니다. S(k!) = 1 + (1 * 2) + (1 * 2 * 3) + ... + (1 * 2 * 3 * ... * k-1) + (1 * 2 * 3 * ... * (k-1) * k) 시그마 팩토리얼 알고리즘의 성질 주의하실 점은 자연수의 곱셈이다 보니, 팩토리얼을 계.. 2019. 5. 21.
[C Console] 실수의 소수점 이하 2자리를 정수로 출력하는 프로그램 프로그램은 함수의 집합으로 이루어져 있다고 볼 수 있습니다. C 언어를 처음 배우시거나 다시 익히는 분들을 위해 일반적인 해결 방법(main 함수에 포함)과 어떤 알고리즘으로 동작하는지, 기능을 쉽게 파악하기 위해 함수로 분리한 방법 2가지로 구현하였으니 참고하시면 될 것 같습니다. 실수의 소수점을 추출해서 정수형 변수에 대입하는 프로그램 임의의 실수는 소수점을 가지고 있죠. 12.3456이라는 값은 정수부 12와 소수부 3456으로 나뉜다고 볼 수 있습니다. 이때, 3456 부분을 정수형 변수로 받아서 처리해야 되는 프로그램이 있습니다. 그 알고리즘을 구현해 보려고 합니다. 예제 프로그램이므로, 편의성 소수점 2자리까지만 정수로 추출하는 것으로 하겠습니다. 12.3456을 예로 들면, 34라는 정수 값.. 2019. 5. 18.
[C언어 연습문제]강좌 19. Variadic functions in C(가변인자 함수 구현법) 학습(Study) & 목표(Objective) 가변 인자 함수는 함수의 인자 값의 수가 변하는 함수를 의미합니다. C 프로그래밍에서 가변 인자 함수는 개발 중인 프로그램의 유연성 향상에 이바지하고 있습니다. 가변 인자 함수의 선언은 적어도 하나의 이름이 있는 변수의 선언으로 시작하고, 생략 부호를 마지막 인자로 사용합니다. 예를 들어 printf() 함수가 있습니다.int printf(const char* format, ...); 과제(Task) 이 프로그램은 인자값의 합계, 인자값의 최솟값, 인자값의 최댓값을 구하는 3개의 가변 인자 함수 sum(), min(), max() 함수를 구현합니다. 첫 번째 인자로 가변 인자 함수의 인자 개수를 전달하고, 그 뒤에 가변인자가 들어오게 됩니다. 입력 형식(In.. 2019. 5. 17.
[C언어 연습문제]강좌 18. Permutations of Strings(문자열 순열 표시 - next_permutation 직접 구현) 문자열 순열 표시 - next_permutation() 함수 구현 순열에 대한 내용입니다. 순열에 대한 수학적 지식과 알고리즘이 없는 백지상태에서는 해결하기 어려운 문제였던 것 같습니다. 학습(Study) & 목표(Objective) & 과제(Task)문자열은 일반적으로 사전 순으로 정렬됩니다. 사전 순으로 정렬된다는 것은 가장 왼쪽의 글자를 비교해서 순서를 정해 정렬을 하게 된다는 의미입니다. 예를 들면, abd가 abc보다 크다(abc y) z > yyy라고 볼 수 있습니다. gh < ghij와 같이 똑같은 문자에 접두사가 붙어있는 문자가 있으면, 접두사가 없는 문자열이 더 사전적으로.. 2019. 5. 14.
[C언어 연습문제]강좌 17. Sorting Array of Strings(함수포인터 활용) 문자열 배열의 정렬 - 입력된 단어를 정렬해서 출력하기 함수 포인터를 활용해서, flag로 여러 개의 함수를 하나의 함수로 제어하는 방법을 연구해봅시다. 학습(Study) & 목표(Objective) & 과제(Task)주어지 문자열 배열을 사전식 오름차순으로 정렬하는 방법이나 글자 수가 가장 작은 단어 순으로 정렬하는 방법은 비교유형을 나타내는 Flag를 통해 작성할 수 있습니다. 그러나 이렇게 하면, 각각의 정렬함수를 매번 다시 작성해야 하는 단점이 있습니다. 각 쌍의 문자열을 비교하는 함수에 대한 포인터를 받아들이는 정렬함수를 작성하는 방법으로, 각각의 정렬함수를 호출하는 단점을 해결할 수 있습니다. 이렇게 하면 새로운 정렬 방법이 있을 때마다 정렬 함수에 대한 포인터만 받아오게 됩니다. 주어진 문자.. 2019. 5. 6.
[C Console] 문자열을 입력받아 대문자는 소문자로, 소문자는 대문자로 변환하는 프로그램 문자열을 입력받아 대문자는 소문자로, 소문자는 대문자로 반환하는 프로그램 예제를 작성해보도록 하겠습니다. 영어 알파벳에 대한 부분만 고려하기로 해요. 다음과 같은 함수가 사용됩니다. - 문자열을 입력받는 함수 : #include gets_s(); - 문자열의 문자 개수를 반환하는 함수 : #include strlen(); 참고로, Windows 기준으로 gets_s() 함수는 fgets() 함수를 이용하여 만들어졌는데, C11 표준이므로 사용하셔도 문제없을 것 같아요. 영어 알파벳만 고려되었을 때, 아스키코드 값 32를 더해주고 빼주면서 대소문자를 변경할 수 있습니다. 다른 입력값은 그대로 출력하기 위해 조건을 주면 됩니다. '32'라는 값을 모를 때는, 같은 'A' - 'a'처럼 문자의 차를 이용하여 .. 2019. 4. 24.
[C언어 연습문제]강좌 16. Students Marks Sum(성별로 구분된 학생 점수의 합) 학습(Study) & 목표(Objective) & 과제(Task)정수 배열 marks를 받습니다. marks 점수는 한 학급의 학생 점수를 나타냅니다.교차 요소로, marks0, marks2, marks4는 남학생의 점수를 나타냅니다.유사하게, marks1, marsk3, marks5는 여학생의 점수를 나타냅니다. 배열 이름 marks는 배열의 주소를 기반으로 하는 포인터로 동작합니다. 다시말하면, marks 배열은 메모리에 저장된 marks0의 주소를 포함합니다. 예를 들어, marks = [3, 2, 5]와 marks는 0x7fff9575c05f로 시작하는 메모리에 저장되고, 0x7fff9575c05f는 marks0의 메모리 주소라고 볼 수 있습니다.다음 조건에 맞는 합계를 반환하는 함수 marks_.. 2019. 4. 19.
[C언어 연습문제]강좌 15. Calculate the Nth term(재귀 함수를 활용한 조건 계산) 재귀 함수 학습 - n번째 조건 계산 문제 학습(Study) & 목표(Objective)재귀 함수를 배우는데 도움이 되는 문제를 풀어보겠습니다. 함수 내에서 자신을 호출하는 함수를 재귀함수라고 합니다. C 프로그래밍 언어에서는 재귀함수를 지원합니다. 하지만, 재귀함수를 사용하는 동안에 함수 종료 조건 중 하나는 주의 깊게 정해야 합니다. 안 그러면 무한루프에 빠져 프로그램이 비정상 종료되거나 잘못된 동작을 일으킵니다. 무한루프를 방지하기 위해 if - else 문(또는 유사한 접근)을 사용하면 하나의 분기는 재귀 호출을 하고, 다른 분기는 종료하거나 다른 동작을 할 수 있습니다.void recurse() {...recurse(); // recursive call...} int main(){...recur.. 2019. 4. 9.
[C Console]Function Key(확장 키), 특수 키, 일반 문자 입력 코드를 받아오는 프로그램 커서 이동키, 특수키의 입력은 어떻게 정의되어있을까? 키보드의 입력은 스캔 코드로 정의되어있습니다. 지금은 생소한 단어가 되어버린 스캔 코드표 대신에 직접 키를 입력받아 어떤 코드가 입력되는지 알아보는 프로그램을 실행해보는 것도 좋은 방법입니다. 누르는 키의 종류를 판별해서 문자, 확장키 코드를 출력하는 프로그램 아래 코드는 누르는 키의 종류를 판별해서 문자, 확장키 코드를 출력하는 프로그램입니다. conio.h에 정의된 _getch() 입력 함수를 이용해서 기능 키(F1~F12), 확장키, 일반 문자 등 키보드의 입력을 받을 수 있는 프로그램이죠. q를 누르면 q의 코드를 출력하면서 종료하게 되어있습니다. //====================================================.. 2019. 4. 8.
[C언어 연습문제]강좌 14. Dynamic Array in C(도서관 책장, 책 페이지 수 쿼리, 조회 프로그램) 동적 배열의 활용 - 도서관 선반과 책 페이지 수 조회 프로그램 작성 학습(Study) & 목표(Objective) & 과제(Task) Snow Howler는 HuskyLand시 중앙 도서관 사서입니다. 그는 다음 형식의 요청을 처리해야 합니다.- 1 x y : x 번째 책장의 끝에 y page의 책을 추가해야 합니다.(유형 1)- 2 x y : x 번째 책장에 y번째 책의 page의 수를 출력해야 합니다. (유형 2)- 3 x : x 번째 책장에 있는 책이 몇 권인지 출력해야 합니다.(유형 3) Snow Howler에게는 교육부에서 투입한 조교 Oshie가 있습니다. Oshie는 경험이 없지만, 유형2와 유형3의 모든 쿼리를 처리할 수 있습니다. Snow Howler는 유형 1의 모든 쿼리를 처리할 수.. 2019. 4. 3.