본문 바로가기

공부기록/C

과제 샘플...?

학교 과제용 코드 1



// File I/O 사용하여 파일 읽어들인 후 다른 파일에 복사하기

// Switch-Case문 사용하여 세 가지 분류로 평균값 정렬

// Selection Sort 사용하여 OS 과목점수가 높은 순서대로, 같다면 이름 알파벳 순서대로 정렬

// Visual Studio 2017 - .C 파일


// 구현


#define _CRT_SECURE_NO_WARNINGS // fopen() 사용


#include <stdio.h>

#include <string.h>


struct student { // student 구조체 선언

int OS, DC, CC; // 각 과목의 성적 - 정수

float Avg; // 평균 - 실수

char Name[20]; // 이름 저장할 배열

};


// 함수 및 (전역)변수

int grade_A, grade_B, grade_F = 0; // AvgSort에 필요한 변수(분류한 값 저장)


void AvgSort(float Avg) { // 평균값 분류하는 AvgSort() 함수 선언 및 구현

if (Avg == 40) // 평균값 40일 경우

grade_F++;

else if (Avg == 80) // 평균값 80일 경우

grade_B++;

else {

switch ((int) (Avg / 10)) { // 평균을 10으로 나눈 몫에 대하여 수행

case 10:

case 9:

case 8: // 81 ~ 100

grade_A++;

break;


case 7:

case 6:

case 5:

case 4: // 41 ~ 79

grade_B++;

break;


default: // 그 외의 값(1~39)

grade_F++;

break;

}

}


}


void swapScore(int *a, int *b); // swapScore - 매개변수 integer

void swapScore2(float *a, float *b); // swapScore - 매개변수 float

void swapName(char *a, char *b);



int main() { // main함수 구현


FILE *os1, *os2; // file 포인터 os1, os2 선언


struct student Stu[7]; // student 구조체 형태 배열(array) 7개 생성


int OS_sum = 0, DC_sum = 0, CC_sum = 0;

float OS_avg, DC_avg, CC_avg, Total_avg = 0;

// OS, DC, CC성적 합계의 평균, 총 합계의 평균


int i, j; // 반복문 변수 i, j


// if ((os1 = fopen("os1.txt", "r")) == NULL) {

if ((os1 = fopen("C:\\Users\\Administrator\\Desktop\\os1.txt", "r")) == NULL) { // os1.txt 열기(read)

printf("파일을 열 수 없습니다!\n");

return;

} // 파일 없을시 메시지 출력 후 return


fseek(os1, 14, SEEK_SET); // 파일 포인터 이동, 시작점에서 14바이트 뒤까지 - 제일 윗부분 넘어감 : Name, OS, DC, CC 부분


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

fscanf(os1, "%s%d%d%d", &Stu[i].Name, &Stu[i].OS, &Stu[i].DC, &Stu[i].CC); // 이름, OS, DC, CC 성적 입력받음

Stu[i].Avg = (float)(Stu[i].OS + Stu[i].DC + Stu[i].CC) / 3; // 각 학생의 평균값 산출하여 저장

}

// os1.txt에서 학생들의 이름과 성적을 입력받고 평균값 산출하여 각각의 배열에 저장


// os1.txt에서 읽어들인 내용을 화면에 출력

printf("1. os1.txt에서 읽어들인 내용입니다.\n");

printf("\nNo\tName\tOS\tDC\tCC\n");

for (i = 0; i < 7; i++)

printf("%d\t%s\t%d\t%d\t%d\n", i+1, Stu[i].Name, Stu[i].OS, Stu[i].DC, Stu[i].CC);

// os1.txt에서 읽어들인 내용 출력 끝


// OS 성적 내림차순으로 정렬 후 이름 순서대로 정렬

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

