안녕하세요.
제발 봐주십사하고 염치불구 질문드립니다.
텍스트파일로부터 지도코드가 B또는 C인 자료에 대해 국어점수+영어점수에 따라 내림차순 했을 때 5번째 국어점수+영어점수를 출력하는 문젭니다. 근데 점수가 동일한 경우 학번에 대해 오름차순 정렬합니다.
문제는 실행도 되고 정렬도 되던데 과목별 점수부분의 데이타가 파괴되어 나옵니다.
#include <stdio.h>
#define MAX 1000 /*데이타가 총 1000행이더군요 */
void an1(void);
FILE *IN, *OUT;
struct tag{
long int stuno; /* 학번*/
char name[5]; /*성명 */
int g_score; /* 목표점수 */
char jido, sung, tong; /* 지도코드, 무슨코드,또 무슨 코드*/
int kor, eng, mat, sci, his, ko_enhap;
/* 국,영,수,과,역사,국+영점수*/
};
int count = 0;
struct tag input[MAX+1]; /* 파일을 읽어들여 놓을 구조체 */
void main() {
int i, j;
IN = fopen("res0105.txt", "r");
OUT = fopen("s1104-8.txt","w"); /*출력하려는 파일 */
for(i = 1; i< MAX+1; i++) { /*읽을 데이타의 자료형,크기입니다*/
fscanf(IN, "%6ld %4s %3d %c %c %c %3d %3d %3d %3d %3d\n",
&input[i].stuno, &input[i].name, &input[i].g_score, &input[i].jido,
&input[i].sung, &input[i].tong, &input[i].kor, &input[i].eng,
&input[i].mat, &input[i].sci, &input[i].his);
input[i].ko_enhap = input[i].kor + input[i].eng;
}
/*이건 잘 동작되는지 시험용으로 그냥 적었음 */
printf("%6ld%4s%3d%c%c%c%3d%3d%3d%3d%3d%3d\n",
input[5].stuno, input[5].name, input[5].g_score, input[5].jido,
input[5].sung, input[5].tong, input[5].kor, input[5].eng,
input[5].mat, input[5].sci, input[5].his, input[5].ko_enhap);
an1(); /* 처리함수 */
fclose(IN); fclose(OUT);
}
void an1(void) {
int i, j, imsi, temp[MAX+1];
static struct tag N1[MAX+1]; /*지도코드가 B나 C인 데이타를 모아놓을 구조체*/
for(i = 1; i<MAX+1; i++)
if(input[i].jido == 'B'|| input[i].jido == 'C') {
++count;
temp[count] = i;/* 지도코드가 B 또는 C인 위치를 기억. */
}
for(i = 1;i<count+1;i++)
N1[i] = input[(temp[i])]; /* N1구조체에다 지도코드 B,C인 행을 복사 */
/*버블정렬 --> 분석중(!!!바로 아래부터 점수들이 이상해집니다 !!!) */
for(i = 1; i< count; i++)
for(j = i+1; j<count+1; j++) /*여긴 국어점수+영어점수 내림차순 정렬*/
if(N1[i].ko_enhap < N1[j].ko_enhap) {
N1[0] = N1[i];
N1[i] = N1[j];
N1[j] = N1[0];
}
for(i = 1; i< count; i++) /* 여긴 점수합이 같을 때 학번순으로 오름차순 정렬 */
for(j = i+1; j<count+1; j++)
if(N1[i].ko_enhap == N1[j].ko_enhap)
if(N1[i].stuno > N1[j].stuno) {
N1[0] = N1[i];
N1[i] = N1[j];
N1[j] = N1[0];
}
for(i= 1;i<count+1;i++)
fprintf(OUT,"%6ld%4s%3d%c%c%c%3d%3d%3d%3d%3d%3d\ttemp[%d] = %d\n",
N1[i].stuno, N1[i].name, N1[i].g_score, N1[i].jido,
N1[i].sung, N1[i].tong, N1[i].kor, N1[i].eng,
N1[i].mat, N1[i].sci, N1[i].his, N1[i].ko_enhap, i,temp[i]);
fprintf(OUT,"count = %d\n",count);
}
좀 긴데 봐주셔서 감사합니다.
국어+영어 점수 내림차순정렬도 되고 동일값의 학번에 따라 오름차순정렬도 되더군요.
근데 가장 중요한 점수가 엉망으로 나오다니요.. 국어+영어 만점이 200점인데 889점이라니...ㅠㅠ
미치겠어요... 왜 그런지 버퍼를 비워야 하는 건지. 어케 해야 되는지 도저히 모르겠습니다. 열 엄청나네요... 도움의 손길을...!
|