b) 建议函数流程:
i. 打开数据文件,失败返回-1;
ii. 从头到尾扫描数据文件(即预读一遍)获得学生人数;
iii. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存;
iv. 利用rewind函数,定位到文件头;
v. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中;
vi. 关闭文件;
vii. 返回学生人数。
c) 数据文件格式说明:
一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如:
张三 通信 89 93 95
李四 网络 88 91 94
王五 物联网 71 94 88
编写统计函数:
a) 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。
b) 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。
c) 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。编写main函数实现:
a) 定义变量,其中保存学生信息的数据文件直接在源代码中初始化;
b) 读取学生信息,如果失败,打印失败信息并退出程序;
c) 统计学生信息;
d) 输出统计信息。
e) 释放内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char name[15];
char major[15];
int Eng_sco;
int cal_sco;
int c_sco;
int sum;
};
int tx_per=0,tx_ave,tx_sum=0;
int wl_per=0,wl_ave,wl_sum=0;
int wlw_per=0,wlw_ave,wlw_sum=0;
int ReadStudentInfo(const char* filename, struct student** pStudents);
void Count(struct student pStudents[], int num);
int main()
{
int count;
int m;
struct student *list;
count=ReadStudentInfo("readme.txt", &list);
printf("学生信息: \n");
printf("----------------------------------------------------\n");
printf("序号 姓 名 专业名称 英语成绩 线性代数成绩 c语言成绩 总成绩\n");
for(m=1;m<=count;m++)
{
printf("%4d %s %s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum);
}
Count(list, count);
printf("\n统计信息 :\n");
printf("----------------------------------------------------\n");
printf("序号 专业名称 学生人数 平均成绩\n");
printf(" 1 通信 %d %d\n",tx_per,tx_ave);
printf(" 2 网络 %d %d\n",wl_per,wl_ave);
printf(" 3 物联网 %d %d\n",wlw_per,wlw_ave);
return 0;
}
int ReadStudentInfo(const char* filename, struct student** pStudents)
{
FILE *fp;
char ch;
int i=1,j;
fp=fopen(readme.txt,"r");
if(fp==NULL)
{
printf("cann't open the file");
exit(-1);
}
ch=fgetc(fp);
while(ch!=EOF)
{
if(ch=='\n')
{
i++;
}
ch=fgetc(fp);
}
rewind(fp);
*pStudents=(struct student*)malloc(sizeof(** pStudents)*i);
for(j=0;j<i;j++)
{
fread(&*pStudents[j],sizeof(struct student)-sizeof(int),1,fp);
(*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco);
}
fclose(fp);
return i;
}
void Count(struct student pStudents[], int num)
{
int n=1;
for(n=1;n<=num;n++)
{
if(!strcmp((pStudents+n-1)->major,"通信"))
{
tx_per++;
tx_sum=tx_sum+(pStudents+n-1)->sum;
}
if(!strcmp((pStudents+n-1)->major,"网络"))
{
wl_per++;
wl_sum=wl_sum+(pStudents+n-1)->sum;
}
if(!strcmp((pStudents+n-1)->major,"物联网"))
{
wlw_per++;
wlw_sum=wlw_sum+(pStudents+n-1)->sum;
}
tx_ave=tx_sum/tx_per;
wl_ave=wl_sum/wl_per;
wlw_ave=wlw_sum/wlw_per;
}
free(pStudents);
}
运行不起来,是哪里出问题了?