C언어

본문 바로가기
사이트 내 전체검색


C언어
C언어

3. 파일입출력 응용 : 검사문항관리

페이지 정보

작성자 관리자 댓글 0건 조회 1,066회 작성일 22-11-23 20:41

본문

3. 파일입출력 응용 : 검사문항관리

1. 분석

성공습관지수 검사 프로그램 문항을 관리하는 프로그램 만들기


- 검사 문항 16개을 키보드로 입력받아 2차원 배열에 저장한다.

- 각 문항을 파일로 저장하고 불러올 수 있게 한다.

- 문항의 목록을 보여줄 수 있게 한다.

- 각 문항을 삭제할 수 있다.


성공습지수 검사 문항관리의 기능은 목록, 등록, 수정, 삭제 기능이다.


2. 소스코딩

1단계) 메뉴 구성하기


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) { 

int sel;

char test_list[16][200];  // 문항입력시 저장할 변수 

printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

} if(sel == 2) {

printf("문항을 추가합니다.\n");

} if(sel == 3) {

printf("문항을 삭제합니다.\n");

} if(sel == 4) {

printf("문항을 출력합니다.\n");

} if(sel == 5) {

printf("문항을 저장합니다.\n");

}

printf("\n"); 

}

return 0;

}


프로그램을 실행하여 메뉴을 선택했을 때 해당 if문이 실행되는 가를 확인한다. 


실행 결과 : 


성공습관지수검사프로그램 : 문항관리

1) 문항불러오기

2) 문항등록/수정하기

3) 문항삭제하기

4) 문항출력하기

5) 문항저장하기

0) 종료하기

메뉴 선택 ? 2

문항을 추가합니다.



2단계) 출력하기 구현

4) 문항출력하기를 구현합니다.

test_list[16][200] 배열에 문항을 출력하는 기능입니다.


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

int sel;

char test_list[16][200]={};  // 문항입력시 저장할 변수 

int num, i;

printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

} if(sel == 2) {

printf("문항을 추가합니다.\n");

} if(sel == 3) { 

printf("문항을 삭제합니다.\n");

} if(sel == 4) {

printf("문항을 출력합니다.\n");

for(i = 0; i< 16; i++) {

printf("%d. %s\n", i+1, test_list[i]);

}

} if(sel == 5) {

printf("문항을 저장합니다.\n");

}

printf("\n"); 

}

return 0;

}


4번 출력하기 메뉴를 테스트 합니다.


실행결과 :

1) 문항불러오기

2) 문항등록/수정하기

3) 문항삭제하기

4) 문항출력하기

5) 문항저장하기

0) 종료하기

메뉴 선택 ? 4

문항을 출력합니다.

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.



3단계) 문항 추가/수정하기

문항 번호와 문항의 내용을 입력하면 2차원배열의 인덱스를 지정하여 저장합니다.


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

int sel;

char test_list[16][200]={};  // 문항입력시 저장할 변수 

int num, i;

printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

} if(sel == 2) {

printf("문항을 추가합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

getchar( );

printf("문항내용 ? ");

i = num - 1; // 인덱스는 0부터 시작하므로 1이 작어야 합니다.

gets(test_list[i]);

} if(sel == 3) {

printf("문항을 삭제합니다.\n");

} if(sel == 4) {

printf("문항을 출력합니다.\n");

for(i - 0; i< 16; i++) {

printf("%d. %s\n", i+1, test_list[i]);

}

} if(sel == 5) {

printf("문항을 저장합니다.\n");

}

printf("\n"); 

}

return 0;

}


문항번호와 내용을 입력하여 문항을 추가하고, 문항출력하기를 선택하여 배열에 저장되었는가 확인합니다.

gets(test_list[i]);를 scanf로 바꿀 때는 아래와 같이 해야 한다.

scanf("%[^\n]s", test_list[i]); 


scanf()는 문자열 중간에 공백이 들어가면 문자열의 끝으로 인식하기 때문에 위와 같이 해야한다.



실행결과:

성공습관지수검사프로그램 : 문항관리

1) 문항불러오기

2) 문항등록/수정하기

3) 문항삭제하기

4) 문항출력하기

5) 문항저장하기

0) 종료하기

메뉴 선택 ? 2

문항을 추가합니다.

문항번호(1 ~ 16) ? 1

문항내용 ? 하루 30분 이상 책을 읽는다


1) 문항불러오기

2) 문항등록/수정하기

3) 문항삭제하기

4) 문항출력하기

5) 문항저장하기

0) 종료하기

메뉴 선택 ? 4

문항을 출력합니다.

1. 하루 30분 이상 책을 읽는다

2.

3.

4.

5.

6.


4단계) 문항 삭제하기

문항 번호를 입력하면 해당 문항번호의 내용을 삭제합니다.


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

int sel;

char test_list[16][200]={};  // 문항입력시 저장할 변수 

