2014-12-07 3 views
-3

을 실행하려고 할 때 중지 :프로그램은 컴파일하지만 나는 다음과 같은 코드를 작성했습니다

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<math.h> 

struct address 
{ 
char street[18]; 
char city[13]; 
char state[7]; 
char zip[5]; 
}; 
struct student 
{ 
char first_name[7]; 
char initial; 
char last_name[9]; 
struct address add; 
int age; 
double gpa; 
}; 

void readData(struct student students[], int *n); 
void print(struct student students[], int n); 
void bestGPA(struct student students[], int n); 
double averageGPA(struct student students[], int n); 
void printAboveGPA(struct student students[], int n, double avg); 
void youngestStudent(struct student students[], int n, double avg); 
void sort(struct student students[], int n); 

int main() 
{ 
struct student students[20]; 
int n=0; 

readData(students, &n); 

print(students, n); 

bestGPA(students, n); 

double avg = averageGPA(students, n); 
printf("Average GPA is: %.2lf\n", avg); 

printAboveGPA(students, n, avg); 

youngestStudent(students, n, avg); 

sort(students, n); 

printf("\nNow sorted based on GPA: \n"); 
print(students, n); 

return 0; 

} 


void readData(struct student students[], int *d) 
{ 
int n = 0; 
FILE *fp; 
fp = fopen("Students.dat", "r"); 

if(fp == NULL) { 
printf("Students.dat file not found.\n"); 
exit(1); 
} 

else 
{ 
while(fscanf(fp, "%s %c %s", 
students[n].first_name, 
&students[n].initial, 
students[n].last_name) == 3) 
{ 

char add1[10], add2[10], add3[10]; 
fscanf(fp, "%s %s %s", add1, add2, add3); 

strcpy(students[n].add.street, add1); 
strcat(students[n].add.street, " "); 
strcat(students[n].add.street, add2); 
strcat(students[n].add.street, " "); 
strcat(students[n].add.street, add3); 

fscanf(fp, "%s %s %s %d %lf", students[n].add.city, students[n].add.state, students[n].add.zip,&students[n].age, &students[n].gpa); 

n++; 
} 
} 

*d = n; 
} 

void print(struct student students[], int n) 
{ 
int i; 
for(i=0; i<n; i++) 
{ 
printf("%s %c %s %s %s %s %s %d %.2lf\n" 
, students[i].first_name 
, students[i].initial 
, students[i].last_name 
,students[i].add.street 
,students[i].add.city 
,students[i].add.state 
,students[i].add.zip 
,students[i].age 
,students[i].gpa); 
} 
} 

void bestGPA(struct student students[], int n) 
{ 
struct student s = students[0]; 

int bestGPAIndex = 0; 
int i; 
for(i=1; i<n; i++) 
{ 
if(students[bestGPAIndex].gpa < students[i].gpa) 
{ 
bestGPAIndex = i; 
} 
} 

printf("\n\nThe student with best GPA is: %c %s %s\n\n", students[bestGPAIndex].initial, students[bestGPAIndex].first_name,students[bestGPAIndex].last_name); 
} 

double averageGPA(struct student students[], int n) 
{ 
int i; 

double total; 
double avg; 

for(i=0; i<n; i++) 
{ 
total += students[i].gpa; 
} 

avg = total/n; 

return avg; 
} 

void printAboveGPA(struct student students[], int n, double avg) 
{ 
int i; 
printf("\nStudents with GPA more than average: \n"); 

for(i=0; i<n; i++) 
{ 
if(students[i].gpa > avg) 
{ 
printf("%c %s %s\n", students[i].initial, students[i].first_name, students[i].last_name); 
} 
} 
} 

void youngestStudent(struct student students[], int n, double avg) 
{ 
int i; 
printf("\nYoungest student with GPA less than average: "); 

int youngestStudentIndex=students[0].age; 
int isFound = 0; 



for(i=0; i<n; i++) 
{ 
if(students[i].gpa < avg) 
{ 
if(!isFound) 
{ 
isFound = 1; 
youngestStudentIndex = i; 
} 

if(students[youngestStudentIndex].age >= students[i].age) 
{ 
youngestStudentIndex = i; 
} 

} 
} 

if(isFound) 
printf("%c %s %s\n\n", students[youngestStudentIndex].initial, students[youngestStudentIndex].first_name, students[youngestStudentIndex].last_name); 
else 
printf("Not found !!\n\n"); 
} 

void sort(struct student students[], int n) 
{ 
int i,j; 
for (i = 0 ; i < (n - 1); i++) 
{ 
for (j = 0 ; j < n - i - 1; j++) 
{ 
if (students[j].gpa > students[j+1].gpa) 
{ 
struct student s = students[j]; 
students[j] = students[j+1]; 
students[j+1] = s; 
} 
} 
} 
} 

내가 할 모든 students.exe 내가 실행에 갈 때 작동이 중지되었습니다 때문이다. Visual Studio에서 디버깅하려고하면 "unhandled exception at 0x76F3D062 (ntdll.dll) in test.exe : 0xC0000005 : 액세스 위반 작성 위치 0x7504006D"라는 메시지가 나타납니다. 솔직히, 나는 그것이 무엇을 의미하는지 정말로 모른다. CodeLite를 IDE로 사용하여 프로그램을 개발하고 있습니다. 문제가있는 부분에 대한 도움이나 힌트를 주시면 감사하겠습니다. 고맙습니다!

+2

http://stackoverflow.com/help/mcve –

+0

그러나 그 원인으로 프로그램이 작동하지 않습니까? 또한 거리 배열을 더 크게 만들 수는 없습니까? 그렇게해도 문제가 해결되지는 않습니다. – user3727648

+0

입력 파일 (Students.dat)이 어떻게 보이는지 ... 아마도 스 니펫입니다. 해당 파일의 특정 줄을 읽으면 프로그램이 항상 종료됩니까? – TonyB

답변

0

거리 배열은 18 바이트입니다. add1, add2 및 add3, 2 공백 및 종료 0 - 에서 9 바이트를 3 번 ​​읽는 데이터에 따라 최대 30 바이트를 넣습니다. 마지막 요소가 필요한 9 바이트의 데이터 요소를 사용자 데이터 요소로 가정합니다. 0

관련 문제