http://mooc1.chaoxing.com/nodedetailcontroller/visitnodedetailurseId=80433103&knowledgeId=87871933
http://mooc1.chaoxing.com/nodedetailcontroller/visitnodedetailurseId=80433103&knowledgeId=87871936
学生信息登记管理
1.需求分析
- 知识点分析
程序处理的对象是学生,由于每个学生有姓名、性别等若干属性,所以属于复杂的数据类型,可以使用结构体处理。
学生人数确定,并且程序运行中不要求改变,可以考虑用数组加以存储。
通过实验可达到如下目标:
(1)进一步掌握数组的声明和使用
(2)掌握结构体的声明,结构体变量的声明和赋值
(3)掌握结构体成员的访问
(4)掌握结构体数组的使用
(5)使用结构体处理复杂的数据结构
3.算法思想
算法思想
(1)程序要求反复运行,直接满足特定条件(输入特定值)退出。可以通过无限循环同时设置监视哨的方式控制程序运行。
while(1)
{
语句(特定条件时:exit(0))
}
(2)学生对象包含学 、姓名、性别等属性,因此应该定义为一个结构体。同时,其属性“成绩”包含3个科目的成绩:C语言、英语、高数,故“成绩”属性为复合属性,应考虑将其定义为一个结构体。即学生结构体中嵌套另一个成绩结构体,结构如下:
(3)学生人数确定,并且不会发生变化,可以将人数定义为宏(或者常量):
#define 宏符 常量值;
(4)使用数组存储学生对象学生信息结构体 [常量值];
(5)程序包括输入学生信息、显示操作菜单、排序、显示信息等功能,这些功能相对独立,根据结构化、模块化的编程思想,应该将它们单独编写函数。除输入学生成绩只运行一次外,其他的都应放到循环体中反复操作,直到程序中止。(分而治之)
(6)程序与用户交互中有不少接收用户输入环节,如:选择操作菜单项、选择排序等,考虑到用户可能输入出错,并且可能多次出错,所以也应该设置为无限循环,当输入错误时,给予适当提示,并继续显示操作菜单,直到用户选择一个正确的交互为止。
(7)考虑到输入的学生没有排序字段(按输入的顺序),在排序后,可能无法恢复最初的顺序。如果希望能够保持或随时恢复原来的顺序,可以给学生结构体外加一个排序的属性,或者将排序操作的结果放到新的数组中,这种方式可以认为是“保护现场”。本示例采用第2种方式。
(8)存储字符串类型数据时使用字符数组,特别需要注意的是:为存储字符串分配空间时,应在长度基础上加上结束标志符的存储空间。
例如:学 的长度是12位,则其声明为:char id[13]。
- 排序操作。经典的排序算法包括快速排序、归并排序、插入排序、冒泡排序等,由于参与排序的数据量不大,所以在时间复杂度和空间复杂度上不作过多考虑,本示例采用冒泡算法进行排序。
程序流程设计(绘制流程图软件用diagram designer )
主程序开始,功能模块之间传递信息有传参和全局变量两种形式,我们采用全局变量。首先定义宏,结构体,和全局变量。显示菜单和选项(用全局变量choice)
- 项目实现
- 打开vc++6.0新建Win32 Consolle Application 控制台应用程序。
实现平台devc/vc++6.0需要新建工程。并添加到工程里面。
in clude”stdio.h”
#include”conio.h”//接收用户输入getche()函数
#include”string.h”//字符串处理
#include”stdlib.h”//exit函数头文件
//#define N 3 //3个学生
#define IDlen 12 //学好
#define NameLen 10//姓名
#define SexLen 4 //性别
//结构体 定义
typedef struct Sco
{
int cp;//c语言
int en;//英语
int math;//数学
} Score;
typedef struct Stu
{
char id[IDlen+1];//学
char name[NameLen+1];//姓名
char sex[SexLen+1];
int age;
Score score;
double avg;//平均成绩
}Student;
//函数声明
void line();//画线
void IuputStudent();//输入学生信息
void DisPlayMenu();//主菜单
void GetOrderDir();//排序菜单
void SortStudent();//排序操作(冒泡)
void OutputStudent(Student[]);//输出学生信息
//全局变量
Student stu[100];//原始输出学生信息
Student sorted[100];//排序操作的学生信息
char choice =0;//主菜单当中的选项
char dir =1;//排序方向1升序0降序
int i=0;
int N; //登记的学生个数。
//输入学生信息
void IuputStudent()
{
printf(“请输入登记信息的学生个数:n”);
scanf(“%d”,&N);
for(i=0;i
printf(“n请输入%d/%d个学生的信息:n”,i+1,N);
line();
printf(“学 (%d个字符):t”,IDlen);
scanf(“%s”,stu[i].id);
stu[i].id[IDlen]=’ ’;//最后一位强制结束。
printf(“姓名(%d个字符):t”,NameLen);
scanf(“%s”,stu[i].name);//字符串中不能有空格,如果有空格用gets(stud[i].name);
printf(“姓别不超出(%d个字符):t”,SexLen);
scanf(“%s”,stu[i].sex);
stu[i].sex[SexLen]=’ ’;//最后一位强制结束
printf(“年龄(整数):t”);
scanf(“%d”,&stu[i].age);//注意整数输入要加上取地址符 。
printf(“c语言成绩(整数):t”);
scanf(“%d”,&stu[i].score.cp);
printf(“英语成绩(整数):t”);
scanf(“%d”,&stu[i].score.en);
printf(“高数成绩(整数):t”);
scanf(“%d”,&stu[i].score.math);
//平均分
stu[i].avg=(stu[i].score.cp+stu[i].score.en+stu[i].score.math)/3.0;///3.0不是三目的是得到小数,精确度高。
line();
}
//复制结构体
for(i=0;i
sorted[i]=stu[i];//保留现场。
}
}
//主菜单
void DisPlayMenu()
{
printf(“n主菜单n”);
printf(“请选择你的操作(排序字段或显示原始信息,或退出)n”);
line();
printf(“(1)学 t(2)姓名t(3)性别t(4)年龄t”);
printf(“(5)c语言t(6)英语t(7)高数t(8)平均分t”);
printf(“(9)显示原始输入信息tt(0)退出程序n”);
line();
choice=getche();//getche 返回的是ascii值,不能用getchar();
if(choice-‘0’9)
{ printf(“n输入选项错误,请重新输入!n”);
}
else
return ;
}
//排序菜单
void GetOrderDir()
{
printf(“n排序菜单n”);
printf(“n请选择你的排序方向(或返回)n)”);
line();
printf(“(1)升序t(2)降序t(0)返回主菜单n”);
line();
dir =getche();//getche 返回的是ascii值,不能用getchar();
if(dir-‘0’2)
{
printf(“n输入选项错误,请重新输入!n”);
}
else
return ;
}
//排序操作(冒泡)
void SortStudent()
{ int j=0,f=0;
Student s;
//从索引0到N-1升序
for(j=0;j
for(i=0;i
f=0;//默认不交换,f=1表示要交换。
switch(choice)
{case ‘1’:if (strcmp(sorted[i].id,sorted[i+1].id)>0)
f=1;
break;//比较学
case ‘2’:if (strcmp(sorted[i].id,sorted[i+1].id)>0)
f=1;
break;//比较姓名
case ‘3’:if (strcmp(sorted[i].sex,sorted[i+1].sex)>0)
f=1;
break;//比较姓名
case ‘4’:if (sorted[i].age>sorted[i+1].age)
f=1;
break;//比较年龄
case ‘5’:if (sorted[i].score.cp>sorted[i+1].score.cp)
f=1;
break;//比较c语言
case ‘6’:if (sorted[i].score.en>sorted[i+1].score.en)
f=1;
break;//比较英语
case ‘7’:if (sorted[i].score.math>sorted[i+1].score.math)
f=1;
break;//比较高数
case ‘8’:if (sorted[i].avg>sorted[i+1].avg)
f=1;
break;//比较高数
default:
printf(“未知错误”);
}
if(f==1)//要交换
{
s=sorted[i];
sorted[i] =sorted[i+1];
sorted[i+1]=s;
}
}
}
}
//输出学生信息
void OutputStudent(Student s[])
{
printf(“n按排序字段排序后的学生信息如下n”);
line();
printf(“%-15st%-14st%-7st%-7st%-7st%-7st%-7st%-7sn”,”学 ”,”姓名”,”性别”,”年龄”,”c语言”,”英语”,”高数”,”平均分”);//%-15s%
//15个字符对齐方式。
if(dir==’1′)//升序
{
for(i=0;i
printf(“%-15st%-14st%-7st%-7dt”,s[i].id,s[i].name,s[i].sex,s[i].age);
printf(“%-7d%-7d%-7d%.1f”,s[i].score.cp,s[i].score.en,s[i].score.math,s[i].avg);
printf(“n”);
}
}
else //降序
{
for(i=N-1;i>=0;i–)//降序,0的时候也得输出等 不能丢。
{
printf(“%-15st%-14st%-7st%-7dt”,s[i].id,s[i].name,s[i].sex,s[i].age);
printf(“%-7d%-7d%-7d%.1fn”,s[i].score.cp,s[i].score.en,s[i].score.math,s[i].avg);
printf(“n”);
}
}
line();
}
//画线
void line()
{
printf(“———————————————————————-n”);
}
int main()
{
IuputStudent();
while(1)
{
DisPlayMenu();//显示菜单
if(choice==’0′)
{
printf(“n谢谢使用,再见n”);
exit(0);
}
else if(choice==’9′)
{ dir=1;
OutputStudent(stu);//传结构体数组名
}
else
{
GetOrderDir();//排序菜单
if (dir==’0′)
{
continue;//返回上一级菜单,进行下一次循环;
}
SortStudent();
OutputStudent(sorted);
}
}
return 0;
}
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114893 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!