
#include <stdio.h>
#include<stdlib.h>
int aver(int scores[5][4])
{
double average = 0;
int sum = 0;
for (int i = 0;i < 5;i++)
{
for (int j = 0;j < 4;j++)
{
sum+=scores[i][j];
}
average = sum / 4.0;
printf("第%d個同學的平均成績: %c\n", i + 1, average);
}
}
typedef struct student
{
int num;
char name[7];
char sex;
int age;
int scores[4];
}STUDENT;
int main()
{
int ret;
STUDENT stu[5] = { {135,"小周",'m',19,80,80,80,80},{136,"小黃 ",'m',19,80,80,80,80},{137,"小鄭 ",'m',19,80,80,80,80},{138,"小程 ",'m',19,80,80,80,80},{139,"小朱 ",'m',20,80,80,80,80} };
STUDENT * p;
printf(" 學號 姓名 性別 年齡 線代 微積分 程式設計 英語\n");
for (p = stu;p < stu + 5;p++)
{
printf("%5d %s %c %2d%5d%6d%8d%7d%\n", p->num, p->name, p->sex, p->age,p->scores[0], p->scores[1], p->scores[2], p->scores[3]);
}
ret = aver(p->scores[0], p->scores[1], p->scores[2], p->scores[3]);
system("PAUSE");
return 0;
}
uj5u.com熱心網友回復:
我和你運行的不是同一個程式,我直接編譯不過。aver定義的數字,呼叫傳遞的4個值uj5u.com熱心網友回復:
你混淆了兩個陣列,關于學生的結構陣列,和每個學生自己的分數陣列,你的代碼試圖把這2個交叉的陣列組成一個二維陣列,思維上混亂了

暫且拋去設計上的邏輯問題,你定義的函式int aver(int scores[5][4])
這個函式實際只有一個引數,就是二維陣列(指標),你呼叫的時候卻傳4個引數進去,這本身也是一個問題
言歸正傳,先做需求分析,你對需求的理解應該是錯誤的
平均分,一般來說是針對一門課程的群體的平均分,而不是針對一個人來計算,(你代碼里計算的是個人的4門平均分)
比如英語,數學,大學里數學假設是百分制,英語是150分制, 你計算個人的平均分沒什么意義
一般統計的是一個班級的某科的平均分, 或者更一般的,所有人總分的平均分
為了使問題簡單化,就不做太多復雜的東西了,供參考,可以對照下
#include <stdio.h>
#include <stdlib.h>
/*
為了不使問題復雜化,沿用你的思路
scores[0],[1] [2] [3]分別代表
線代 微積分 程式設計 英語
----
但是從設計思想來看,這是不好的,
隱含資訊,這種對應關系只有你知道
沒法用程式去約束他,建立對應關系
對于初學語言特性的你來說,先這樣吧
*/
struct student_st
{
int num;
char name[16];
char sex;
int age;
int scores[4];
};
typedef struct student_st student;
/*根據student集合,計算每門功課平均分
存盤到avg_score中,
這里其實有一些設計細節,比如要使用本
函式,傳入的陣列要能裝得下student的課程數
更由甚者,這里默認用嚴格的一一對應關系,
留給你去思考吧,這些思考能幫助你設計出
更好的軟體
*/
int aver(student *s, double *avg_score) //與aver(student s[], int avg_score[])是一樣的
{
int sum = 0;
for (int i = 0; i < 4; i++) //4門課程,按課程平均
{
sum = 0; //每次都要初始化,不然就會累加到上次的結果了
for (int j = 0; j < 5; j++)
{
/*嵌套關系,陣列里包含陣列,逐層解開訪問它就好了
要訪問第j個學生的資料怎么辦,先s[j],
第j個學生的分數呢, s[j].score*/
/*
這里惡搞一下,指標真有你想的那么優雅高級?
*/
sum += *((s + j)->scores + i); //使用s[j].scores[i];搞定, 經常來說用下標訪問陣列使你生活更容易些
}
*(avg_score + i) = (double)sum / 5; //avg_score[i] = sum / 4.0;
//printf("第%d門課程的平均成績: %f\n", i + 1, *(avg_score + i));
}
}
int main()
{
int ret;
/*分行對齊,好看些,護眼護腦
很快就發現問題,名字里有空格
幫你把資料改了一下,體現出你程式的價值,
能計算平均分,不然分數都一樣,不用算都知道平均分了
最后愿你成為最后那個學霸,送你了female,女的!*/
student stu[5] = {{1, "小周", 'm', 19, 81, 40, 70, 84},
{136, "小黃", 'm', 19, 40, 50, 88, 30},
{137, "小鄭", 'm', 19, 60, 20, 89, 0},
{13822, "小小", 'm', 19, 80, 70, 66, 77},
{139, "小朱", 'f', 20, 97, 100, 99, 99}};
student *p;
printf("\n-------------------------------學生資訊總覽-------------------------------\n\n");
/*一種簡單的輸出對齊方法*/
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "學號", "姓名", "性別", "年齡", "線代", "微積分", "程式設計", "英語");
/*直接用數字就好了,但是從練習熟悉指標來說,沒毛病*/
for (p = stu; p < stu + 5; p++)
{
/*單個字符 用%c, 字串用%s
character, string,,,中文字符printf輸出對齊是噩夢, 不齊的時候自己加\t對齊*/
printf("%d\t%s\t%c\t%d\t%d\t%d\t%d\t\t%d\n", p->num, p->name, p->sex, p->age,
p->scores[0], p->scores[1], p->scores[2], p->scores[3]);
}
/*平均分
沿用前面的隱含約定,
[0],[1] [2] [3]分別代表
線代 微積分 程式設計 英語
----知道這樣做的麻煩了吧,每一次涉及科目成績的處理(編程),都得回頭看看
確認一次,到底代表什么
*/
double avg_score[4];
ret = aver(stu, avg_score);
printf("\n\n-----------------各科平均成績-----------------\n\n");
printf("%s\t%s\t%s\t%s\n", "線代", "微積分", "程式設計", "英語");
printf("%.2f\t%.2f\t%.2f\t\t%.2f\n\n", avg_score[0], avg_score[1],
avg_score[2], avg_score[3]);
system("PAUSE");
return 0;
}
uj5u.com熱心網友回復:
謝謝你的用心,對于一個初學者來說幫助很大!轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104413.html
標籤:C語言
