资源描述
《C语言程序设计实训1》报告
设 计 题 目: 基于数组得学生信息管理系统
学 院 名 称: 信息科学技术学院
专 业: 计算机科学与技术
班 级:
姓 名: 学 号
指 导 教 师:
提 交 日 期: 2014年12月22日
一、实验内容
编写并调试程序,实现学校各专业班级学生信息得管理。10个学生得信息存储在文件studentInit、dat中。在头文件student、h中定义学生信息得结构体类型,包括:学号、姓名、专业、班级、3门成绩;与符号常量N(学生数)。(同一班级得学生可以属于不同得专业,同一专业得学生可以属于不同得班级)
#define N 10
struct Student{
char num[15];//学号
char name[15];//姓名
char major[10];//专业(puter,software,network)
int classNo;//班级(1-2)
int score[3];//3门课得成绩(0-2)
};
typedef struct Student STU;
二、实验要求
(1) main函数:以菜单形式将各项功能提供给用户,根据用户得选择,调用相应得函数。
STU student[N]; //保存输入得N名学生信息
(2) 定义函数void Input(STU *p, int n):从文件sutdentInit中输入n个学生得信息。
(3) 定义函数void Output(STU *p):将p所指得某个学生信息表格化屏幕输出。
(4) 定义函数STU Fetch(int studentIndex):从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生得信息。
(5) 定义函数void Search(STU *p, int classNo, char s, int scoreSum);:实现班级与成绩得综合查找(如1班,总分>240得同学)。
(6) 定义函数int Max(STU *p, int scoreIndex):求所有学生、下标为scoreIndex得课程分数最高得学生序号(在数组中得下标),学生序号作为返回值。
(7) 定义函数void Sort_select(STU *p): 对所有学生,按平均成绩由低到高进行简单选择排序。
(8) 定义函数void Sort_buble(STU *p, int n); 对某个班级得学生,按平均成绩由高到低进行起泡排序。并调用Output输出。
定义局部变量:
STU stu_class_ave[N]; //按平均成绩排序后得某个班级得学生信息;
int count; //实际元素个数
(9) 定义函数void Sort_insert(STU *p, int n, char *major):对某个专业得学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出。
定义局部变量:
STU stu_class_ subject [N]; //按某门课程成绩排序后得某个专业得学生信息;
int count; //实际元素个数
(10) 定义函数void Save(STU *p,int n) :将学生信息存入文件。
四、程序清单(关键语句与变量加注释)
1.头文件,类型定义,函数声明
#include <stdio、h>
#include <stdlib、h>
#include <string、h>
#define N 10
struct Student{
char num[15];
char name[15];
ﻩchar major[10];
int classNo;
int score[3];
};
typedef struct Student STU;
void Input(STU * p,int n);//从文件sutdentInit中输入n个学生得信息
void Output(STU * p);//将p所指得某个学生信息表格化屏幕输出
STU Fetch(int studentIndex);//从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生得信息
void Search(STU * p,int classNo,char s,int scoresum);//实现班级与成绩得综合查找(如1班,总分>240得同学)
int Max(STU * p,int scoreIndex);//求所有学生、下标为scoreIndex得课程分数最高得学生序号(在数组中得下标),学生序号作为返回值
void Sort_select(STU * p);//对所有学生,按平均成绩由低到高进行简单选择排序
void Sort_buble(STU * p,int n);//对某个班级得学生,按平均成绩由高到低进行起泡排序
void Sort_insert(STU * p,int n,char * major);//对某个专业得学生,按某门课程成绩由低到高进行直接插入排序
void Save(STU * p,int n);//将学生信息存入文件
2、主函数
#include "student、h"
void main()
{
int i,n,id,num,m,sub,corse;//n,第几个结构体;id,菜单序号;num,班级号;sub,学生下标;corse,课程下标
ﻩchar majorname;//专业名称
STU students[N];
ﻩSTU tem;
ﻩwhile(1){
ﻩﻩprintf("\n请输入功能编号,运行相应功能\n");
printf("\n1、您将从文件中读取10个人得信\n");
printf("\n2、您将从文件中随机读取第n(0<=n<=9)个学生得信
息\n")
ﻩprintf("\n3、您将根据某一班级某一专业总分超过多少进行查
找\n");
ﻩﻩprintf("\n4、您将求某一课程分数最高得学生序号得下标\n");
printf("\n5、您将对平均成绩由低到高进行简单选择排序法\n
");
ﻩﻩprintf("\n6、您将对某一个班得平均成绩由低到高进行起泡排
序法\n");
ﻩﻩprintf("\n7、您将对某门专业得学生得某门课程成绩由低到高
进行直接插入排序法\n");
printf("\n8、您将把学生信息存入文件\n");
ﻩscanf("%d",&id);
ﻩﻩgetchar();
ﻩswitch(id){
ﻩﻩcase 1:
ﻩﻩ {
ﻩprintf("\n从文件中读取信息\n");
ﻩ Input(students,sizeof(students)/sizeof(STU));//调用Input函数,sizeof(students)/sizeof(STU)表示要读取几个学生得信息
ﻩprintf("\n学号 姓名 专业 班级 课程1
课程2 课程3\n");
ﻩﻩ for(i=0;i<N;i++)
Output(students+i);//调用Output函数
ﻩﻩﻩﻩbreak;
ﻩ }
ﻩ case 2:
ﻩﻩ {
ﻩ ﻩprintf("\n请输入您想从文件中读取第几个结构体信
息(<%d)\n",N);
ﻩ scanf("%d",&n);
ﻩﻩ tem=Fetch(n);//Fetch
ﻩﻩﻩ printf("\n下面就是第%d个结构体得信息\n",n);
ﻩﻩﻩ printf("\n学号 姓名 专业 班级 课程1
课程2 课程3\n");
ﻩOutput(&tem);//调用Output函数
ﻩﻩ ﻩbreak;
ﻩ }
ﻩ case 3:
ﻩﻩ {
ﻩprintf("\n请输入班级号num(1或2)\n");
ﻩﻩ printf("\n请输入专业名称majorname(puter=c,
software=s,network=n)\n");
ﻩﻩﻩprintf("\n请输入一个分数m(0<m<300)\n");
ﻩﻩ scanf("%d",&num);
ﻩﻩ getchar();
ﻩ ﻩ scanf("%c",&majorname);
ﻩ getchar();
ﻩ ﻩ scanf("%d",&m);
ﻩ Search(students,num,majorname,m);//调用Search函数
break;
ﻩ}
ﻩcase 4:
{
ﻩprintf("\n请输入某一课程下标corse(0,1,2)\n");
scanf("%d",&corse);
ﻩ ﻩsub=Max(students,corse);//调用Max函数,返回值给sub
ﻩﻩ printf("\n下面就是课程%d最高分学生得信息\n",corse);
ﻩprintf("\n学号 姓名 专业 班级 课程0
课程1 课程2\n");
ﻩ ﻩ Output(students+sub);//调用Output函数
ﻩ break;
}
ﻩcase 5:
ﻩ ﻩ{
ﻩﻩﻩﻩprintf("\n下面就是对所有学生得平均成绩简单选择排序后得顺序:\n");
ﻩ ﻩSort_select(students);//调用Sort_select函数
ﻩﻩbreak;
ﻩﻩ }
ﻩﻩcase 6:
ﻩ ﻩ{
ﻩ printf("\n请输入一个班级号num(1或2)\n");
ﻩ scanf("%d",&num);
ﻩ ﻩprintf("\n下面就是对某个班级起泡排序后顺序:\n");
ﻩ Sort_buble(students,num);//调用Sort_buble函数
ﻩ ﻩbreak;
ﻩ ﻩ}
case 7:
{
ﻩ ﻩﻩprintf("\n请输入某一课程下标corse(0,1,2)\n");
ﻩﻩ printf("\n请输入专业名称majorname(puter=c,
software=s,network=n)\n");
ﻩ scanf("%d",&corse);
ﻩgetchar();
ﻩ ﻩscanf("%c",&majorname);
ﻩ ﻩﻩprintf("\n下面就是对某一专业学生得某一课程直接插
入排序后得顺序:\n");
ﻩﻩ ﻩSort_insert(students,corse,&majorname);//调用Sort_insert函数
ﻩﻩﻩ break;
ﻩ}
ﻩ case 8:
ﻩﻩ {
ﻩ ﻩSave(students,sizeof(students)/sizeof(STU));//调用Save函数,sizeof(students)/sizeof(STU)表示要保存几个学生得信息
ﻩﻩﻩ break;
ﻩ }
default:
ﻩ {
ﻩﻩbreak;
ﻩ ﻩ}
ﻩﻩif((id<1)||(id>8))
ﻩﻩﻩbreak;
ﻩ }
}
}
3、Input函数
#include "student、h"
void Input(STU * p,int n)
{
FILE * fp;
ﻩchar [15];
ﻩprintf("\n请输入打开文件名:\n");
gets();
ﻩfp=fopen(,"r");
ﻩfread(p,sizeof(STU),n,fp);
ﻩfclose(fp);
}
4、Output函数
#include "student、h"
void Output(STU * p)
{
printf("\n%-5s%-10s%-8s%6d%6d%7d%7d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}
5、Fetch函数
#include "student、h"
STU Fetch(int studentIndex)
{
ﻩSTU tem;
ﻩFILE * fp;
char [15];
if((studentIndex<0)||(studentIndex>N-1)){
ﻩ printf("studentIndex error\n");
ﻩ exit(0);
ﻩ }
getchar();
printf("\n请输入打开文件名:\n");
gets();
fp=fopen(,"r");
ﻩfseek(fp,(long)(studentIndex*sizeof(STU)),SEEK_SET);
ﻩfread(&tem,sizeof(STU),1,fp);
ﻩfclose(fp);
return tem;
}
6、Search函数
#include "student、h"
void Search(STU * p,int classNo,char s,int scoreSum)
{
ﻩint i;
ﻩfor(i=0;i<N;i++){
if((p+i)->classNo==classNo)
if((p+i)->major[0]==s)
ﻩ if(((p+i)->score[0]+(p+i)->score[1]+(p+i)->
score[2])>scoreSum){
ﻩprintf("\n下面就是班级%d专业%c超过%d分得学生
信息\n",classNo,s,scoreSum);
ﻩ ﻩ printf("\n学号 姓名 专业 班级
课程1 课程2 课程3\n");
ﻩ ﻩOutput(p+i);
}
}
}
7.Max函数
#include "student、h"
int Max(STU * p,int scoreIndex)
{
ﻩint i=0,max,result;
ﻩmax=(p+i)->score[scoreIndex];
result=i;
for(i=1;i<N;i++){
ﻩﻩif((p+i)->score[scoreIndex]>max){
ﻩ ﻩmax=(p+i)->score[scoreIndex];
ﻩﻩﻩresult=i;
ﻩ}
}
ﻩreturn result;
}
8、 Sort_select函数
#include "student、h"
void Sort_select(STU * p)
{
int i,j,k;
ﻩfloat sum,ave[N],t;
STU tem;
ﻩfor(i=0;i<N;i++){
ﻩsum=0、0;
ﻩsum=sum+(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2];
ﻩ ave[i]=sum/3;ﻩ
}
ﻩfor(i=0;i<N-1;i++){
k=i;
ﻩfor(j=k+1;j<N;j++){
ﻩ if(ave[j]<ave[k])
ﻩ k=j;
ﻩ }
ﻩﻩt=ave[k];
ﻩave[k]=ave[i];
ave[i]=t;
ﻩ tem=*(p+k);
ﻩ*(p+k)=*(p+i);
*(p+i)=tem;
}
printf("\n学号 姓名 专业 班级 课程1 课程2
课程3\n");
for(i=0;i<N;i++)
ﻩ Output(p+i);
}
9、 Sort_buble函数
#include "student、h"
void Sort_buble(STU * p,int n)
{
STU stu_class_ave[N],tem;
ﻩint i,j=0,count=0;
ﻩfloat sum,ave[N],t;
for(i=0;i<N;i++)
ﻩ if((p+i)->classNo==n){
ﻩ ﻩcount++;
ﻩﻩstu_class_ave[j]=*(p+i);
ﻩﻩ j++;
ﻩﻩsum=0、0;
ﻩ sum=sum+(p+i)->score[0]+(p+i)->score[1]+
(p+i)->score[2];
ﻩ ave[i]=sum/3;
}
for(i=0;i<count-1;i++)
ﻩ for(j=0;j<count-i-1;j++)
ﻩif(ave[j]>ave[j+1]){
ﻩ t=ave[j];
ﻩﻩﻩ ave[j]=ave[j+1];
ﻩave[j+1]=t;
ﻩﻩ tem=stu_class_ave[j];
ﻩ stu_class_ave[j]=stu_class_ave[j+1];
ﻩﻩ stu_class_ave[j+1]=tem;
ﻩﻩﻩ}
printf("\n学号 姓名 专业 班级 课程1 课程2
课程3\n");
for(j=0;j<count;j++)
ﻩ Output(stu_class_ave+j);
}
10、 Sort_insert函数
#include "student、h"
void Sort_insert(STU * p,int n,char * major)
{
STU stu_class_subject[N];
int i=0,j=1,count=0;
ﻩfor(i=0;i<N;i++)
if(* major==(p+i)->major[0]){
count++;
stu_class_subject[j]=* (p+i);
ﻩﻩj++;
ﻩ}
ﻩfor(i=2;i<=count;i++){
stu_class_subject[0]=stu_class_subject[i];
for(j=i-1;stu_class_subject[0]、score[n]<stu_class_subject
[j]、score[n];j--)
ﻩstu_class_subject[j+1]=stu_class_subject[j];
ﻩﻩstu_class_subject[j+1]=stu_class_subject[0];
}
ﻩprintf("\n学号 姓名 专业 班级 课程1 课程2
课程3\n");
for(j=1;j<=count;j++)
ﻩ Output(stu_class_subject+j);
}
11、 Save函数
#include "student、h"
void Save(STU * p,int n)
{
FILE * fp;
ﻩchar [15];
ﻩint i;
ﻩprintf("\n请输入保存得文件名:\n");
ﻩgets();
ﻩif((fp=fopen(,"wb"))==NULL){
ﻩﻩprintf("cannot open file\n");
ﻩ return;
ﻩ}
for(i=0;i<n;i++){
ﻩ if(fwrite(p++,sizeof(STU),1,fp)!=1)
ﻩ printf(" error\n");
}
五、程序测试(Input、Search、Max、Sort_buble、Sort_insert函数得调用及执行结果得截图)
1、Input 函数
2、Search函数
3、Max函数
4、Sort_buble函数
5、Sort_insert函数
展开阅读全文