10 개 대학에 대한 다양한 정보를 배열 구조로 저장하는 프로그램이 있습니다. 대학 정보를 구조로 변환하여 배열에로드하는 'inputData'라는 함수가 있습니다. 나는 모든 대학의 수업료를 재귀 적으로 합산하고 평균을 반환하는 함수를 작성하려고합니다. 하지만 어딘가에서 오류가 계속 발생합니다.
다음은 구조입니다.
struct University
{
char name[50];
char city[20];
char state[3];
int rank;
int tuition;
};
정보를 구조로 변환하는 함수입니다.
struct University inputData(char Name[50], char City[20], char State[3], int Rank, int Tuition){
struct University uni;
strcpy(uni.name, Name);
strcpy(uni.city, City);
strcpy(uni.state, State);
uni.rank=Rank;
uni.tuition=Tuition;
return uni;
};
그런 다음 구조 배열을 만들고 모든 정보를 추가했습니다.
struct University university[10];
university[0]= inputData("Princeton University", "Princeton", "NJ", 1, 45320);
university[1]= inputData("University of Virginia", "Charlottesville", "VA", 24, 52040);
university[2]= inputData("Boston College", "Chestnut Hill", "MA", 31, 51296);
university[3]= inputData("Georgia Institute of Technology", "Atlanta", "GA", 34, 32404);
university[4]= inputData("Lehigh University", "Bethlehem", "PA", 44, 48320);
university[5]= inputData("University of Chicago", "Chicago", "IL", 3, 52491);
university[6]= inputData("Duke University", "Durham", "NC", 8, 51265);
university[7]= inputData("University of Georgia", "Athens", "GA", 56, 29844);
university[8]= inputData("University of Denver", "Denver", "CO", 86, 46362);
university[9]= inputData("Loyola University Chicago", "Chicago", "IL", 99, 26270);
평균 수업료를 계산하는 기능은 다음과 같습니다 (배열과 길이를 전달합니다).
int recursionAvg(struct University* list, int length){
if (length<=0){
return 0;
}
if(length!=0) return (recursionAvg(list, length -1) + list[length - 1].tuition)/10;
};
나는 그것을 호출하고 다음을 수행하여 결과를 인쇄합니다.
average = recursionAvg(university, 10);
printf("the average is: %d", average);
나는 답으로 43561을 받아야하는데 3126을 계속 얻습니다. 문제의 일부는 모든 재귀 호출에서 계속 10으로 나누기 때문이라는 것을 알고 있습니다.하지만 함수 자체 내에서 이것을 한 번만 수행하는 방법은 무엇입니까?
코드가 실행되지만 잘못된 결과가 나타납니다.
증분 평균을 사용하여 재귀 적 구현을 수행 할 수 있습니다 . int / int 반올림 문제를 피하기 위해 doubles로 수행하는 것이 좋습니다.
double avg_tuition(struct University* list, int n) {
if (length <= 0) {
return 0.0;
}
double running_avg = avg_tuition(list, n - 1);
return running_avg + (list[n - 1].tuition - running_avg) / n;
}
그런 다음 결과를 int로 캐스트하거나 반올림 할 수 있습니다.
정수 산술 사용을 고집하는 경우 :
int avg_tuition(struct University* list, int n) {
if (length <= 0) {
return 0;
}
int running_avg = avg_tuition(list, n - 1);
return running_avg + (list[n - 1].tuition - running_avg) / n;
}
그러나 이것은 정수 절단의 누적 효과로 인해 부정확 한 결과를 제공합니다. 좋은 소식은 원래 데이터가 int
유형에 맞을 때 오버플로가 발생하지 않는다는 것입니다 . 왜냐하면 큰 합계 (잠재적 오버플로가 발생하는 위치)를 누적하는 대신 실행 평균과 각각의 새로운 관측치 간의 차이로 작동하기 때문입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다