《C语言程序设计》-综合性实验实验报告(参考格式)

时间:2024.4.7

 

综合性实验报告

        

                                                                           

一、实验目的和要求

实验目的

1、利用所学的三种程序基本结构以及数组、用户自定义函数进行一个小型程序的设计,进一步理解和掌握C语言的语法以及三种基本程序结构的综合应用。

2、通过程序中涉及到的排序、查找、求和等操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。

实验要求

1、根据实验内容,认真编写源程序代码、上机调试程序,书写实验报告。

2、分小组协作实验时,要写明每一位学生负责的实验内容。

二、设计要求

(一)学生信息和程序功能

给定的原始数据和程序应实现的功能是该C程序开发的依据,此实验只处理一个班级学生信息,最多学生数为120人。

1、学生信息和数据类型

最多学生人数和最多课程数定义为全局符号常量:

#define Mmax 120

#define Nmax 3

(1)学生信息

学生信息包含:学号,姓名,三门课(语文,数学,英语)成绩和总分。

(2)数据类型

学号、姓名、课程三个信息为char型,课程分数和总分为float型,其余为int型。其中,假设学号有10位数字字符(注意此时要求存储空间要11个字节),例如2011023102表示入学年份为20##年,023是专业编码,102是学生在班级中的排号。

2、测试数据

测试数据在定义数组时以初值形式提供,其中学生总成绩通过程序计算。

但是,在用单链表处理学生信息时,要求直接从键盘上接收数据。

3、程序功能

(1)学生信息(学号、姓名、成绩等)的显示(数据结构要求用数组);

(2)按姓名查找学生(数据结构要求用数组);

(3)计算各门课程的平均分(数据结构要求用数组);

(4)计算学生总成绩,并按总成绩进行排序(数据结构要求用数组);

(5)按总成绩降序显示学生信息;

(6)学生记录的插入;

(7)用单链表(结构体)处理班级学生信息(学号、姓名、成绩等),包括学生信息输入(添加)、学生信息浏览、学生总成绩计算和将学生信息存入文件。

其中第(7)为选作内容,如果学生能够做出来,实验成绩应给予加分奖励。

(二)程序总体设计

1、数据结构

依据给定的学生信息和数据类型,定义相应的数组和结构体类型分别如下:

Ø  课程名称定义为全局数组:

char course[Nmax][50] = {"Chinese","Mathematic","English"};

Ø  学生结构体类型如下:

struct student

{    

       char       code[11]; /* 学号 */

       char     name[20];    /* 姓名 */

       float       score[Nmax]; /* 各课程成绩 */

       float    total;       /* 总分 */

       struct student  *next;

};

以下的数组或变量均为局部类型的(可放在main函数中加以定义):

Ø  sno数组存储学生学号,可事先加入初始数据若干条:

       char  sno[Mmax][11]={"2011023001","2011023002","2011023003","2011023004"};

Ø  name数组存储学生姓名,可事先加入初始数据若干条; namesearch数组用于存储要查找的学生姓名:

       char  name[Mmax][20]={"Zhang","Li","Cheng","Wang"}, namesearch[20];

Ø  score数组存储学生成绩;假设至多有M名学生,N门课程,可事先加入初始数据若干条; avecourse数组存储每门课程的平均分,实际计算时可事先初始化:

       float  score[Mmax][Nmax]={ {73.5,85,67}, {83,91.5,87},{65, 82, 78},{71,83,80.5}};

float  avecourse[Nmax]={0}; 

Ø  tscore数组存储每位学生成绩的总分:

       float tscore[Mmax]={0};

Ø  index数组为排名索引(约定为降序),存储每位学生总成绩在tscore 数组中的名次(即index[0]存放了总分第一的学生在tscore数组中的下标, index[1]存放了总分第二的学生在tscore数组中的下标,依次类推):

       int   index[Mmax];

