티스토리 뷰
실습 1
화면에서 'C' 문자를 주어진 숫자만큼 오른쪽으로 이동시키는 프로그램
Tip > 대주제로 작성이 어렵다고 판단되면 대주제를 순서화 또는 소분화 해본다.
1. 화면을 지운다.
2. 공백의 갯수를 전보다 하나씩 늘려가면서 출력한다.
3. 문자를 출력한다.
4. 출력 중간에 쉬는 타임을 두어 이동하는 것을 눈으로 확인할 수 있도록 한다.
5. 단계 1~4를 주어진 숫자만큼 반복한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ 'C' // 이동시킬 문자 #define BREADTH 80 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(" "); } printf("%c", OBJ); // 3. 공백의 가장 뒤에 OBJ 문자를 출력 j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(100); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
프로그램의 이해를 위해 아래 기능을 수행해보자.
1-1.
문자를 가로로 20만큼
이동시켜라.
1-2.
문자 'C'
대신 'c'를
이동시켜라.
1-3.
문자가 이동할 때에 대문자 'C'와
소문자 'c'가
교대로 나오면서 이동하게 하라.
1-4.
문자가 더 천천히 이동하게 하라.
1-5.
문자가 이동할 때 이동한 자리에 ','이
넣도록 해라.
1-6.
처음에 시작을 "C,,,,,,,,,,,,,,,,,,,,,,,"이런
상태에서 시작하여 문자가 오른쪽으로 움직일 때 마다 ','
지워지도록 하라.
1-7.
문자가 무조건 움직이지 않고 키보드에서 'd'를
입력할 때마다 오른쪽으로 한칸씩
움직이게 하라.
1-8.
'd'를 입력하고 나서 Enter
키를 눌러야 움직이니까 짜증나나요?
Enter 키 안눌러도
움직이게 해보세요.
1-9.
'd' 대신 화살표 ->
키를 눌렀을 때 오른쪽으로 움직이게 하라.
1-10.
위에 적어준 프로그램(OS-Movingchar-1.c)에서
문자가 오른쪽에서 왼쪽으로 이동하도록 하라.
1-11.
이제 OS-Movingchar-1-11을
응용하여 화살표 <- 키를
눌렀을 때 왼쪽으로 움직이게 하라.
1-1. 문자를 가로로 20만큼 이동시켜라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ 'C' // 이동시킬 문자 #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(" "); } printf("%c", OBJ); // 3. 공백의 가장 뒤에 OBJ 문자를 출력 j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(100); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
1-2. 문자 'C' 대신 'c'를 이동시켜라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ 'c' // 이동시킬 문자 #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(" "); } printf("%c", OBJ); // 3. 공백의 가장 뒤에 OBJ 문자를 출력 j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(100); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
1-3. 문자가 이동할 때에 대문자 'C'와 소문자 'c'가 교대로 나오면서 이동하게 하라.
n번째 실행에 해당하는 j의 시작이 0임에 주의하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(" "); } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(100); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
1-4. 문자가 더 천천히 이동하게 하라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(" "); } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(200); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
1-5. 문자가 이동할 때 이동한 자리에 ','이 넣도록 해라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 공백의 갯수를 j번 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. Sleep(200); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } |
1-6. 처음에 시작을 "C,,,,,,,,,,,,,,,,,,,,,,,"이런 상태에서 시작하여 문자가 오른쪽으로 움직일 때 마다 ',' 지워지도록 하라.
프로그램 작성 방법은 다양하다. 여기선 코드 수정을 최소화 하는 방법으로 수정하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 문자 앞 공백의 갯수를 j번 출력한다. printf(" "); // 이동한 발자취에 ' '를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. for (i = 0; i < BREADTH - j - 1; i++) { // 2. 문자 뒤 공백의 갯수를 BREADTH - j - 1 만큼 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } Sleep(200); // 5. 루프 반복이 엄청 빠르므로 잠깐 정지한다. } return 0; } | cs |
1-7. 문자가 무조건 움직이지 않고 키보드에서 'd'를 입력할 때마다 오른쪽으로 한칸씩 움직이게 하라.
콘솔 출력에서 한줄만 삭제할 수 있나요? 가능하다면 제보바랍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 문자 앞 공백의 갯수를 j번 출력한다. printf(" "); // 이동한 발자취에 ' '를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. for (i = 0; i < BREADTH - j - 1; i++) { // 2. 문자 뒤 공백의 갯수를 BREADTH - j - 1 만큼 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } char k = NULL; printf("\n"); printf("계속 진행하시려면 d를 입력해주세요 : "); do { scanf("%c", &k); // 5. d를 입력해야만 이동할 수 있다. } while (k != 'd'); } return 0; } | cs |
1-8. 'd'를 입력하고 나서 Enter 키를 눌러야 움직이니까 짜증나나요? Enter 키 안눌러도 움직이게 해보세요.
<conio> 라이브러리에 접근해서 실시간 키 입력을 사용하기 위한 _getch() 함수 선언을 가져옵시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #include <conio.h> // getch() 함수 사용을 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 문자 앞 공백의 갯수를 j번 출력한다. printf(" "); // 이동한 발자취에 ' '를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. for (i = 0; i < BREADTH - j - 1; i++) { // 2. 문자 뒤 공백의 갯수를 BREADTH - j - 1 만큼 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } char key; do { key = _getch(); // 5. d를 입력해야만 이동할 수 있다. } while (key != 'd'); } return 0; } | cs |
1-9. 'd' 대신 화살표 -> 키를 눌렀을 때 오른쪽으로 움직이게 하라.
방향키의 ASCII 코드 값을 사용해 접근합니다. ( ← = 75, → = 77, ↑ = 72, ↓ = 80 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #include <conio.h> // getch() 함수 사용을 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 문자 앞 공백의 갯수를 j번 출력한다. printf(" "); // 이동한 발자취에 ' '를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. for (i = 0; i < BREADTH - j - 1; i++) { // 2. 문자 뒤 공백의 갯수를 BREADTH - j - 1 만큼 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } char key; do { key = _getch(); // 5. →를 입력해야만 이동할 수 있다. } while (key != 77); } return 0; } | cs |
1-10. 위에 적어준 프로그램(OS-Movingchar-1.c)에서 문자가 오른쪽에서 왼쪽으로 이동하도록 하라.
이동 상황을 나누기 위해 코드를 일부 수정하였다. ( ← = 75, → = 77, ↑ = 72, ↓ = 80 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <stdio.h> #include <Windows.h> // system() 함수를 사용하기 위한 라이브러리 #include <conio.h> // getch() 함수 사용을 위한 라이브러리 #define OBJ_1 'c' // 이동시킬 문자(홀수) #define OBJ_2 'C' // 이동시킬 문자(짝수) #define BREADTH 20 // 이동할 거리 int main() { int i, j = 0; while (j < BREADTH) { // 6. 단계를 BREADTH 횟수만큼 반복 system("cls"); // 1. 콘솔 출력창을 지우는 매소드 for (i = 0; i < j; i++) { // 2. 문자 앞 공백의 갯수를 j번 출력한다. printf(" "); // 이동한 발자취에 ' '를 작성한다. } (j%2) ? printf("%c", OBJ_1) : printf("%c", OBJ_2) ; // 3. 삼항연산자는 참(1)일 때 두번째 블럭을 거짓(0)일 때 세번째 블럭을 실행한다. j++; // 4. 출력할 공백의 수를 증가시킨다. for (i = 0; i < BREADTH - j - 1; i++) { // 2. 문자 뒤 공백의 갯수를 BREADTH - j - 1 만큼 출력한다. printf(","); // 이동한 발자취에 ','를 작성한다. } char key; while (1) { key = _getch(); if (key == 77) { // 5. →를 입력하면 우측으로 이동한다. break; } else if (j == 1) { // 5. C가 가장 앞에 있을 때는 좌측 이동이 불가하다. j -= 1; break; } else if (key == 75) { // 5. ←를 입력하면 좌측으로 이동한다. j -= 2; break; } } } return 0; } | cs |
1-11. 이제 OS-Movingchar-1-11을 응용하여 화살표 <- 키를 눌렀을 때 왼쪽으로 움직이게 하라.
위 코드와 동일
'프로그래밍 > C' 카테고리의 다른 글
[자료구조] 2일차_과제(180316) - 오목 (0) | 2018.03.16 |
---|---|
[창의적it 프로그래밍] 1차 과제 -구조체- (0) | 2018.03.13 |
[자료구조] 1일차_생각해 볼 내용(180312) (0) | 2018.03.08 |
[자료구조] 1일차_토론(180312) (0) | 2018.03.07 |
[자료구조] 1일차_과제(180309) (0) | 2018.03.06 |
- Total
- Today
- Yesterday
- Cloud
- LINQ
- svelte
- Angular
- Azure
- vue
- vue.js
- JavaScript
- aws
- Next.js
- oracle
- C#
- Quasar
- PostgreSQL
- hoisting
- nosql
- gcp
- 이진탐색 #중복
- Gatsby.js
- alpine.js
- delegate
- .NET
- REACT
- DevOps
- node.js
- SQLite
- nuxt.js
- garbage collection
- MySQL
- RDBMS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |