관리 메뉴

c0smicb0y

시스템 프로그래밍 팀프로젝트 3 본문

진행한 프로젝트/시스템 프로그래밍

시스템 프로그래밍 팀프로젝트 3

2015. 1. 8. 01:00

내가 만들부분은 다 만들었고 앞으로 설명할 부분은 팀원들이 만든 부분이다.

일단 내가 만든 프로그램에 팀원들이 붙인 기능은

1. 파일입출력을 통한 문자 출력

2. 타이머를 통한 타수 측정

3. 현재페이지에서 끝까지 작성했을때 다음페이지로 넘어가기

이렇게 세가지이다.


먼저 파일입출력은 그리 어렵지 않게 구현하였다.

1
2
3
4
if ((rfp = fopen("TheLittlePrince.txt""r")) == NULL){ //파일 열기
        perror("file open err");
        exit(1);
    }
cs


FILE 포인터 변수인 rfp에 fopen으로 TheLittlePrince.txt라는 파일을 읽어오게 하였다.

그런다음 

1
2
3
4
5
6
    while (!feof(rfp)){ //파일 읽기
        fread(compare1, sizeof(char) * COMPARE, 1, rfp);
        comp = sampletext(compare1); //이 부분은 compare에 글자 넣고 화면에 표시하는 것
 
        ...
    }
cs


rfp를 읽으면서 compare1 배열에 집어넣고 그것을 화면에 표시하고 다음페이지로 넘어가서 또 이걸 반복하고 rfp가 끝이 나올때까지 계속 반복하는 부분이다. 다음페이지로 넘어가는 부분은 지금은 생략되어 있다. 배열에 집어넣고 그걸 화면에 표시하는 부분만 표시되어 있다. 이것으로 파일입출력은 끝이다.


타이머를 통한 타수 측정도 그리 어렵지 않게 구현되었다.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <time.h>
#include <sys/time.h>
...
 
void TypePractice() {
    ...
    //time    
    time_t start = 0, end = 0;
    float gap = 0;
    float tasu = 1;
    time_t temp = 0;
    int k = 0;
    float persent = 0;
 
    int total = 0;
    int tot = 0;
    int red = 0;
    int typing = 0;
    int remain = 0;
    float per;    
    ...
 
    time(&start);//시작 시간 설정
 
    while (!feof(rfp)){
        ...
        total += comp;
 
        if (c != ESC)
            tot += comp;
 
        while (c != ESC && i < comp) {
            if (next != 1)
                c = getchar(); //입력받음
 
            if ((c == '\r') || (next == 1)) {
                ...
                if (c == '\r'){
                    red += BUFFER;
                    red -= i%BUFFER;
 
                    if (COMPARE != comp && line == (comp/BUFFER)*2+1+2+3){
                        red -= BUFFER;
                        red += comp%BUFFER;
                    }
 
                    ...
                }
                ...
            }
            else {
                if (c != 127) { //backspace가 아닐 때
                    ...
                    if (buffer1[i%BUFFER] == compare1[i]) { //틀렸다가 맞는 경우를 위한 처리
                        ...
                    }
                    else { //글자가 틀렸을때
                        ...
 
                        red++;
                    }
                    i++; //인덱스 증가
                    typing++;
                    if (c == ESC)
                        remain = comp - i;
 
                }
                else { //지울 때
                    if ((i%BUFFER) != 0) {
                        if (buffer1[i%BUFFER - 1] != compare1[i - 1])
                            red--;
 
                        ...
                        i--;//인덱스 감소
                        typing--;
                        ...
                    }
                }
 
                ...
            }
 
        }
    ...
    }
 
    ...
    time(&end);//끝 시간 설정
    gap = end - start; // 걸린 시간
    tasu = 60 * (typing / gap); //타자 속도
 
    temp = end; // 
 
    // 정확도 계산
    if (c == ESC)
        red += remain;
 
    per = (float)tot - (float)red;
    per /= (float)tot;
    per *= 100;
 
    // 타자검정
    clear();
    move(11);
    printw("\ttime : %.1f\n", (float)gap); // 걸린시간 출력
    printw("\tta-su :%.1f\n", tasu);// 타수 출력
    printw("\taccuracy :%.1f\n", per);// 정확도
    printw("\ttotal: %d %d| ", total,tot);
    printw("typing: %d | ", typing);
    printw("typing error: %d", red);
    ...
}
cs


time.h에 있는 현재 시간을 기록하는 time(time_t) 함수를 이용하여 타자연습이 시작될때와 끝날때 시간을 각각 기록하여 그 차를 구하여 타자연습하는데 걸린 시간을 구하고, 타수는 인덱스로 쓰인 i가 전역변수처럼 쓰인것인데 i가 입력라인이 바뀌면 0으로 초기화 되지만, 그렇지 않은 typing 변수를 하나 더 만들어서 지금까지 입력한 글자수를 셀 수 있도록 했다. 그러므로 타수는 1분당 입력갯수임으로 속도같은 개념이니 현재까지 입력한 갯수(거리같은 개념)을 걸린 시간으로 나누어 60을 곱하면 되겠다. 정확도를 위해 red변수를 통하여 handling 해놓았는데 팀원말로는 너무 예외적인 경우가 많아서 하드코딩을 했다고한다. 정확도까지 바라지는 않았는데 이래저래 만들어놓았다. 인덱스에서 맞고 틀림에 따라 좀 다르게 처리한 변수라고 보면 편리하겠다.


그리고 마지막으로 현재페이지에서 끝까지 작성하였을때 다음페이지로 넘어가는 부분이다. 파일입출력을 하는 부분에서 그냥 거의 다 만들어졌다고 봐도 무방한데 일단 코드를 보자.

1
2
3
4
5
6
    while (!feof(rfp)){ //파일 읽기
        fread(compare1, sizeof(char) * COMPARE, 1, rfp);
        comp = sampletext(compare1);
        ...
        clear();
    }
cs


그냥 마지막에 clear()를 넣은게 다다(...)

이렇게 해서 프로그램을 실행하면 



예전에 만든 타자연습과 동일하게 실행되지만, 파일에서 텍스트를 읽어와서 화면에 표시하였고, 페이지의 끝까지 입력하면 다음페이지로 넘어간다. 

그리고 중간에 프로그램을 종료하거나 끝까지 완료하면



이런 화면이 뜨면서 자신이 의 타수와 정확도, 입력한 글자, 틀린글자 등등을 알 수 있다.

이렇게해서 타자연습과 검정기능은 모두 구현되었다.
다음에는 이 프로젝트에서 제일 야심찼던 산성비 게임에 대해 설명하겠다.



Comments