Ø  M为实际学生数; N为实际课程数; M、N的值要根据插入或删除学生记录情况加以适时修改:

int   M=4, N=3;

2、模块划分

依据程序的数据结构和功能,遵照“自顶向下”原则,采用基于函数的逐步求精法,描述该程序的层次结构。该程序可按给定的程序功能直接描述模块层次结构。该程序要求保留一种排序状态:按总分排序。

 

在C语言中,模块用函数实现,函数原型清单如下(注意:以下各函数原型中很多地方用到了指向一维数组的指针变量或指向二维数组的指针变量,也可以将之对应的定义为形参数组的形式进行处理):

1-1  计算所有课程的平均分

void averagemark(float (*pscore)[Nmax], float *pavecourse, int m, int n)

1-2  计算每位学生所修课程总分

void totalmark(float (*pscore)[Nmax], float *ptscore, int m, int n)

1-3  按姓名查找学生记录

int retrievebyn(char (*pname)[20], char *pnamesearch, int m)

1-4  浏览全部学生信息

void displaystu(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int m, int n)

1-5  按总分降序浏览全部学生信息

void displaystusort(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pindex, int m, int n)

1-6  添加新的学生记录

void insert(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pm, int n)

1-7  用单链表进行班级成绩管理

void linkprocess()

2-1  按总分递减排序

void sortscore(float *ptscore, int *pindex, int m)

2-2  输入和添加学生信息

struct student *appendstuinfo(struct student *head)

2-3  浏览学生信息

void displaylist(struct student *head)

2-4  保存学生信息

void savestuinfo(struct student *head)

模块层次结构只是确定模块之间的关系和函数原型,不是程序的执行步骤。程序总体框架是该程序的总体流程图。该程序不是顺序执行全部功能,而是在某一时刻有选择地执行一种或多种功能。因此,选用菜单方式是较佳的方案。

三、小组各成员分工协作情况说明

    成员:             负责编写的函数是:                                    

    成员:             负责编写的函数是:                                    

    成员:             负责编写的函数是:                                    

四、编程体会(或是对实验系统做进一步改进的思考)

五、程序代码

以下给出了程序的基本框架,请完成函数的功能及函数调用等程序代码的编写工作。

#include <stdlib.h>

#include <string.h>

#include <malloc.h>

#include <stdio.h>

#define  Mmax  120   /*记录最大学生数*/

#define  Nmax  3     /*记录学生选课最大课程数目*/

char course[Nmax][50] = {"Chinese","Mathematic","English"};//以全局变量的形式给出各门课程的名称

/*当使用单链表进行班级成绩管理时,使用如下的结构体类型*/

struct student

{      

         char code[11];   

         char   name[20];    /* 姓名 */

         float score[Nmax]; /* 各课程成绩 */

         float  total;                   /* 总分 */

         struct student  *next;

};

/*以下是各函数的声明,其中下面的7个函数和main函数是首先要实现的*/

void  averagemark(float (*pscore)[Nmax], float *pavecourse, int m, int n);

void  totalmark(float (*pscore)[Nmax], float *ptscore, int m, int n);

int    retrievebyn(char (*pname)[20], char *pnamesearch, int m);

void  displaystu(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int m, int n);

void  displaystusort(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pindex, int m, int n);

void  insert(char (*psno)[11], char (*pname)[20], float (*pscore)[Nmax], float *ptscore, int *pm, int n);

void  sortscore(float *ptscore, int *pindex, int m);

/*以下各函数是用单链表进行班级成绩管理时,需要用到函数。实际编程时,先实现以上的7个函数及main函数,而对下面4个函数在具体编程时,可只给出相应空函数形式,等真正要实现时,再具体编写它们*/

void  linkprocess();/*这是函数的声明*/

struct student  *appendstuinfo(struct student *head);

void  displaylist(struct student *head);

void  savestuinfo(struct student *head);

