实验内容:

从文件中读取学生信息并打印。完成以下编程实验,调试运行程序并完成报告。

设每个学生包含如下信息:

属性名

姓名

专业名称

英语成绩

线性代数成绩

C成绩

总成绩

类型

字符串

字符串

整数

整数

整数

整数(初始化为0)

  1. 设计一个表示学生信息的结构体 struct student;
  2. 编写函数从文件读入所有学生信息:
    1. 函数定义 int ReadStudentInfo(const char* filename, struct student** pStudents); 函数返回值:返回学生个数,失败返回-1。输入参数const char* filename:数据文件名;struct student** pStudents:返回读取的学生信息,内存由ReadStudentInfo函数分配,main函数释放。
    2. 建议函数流程:
      1. 打开数据文件,失败返回-1;
      2. 从头到尾扫描数据文件(即预读一遍)获得学生人数;
      3. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存;
      4. 利用fseek函数,定位到文件头;
      5. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中;
      6. 关闭文件;
      7. 返回学生人数。
    3. 数据文件格式说明:

一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如:

张三 通信 89 93 95

李四 网络 88 91 94

王五 物联网 71 94 88

  1. 编写统计函数:

    1. 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。
    2. 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。
    3. 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。
  2. 编写信息输出函数:

要求通过一定的格式控制符,使得输出美观。输出格式为:

学生信息:

-----------------------------------------------------

序号 姓 名 专业名称 英语成绩 线性代数成绩 C成绩 总成绩

1 张三      通信       89           93     95    277

2 … …

统计信息:

-----------------------------------------------------

序号 专业名称 学生人数 平均成绩

1     通信     322      242

