#include "stdafx.h"
#include "stdio.h" //text파일로 출력을 위해서는 헤더파일에 stdio.h파일이 있어야한다.
struct score //score라는 구조체를 만들었습니다.
{
char* name[100];
char* sub[5]; //sub라는 변수의 내용은 char형태이고 이 포인터는 다른 함수에서 내용을 참조할 수 있습니다. 배열크기는 과목이 5개이므로 5를 주었습니다.
int data[5]; //data는 점수이고 정수이므로 int형태이다. 이 역시 과목 5개 대한 점수를 입력하기 위해 크기를 5로 주었습니다.
char* grade[5]; //grade는 학점이고 변수내용은 char형태이입니다. 이 역시 포인터를 사용해 다른함수에서 내용을 참조할 수 있습니다. 이것을 설정한 이유는 나중에 텍스트파일 출력에 사용하기 위해서 입니다.
};
class evaluation //evaluation 이라는 class를 만들었습니다. class는 struct의 확장적 의미입니다.
{
public: //타입은 public타입을 사용하였으며, public경우 모든 곳에서 접근할 수 있습니다.
struct score sc; //class안에 위에 설정한 score라는 struct를 설정하였습니다.
void input(); //멤버함수를 쓰기위해 void타입으로 나중에 입력할 input과 학점을 넣을 project도 선언하였습니다.
void project(int i); //이때, input에서는 아직 입력받은게 없으므로 ()가 비었지만 project는 input에서 입력받은 점수를 가지고 학점을 매기므로 int i를 넣었습니다.
};
void evaluation::input() //evaluation class의 input라는 멤버함수를 만들었습니다.
{
int i, j, temp; //이 경우는 선택정렬입니다. 인터넷을 통해 소스를 다운받았습니다.
char* tempa;
sc.sub[0] = "C"; //이때, 구조체서 만든 과목sub의 배열의 값을 각각 지정해주었습니다.
sc.sub[1] = "CPP";
sc.sub[2] = "DB";
sc.sub[3] = "CAD";
sc.sub[4] = "CATIA";
printf("이름을 입력해 주세요.");
scanf("%s", &sc.name);
printf("\n");
for(i=0; i<5; i++)
{
printf("%s의 점수를 입력하시오. ", sc.sub[i]);
scanf("%d", &sc.data[i]); //이때 각 점수는 그 배열에 맞게 놓여지도록 설정하였습니다.
}
printf("[\n%s의 성적\n]", sc.name);
//이때 점수에 따라 높은 것부터 낮은 것으로 정렬시키게 만드는 것이고
for(i=0; i<4; i++) //거기에 따라 프린트 되어지는 문자도 같이 정렬되게 만들었습니다.
{ //변수를 두개 지정하고 정수에 관한 temp도 지정해주었습니다, 그리고 점수에 따른 문자도 이동해야하므로 tempa도 사용해주었습니다.
for(j=i+1; j<5; j++) //선택정렬을 sc.sub[0]의 점수를 기준으로 했을시 sc.sub[1]의 점수가 sc.sub[0]보다 높으면 높은게 앞쪽으로 오도록 하고
{ //만약 점수가 같거가 sc.sub[0]가 더 클시에는 그냥 그대로 위치하도록 해놓는 것을 말합니다.
if(sc.data[i]<sc.data[j])
{
temp=sc.data[i]; //점수에 맞게 이동하고 난뒤에, 문자도 역시 이동해야하므로 temp와 tempa를 이용하여 만들었습니다.
sc.data[i]=sc.data[j];
sc.data[j]=temp;
tempa=sc.sub[i]; //그리고 점수 입력을 5번하므로 for문이 4번 반복되도록 설정했습니다.
sc.sub[i]=sc.sub[j];
sc.sub[j]=tempa;
}
}
}
}
void evaluation::project(int i) //evaluation class의 input라는 멤버함수를 만들었습니다. int i는 scanf 받은 점수를 가지고 학점을 매기기 위해 넣었습니다.
{
int score;
score = sc.data[i]; //이때 C라는 것을 구조체의 점수배열로 만들었습니다.
if(score >= 90 && score <= 100) //그리고 if와 else if를 사용해 점수때별 학점을 매기게 만들었습니다.
{
sc.grade[i] = "A"; //이때 아까 위에 학점 grade의 배열을 5칸 만들어서 점수 5번 입력시 학점도 저장할 수 있도록 배열로 받았습니다.
}
else if(score >= 80 && score < 90)
{
sc.grade[i] = "B";
}
else if(score >= 70 && score < 80)
{
sc.grade[i] = "C";
}
else if(score >= 60 && score < 70)
{
sc.grade[i] = "D";
}
else if(score < 60)
{
sc.grade[i] = "F";
}
printf("%s\t%d\t<%s>\n", sc.sub[i], score, sc.grade[i]); //그리고 프린트 f서 먼저 과목명과 점수, 학점이 뜨도록 printf를 설정하였으며 이때 줄간격을 맞추기 위해 tab기호인 \t를 썼습니다.
}
int main(int argc, char* argv[]) //마지막으로 메인문에다가 이때까지 만든 class와 멤버함수를 인식시켜야합니다.
{
int i;
ret:
printf("원하시는 모드를 선택해 주십시오.\n1.성적 입력 모드\n2.성적 조회 모드\n3.프로그램 종료\n");
scanf("%d", &i);
switch(i)
{
case(1):
goto insert;
case(2):
goto search;
case(3):
goto exit;
default:
printf("잘못 입력하셨습니다 다시 입력해 주십시오.\n");
goto ret;
}
insert:
evaluation ev; //evaluation라는 class를 넣었습니다.
ev.input(); //그리고 class의 멤버함수인 input을 넣었습니다.
printf("과목명\t점수\t학점\n");
for(
i=0; i<5; i++) //project 멤버함수도 넣는데 이경우 점수를 5번입력하므로 그 입력한 값에 대한 각각의 학점이 다 나와야 하므로 for문을 이용하여 5번 반복시켰습니다.
{
ev.project(i);
}
search:
int* name;
printf("조회하려는 학생의 이름을 입력하시오.(처음으로 되돌아가려면 0을 입력) : ");
scanf("%s", name);
if(name[0]=='0')
goto ret;
while(evaluation!=NULL)
{
if(strcmp(evaluation->sub,name) == 0)
{
printf("%s의 성적\n", evaluation->grade);
printf("과목명 점수 학점\n");
for(i=0; i<5; i++)
{
printf("%s %d %c\n", evaluation->sub[i], evaluation->data[i], evaluation->grade[i]);
}
}
evaluation = evaluation->link;
char fname[100] = "grade.txt";
FILE *f;
int cnt = 0;
while (!feof(stdin))
{
fprintf(f,"%d",++cnt);
fputs(name,f);
fgets(name,100,stdin);
}
fclose(f);
}
exit:
return 0;
}
<
<
<
<
<
<