/*下面是main函数,但需要你完善函数的调用;如果变量不够用,请自行添加*/

void main()

{      

         /*sno数组存储学生学号,可事先加入初始数据若干条*/

         char  sno[Mmax][11]={"2011023001","2011023002","2011023003","2011023004"};

         /*name数组存储学生姓名; namesearch数组用于存储要查找的学生姓名*/

         char  name[Mmax][20]={"Zhang","Li","Cheng","Wang"}, namesearch[20];

         /*score数组存储学生成绩;avecourse数组存储每门课程的平均分,实际计算时要初始化*/

         float score[Mmax][Nmax]={ {73.5,85,67}, {83,91.5,87},{65, 82, 78},{71,83,80.5}}, avecourse[Nmax]={0};  

         /*tscore数组存储每位学生成绩的总分*/

         float tscore[Mmax]={0};

         /*index数组为排名索引(约定为降序)*/

         int   index[Mmax];

         int   M=4, N=3; /* M为实际学生数; N为实际课程数; M、N的值可根据情况修改;由赋初值情况知M=4,N=3*/

         int i,j;

         char c;

         while(1)

         {

                   system("cls");/*清屏操作*/

                   printf("\n\t 这是班级成绩管理系统,请选择你要的操作:\n\n");

                   printf("\t\t 1 : 计算所有课程的平均分\n");

                   printf("\t\t 2 : 计算每位学生所修各门课程的总分\n");

                   printf("\t\t 3 : 按姓名查找学生记录\n");

                   printf("\t\t 4 : 浏览全部学生信息\n");

                   printf("\t\t 5 : 按总分降序浏览全部学生信息\n");

                   printf("\t\t 6 : 添加(插入)新的学生记录\n");

                   printf("\t\t 7 : 用单链表进行班级成绩管理\n");

                   printf("\t\t 8 : 退出系统!\n");

                   printf("\n\n请输入命令: ");

                   scanf("%c",&c);           /* 输入选择命令 */

                   if(c=='8')

                   {

                            puts("\n 谢谢使用!");

                            break;                  /* 结束程序运行 */

                   }

                   switch(c)

                   {

                            case '1': /* 计算课程平均分 */

                                                                     ;/* 调用averagemark函数,计算课程的平均分 */

                                     printf("\n");

                                     for(j=0;j<N;j++)/*显示每门课程的平均分*/

                                               printf("%s课程的平均分是: %.2f.\n", course[j], avecourse[j] );

                                     getchar();

                                     getchar();

                                     break;

                            case '2': /* 计算每位学生总分 */

                                                                     ;/* 调用totalmark函数,计算每位学生总分 */

                                     printf("\n");

                                     for(i=0;i<M;i++)/*显示每位学生的总分*/

                                               printf("第%d名学生的总分是: %.2f.\n", i+1, tscore[i]);

                                     getchar();

                                     getchar();

                                     break;

                            case '3': /* 按学生的姓名寻找记录 */

                                     printf("请输入你想查找的学生姓名: ");        

                                     scanf("%s",namesearch);

                                                                                     ; /* 调用retrievebyn函数 */

                                     if(i==-1)

                                               printf("学生%s不存在.\n", namesearch);

                                     else

                                     {

                                               printf("\n你查找的学生记录是:\n");

                                               printf("学号: %s\n姓名: %s\n",sno[i], namesearch);

                                               for(j=0;j<N;j++)/*显示每门课程成绩*/

                                                        printf("%s课程成绩是: %.2f.\n", course[j], score[i][j] );

                                               printf("所修课程总分是:%.2f.\n", tscore[i]);

                                     }

                                     getchar(); getchar();

                                     break;

                            case '4': /* 浏览全部学生信息(包括学号、姓名、各门功课成绩和总成绩) */

                                                                                     ; /* 调用displaystu函数 */

                                     getchar(); getchar();

                                     break;

                            case '5': /* 按总分降序浏览全部学生信息(包括学号、姓名、各门功课成绩和总成绩) */

                                                                                    ; /* 调用displaystusort函数 */

                                     getchar();getchar();

                                     break;

                            case '6': /*添加(插入)新的学生记录*/

                                                                                    ; /* 调用insert函数 */

                                     getchar();getchar();

                                     break;

                            case '7': /*用单链表处理班级学生信息*/

                                                                                    ;/* 调用linkprocess函数 */

                                     getchar(); getchar();

                                     break;

                            default:

                                     printf("\n\n输入的命令不对,请重新输入!!\n");

                                     getchar(); getchar();

                                     break;

                   }

         }

}