2 … …

  1. 编写main函数实现:

    1. 定义变量,其中保存学生信息的数据文件直接在源代码中初始化;
    2. 读取学生信息,如果失败,打印失败信息并退出程序;
    3. 统计学生信息;
    4. 输出统计信息。
    5. 释放内存。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student{char name[25];char major[25];int english;int algebra;int C;int total;
};
int SICE=0,NE=0,IOT=0,ave_SICE=0,ave_NE=0,ave_IOT=0;
int ReadStudentInfo(const char* filename,struct student** pStudents);
void Count(struct student pStudents[], int num);
int main()
{int num,i;struct student *STU;num=ReadStudentInfo("students.txt",&STU);printf("学生信息:\n");printf("------------------------------------------------------\n");printf("序号 姓  名 专业名称 英语成绩 线性代数成绩 C成绩 总成绩\n");for(i=0;i<num;i++){printf("%4d %6s %8s %8d %12d %5d %6d\n",i+1,(STU+i)->name,(STU+i)->major,(STU+i)->english,(STU+i)->algebra,(STU+i)->C,(STU+i)->total);}Count(STU,num);printf("\n\n统计信息:\n");printf("------------------------------------------------------\n");printf("序号 专业名称 学生人数 平均成绩\n");printf("%4d %8s %8d %8d\n",1,"通信",SICE,ave_SICE);printf("%4d %8s %8d %8d\n",2,"网络",NE,ave_NE);printf("%4d %8s %8d %8d\n",3,"物联网",IOT,ave_IOT);free(STU);//printf("%d %d %d %d %d %d",SICE,NE,IOT,ave_SICE,ave_NE,ave_IOT);return 0;
}
int ReadStudentInfo(const char* filename,struct student** pStudents)
{FILE* fp;int num=0,i;char str[50];if((fp=fopen(filename,"r"))==NULL) return -1;while(fgets(str,100,fp)!=NULL) num++;fseek(fp,0,SEEK_SET);*pStudents=(struct student*)malloc(sizeof(struct student)*num);for(i=0;i<num;i++){fscanf(fp,"%s %s %d %d %d",(*pStudents+i)->name,(*pStudents+i)->major,&(*pStudents+i)->english,&(*pStudents+i)->algebra,&(*pStudents+i)->C);(*pStudents+i)->total=(*pStudents+i)->english+(*pStudents+i)->algebra+(*pStudents+i)->C;//fread((*pStudents+i),sizeof(struct student),1,fp);}fclose(fp);return num;
}
void Count(struct student pStudents[], int num)
{int i;for(i=0;i<num;i++){if(strcmp(pStudents[i].major,"通信")==0){SICE++;ave_SICE+=pStudents[i].total;}if(strcmp(pStudents[i].major,"网络")==0){NE++;ave_NE+=pStudents[i].total;}if(strcmp(pStudents[i].major,"物联网")==0){IOT++;ave_IOT+=pStudents[i].total;}}ave_SICE/=SICE;ave_NE/=NE;ave_IOT/=IOT;
}

讲解:

注意:运行此程序时,请确保源代码与“students.txt”在同一目录下。

实验8主要考察:文件输入/输出,结构体指针运用,动态内存。

有关文件输入/输出这里引入相关链接:点击进入。

己见:由于实验报告说的并不清楚,所以只能写出针对本题附件中“students.txt”的相关操作,如果另有测试文件,例如增加专业“计算机”等,本程序无法实现。另外对于题目中的设计带参数的宏,我不解,直接用strcmp()不是很好吗。当然,如果有小伙伴追求更快更强更完美,可以自行修改count函数,使用带参宏。

求实求真,大气大为。

#ex8 C语言标准实验报告相关推荐

  1. 2019春第二次课程设计实验报告

    2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...

  2. JAVA第二次验证设计性实验报告

    [实验任务一]:素数输出 (3)实验报告中要求包括程序设计思想.程序流程图.源代码.运行结果截图.编译错误分析等内容. 1.   实验内容 (1)计算并输出3~100之间的素数. (2)编程满足下列要 ...

  3. 计算机网络实验报告建立校园网,计算机网络实验报告

    设计性实验报告 一.实验目的 通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解:通过路由建立起网络之间的连接,熟悉交换机.路由器的基本操作命令,了解网络路由的设计与配置. 二.背景描 ...

  4. c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc

    操作系统--最高响应比优先调度算法实验报告. 进程调度一.实验题目与要求 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法.实现具体包括:首先确定作业控制块的内容和组成方式:然 ...

  5. 计算机网络实验可变长子网掩码,计算机网络实验3-子网掩码与划分子网实验报告.docx...

    PAGE PAGE # / 5 上机实验报告三 -.实验目的 (1 )掌握子网掩码的算法. 了解网关的作用. 熟悉模拟软件 packet tracer5.3的使用. 二.实验内容 1.( 1) 172 ...

  6. 实验报告Linux操作系统基本命令,linux操作系统实验报告全部.doc

    linux操作系统实验报告全部 计算机操作系统 实验报告 学 号:姓 名:提交日期:2014.12.15成 绩: 东北大学秦皇岛分校 [实验题目]熟悉Linux/UNIX操作系统[实验目的]1.熟悉L ...

  7. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

  8. labview简易计算机实验报告,labview实验报告..doc

    学院:电气工程学院 班级:自112班 姓名:何富裕 学号:1112011060 实验一 一.实验目的 熟悉LabVIEW软件的基本编程环境. 二.实验内容 创建并保存一个VI程序.此VI要实现的功能是 ...

  9. c语言实验报告管理系统,C语言实验报告-学生信息资管理系统.doc

    C语言实验报告-学生信息资管理系统 C语言实验报告 院系: 数学与计算科学学院 班级: 信息与计算科学2班 姓名: 学号: 2011年12月21日 一.问题描述 编写一个信息管理系统,包括姓名.性别. ...

最新文章

  1. ubuntu中PyCharm的安装与卸载
  2. mysql中主从_MySQL的主从
  3. 创建型模式——抽象工厂模式
  4. Information_Schema系统表
  5. Java 多线程学习笔记
  6. codevs 1164 统计数字
  7. python背景怎么自定义铃声_【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声...
  8. 我的毕业生涯至从零开始从事编程开发
  9. mysql stmt fetch,mysql_stmt_fetch 奇怪的问题..
  10. 物理机能够ping通虚拟机,但是虚拟机无法ping通物理机
  11. c语言if语句用法总结,C语言if语句总结.doc
  12. c语言寻找完全平方数,菜鸟求助,要怎么求完全平方数?
  13. flex 调用 flash影片剪辑
  14. 计算机硬盘分区win7,win7移动硬盘怎么分区|win7移动硬盘分区的方法
  15. Informix数据库查询表的锁级别
  16. qq空间把android改成iphone,qq空间改iPhone6 Plus的教程
  17. 使用fastText实现文本分类-java版
  18. 游戏设计自学记录(20)
  19. 电声乐器的演奏特征与制作技巧-----(3)吉他篇
  20. ssoj4015: 永琳的竹林迷径(path)

热门文章

  1. 记一次使用Cobar踩到的坑
  2. 低成本、云边端、软硬件一体化智能视频监控解决方案
  3. NRF52832官方SDK介绍
  4. Linux 平台下 误删 oracle 数据文件的恢复方法
  5. 电脑清灰,你的电脑能有多脏 论清灰的重要性
  6. JAVA基础复习(一)
  7. R语言(ggplot2绘图)
  8. UNIAPP中腾讯地图选点组件和wx.getLocation配合使用,实现定位当前位置,并获取当前位置信息。
  9. MATLAB绘图,在指定位置添加文本
  10. android google 分屏 多窗口 按home键界面错乱故障分析(一)分屏的整个流程分析