int num, i;

printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

} if(sel == 2) {

printf("문항을 추가합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

printf("문항내용 ? ");

i = num - 1;

scanf("%[^\n]s", test_list[i]);

} if(sel == 3) {

printf("문항을 삭제합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

i = num - 1;

test_list[i][0] = '\0';

} if(sel == 4) {

printf("문항을 출력합니다.\n");

for(i = 0; i< 16; i++) {

printf("%d. %s\n", i+1, test_list[i]);

}

} if(sel == 5) {

printf("문항을 저장합니다.\n");

}

printf("\n"); 

}

return 0;

}


배열의 내용을 삭제할 때는 test_list[i][0] = '\0'; 와 같이 첫칸에 끝문자(\0)을 넣어주면 된다.


5단계) 문항을 파일에 저장하기

문항이 저장된 test_list[][] 배열의 내용을 읽어 파일에 저장하면 됩니다.


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

int sel;

char test_list[16][200]={};  // 문항입력시 저장할 변수 

int num, i;

FILE *fp;


printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

} if(sel == 2) {

printf("문항을 추가합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

getchar( );

printf("문항내용 ? ");

i = num - 1;

gets(test_list[i]);


} if(sel == 3) {

printf("문항을 삭제합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

i = num - 1;

test_list[i][0] = '\0';

} if(sel == 4) {

printf("문항을 출력합니다.\n");

for(i = 0; i< 16; i++) {

printf("%d. %s\n", i+1, test_list[i]);

}

} if(sel == 5) {

printf("문항을 저장합니다.\n");

fp = fopen("c:\\temp\\test_list.txt", "w"); 

for(i = 0; i< 16; i++) {

fputs(test_list[i],fp);

}

fclose(fp); 

} 

printf("\n"); 

}

return 0;

}


실행하면 c:\temp 폴더에 저장됩니다.

파일탐색기에서 c:\temp 폴더에서 test_list.txt 파일을 메모장에서 열어봅니다.


6단계) 문항을 파일에서 불러와 배열에 저장하기 

c:\temp 폴더에서 test_list.txt 파일을 열고 fgets로 불러와 배열에 저장합니다. 


#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

int sel;

char test_list[16][200]={};  // 문항입력시 저장할 변수 

int num, i, j;

char ch;

FILE *fp;

printf("성공습관지수검사프로그램 : 문항관리\n");

while(1) {

printf("1) 문항불러오기\n");

printf("2) 문항등록/수정하기\n");

printf("3) 문항삭제하기\n");

printf("4) 문항출력하기\n");

printf("5) 문항저장하기\n");

printf("0) 종료하기\n");

printf("메뉴 선택 ? ");

scanf("%d", &sel);

if(sel == 0) {

printf("종료합니다.\n");

break;

} if(sel == 1) {

printf("문항을 불러옵니다.\n");

fp = fopen("c:\\temp\\test_list.txt", "r");

i = 0;

j = 0;

while(1) {

ch = fgetc(fp);

//putchar(ch);


if(ch == '\n') {  // 문장의 끝일 때

test_list[i][j] = '\0';

i++;

j = 0;


} else if(ch == EOF) {  // 파일의 끝일 때  

test_list[i][j] = '\0';

break;

}  else {

test_list[i][j] = ch; 

j++;

}


}

fclose(fp);

} if(sel == 2) {

printf("문항을 추가합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

getchar( );

printf("문항내용 ? ");

i = num - 1;

gets(test_list[i]);


} if(sel == 3) {

printf("문항을 삭제합니다.\n");

printf("문항번호(1 ~ 16) ? ");

scanf("%d", &num);

i = num - 1;

test_list[i][0] = '\0';

} if(sel == 4) {

printf("문항을 출력합니다.\n");

for(i = 0; i< 16; i++) {

printf("%d. %s\n", i+1, test_list[i]);

}

} if(sel == 5) {

printf("문항을 저장합니다.\n");

fp = fopen("c:\\temp\\test_list.txt", "w");

for(i = 0; i< 16; i++) {

fputs(test_list[i], fp);

fputs("\n", fp);

}

fclose(fp);

}

printf("\n"); 

}

return 0;

}


실행하면 문항파일에서 문항을 한글자씩 읽어 test_list배열에 저장합니다.

출력하여 잘 읽어왔는가 확인합니다.


3. 실행


반복적으로 실행하면서 오류가 있는가를 확인합니다.


- 16개의 문항을 추가하고, 파일로 저장합니다.

참고사이트

https://www.leelab.co.kr/content.php?co_id=buja 


- 메뉴는 0~5까지 입니다. 다른 숫자를 입력하면 다시 입력하게 합니다.

- 문항 추가/삭제 시 문항번호는 1~16까지 입니다. 다른 숫자를 입력하면 다시 입력하게 합니다.


댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.