/*下面请你编写各功能模块对应的函数*/

/*下面linkprocess 函数是先用空函数实现的实例,它是利用单链表进行班级成绩管理时,需要用到函数,该函数会调用appendstuinfodisplaylistsavestuinfo三个函数,等真正实现时,删掉以下linkprocess空函数对应的两行代码,再具体编写此四个函数*/

void  linkprocess()/*这是空函数*/

{}

/*下面请你编写函数声明中的前7个函数*/

更多相关推荐:
《C语言程序设计》课程设计报告(小组)

东莞理工学院《C语言程序设计》课程设计题目:图书信息管理系统院系:电子工程学院专业:电子信息工程年级:20##班别:2班指导教师:##组长:##同组成员:##目录一、目的....................…

c语言课程设计报告

C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体设计四详细设计五运行结果六课程设计体会一实验目的1通过课程设计加深对结构化程序设...

C语言课程设计报告

河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名学号专业班级计算机07-2班指导教师20XX年9月12日目录1.设计任务书21.…

C语言课程设计报告范例

C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的难点及解决办法四小结五附录原程序2一课程设计题目及所涉及知识点一课程设计题目1基...

厦门理工学院11级C语言C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求1二方案实现与调试221掷骰子游戏222射击游戏323汽车...

C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期专业计算机科学与技术班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求3二方案实现与调试321掷骰子游戏322汽车加...

c语言程序贪吃蛇课程设计报告

山东工商学院信电学院自动111班第一组贪吃蛇课程设计报告高级语言程序设计课程设计报告ExperimentDesigningreporter课程名称高级语言程序设计英文名称CProgramExperimentDe...

C语言程序设计报告—学生选修课程系统

C语言程序设计学校:中国地址大学学院:工程学院班级序号:学号:姓名:指导老师:C语言程序设计报告一、C语言课程设计的目的:高级语言课程设计是学习完《高级语言程序设计》课程后进行的一次全面的综合性上机实验。其目的…

C语言课程设计报告书样本

海南大学三亚学院C语言程序设计课程设计贪吃蛇算法专业计算机科学与技术班级计科1001姓名杨凯文题目学号指导老师李春林目录C语言程序设计课程设计11程序要求32程序分析与设计33流程图44源程序清单45调试过程1...

C语言课程设计报告—人事管理系统

人事管理系统前言:现代计算机技术的发展为人们的学习、生活、工作提供了很大的帮助,各行各业都需要特定计算系统的运用,我们需要了解这些系统是怎么样为我们服务以及他们是怎样编辑出来的。我们需要学习C语言编程,根据课堂…

C语言课程设计报告(通讯录)

设计说明书通讯录系统起止日期20xx年01月03日至20xx年01月08日学班学成生姓名级号绩XXX指导教师签字计算机与通信学院20xx年01月08日一课题任务设计一个通讯录管理系统课题的主要任务是1对通讯录信...

C语言课程设计报告 扫雷

程序课程设计基础课程设计扫雷游戏院系计算机科学技术学院计算机科学与技术师范班级师计091设计者徐群杨松徐春辉杨雷刘安然学号3224312504指导教师黄绍义20xx年12月25日1目录1概述311研究的背景及意...

c语言程序设计课程设计报告(34篇)