#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct SUBJECT{
char clas[20];
float num;
struct SUBJECT *next;
}Sub;
typedef struct student{
long id;
char name[20];
Sub *clas;
float Snum;
}stu;
void input(int n,int N,stu student[]);//录入成绩、学号和姓名
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]);//计算每个学生的总分和平均分
float Sadd(stu p[],int n,int N,float Saver[6]);//计算每门课程的总分和平均分
int main(){
int n,f,N;
stu student[n];
float Eaver[30],Saver[6],Esum[30];
printf("请输入学生人数:");
scanf("%d",&n);
printf("请输入科目的数量:");
scanf("%d",&N);
printf(" 1.input recorf\n 2.caculate total and Eaverage score of every course\n 3.caculate total and Eaverage score of every student\n ");
do{
printf("请选择操作:");
scanf("%d",&f);
switch(f){
case 1:input(n,N,student);break;
case 2:Eadd(student,Esum,n,N,Eaver);break;
case 3:Sadd(student,n,N,Saver);break;
default:break;
}
}while(f!=0);
return 0;
}
void input(int n,int N,stu p[]){
char a;
Sub *c;
for(int i=0;i<n;i++){
printf("第%d个同学的学号:",i+1);
scanf("%ld",&p[i].id);
printf("姓名:");
scanf(" %s",p[i].name);
for(int j=0;j<N;j++){
c=(Sub *) malloc (N * sizeof(Sub));
printf("当前所录入的科目:");
scanf("%s",c->clas);
printf("请输入%s同学的%s的成绩:",p[i].name,c->clas);
scanf("%f",&c->num);
a=getchar();
if(p[i].clas==NULL){
p[i].clas=c;
}
else{
c->next=p[i].clas;
p[i].clas=c;
}
}
}
free(c);
}
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]){
stu *q=p;
for(int i=0;i<N;i++){
for(int j=0;j<n;j++){
Esum[i]=q[i].clas->num;
q[i].clas=q[i].clas->next;
}
}
for(int i=0;i<n;i++){
Eaver[i]=Esum[i]/(float)N;
}
printf("计算完成\n");
}
float Sadd(stu p[],int n,int N,float Saver[6]){
stu *q=p;
for(int i=0;i<n;i++){
for(int j=0;j<N;j++){
p[i].Snum += q[i].clas->num;
q[i].clas = q[i].clas->next;
}
}
for(int i=0;i<N;i++){
Saver[i]=p[i].Snum/(float)n;
}
printf("计算完成\n");
}
这个程序单独执行选项2和选项3时可以执行,但是2和3没法都执行
我跑了一遍,只发现了int n,f,N;其中n没有初始化
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct SUBJECT{
char clas[20];
float num;
struct SUBJECT *next;
}Sub;
typedef struct student{
long id;
char name[20];
Sub *clas;
float Snum;
}stu;
void input(int n,int N,stu student[]);//录入成绩、学号和姓名
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]);//计算每个学生的总分和平均分
float Sadd(stu p[],int n,int N,float Saver[6]);//计算每门课程的总分和平均分
int main(){
int n = 10,f,N;
stu student[n];
float Eaver[30],Saver[6],Esum[30];
printf("请输入学生人数:");
scanf("%d",&n);
printf("请输入科目的数量:");
scanf("%d",&N);
printf(" 1.input recorf\n 2.caculate total and Eaverage score of every course\n 3.caculate total and Eaverage score of every student\n ");
do{
printf("请选择操作:");
scanf("%d",&f);
switch(f){
case 1:
input(n,N,student);
break;
case 2:
Eadd(student,Esum,n,N,Eaver);
break;
case 3:
Sadd(student,n,N,Saver);
break;
default:
break;
}
}while(f!=0);
return 0;
}
void input(int n,int N,stu p[]){
char a;
Sub *c;
for(int i=0;i<n;i++){
printf("第%d个同学的学号:",i+1);
scanf("%ld",&p[i].id);
printf("姓名:");
scanf(" %s",p[i].name);
for(int j=0;j<N;j++){
c=(Sub *) malloc (N * sizeof(Sub));
printf("当前所录入的科目:");
scanf("%s",c->clas);
printf("请输入%s同学的%s的成绩:",p[i].name,c->clas);
scanf("%f",&c->num);
a=getchar();
if(p[i].clas==NULL){
p[i].clas=c;
}
else{
c->next=p[i].clas;
p[i].clas=c;
}
}
}
free(c);
}
float Eadd(stu p[],float Esum[30],int n,int N,float Eaver[30]){
stu *q=p;
for(int i=0;i<N;i++){
for(int j=0;j<n;j++){
Esum[i]=q[i].clas->num;
q[i].clas=q[i].clas->next;
}
}
for(int i=0;i<n;i++){
Eaver[i]=Esum[i]/(float)N;
}
printf("计算完成\n");
}
float Sadd(stu p[],int n,int N,float Saver[6]){
stu *q=p;
for(int i=0;i<n;i++){
for(int j=0;j<N;j++){
p[i].Snum += q[i].clas->num;
q[i].clas = q[i].clas->next;
}
}
for(int i=0;i<N;i++){
Saver[i]=p[i].Snum/(float)n;
}
printf("计算完成\n");
}
修改如下,供参考:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct SUBJECT {
char cla[20];
float num;
struct SUBJECT* next;
}Sub;
typedef struct student {
long id;
char name[20];
Sub* clas;
float Snum;
}stu;
void input(int n, int N, stu* student, float Esum[]); // 录入成绩、学号和姓名
void Eadd(float Esum[], int n, int N, float Eaver[]); //计算每门课程的总分和平均分
void Sadd(stu p[], int n, int N, float Saver[]); //计算每个学生的总分和平均分
void print_Stuadd(stu p[], int n, int N, float Saver[], float Esum[], float Eaver[]);
int main() {
int n, f, N;
stu student[50]; //stu student[n];
float Eaver[30] = { 0 }, Saver[30] = { 0 }, Esum[30] = {0};
printf("请输入学生人数:");
scanf("%d", &n);
printf("请输入科目的数量:");
scanf("%d", &N);
printf(" 1.input recorf\n"
" 2.caculate total and Eaverage score of every course\n "
"3.caculate total and Eaverage score of every student\n "
"4.printf\n");
do {
printf("请选择操作:");
scanf("%d", &f);
switch (f) {
case 1:input(n, N, student,Esum); break;
case 2:Eadd(Esum, n, N, Eaver); break;
case 3:Sadd(student, n, N, Saver); break;
case 4:print_Stuadd(student, n, N, Saver, Esum, Eaver);
break;
default:break;
}
} while (f != 0);
return 0;
}
void input(int n, int N, stu* p, float Esum[]) {
//char a;
Sub* c;
for (int i = 0; i < n; i++) {
printf("第%d个同学的学号:", i + 1);
scanf("%ld", &p[i].id);
printf("姓名:");
scanf(" %s", p[i].name);
p[i].Snum = 0; //修改
p[i].clas = NULL; //修改
for (int j = 0; j < N; j++) {
c = (Sub*)malloc(sizeof(Sub));//修改
//c = (Sub*)malloc(N * sizeof(Sub));
c->next = NULL; //修改
printf("当前所录入的科目:");
scanf("%s", c->cla);
printf("请输入%s同学的%s的成绩:", p[i].name, c->cla);
scanf("%f", &c->num);
Esum[j] += c->num; //修改
//getchar(); //a = getchar();
//if (p[i].clas == NULL) {
// p[i].clas = c;
//}
//else {
c->next = p[i].clas;
p[i].clas = c;
//}
}
}
//free(c);
}
void Eadd(float Esum[], int n, int N, float Eaver[]) {
//float Eadd(stu p[], float Esum[30], int n, int N, float Eaver[30]) {
//Sub* q;//stu* q = p;
//for (int i = 0; i < N; i++){
// for (int j = 0; j < n; j++)
// q = p[j].clas;
// Esum[i] += q->num; //Esum[i] = q[i].clas->num;
//q[i].clas = q[i].clas->next;
//}
for (int i = 0; i < N; i++) {
Eaver[i] = Esum[i] / (float)n;
}
printf("计算完成\n");
//return 1;
}
void Sadd(stu p[], int n, int N, float Saver[]) {
Sub* q; //stu* q = p;
for (int i = 0; i < n; i++) {
for (q = p[i].clas; q != NULL; q = q->next) { //for (int j = 0; j < N; j++)
p[i].Snum += q->num;
//q[i].clas = q[i].clas->next;
}
}
for (int i = 0; i < n; i++) {
Saver[i] = p[i].Snum / (float)N;
}
printf("计算完成\n");
//return 1;
}
void print_Stuadd(stu p[], int n, int N, float Saver[], float Esum[], float Eaver[])
{
Sub* q;
for (int i = 0; i < n; i++) {
printf("id:%ld name:%s ", p[i].id, p[i].name);
for (q = p[i].clas; q != NULL; q = q->next) {
printf("%s:%.2f ", q->cla, q->num);
}
printf("sum:%.2f avg:%.2f\n", p[i].Snum, Saver[i]);
}
for (int i = N-1; i >= 0; i--)
printf("Esum:%.2f Eavg:%.2f ", Esum[i], Eaver[i]);
printf("\n");
}