for (j = 6; j >= i; j--) {

if (Stu[i].OS < Stu[j].OS) { // OS성적 비교하여 뒤가 앞보다 크다면

swapScore(&Stu[i].OS, &Stu[j].OS);

swapScore(&Stu[i].DC, &Stu[j].DC);

swapScore(&Stu[i].CC, &Stu[j].CC);

swapScore2(&Stu[i].Avg, &Stu[j].Avg);


swapName(Stu[i].Name, Stu[j].Name); // 자리바꿈

}

else if (Stu[i].OS == Stu[j].OS) { // OS성적이 같다면 - 이름 순서대로 정렬

if (strcmp(Stu[i].Name, Stu[j].Name) > 0) { // 문자열 비교하여 양수라면(i가 j보다 뒷 순서라면)


swapScore(&Stu[i].OS, &Stu[j].OS);

swapScore(&Stu[i].DC, &Stu[j].DC);

swapScore(&Stu[i].CC, &Stu[j].CC);

swapScore2(&Stu[i].Avg, &Stu[j].Avg);


swapName(Stu[i].Name, Stu[j].Name); // 자리바꿈

}

}

}

} // 정렬 완료


// 개인별 평균값과 과목별 합계 산출

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

AvgSort(Stu[i].Avg);


OS_sum += Stu[i].OS;

DC_sum += Stu[i].DC;

CC_sum += Stu[i].CC;

}


OS_avg = (float)(OS_sum / 7); // OS 합계의 평균

DC_avg = (float)(DC_sum / 7); // DC 합계의 평균

CC_avg = (float)(CC_sum / 7); // CC 합계의 평균


Total_avg = (OS_avg + DC_avg + CC_avg) / 3; // 평균 합

// os2 = fopen("os2.txt", "w+"); 

os2 = fopen("C:\\Users\\Administrator\\Desktop\\os2.txt", "w+"); // os2.txt 열기(write+)


// os2.txt에 쓰기

fprintf(os2, "No\tName\tOS\tDC\tCC\tAVE\n");


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

fprintf(os2, "%d\t%s\t%d\t%d\t%d\t%.0f\n", i+1, Stu[i].Name, Stu[i].OS, Stu[i].DC, Stu[i].CC, Stu[i].Avg);

}


fprintf(os2, "\n1-40 : %d\n", grade_F);

fprintf(os2, "41-80 : %d\n", grade_B);

fprintf(os2, "81-100 : %d\n", grade_A);


fprintf(os2, "\nOS : %.0f\tDC : %.0f\tCC : %.0f\tTotal AVE : %.0f", OS_avg, DC_avg, CC_avg, Total_avg); // 소수 첫째 자리에서 반올림(정수)


// os2.txt에 저장한 내용을 화면에 출력

printf("\n\n2. os2.txt에 저장할 내용을 출력합니다.\n");

printf("\nNo\tName\tOS\tDC\tCC\tAVE\n");


for (i = 0; i < 7; i++)

printf("%d\t%s\t%d\t%d\t%d\t%.0f\n", i + 1, Stu[i].Name, Stu[i].OS, Stu[i].DC, Stu[i].CC, Stu[i].Avg);


printf("\n1-40 : %d\n", grade_F);

printf("41-80 : %d\n", grade_B);

printf("81-100 : %d\n", grade_A);


printf("\nOS : %.0f\tDC : %.0f\tCC : %.0f\tTotal AVE : %.0f\n", OS_avg, DC_avg, CC_avg, Total_avg);


printf("\n출력한 내용이 os2.txt에 저장되었습니다.\n");

// os2.txt에 복사한 내용 출력 끝


fclose(os1); // file 포인터 os1 닫음

fclose(os2); // file 포인터 os2 닫음


// return;

}


// 함수 구현

void swapScore(int *a, int *b) {

int tmp;

tmp = *a;

*a = *b;

*b = tmp;

}


void swapScore2(float *a, float *b) {

float tmp;

tmp = *a;

*a = *b;

*b = tmp;

}


void swapName(char *a, char *b) {

char tmp[20];

strcpy(tmp, a);

strcpy(a, b);

strcpy(b, tmp);

}