12 장입력과출력
getchar()/putchar() printf()/scanf() sprintf()/sscanf() 파일입출력 fprintf()/fscanf() 파일의임의의위치접근 내용 ftell(), fseek(), rewind() 텍스트파일 이진파일 fread()/fwrite() 1
getchar()/putchar() 함수원형 int getchar(void); int putchar(int c); getchar() 표준입력장치로문자를하나읽는함수 읽을문자가없으면 EOF 리턴 putchar() 표준출력장치로문자를하나쓰는함수 2
표준입출력장치 표준입력장치 : 디폴트로는키보드 표준출력장치 : 디폴트로는화면 표준입출력장치는변경할수있음 입출력재지정 파이프 3
입출력재지정 (<, >) 표준입출력장치 $ io_prog < in_file > out_file io_prog 의표준입력장치는 in_file 파일이되고, 표준출력장치는 out_file 파일이됨 파이프 $ io_prog1 io_prog2 io_prog3 io_prog2 의표준입력장치는첫번째파이프 (io_prog1 의표준출력 ) io_prog2 의표준출력장치는두번째파이프 (io_prog3 의표준입력 ) 4
프로그램 12.1 getchar()/putchar() #include <stdio.h> int main(void) { int c; while ((c = getchar())!= EOF) { putchar(c); } } return 0; 5
$ pass abcdefg abcdefg hij hij ^d $ ls pass bin etc include lib local man sbin tmp var $ pass < infile > outfile 프로그램결과 6
printf() 첫번째인자를제어문자열이라고함 제어문자열에서 % 부터변환문자까지를변환명세라고함 첫번째인자인제어문자열을화면에출력하는데, 변환명세가나오면뒤의인자를적절히형변환하여대신출력함 printf("%s 학생의점수는 %d 점입니다.",name,grade); 변환명세보다인자가많으면여분의인자는무시됨 인자가적으면시스템종속적인일이일어남 7
변환명세의형식 printf() %[ 플래그 ][ 폭 ][. 정밀도 ][ 형변환자 ] 변환문자 플래그, 폭,. 정밀도, 형변환자 : 옵션 변환문자 : 생략할수없음 8
변환문자 c 출력형태 문자 d, i 10 진정수 u o 부호없는 10 진정수 부호없는 8 진정수 printf() x, X 부호없는 16 진정수, 예 : 5dee, 5DEE f, F 부동소수점표기법의실수, 예 : 7.123000 e, E 지수표기법의실수, 예 : 7.123000e+00, 7.123000E+00 a, A (C99) 16 진지수표기법의실수, 예 : 0x7.123p+20, 0X7.123P+20 g, G e 형식과 f 형식중짧은것또는 E 형식과 F 형식중짧은것 s p n 널로끝나는문자열 포인터값의 16 진정수 출력되는것없음, 대응되는정수적형포인터인자에현재까지출력된문자의개수를배정함 % % 문자, 대응되는인자없음 9
printf() 플래그 출력형식조정 플래그 의미 - 필드에서좌측정렬로출력 + 숫자앞에 + 나 - 를항상붙임출력 공백 양수앞에공백을붙여출력 0 숫자를우측정렬로출력할때남는공간을 0 으로채워서출력 # 8 진수는앞에 0, 16 진수는앞에 0x, 실수는소수점을출력 * 필드 : 인자가출력되는공간 ( 자리 ) 10
폭 필드의크기 ( 자리수 ) 지정 양의정수나 * * : 인자로받아들임 printf() 예 printf("i = %8d\n", i); printf("i = %*d\n", 8, i); 11
정밀도 점 (.) 뒤에명시 음이아닌정수나 * printf() * : 인자로받아들임 정밀도는변환문자별로의미가다름 d, i, o, u, x, X : 출력될숫자의최소자릿수 a, A, e, E, f, F : 소수점이하의자릿수 g, G : 최대유효숫자 s : 문자열로부터출력될문자의최대개수 12
printf() 형변환자 인자의크기지정 형변환자뒤에올수있는변환문자변환형 hh d, i, o, u, x, X signed/unsigned char h d, i, o, u, x, X signed/unsigned short l d, i, o, u, x, X signed/unsigned long l c wint_t l s wchar_t l a, A, e, E, f, F, g, G 무시 ll d, i, o, u, x, X signed/unsigned long long j d, i, o, u, x, X intmax_t나 uintmax_t z d, i, o, u, x, X size_t t d, i, o, u, x, X ptrdiff_t L a, A, e, E, f, F, g, G long double 13
printf() 프로그램 12.2 #include <stdio.h> int main(void){ char c = 'A', s[] = "test string"; int i = 1024; int j = 9, k = 2; long l = 12345678; long long ll = 12345678901234LL; float f = 123.45678, f0 = 987.0; double d = -123.45678, d0 = 0.00000009; printf(">> 문자출력 <<\n"); printf("%%c: %c, %%7c: %7c, %%+7c: %+7c \n", c, c, c); printf("%%s: %s, %%7s: %7s, %%+7s: %+7s \n", s, s, s); printf("%%.7s: %.7s, %%10.7s: %10.7s, %%+10.7s: %+10.7s \n", s, s, s); printf("c 는재미있는 %n\n", &j); printf("%*c 프로그래밍언어입니다.\n", j, ' '); 14
프로그램결과 >> 문자출력 << %c: A, %7c: A, %+7c: A %s: test string, %7s: test string, %+7s: test string %.7s: test st, %10.7s: test st, %+10.7s: test st C는재미있는 프로그래밍언어입니다. 15
printf() 프로그램 12.2 int i = 1024; int j = 9, k = 2; long l = 12345678; long long ll = 12345678901234LL; printf("\n>> 정수출력 <<\n"); printf("%%d: %d, %%o: %o, %%x: %x, %%u: %u \n", i, i, i, i); printf("%%07d: %07d, %%0.7d: %0.7d, %%+d: %+d \n", i, i, i); printf("%%x: %X, %%#x: %#x, %%#X: %#X \n", i, i, i); printf("%%ld: %ld, %%lo: %lo, %%lx: %lx \n", l, l, l); printf("%%lld: %lld, %%llo: %llo, %%llx: %llx \n", ll, ll, ll); 16
프로그램결과 >> 정수출력 << %d: 1024, %o: 2000, %x: 400, %u: 1024 %07d: 0001024, %0.7d: 0001024, %+d: +1024 %X: 400, %#x: 0x400, %#X: 0X400 %ld: 12345678, %lo: 57060516, %lx: bc614e %lld: 12345678901234, %llo: 263516363427762, %llx: b3a73ce2ff2 17
printf() 프로그램 12.2 float f = 123.45678, f0 = 987.0; double d = -123.45678, d0 = 0.00000009; } printf("\n>> 실수출력 <<\n"); printf("%%f: %f, %%e: %e, %%g: %g \n", f, f, f); printf("%%.3f: %.3f, %%.3e: %.3e, %%.3g: %.3g \n", f, f, f); printf("%%10.3f: %10.3f, %%10.3e: %10.3e, %%10.3g: %10.3g \n", f, f, f); printf("%%*.*f: %*.*f \n", j, k, f); printf("%%f: %f, %%e: %e, %%g: %g \n", f0, f0, f0); printf("%%#f: %#f, %%#e: %#e, %%#g: %#g \n", f0, f0, f0); printf("%%f: %f, %%e: %e, %%g: %g \n", d, d, d); printf("%%*f: %*f, %%.*f: %.*f, %%*.*f: %*.*f \n", j, d, k, d, j, k, d); printf("%%f: %f, %%e: %e, %%g: %g \n", d0, d0, d0); return 0; 18
프로그램결과 >> 실수출력 << %f: 123.456779, %e: 1.234568e+02, %g: 123.457 %.3f: 123.457, %.3e: 1.235e+02, %.3g: 123 %10.3f: 123.457, %10.3e: 1.235e+02, %10.3g: 123 %*.*f: 123.46 %f: 987.000000, %e: 9.870000e+02, %g: 987 %#f: 987.000000, %#e: 9.870000e+02, %#g: 987.000 %f: -123.456780, %e: -1.234568e+02, %g: -123.457 %*f: -123.456780, %.*f: -123.46, %*.*f: -123.46 %f: 0.000000, %e: 9.000000e-08, %g: 9e-08 19
scanf() 첫번째인자를제어문자열이라고함 제어문자열에서 % 부터변환문자까지를변환명세라고함 입력스트림에서변환명세대로읽어서대응인자에배정함 대응인자는포인터이어야함 첫번째인자인제어문자열에서제어문자가아닌일반문자는입력스트림에서똑같은문자를제거함 scanf("name : %s", s); 20
변환명세의형식 %[*][ 폭 ][ 형변환자 ] 변환문자 *, 폭, 형변환자 : 옵션 변환문자 : 생략할수없음 scanf() 21
scanf() 변환문자입력형태대응인자형 c 공백을포함한모든문자 char 포인터 d, i 10 진정수 ( 부호는옵션 ) 정수포인터 u 10 진정수 ( 부호는옵션 ) 부호없는정수포인터 o 8 진정수 ( 부호는옵션 ) 부호없는정수포인터 x 16 진정수 ( 부호는옵션 ) 부호없는정수포인터 a, e, f, g 실수 ( 부호는옵션 ) 실수포인터 s 공백없는문자열 char 포인터 p 보통 16진정수 ( 시스템에따라다름 ) void 포인터 n 지금까지읽은문자개수를대응인자에배 정수포인터 정, 입력스트림의내용은안읽음 % 입력스트림에서 % 읽음 대응인자없음 [ ] 다음에설명 char 포인터 22
변환문자 [ ] scanf() 원하는문자들 ( 스캔집합 ) 로만구성된문자열을읽어드림 [ ] 내의첫번째문자가 ^ 가아니면괄호내의문자가스캔집합이되고, ^ 이면괄호내의문자를제외한문자들이스캔집합이됨 입력스트림에서스캔집합이외의문자가나올때까지읽어서대응인자에배정함 scanf("%[^ \n\t]", s); // 공백, 개행, 탭제외 scanf("%[0-9a-fa-f]", s); // 숫자와알파벳 23
* 입력스트림의내용을지움 예제 scanf("%d %*d %d", &a, &b); 입력스트림 : 20 40 50 scanf() 20 은 a 에, 40 은무시, 50 은 b 에저장 24
폭 scanf() 읽어들일필드의최대크기 ( 문자수 ) 지정 예제 scanf("%3d %5c", &a, s); 입력스트림 : 1234567890 123 은 a 에, 45678 은 s 에저장 25
형변환자 인자의크기지정 scanf() 형변환자뒤에올수있는변환문자인자의형 hh d, i, o, u, x, X, n signed/unsigned char 포인터 h d, i, o, u, x, X, n signed/unsigned short 포인터 l d, i, o, u, x, X, n signed/unsigned long 포인터 l c, s, [ ] wchar_t 포인터 l a, A, e, E, f, F, g, G double 포인터 ll d, i, o, u, x, X, n signed/unsigned long long 포인터 j d, i, o, u, x, X, n intmax_t 나 uintmax_t 포인터 z d, i, o, u, x, X, n size_t 포인터 t d, i, o, u, x, X, n ptrdiff_t 포인터 L a, A, e, E, f, F, g, G long double 포인터 26
sprintf()/sscanf() printf() 와 scanf() 의문자열버전 표준입출력장치로입출력하는것이아니라문자열에쓰거나읽음 첫번째인자로입출력을위한문자열이오고나머지인자는 printf(), scanf() 와같음 27
프로그램 12.3 sprintf()/sscanf() void cal(char * express, char *result){ int opd1, opd2; char op; if (sscanf(express, "%d %c %d", &opd1, &op, &opd2)!= 3) { sprintf(result, " 수식오류 "); return; } if (op == '+') sprintf(result, "%d", opd1 + opd2); else if (op == '-') sprintf(result, "%d", opd1 - opd2); else if (op == '*') sprintf(result, "%d", opd1 * opd2); else if (op == '/') sprintf(result, "%.3f", (float)opd1 / opd2); else sprintf(result, " 수식오류 "); } 28
프로그램 12.3 int main(void){ char express[21]; char result[10]; sprintf()/sscanf() printf(" 수식을입력하세요 : "); scanf("%20[^\n]", express); cal(express, result); printf("%s = %s\n", express, result); } return 0; 29
프로그램결과 $ calculate 수식을입력하세요 : 19-3 19-3 = 16 $ calculate 수식을입력하세요 : 57 / 9 57 / 9 = 6.333 $ calculate 수식을입력하세요 : 45* 543 45* 543 = 24435 $ calculate 수식을입력하세요 : 90 34 90 34 = 수식오류 30
sprintf()/sscanf() sprintf() 나 sscanf() 는호출될때마다문자열의처음부터쓰거나읽음 char str[] = "1234567890"; int a, b, c, d; sscanf(str, "%2d%2d", &a, &b); sscanf(str, "%2d%2d", &c, &d); // a = 12, b = 34 // c = 12, b = 34 31
파일입출력 파일입출력을위해서는파일을먼저열고해야함 관련함수들 fopen() fclose() fprintf() fscanf() 32
fopen() 파일을열기전에는파일의내용을보거나쓸수없음 fopen() 함수는파일이름과모드를인자로받음 fopen() 은지정된모드로파일을열고그파일을접근할수있게 FILE 포인터를리턴함 파일열기를실패하면 NULL 을리턴함 33
fopen() 모드 모드 "r" "w" "a" "rb" "wb" "ab" 의미읽기위해문서파일열기쓰기위해문서파일열기첨부하기위해문서파일열기읽기위해이진파일열기쓰기위해이진파일열기첨부하기위해이진파일열기 모드뒤의 + 는파일을읽기와쓰기로모두연다는것을의미함 34
사용예 fopen() FILE *ifp, *ofp; ifp = fopen("infile", "r"); ofp = fopen("outfile", "w"); infile과 outfile로데이터를읽고쓸때 ifp와 ofp 를통해읽거나써야함 if ((ifp = fopen("infile", "r")) == NULL) printf(" 오류 : 파일을열수없습니다."); else... // 파일읽기 // 오류처리 35
<stdio.h> 에정의 표준파일포인터 파일포인터 설명 비고 stdin 표준입력파일 키보드로연결됨 stdout 표준출력파일 화면으로연결됨 stderr 표준에러파일 화면으로연결됨 36
fclose() 파일을다사용한후에는 fclose() 를사용하여닫아야함 fclose() 의인자로는 fopen() 에의해리턴된 FILE 포인터를명시해야함 예제 fclose(ifp); fclose(ofp); 37
getc()/putc() FILE 포인터를갖는다는것만제외하면 getchar()/ putchar() 와같음 getchar() : getc(stdin) putchar(c) : putc(c, stdout) 예제 c = getc(ifp); putc(c, ofp); 38
프로그램 12.4 int main(int argc, char **argv){ FILE *ifp, *ofp; int c; } getc()/putc() if (argc!= 3) { printf(" 실행오류 : \n 사용법 : %s from_file to_file\n", argv[0]); exit(1); } if ((ifp = fopen(argv[1], "r")) == NULL){ printf(" 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } if ((ofp = fopen(argv[2], "w")) == NULL){ printf(" 오류 : %s 파일을열수없습니다.\n", argv[2]); exit(1); } while ((c = getc(ifp))!= EOF) putc(c, ofp); fclose(ifp); fclose(ofp); return 0; 39
fprintf()/fscanf() printf()/scanf() 함수의파일버전 첫번째인자는 FILE 포인터이고나머지는 printf()/ scanf() 와같음 printf(...) : fprintf(stdout,...) scanf(...) : fscanf(stdin,...) 40
프로그램 12.5 #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE *pro, *sol; int c, i, opd1, opd2; char word[50]; fprintf()/fscanf() if (argc!= 3) { fprintf(stderr, " 실행오류 :\n 사용법 : %s data_file out_file\n,argv[0]); exit(1); } if ((pro = fopen(argv[1], "w")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 41
fprintf()/fscanf() 프로그램 12.5 for (i = 0; i < 50; i++) fprintf(pro, "%d + %d = \n", rand() % 1000, rand() % 1000); fclose(pro); if ((pro = fopen(argv[1], "r")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } if ((sol = fopen(argv[2], "w")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[2]); exit(1); } while (fscanf(pro, "%d + %d = \n", &opd1, &opd2)!= EOF) fprintf(sol, "%d + %d = %d\n", opd1, opd2, opd1 + opd2); fclose(pro); fclose(sol); } return 0; 42
파일의임의의위치접근 입출력함수는이전에마지막으로입출력이일어난곳부터입출력을실행함 파일위치지시자 파일위치지사자와관련된함수들 ftell() fseek() rewind() 43
ftell() 파일의임의의위치접근 파일위치지시자의현재값을리턴 사용예 pos = ftell(file_ptr); FILE_ptr과관련된파일위치지시자를 pos에배정 리턴된값은파일의처음부터몇바이트떨어진곳인가를나타냄 44
fseek() 파일의임의의위치접근 파일위치지시자의값을직접지정함 사용예 fseek(file_ptr, offset, place) 파일위치지시자를 place 부터 offset 바이트떨어진곳을나타내는값으로설정함 place 값기호문자의미 0 SEEK_SET 파일의시작 1 SEEK_CUR 현재위치 2 SEEK_END 파일의끝 45
rewind() 파일의임의의위치접근 파일위치지시자를파일의제일앞으로지정함 사용예 rewind(file_ptr) fseek(file_ptr, 0, SEEK_SET) 과같음 46
프로그램 12.6 파일의임의의위치접근 int main(void){ char fname[maxstring]; int c; FILE* ifp; fprintf("\n입력파일 : "); scanf("%s", fname); ifp = fopen(fname, "r"); fseek(ifp, 0, SEEK_END); if (ftell(itp) == 0) return 0; fseek(ifp, 1, SEEK_CUR); } while (1) > 0) { c = getc(ifp); putchar(c); if (ftell(itp) == 1) break; fseek(ifp, 2, SEEK_CUR); } fclose(ifp); return 0; 47
텍스트파일 putc() 나 fprintf() 는문자로출력함 아스키값으로파일에저장됨 문서편집기로내용을확인할수있음 텍스트로저장하면내용을쉽게파악할수있어좋지만파일의크기가커지고, 데이터의직접접근이어려워짐 48
예 텍스트파일 struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 }; for (i = 0; i < N; i++) fprintf(output, "%d %s %d %d %d %d %f\n", st[i].id, st[i].name, st[i].grade[0], st[i].grade[1], st[i].grade[2], st[i].sum, st[i].avg); 각학생별레코드크기가다름 100 번째학생의정석을찾기위해서는처음부터읽어야함 49
이진파일 메모리내용과같은형식으로작성된파일 관련함수 fwrite() fread() 50
fwrite() 함수원형 size_t fwrite(const void *buffer, size_t size, size_t count, FILE *FP); buffer : 파일에쓸데이터를가지고있는포인터 size : 저장할각객체의크기 count : 저장한객체의수 FP : 저장할파일포인터 51
프로그램 12.7 #include <stdio.h> fwrite() typedef struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 } student; int main(int argc, char **argv){ FILE *ofp; int id, check; student st = {0, "", {0}, 0, 0.0}; if (argc!= 2) { fprintf(stderr, " 실행오류 : \n 사용법 : %s out_file\n", argv[0]); exit(1); } if ((ofp = fopen(argv[1], "wb")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 52
fwrite() 프로그램 12.7 fprintf(stderr, " 성적을입력하세요.\n"); fprintf(stderr, " 입력형식 : 이름국어성적수학성적영어성적 \n"); } id = 1; check = scanf("%s %d %d %d", st.name, &st.grade[0], &st.grade[1], &st.grade[2]); while (check!= EOF) { st.id = id++; fwrite(&st, sizeof(student), 1, ofp); check = scanf("%s %d %d %d", st.name, &st.grade[0], &st.grade[1], &st.grade[2]); } close(ofp); return 0; 53
프로그램결과 $ input_grade output 성적을입력하세요. 입력형식 : 이름국어성적수학성적영어성적하나 78 90 100 둘 8 98 67 셋 78 90 88 넷 78 88 90 다섯 58 88 91 여섯 77 70 76 ^D $ cat output ꠑ 하나 N Z d ꠓ 둘찺 Z d ꠗ 셋찺 Z d ꠙ 넷찺 Z d ꠛ 다섯 N Z d ꠚ 여섯 N Z d 54
fread() 함수원형 size_t fread(void *buffer, size_t size, size_t count, FILE *FP); buffer : 파일에서읽은데이터를저장할포인터 size : 각객체의크기 count : 객체의수 FP : 읽을파일포인터 55
프로그램 12.8 #include <stdio.h> fread() typedef struct student{ int id; char name[10]; int grade[3]; // 국어, 수학, 영어성적 int sum; // 성적합 float avg; // 성적평균 } student; int main(int argc, char **argv){ FILE *ifp; int check; student st = {0, "", {0}, 0, 0.0}; if (argc!= 2) { fprintf(stderr, " 실행오류 : \n 사용법 : %s in_file\n", argv[0]); exit(1); } if ((ifp = fopen(argv[1], "rb")) == NULL){ fprintf(stderr, " 오류 : %s 파일을열수없습니다.\n", argv[1]); exit(1); } 56
fread() 프로그램 12.8 fprintf(stderr, " 번호이름국어수학영어 \n"); } check = fread(&st, sizeof(student), 1, ifp); while (check) { printf("%3d %-5s %3d %3d %3d\n", st.id, st.name, st.grade[0], st.grade[1], st.grade[2]); check = fread(&st, sizeof(student), 1, ifp); } close(ifp); return 0; 57
프로그램결과 $ print_grade output 번호이름국어수학영어 1 하나 78 90 100 2 둘 8 98 67 3 셋 78 90 88 4 넷 78 88 90 5 다섯 58 88 91 6 여섯 77 70 76 7 일곱 100 90 9 8 여덜 98 100 87 9 아홉 93 95 50 10 열 66 90 88 58
이진파일 프로그램 12.9 일부 case 1 : // 전체성적출력 rewind(fp); fprintf(stderr, " 번호이름국어수학영어총점평균 \n"); check = fread(&st, sizeof(student), 1, fp);... case 2 : // 개인적출력 fprintf(stderr, " 학생 id : "); scanf("%d", &id); fseek(fp, sizeof(student) * (id - 1), SEEK_SET); check = fread(&st, sizeof(student), 1, fp);... case 3 : // 성적추가... fseek(fp, 0, SEEK_END); st.id = ftell(fp) / sizeof(student) + 1;... fwrite(&st, sizeof(student), 1, fp); fflush(fp); 59
프로그램 12.9 일부 이진파일 case 4 : // 성적수정 fprintf(stderr, " 학생 id : "); scanf("%d", &id); fseek(fp, sizeof(student) * (id - 1), SEEK_SET); check = fread(&st, sizeof(student), 1, fp);... fseek(fp, -sizeof(student), SEEK_CUR); fwrite(&st, sizeof(student), 1, fp);... 60
프로그램 12.9 일부 이진파일 case 5 : // 성적처리 rewind(fp); check = fread(&st, sizeof(student), 1, fp); while (check){ st.sum = st.grade[0] + st.grade[1] + st.grade[2]; st.avg = st.sum / 3.0; fseek(fp, -sizeof(student), SEEK_CUR); fwrite(&st, sizeof(student), 1, fp); check = fread(&st, sizeof(student), 1, fp); }... 61
원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 1 번호이름국어수학영어총점평균 1 하나 78 90 100 0 0.00 2 둘 8 98 67 0 0.00 3 셋 78 90 88 0 0.00 4 넷 78 88 90 0 0.00 5 다섯 58 88 91 0 0.00 6 여섯 77 70 76 0 0.00 7 일곱 100 90 9 0 0.00 8 여덜 98 100 87 0 0.00 9 아홉 93 95 50 0 0.00 10 열 66 90 88 0 0.00 프로그램결과 62
원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 5 성적처리완료 프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 2 학생 id : 4 번호 : 4 이름 : 넷국어 : 78 수학 : 88 영어 : 90 총점 : 256 평균 : 85.33 63
프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 4 학생 id : 4 넷학생성적을입력하세요 : 100 98 100 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 3 이름과성적을입력하세요 : 끝 100 100 100 64
프로그램결과 원하는번호를입력하세요. 1 : 전체성적출력 2 : 학생별출력 3 : 성적추가 4 : 성적수정 5 : 성적처리 0 : 종료 1 번호이름국어수학영어총점평균 1 하나 78 90 100 268 89.33 2 둘 8 98 67 173 57.67 3 셋 78 90 88 256 85.33 4 넷 100 98 100 298 99.33 5 다섯 58 88 91 237 79.00 6 여섯 77 70 76 223 74.33 7 일곱 100 90 9 199 66.33 8 여덜 98 100 87 285 95.00 9 아홉 93 95 50 238 79.33 10 열 66 90 88 244 81.33 11 끝 100 100 100 300 100.00 65