(一)要求:设计一个简单的学籍管理系统,包括的学生信息为:学号、姓名、年龄、C语言成绩。假设该班级学生10人,能够实现以下功能:
(1)输入10名学生的基本信息;
(2)输出10名学生的基本信息;
(3)输入学号/姓名,输出该学生的基本信息。
(4)c语言程序成绩降序排序;
(5)统计优、良、不及格的学生。
(二)数据结构分析 :
10名学生的学号、年龄、C语言成绩可分别用长度为10的一位数组sno(long int) 、sage(int)、cs(float)存储,10 名学生的姓名可以用长度为20个字符的一围数组,即字符型二维数组sname存储。
(三)算法分析
该系统主要可以由6个主要模块构成:输入学生的基本信息,输出学生的基本信息,查找学生的基本信息,排序,统计,退出。
(四)各模块的具体实现:
a. 输入学生的基本信息input
void input (unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int i;
//输入N个学生的基本信息
printf("请输入%d个学生的基本信息.\n",N);
for( i=0; i<N; i++)
{
printf("\n输入第%d个学生的\n",i+1);
printf("学号:");
scanf("%lu",&sno[i]);
//getchar();
printf("姓名:");
//gets(sname[i]);
scanf("%s",&sname[i]);
printf("年龄:");
scanf("%d",&sage[i]);
printf("成绩:");
scanf("%f",&cs[i]);
}
}
b.输出学生信息函数 output
void output(unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int i;
//输出i个学生的基本信息
printf("\n%d个学生的基本信息为\n",N);
for( i=0; i<N; i++)
{
printf("%-10lu",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
}
c.查找学生信息函数:两种方式,按学号查找和按姓名查找,对应函数snofind,snamefind
void snofind(unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int i;
unsigned long snol;
//按学号查找
printf("请输入您要查找的学号:");
scanf("%lu",&snol);
for(i=0; i<N; i++)
{
if(sno[i] == snol)
break;
}
if(i<N)
{
printf("学号为%lu的学生的基本信息为:\n",snol);
printf("%-10ld",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
else
printf("您输入的学号不存在!\n");
}
void snamefind( unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int i;
char sname1[20];
//按姓名查找
printf("请输入您要查找的姓名:");
getchar();
gets(sname1);
for(i=0; i<N; i++)
{
if( strcmp(sname[i], sname1) == 0)
break;
}
if(i<N)
{
printf("姓名为%s的学生的基本信息为:\n",sname1);
printf("%-10lu",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
else
printf("你输入的姓名不存在!\n");
}
d.排序模块函数:根据C语言的成绩对10名学生的成绩进行降序排列,实现函数为cssort
void cssort( unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
//按成绩降序排列
int i, j, k;
unsigned long tsno;
char tsname[20];
int tsage;
float tcs;
for( i=0; i<N; i++)
{
k=i;
for( j=i+1; j<N; j++)
{
if(cs[j]>cs[k])
k=j;
}
if(k != j)
{
//交换下标i与k对应学生信息
tsno=sno[i];
sno[i]=sno[k];
sno[k]=sno[i]; /*交换学号*/
strcpy(tsname,sname[i]);
strcpy(sname[i],sname[k]);
strcpy(sname[k],tsname); /*交换姓名*/
tsage=sage[i];
sage[i]=sage[k];
sage[k]=tsage; /*交换年龄 */
tcs=cs[i];
cs[i]=cs[k];
cs[k]=tcs;
}
}
}
e. 统计模块: 用于完成学生C语言成绩优、良、及格、以及不及格人数的统计, 实现函数total
void total (unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int i;
//统计
printf("\n\n\n优(成绩>=90)的学生为:\n");
for( i=0; i<N; i++)
{
if(cs[i]>=90)
{
printf("%-10lu",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
}
printf("\n\n\n良(成绩>=80)的学生为:\n");
for( i=0; i<N; i++)
{
if(cs[i]>=80 && cs[i]<90)
{
printf("%-10lu",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
}
printf("\n\n\n及格(成绩>=60)的学生为:\n");
for( i=0; i<N; i++)
{
if(cs[i]>=60 && cs[i]<80)
{
printf("%-10lu",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
}
printf("\n\n\n不及格(成绩<60)的学生为:\n");
for( i=0; i<N; i++)
{
if(cs[i]<60)
{
printf("%-10ld",sno[i]);
printf("%-16s",sname[i]);
printf("%-4d",sage[i]);
printf("%-6.0f",cs[i]);
printf("\n");
}
}
}
f.退出函数:exit(1);
(五) 主函数的设计
主函数的功能:
(1)变量的定义以及数组的定义;
(2) 显示界面;
(3) 选择操作;
其中第一步根据具体需求定义;第二模块由函数maininterface函数实现;而第三模块则由函数choice实现;
具体如下:
(1) 显示函数maininterface
void maininterface()
{
printf("\t\t**************************************************\n");
ptintf("\t\t************ 欢迎使用学籍管理系统 **************\n");
printf("\t\t*1.输入学生的额基本信息 2.输出学生的基本信息*\n");
printf("\t\t*3.查找学生的基本信息 4.排序 *\n");
printf("\t\t*5.统计 0.退出 *\n");
printf("\t\t*************************************************\n");
printf("\t\t请输入0-5:");
}
(2) 选择函数 choice
void choice( unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int m;
while(1)
{
scanf("%d",&m);
switch(m)
{
case 1:
input(sno,sname,sage,cs,N);
maininterface();
break;
case 2:
output(sno,sname,sage,cs,N);
maininterface();
break;
case 3:
findinterface();
findchoice(sno,sname,sage,cs,N);
break;
case 4:
cssort(sno,sname,sage,cs,N);
maininterface();
break;
case 5:
total(sno,sname,sage,cs,N);
maininterface();
case 0:
exit(1);
}
}
}
其中的findinterface用于显示查找模块的进入方式,选择学号查找或者姓名查找,findchoice()则是完成查找;
void findinterface()
{
printf("**************************************************\n");
printf("************* 欢迎使用查找操作 **************\n");
printf("*1.按学号查找 *\n");
printf("*2.按姓名查找 *\n");
printf("*0.返回上一级 *\n");
printf("**************************************************\n");
printf("请输入0-2:");
}
void findchoice ( unsigned long sno[], char sname[][20], int sage[], float cs[], int N)
{
int m;
while(1)
{
scanf("%d",m);
switch(m)
{
case 1:
snofind( sno, sname, sage, cs,N);
findinterface();
break;
case 2:
snamefind( sno, sname, sage, cs, N);
findinterface();
break;
case 0:
break;
}
if(m==0)
break;
}
maininterface();
}
最后进行主程序的设计,为了便于测试,假设人数为3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "guanli.h"
#define M 3
int main( int arge, char *argv[])
{
unsigned long int sno[M];
char sname[M][20];
int sage[M];
float cs[M];
//int i,j;
//显示界面
maininterface();
//选择操作
choice(sno,sname,sage,cs,M);
}