设计一个学生信息管理系统
#include #include #include #define MAX 1000 struct stu { char id[8]char name[8]double Chinesedouble Mathdouble Englishdouble averagedouble total} struct stu students[MAX] int currentvoid input() { int iprintf("请输入学生人数:")scanf("%d", &current)for (i = 0i <currenti++) { printf("\n请输入学生学号,最多为7位数: ")scanf("%s", students[i].id)printf("请输入学生姓名:")scanf("%s", students[i].name)printf("请输入语文成绩:")scanf("%lf", &students[i].Chinese)printf("请输入数学成绩:")scanf("%lf", &students[i].Math)printf("请输入英语成绩:")scanf("%lf", &students[i].English)students[i].total = students[i].Chinese + students[i].Math + students[i].Englishstudents[i].average = students[i].total / 3} } void sort(struct stu array[], int n) { int i, jstruct stu tempfor (i = 0i <ni++) { for (j = i+1j <nj++) { if (array[i].average - array[j].average <1e-16) { temp = array[i]array[i] = array[j]array[j] = temp} } } } void print_score(struct stu array[], int n) { int idouble ave = 0int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0for (i = 0i <ni++) { ave += array[i].averageswitch ((int)(array[i].average / 10)) { case 10: case 9: sum1++breakcase 8: sum2++breakcase 7: case 6: sum3++breakdefault: sum4++} } printf("全班的平均分为:%.1f\n", ave/n)printf("平均分在90分以上的人数为:%d\n", sum1)printf("平均分在80~89的人数为:%d\n", sum2)printf("平均分在60~79的人数为:%d\n", sum3)printf("平均分在60分以下的人数为:%d\n", sum4)} void print_unreach(struct stu array[], int n) { int iprintf("科目\t学号\t名字\n")for (i = 0i <ni++) { if (array[i].Chinese <60) { printf("语文\t%s\t%s\n", array[i].id, array[i].name)} if (array[i].Math <60) { printf("数学\t%s\t%s\n", array[i].id, array[i].name)} if (array[i].English 60) { printf("英语\t%s\t%s\n", array[i].id, array[i].name)} } } void print_good(struct stu array[], int n) { int ichar mark = 0if (n >3) { n = 3} printf("学号\t姓名\t语文\t数学\t英语\t平均分\t名次\n")for (i = 0i ni++) { if ((array[i].Chinese >60) &&(array[i].Math >60) &&(array[i].English >60)) { if (array[i].average >90) mark = 1else if (array[i].average >85) { if (array[i].Chinese == 100) mark = 1if (array[i].Math == 100) mark = 1if (array[i].English == 100) mark = 1if (array[i].Chinese >95 &&array[i].English >95) mark = 1if (array[i].Chinese >95 &&array[i].Math >95) mark = 1if (array[i].Math >95 &&array[i].English >95) mark = 1} if (mark == 1) { printf("%s\t%s\t", array[i].id, array[i].name)printf("%.f\t%.f\t%.f\t%.1f\t", array[i].Chinese, array[i].Math, array[i].English, array[i].average)printf("%d\n", i+1)} } } } void search_name(struct stu array[], int n, char* name) { int ichar mark = 1for (i = 0i <ni++) { if (strcmp(name, array[i].name) == 0) { printf("学生姓名:%s\n", name)printf("学生学号:%s\n", array[i].id)printf("语文:%.f\n", array[i].Chinese)printf("数学:%.f\n", array[i].Math)printf("英语:%.f\n", array[i].English)printf("平均分:%.1f\n", array[i].average)mark = 0} } if (mark == 1) puts("不存在该学生记录")} void search_id(struct stu array[], int n, char* id) { int ichar mark = 1for (i = 0i <ni++) { if (strcmp(id, array[i].id) == 0) { printf("学生姓名:%s\n", array[i].name)printf("学生学号:%s\n", array[i].id)printf("语文:%.f\n", array[i].Chinese)printf("数学:%.f\n", array[i].Math)printf("英语:%.f\n", array[i].English)printf("平均分:%.1f\n", array[i].average)mark = 0break} } if (mark == 1) puts("不存在该学生记录")} void print_menu() { system("cls")printf("1.输入学生信息\n")puts("2.统计全班学生成绩")puts("3.按学号查询学生成绩")puts("4.按姓名查询学生成绩")puts("5.输出不及格情况")puts("6.输出优等生名单")puts("0.退出本程序")printf("\n\n 请输入你的选择:")} int main(int argc, char **argv) { char ch = 0char id[8], name[8]while (ch != '0') { print_menu()ch = getchar()switch (ch) { case '1': { system("cls")input()sort(students, current)break} case '2': { system("cls")print_score(students, current)break} case '3': { system("cls")printf("请输入学号:")scanf("%s", id)search_id(students, current, id)break} case '4': { system("cls")printf("请输入姓名:")scanf("%s", name)search_name(students, current, name)break} case '5': { system("cls")print_unreach(students, current)break} case '6': { system("cls")print_good(students, current)break} case '0': exit(0)} printf("\n\n按任意键返回主菜单……")getchar()getchar()} return 0}
#include<iostream>
#include<string>
#include <fstream>
#include<sstream>
#include<iomanip>
using namespace std
//结点类,用于存放学生的各种数据
class Node{
public:
int id//学号
string name//姓名
string grade//等级
double english//英语
double math//数学
double c//C++
double sum//总分
double average
Node *next//指向下一结点的指针
Node(int nid=0,string nname="noname", //构造函数,初始化变量
double e=0,double m=0,double cl=0,
double s=0 ,double a=0,string g="ng")
}
Node::Node(int nid,string nname,double e,double m,double cl,double s,double a,string g){
id=nid
name=nname
next=NULL
english=e
math=m
c=cl
sum=s
average=a
grade=g
}
//class NOde结束
//Link类,把数据以链表的形式存储,链表的每个结点为一个Node对象
class Link{
private:
Node *head//链表的头指针,为Node对象类型的指
public :
Link()//构造函数,初始化变量
bool linkIsEmpty()//判断链表是否为空
void linkInsert(Node *newnode)//向链表中插入新的结点
bool linkDelete(int nid)//从链表中删除的结点
void linkClear()//清空链表中数据
void linkView()//查看链表中数据
void linkGrade(Node *p1)//计算等级
void linkAverageTotle()//按平均分统计
Node* linkFind(int nid)//在链表中查找id为nid结点,返回指向该结点的指针
Node* getHead()//获取头指针
}
Link::Link(){ //构造函数,初始化链表为空
head=NULL
}
bool Link::linkIsEmpty(){ //判断链表是否为空,空则返回true
return(head==NULL)
}
void Link::linkInsert(Node *newnode){//按id值从小到大的顺序,插入新的结点
Node *p1
if(!head)//链表为空的情况
head=newnode
else if((head->id)>(newnode->id)){//插入到第一个结点的情况
newnode->next=head
head=newnode
}
else{//插入到第二个及以后情况
p1=head
while(1){
if(!(p1->next)){
p1->next=newnode
break
}
else if((p1->next)->id>newnode->id){
newnode->next=p1->next
p1->next=newnode
break
}
p1=p1->next
}
}
}
bool Link::linkDelete(int nid){//删除结点,成功则返回true
Node *p
if(head==NULL)//链表为空的情况
return false
if(head->id==nid){//删除的为第一个结点的情况
head=head->next
return true
}
p=head
while(p->next){//删除的为第二个及以后结点的情况
if((p->next)->id==nid){
p->next=(p->next)->next
return true
}
p=p->next
}
return false
}
void Link::linkClear(){//清空链表
head=NULL
}
void Link::linkView(){//显示链表数据
Node *p=head
cout<<setw(10)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"英语"<<setw(8)
<<"数学"<<setw(8)<<"C++"<<setw(8)<<"总分"<<setw(8)<<"平均分"<<setw(8)<<"等级"<<endl
while(p){
(p->sum)=(p->english)+(p->math)+(p->c)//计算总分
(p->average)=((p->english)+(p->math)+(p->c))/3//计算平均成绩
linkGrade(p)//计算等级
cout<<setw(10)<<p->id<<setw(8)<<p->name<<setw(8)<<p->english
<<setw(8)<<p->math<<setw(8)<<p->c<<setw(8)<<p->sum<<setw(8)
<<p->average<<setw(8)<<p->grade<<endl
p=p->next
}
}
void Link::linkGrade(Node *p1){ // 计算等级
while(p1){
if(p1->average>=90&&p1->average<=100)
p1->grade="优"
else if(p1->average>=80&&p1->average<90)
p1->grade="良好"
else if(p1->average>=70&&p1->average<80)
p1->grade="中等"
else if(p1->average>=60&&p1->average<=70)
p1->grade="合格"
else
p1->grade="不合格"
p1=p1->next
}
}
void Link::linkAverageTotle(){//按学生平均分统计
int a=0,b=0,c=0,d=0,e=0,f=0
double averagesum=0,asum=0,aaverage=0,paverage=0
Node *p3=head
while(p3){
if(p3->average>=90&&p3->average<=100)
a+=1
else if(p3->average>=80&&p3->average<90)
b+=1
else if(p3->average>=70&&p3->average<80)
c+=1
else if(p3->average>=60&&p3->average<70)
d+=1
else
e+=1
asum+=p3->sum
aaverage+=p3->average
p3=p3->next
}
f=a+b+c+d+e
averagesum=asum/f
paverage=aaverage/f
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 总 人 数:"<<f<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 优 人 数:"<<a<<" | "<<"优 秀 率: "<<a*100/f<<"%"<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 良 好 的人数:"<<b<<" | "<<"良 好 率: "<<b*100/f<<"%"<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 中 等 的人数:"<<c<<" | "<<"中 等 率: "<<c*100/f<<"%"<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 所有合格人数:"<<a+b+c+d<<" | "<<"合 格 率: "<<(a+b+c+d)*100/f<<"%"<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 不 合 格 数:"<<e<<" | "<<"不合格率: "<<e*100/f<<"%"<<endl
cout<<"|-------------------------------------------------------|"<<endl
cout<<"| 总分的平均分:"<<averagesum<<" | "<<"所有科目的平均分:"<<paverage<<endl
cout<<"|-------------------------------------------------------|"<<endl
}
Node* Link::linkFind(int nid){//查找id值为nid的结点,返回该结点的指针
Node *p=head//没找到符合条件的结点的话,返回的指针值为NULL
while(p){
if(p->id==nid)
break
else
p=p->next
}
return p
}
Node* Link::getHead(){
return head
}
//class Link 结束
//类Student,用于包装Link类及菜单操作
class Student{
private:
Link slink//Link对象成员
bool k//记录数据是否被修改
public:
Student()
void studentClear()
void studentInsert()
void studentDelete()
void studentFind()
void studentView()
void studentLoad()
void studentSave()
void studentAverageTotle()//按平均分数统计等级
void Exit()//退出程序
void showMenu()//显示菜单
void showTip()//显示操作提示
void doMenu(char n)//执行相应菜单项功能
}
Student::Student(){
Link()//调用成员对象的构造函数
studentLoad()//从文件中读取数据,创建链表
k=false//设置数据被修改
}
void Student::studentClear(){//清空学生记录
slink.linkClear()
cout<<"成功清空学生记录!"<<endl
}
void Student::studentInsert(){//插入学生记录
Node *p=new Node()
cout<<"请输入学号:"
cin>>p->id
cout<<"请输入姓名:"
cin>>p->name
if(!slink.linkFind(p->id)){//判断学号是否存在
slink.linkInsert(p)
k=true
}
else
cout<<"学号为"<<p->id<<"的学生已存在,插入失败!"<<endl
cout<<"请输入成绩:"<<endl
cout<<"英语:"
cin>>p->english
cout<<endl
cout<<"数学:"
cin>>p->math
cout<<endl
cout<<"C++:"
cin>>p->c
cout<<endl
(p->sum)=(p->english)+(p->math)+(p->c)//计算总分
(p->average)=((p->english)+(p->math)+(p->c))/3//计算平均成绩
}
void Student::studentDelete(){//删除学生记录
int i
if(slink.linkIsEmpty())//链表为空的情况
cout<<"没有学生记录!"<<endl
else{
cout<<"请输入学号:"
cin>>i
if(slink.linkDelete(i)){
cout<<"成功删除学号为"<<i<<"的学生记录!"<<endl
k=true
}
else
cout<<"没有找到学号为"<<i<<"的学生!"<<endl
}
}
void Student::studentFind(){//查找某学号的学生记录
int n
Node *p
if(slink.linkIsEmpty())//链表为空的情况
cout<<"没有学生记录!"<<endl
else{
cout<<"请输入要查找的学号:"
cin>>n
p=slink.linkFind(n)//获得找到的结点的指针
if(p){//指针值不为NULL时
(p->sum)=(p->english)+(p->math)+(p->c)//计算总分
(p->average)=((p->english)+(p->math)+(p->c))/3//计算平均成绩
slink.linkGrade(p)
cout<<setw(6)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<"英语"
<<setw(8)<<"数学"<<setw(8)<<"C++"<<setw(8)<<"总分"<<setw(8)
<<"平均分"<<setw(8)<<"等级"<<endl
cout<<setw(6)<<p->id<<setw(8)<<p->name<<setw(8)<<p->english
<<setw(8)<<p->math<<setw(8)<<p->c<<setw(8)<<p->sum<<setw(8)<<p->average
<<setw(8)<<p->grade<<endl
}
else//指针值为NULL时
cout<<"没有找到学号为"<<n<<"的学生记录!"<<endl
}
}
void Student::studentView(){//显示所有学生的记录
if(slink.linkIsEmpty())
cout<<"没有学生记录!"<<endl
else
slink.linkView()
}
void Student::studentLoad(){//从文件中读入数据,创建链表
Node *p
int nid
ifstream infile("data.txt")
if(!infile)
cerr<<"错误:数据文件不能打开!\n"
else
while(infile>>nid){//读取学号,直到读空
p=new Node()
p->id=nid
infile>>p->name>>p->english>>p->math>>p->c>>p->sum>>p->average>>p->grade//读取姓名
slink.linkInsert(p)
}
infile.close()//关闭文件
}
void Student::studentSave(){//将数据保存到文件
Node *p=slink.getHead()
ofstream outfile("data.txt")
if(!outfile)
cerr<<"错误:数据文件不能打开!\n"
else{
while(p){
outfile<<p->id<<' '<<p->name<<' '<<p->english<<' '<<p->math<<' '
<<p->c<<' '<<p->sum<<' '<<p->average<<' '<<p->grade<<endl
p=p->next
}
k=false
cout<<"保存成功!"<<endl
}
}
void Student::studentAverageTotle(){
if(slink.linkIsEmpty())
cout<<"没有学生记录!"<<endl
else
slink.linkAverageTotle()
}
void Student::Exit(){
char s='Y'
if(k){//判断数据是否修改
cout<<"数据已经改变,是否保存?(y/n):"
cin>>s
if(s=='y'||s=='Y')
studentSave()
}
cout<<"已安全退出,"
system("pause")
exit(0)
}
void Student::showMenu(){
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 学生信息管理系统 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 1. 清空:清除所有学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 2. 添加:插入一条学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 3. 删除:删除指定学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 4. 查找:查找指定学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 5. 显示:显示所有学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 6. 保存:保存所有学生数据 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 7. 统计:按学生平均分统计 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl
cout<<" "<<"| 0. 退出:安全的退出本系统 |"<<endl
cout<<" "<<"|------------------------------------------------|"<<endl<<endl
}
void Student::showTip(){
cout<<endl
cout<<"-------------------操作完成---------------------"<<endl
cout<<"-----------------选择0-7继续-------------------"<<endl
cout<<"请选择:"
}
void Student::doMenu(char n){
switch(n){
case '1':
studentClear()break
case '2':
studentInsert()break
case '4':
studentFind()break
case '3':
studentDelete()break
case '5':
studentView()break
case '6':
studentSave()break
case '7':
studentAverageTotle()break
case '0':
Exit()break
default:cout<<"输入错误!"
}
}
int main(){
Student s
char i='9'
s.showMenu()
cout<<"选择对应数字进行操作:"
while(1){
cin>>i
system("cls")//清除屏幕
s.showMenu()
s.doMenu(i)
s.showTip()
}
}
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 80
void input()
void sort()
void display()
void insert()
void del()
void average()
void find()
void save()
void read()
void del_file()
void average()
void modify()
int now_no=0
struct student
{
int no
char name[20]
char sex[4]
float score1
float score2
float score3
float sort
float ave
float sum
}
struct student stu[MAX],*p
main()
{
int as
start: printf("\n\t\t\t欢迎使用学生成绩管理系统\n")
do
{
printf("\n\t\t\t\t1.录入学员信息\n\t\t\t\t2.显示学员信息\n\t\t\t\t3.成绩排序信息\n\t\t\t\t4.添加学员信息\n\t\t\t\t5.删除学员信息\n\t\t\t\t6.修改学员信息\n\t\t\t\t7.查询学员信息\n\t\t\t\t8.从文件读入学员信息\n\t\t\t\t9.删除文件中学员信息\n\t\t\t\t10.保存学员信息\n\t\t\t\t11.退出\n")
printf("\t\t\t\t选择功能选项:")
fflush(stdin)
scanf("%d",&as)
switch(as)
{
case 1:system("cls")input()break
case 2:system("cls")display()break
case 3:system("cls")sort()break
case 4:system("cls")insert()break
case 5:system("cls")del()break
case 6:system("cls")modify()break
case 7:system("cls")find()break
case 8:system("cls")read()break
case 9:system("cls")del_file()break
case 10:system("cls")save()break
case 11:system("exit")exit(0)
default:system("cls")goto start
}
}while(1)
}
void input()
{
int i=0
char ch
do
{
printf("\t\t\t\t1.录入学员信息\n输入第%d个学员的信息\n",i+1)
printf("\n输入学生编号:")
scanf("%d",&stu[i].no)
fflush(stdin)
printf("\n输入学员姓名:")
fflush(stdin)
gets(stu[i].name)
printf("\n输入学员性别:")
fflush(stdin)
gets(stu[i].sex)
printf("\n输入学员成绩1:")
fflush(stdin)
scanf("%f",&stu[i].score1)
printf("\n输入学员成绩2:")
fflush(stdin)
scanf("%f",&stu[i].score2)
printf("\n输入学员成绩3:")
fflush(stdin)
scanf("%f",&stu[i].score3)
printf("\n\n")
i++
now_no=i
printf("是否继续输入?(Y/N)")
fflush(stdin)
ch=getch()
system("cls")
}
while(ch!='n'&&ch!='N')
system("cls")
}
void sort()
{
struct student temp
int i,j
average()
for(i=1i<now_noi++)
{
for(j=1j<=now_no-ij++)
{
if(stu[j-1].ave<stu[j].ave)
{
temp=stu[j]
stu[j]=stu[j-1]
stu[j-1]=temp
}
}
}
}
void display()
{
int i
char as
average()
do
{
printf("\t\t\t班级学员信息列表\n")
printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n")
for(i=0i<now_no&&stu[i].name[0]i++)printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave)
printf("\t\t按任意键返回主菜单.")
fflush(stdin)
as=getch()
}
while(!as)
system("cls")
}
void insert()
{
char ch
do
{
printf("\n\t\t输入新插入学员队信息\n")
printf("\n输入学生编号:")
scanf("%d",&stu[now_no].no)
fflush(stdin)
printf("\n输入学员姓名:")
fflush(stdin)
gets(stu[now_no].name)
printf("\n输入学员性别:")
fflush(stdin)
gets(stu[now_no].sex)
printf("\n输入学员成绩1:")
fflush(stdin)
scanf("%f",&stu[now_no].score1)
printf("\n输入学员成绩2:")
fflush(stdin)
scanf("%f",&stu[now_no].score2)
printf("\n输入学员成绩3:")
fflush(stdin)
scanf("%f",&stu[now_no].score3)
printf("\n\n")
now_no=now_no+1
sort()
printf("是否继续输入?(Y/N)")
fflush(stdin)
ch=getch()
system("cls")
}
while(ch!='n'&&ch!='N')
}
void del()
{
int inum,i,j
printf("输入要删除学员的编号:")
fflush(stdin)
scanf("%d",&inum)
for(i=0i<now_noi++)
{
if(stu[i].no==inum)
{
if(i==now_no)now_no-=1
else
{
stu[i]=stu[now_no-1]
now_no-=1
}
sort()
break
}
}
system("cls")
}
void save()
{
FILE *fp
int i
char filepath[20]
printf("输入要保存的文件路径:")
fflush(stdin)
gets(filepath)
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失败!")
exit(0)
}
for(i=0i<now_noi++)
{
stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3
stu[i].ave=stu[i].sum/3
fprintf(fp,"\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave)
}
fclose(fp)
printf("学生信息已保存在%s中!\n",filepath)
system("pause")
system("cls")
}
void find()
{
int i
char str[20],as
do
{
printf("输入要查询的学生姓名:")
fflush(stdin)
gets(str)
for(i=0i<now_noi++)
if(!strcmp(stu[i].name,str))
{
printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n")
printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave)
}
printf("\t\t按任意键返回主菜单.")
fflush(stdin)
as=getch()
}
while(!as)
system("cls")
}
void average()
{
int i
for(i=0i<now_noi++)
{
stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3
stu[i].ave=stu[i].sum/3
}
}
void modify()
{
int i
char str[20],as
printf("输入要修改的学生姓名:")
fflush(stdin)
gets(str)
for(i=0i<now_noi++)
if(!strcmp(stu[i].name,str))
{
system("cls")
printf("\n\t\t输入新插入学员队信息\n")
printf("\n输入学生编号:")
fflush(stdin)
scanf("%d",&stu[i].no)
printf("\n输入学员性别:")
fflush(stdin)
gets(stu[i].sex)
printf("\n输入学员成绩1:")
fflush(stdin)
scanf("%f",&stu[i].score1)
printf("\n输入学员成绩2:")
fflush(stdin)
scanf("%f",&stu[i].score2)
printf("\n输入学员成绩3:")
fflush(stdin)
scanf("%f",&stu[i].score3)
printf("\n\n")
sort()
break
}
system("cls")
}void read()
{
FILE *fp
int i
char filepath[20]
printf("输入要读入的文件路径:")
fflush(stdin)
gets(filepath)
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!\n",filepath)
system("pause")
exit(0)
}
now_no=0
for(i=0i<MAX&&!feof(fp)i++)
{
fscanf(fp,"\t%d\t%s\t%s\t%f\t%f\t%f\t%f\n",&stu[i].no,stu[i].name,stu[i].sex,&stu[i].score1,&stu[i].score2,&stu[i].score3,&stu[i].ave)
now_no++
}
fclose(fp)
printf("保存的在文件%s中的所有信息已经读入!\n",filepath)
system("pause")
system("cls")
}void del_file()
{
FILE *fp
char filepath[20]
printf("输入要删除的文件路径:")
fflush(stdin)
gets(filepath)
fp=fopen(filepath,"w")
fclose(fp)
printf("保存的在文件%s中的所有信息已经删除!\n",filepath)
system("pause")
system("cls")
}
#include<iostream>
#define max 5
using namespace std
struct student//////////定义数组结构体
{
int xuehao //学号
char name[10] //姓名
char sex //性别
int age//年龄
}stu[max]
//////定义数型
char a //全局函数a(操作数)
int i //全局函数i(循环操作数)
//////////函数列表
void display() //屏显函数
void init()//数组结构体初始化函数
void xuanze() //选择操作数函数
void sys(char a) //根据操作数执行函数
void addf()//增加数据的函数
void delf()//删除数据的函数
void inqf()//查询数据的函数
//////////////////////屏显
void display()
{
cout<<"==========Welcome to Student Manager System!=========="<<endl
cout<<endl
cout<<"A: Add new student"<<endl
cout<<"D: Delete a student"<<endl
cout<<"I: Inquiry a student"<<endl
cout<<"Q: Quit"<<endl
cout<<endl
xuanze()
}
/////////////////////////////信息初始化
void init()
{
for(i=0i<maxi++)
{
stu[i].name[10]='\0'
stu[i].sex='\0'//初始化所有的sex为'\0'
stu[i].age=0
}
}
////////////////////////操作选择
void xuanze()
{
cout<<"input your choose:"<<endl
cin>>a
if(a=='A'||a=='D'||a=='I'||a=='Q')
sys(a) //选择相应的操作数执行函数
else
{
cout<<"Error chooseing!"<<endl
cout<<endl
display()
}
}
/////////////////////相应操作数对应函数
void sys(char a)
{
switch(a)
{
case 'A':addf()
case 'D':delf()
case 'I':inqf()
case 'Q':exit(0) //退出
}
}
/////////////添加数据的函数
void addf()
{
int k=0,j,g
for(i=0i<maxi++)
{
if(stu[i].sex=='\0')k++
}
cout<<"剩余 "<<k<<" 个记录可以添加!"<<endl //输出剩余的可添加记录数目
if(k!=0)
{
cout<<"请输入你要添加的记录的个数,但是记录个数不能超过 "<<k<<endl
cin>>j
if(j>k)
{
cout<<"Error number!"<<endl
cout<<endl //显示美观需要
display()
}
else
{
for(i=0i<ji++)
{
for(int h=0h<maxh++)
{
if(stu[h].sex=='\0') //判断sex是否为'\0' 如果是则执行写入操作
{
cout<<"input the NO"<<i+1<<" 's xuehao:"<<endl
cin>>stu[h].xuehao
///判断数据非法与否
for(g=0g<maxg++)
{
if((stu[g].xuehao==stu[h].xuehao)&&g!=h)
{
cout<<"Duplicate number!"<<endl
cout<<endl
display()
}
}/////////判断学号是否相同
if(stu[h].xuehao<1||stu[h].xuehao>10000)
{
cout<<"Error number!"<<endl
cout<<endl
display()
}
cout<<"input the NO"<<i+1<<" 's name:"<<endl
cin>>stu[h].name
cout<<"input the NO"<<i+1<<" 's sex:('f' for female,'m' for male)"<<endl
cin>>stu[h].sex
///判断数据非法与否
if(stu[h].sex!='f'&&stu[h].sex!='m')
{
stu[h].sex='\0' //恢复sex的初始值,以便下次写入产生遗漏
cout<<"Error sex!"<<endl
cout<<endl
display()
}
cout<<"input the NO"<<i+1<<" 's age:(1-100)"<<endl
cin>>stu[h].age
///判断数据非法与否
if(stu[h].age<1||stu[h].age>100)
{
stu[h].sex='\0'//恢复sex的初始值,以便下次写入产生遗漏
cout<<"Error age!"<<endl
cout<<endl
display()
}
break//跳出本层循环
}
}
}
display()//返回
}
}
else
{
cout<<"No space to add new student!"<<endl
cout<<endl
display()
}
}
////////////////删除数据的函数
void delf()
{
int d,s=0
cout<<"Please input the number of the student you want to delete:"<<endl
cin>>d
if(d<1||d>10000)
{
cout<<"Error number!"<<endl
cout<<endl
display()
}
else
{
for(i=0i<maxi++)
{
if(stu[i].xuehao==d)
{
s++//是否实行删除的标志位
stu[i].xuehao=-1
stu[i].name[10]='\0'
stu[i].sex='\0'
stu[i].age=0
cout<<"Delete successfully!"<<endl
cout<<endl
display()
}
}
if(s==0)
{
cout<<"Not exist!"<<endl
cout<<endl
display()
}
}
}
/////////////查询数据的函数
void inqf()
{
int d,s=0
cout<<"Please input the number of the student you want to inquiry(0 for all):"<<endl
cin>>d
cout<<endl
if(d==0)
{
for(i=0i<maxi++)
{
if(stu[i].sex!='\0')
cout<<stu[i].xuehao<<","<<stu[i].name<<","<<stu[i].sex<<","<<stu[i].age<<endl
}
cout<<endl
display()
}
else
{
if(d<1||d>10000)
{
cout<<"Error number!"<<endl
cout<<endl
display()
}
else
{
for(i=0i<maxi++)
{
if(stu[i].xuehao==d)
{
s++ //是否存在该数字的标志
cout<<stu[i].xuehao<<","<<stu[i].name<<","<<stu[i].sex<<","<<stu[i].age<<endl
display()
}
}
if(s==0)
{
cout<<"Not exist!"<<endl
cout<<endl
display()
}
}
}
}//ingf
//////////////主函数
void main()
{
init() //初始化
display()//屏显(主界面)
}
用了我整整三个小时啊,如果你还有什么问题,或者调试的过程中发现了什么问题,又或者你想实现文件的读取存储功能的可以留下你的QQ,我会主动联系你的了.这两天我都有时间.....
#include<stdlib.h>
#include<string.h>
//链表结点结构体声明
typedef struct subjects
{
char name[20]
float score
}sub
typedef struct student
{
int num
char name[20]
sub subject[3]
struct student* next
}stu,*pstu
#define SIZE sizeof(stu)
//函数申明
pstu LoadInfo()
void PrintMenu()
pstu AddStu(pstu )
pstu DeleStu(pstu )
pstu RwrStu(pstu )
void FindStu(pstu , char )
void Count(pstu ,char * ,float ,float )
void Rank(pstu ,char * )
void SaveQuit(pstu )
//主函数
int main()
{
float score1,score2
char n,j
char subname[20]
pstu head,ptr
head = LoadInfo()
ptr = head->next
//创建菜单,进入选择循环
while(1)
{
PrintMenu()
printf("请输入您的选择编号:")
scanf("%d",&n)
getchar()
switch(n)
{
case 1:
{
system("cls")
j=0
while(4!=j)
{
printf("欢迎进入信息管理版块!\n\n")
printf("\025 1、添加学生\n")
printf("\025 2、删除学生\n")
printf("\025 3、修改学生信息\n")
printf("\025 4、返回\n")
printf("请输入您的选择编号:\n")
scanf("%d",&j)
getchar()
if ( 1 == j) head = AddStu(head)
else if( 2 == j) head = DeleStu(head)
else if( 3 == j) head = RwrStu(head)
else if( 4 == j)
else printf("输入有误,请重新输入!\n")
}
printf("请输入回车键返回主菜单!") //此处本意按任意键返回,但是任意键的话,需要按键A,再按回车确定
getchar() //则会连续收到两个按键,造成错误读入,可以改进scanf接收字符串,
system("cls") //以下所有getchar()、system("cls")同理
break
}
case 2:
{
//信息查询
system("cls")
printf("欢迎进入信息查询版块!\n")
printf("请输入要查询的学生编号:")
scanf("%d",&j)
getchar()
//printf("%d\n",j) //检测输入是否成功,调试程序用
FindStu(head,j) //查询并输出
printf("\n请输入回车键返回主菜单!")
getchar()
system("cls")
break
}
case 3:
{
//成绩统计
system("cls")
printf("欢迎进入成绩统计版块!\n")
printf("请输入科目:")
scanf("%s",&subname)
getchar()
printf("请输入分数范围(score1,score2):")
scanf("%f,%f",&score1,&score2)
getchar()
//检测输入是否成功,调试程序用
Count(head,subname,score1,score2) //统计并输出
printf("请输入回车键返回主菜单!")
getchar()
system("cls")
break
}
case 4:
{
//成绩排序
system("cls")
printf("欢迎进入成绩排序版块,请输入科目:")
scanf("%s",&subname)
getchar()
Rank(head,subname) //排序并输出
printf("\n请输入回车键返回主菜单!\n")
getchar()
system("cls")
break
}
case 5:
{
//保存退出
SaveQuit(head) //文件操作,保存并退出
free(head)
return 0
}
default:
{
printf("输入有误,按回车键重新选择!\n") //主菜单错误输出检测
getchar()
system("cls")
}
}
}
}
//加载data数据 ,文件操作
pstu LoadInfo()
{
int num
char name[20]
char sub1[20]
char sub2[20]
char sub3[20]
float score1
float score2
float score3
char filename[] = "D:\\编程学习\\编程实践\\c语言课程设计1 学生信息管理\\data.txt" //文件名,此处为简化编程,采用固定地址名称,未作输入
FILE *fp
pstu head,ptr
//创建带表头结点的空单链表head,用来存放载入信息
head = (pstu)malloc(SIZE)
ptr = head
ptr->next = NULL
//加载data文件,存入head链表
if( NULL == (fp = fopen(filename,"r")) ) //判断文件是否存在及可读
{
printf("error!")
exit(0)
}
while (!feof(fp))
{
fscanf(fp,"%d %s %s %f %s %f %s %f\n",&num,&name,
&sub1,&score1,&sub2,&score2,&sub3,&score3) //读取一行,采用格式化读取,避免了其他各种读取方法的数据处理问题
//该方法缺点明显,对数据格式要求教研,故data文件规定数据格式
ptr->next = (pstu)malloc(SIZE)
ptr = ptr->next
ptr->next = NULL
ptr->num = num
strcpy(ptr->name,name)
strcpy(ptr->subject[0].name,sub1)
ptr->subject[0].score = score1
strcpy(ptr->subject[1].name,sub2)
ptr->subject[1].score = score2
strcpy(ptr->subject[2].name,sub3)
ptr->subject[2].score = score3
}
fclose(fp) //关闭文件,已得到保存data信息的链表head
return head
}
//打印主菜单
void PrintMenu()
{
printf("***************************************\n")
printf(" 枫枫学生信息管理系统 \n")
printf("***************************************\n")
putchar('\n')
printf("菜单\n")
printf("\025 1、信息管理\n")
printf("\025 2、信息查询\n")
printf("\025 3、成绩统计\n")
printf("\025 4、成绩排序\n")
printf("\025 5、保存退出\n")
}
//添加学生
pstu AddStu(pstu x)
{
char namestu[20]
char *p
char subname1[20],subname2[20],subname3[20]
pstu head,ptr
head = x
ptr = head
while( NULL != ptr->next ) //遍历链表,找到链尾结点
{
ptr = ptr->next
}
ptr->next = (pstu)malloc(SIZE) //默认在链表末追加添加信息
ptr = ptr->next
ptr->next = NULL
printf("请输入添加学生的信息:\n")
printf("请输入添加学生的学号:")
scanf("%d",&ptr->num)
getchar()
printf("请输入添加学生的姓名:")
scanf("%s",namestu)
getchar()
p = namestu
strcpy(ptr->name,p)
printf("请输入添加学生的科目1名称:")
scanf("%s",&subname1)
getchar()
p = subname1
strcpy(ptr->subject[0].name,p)
printf("请输入添加学生的科目1成绩:")
scanf("%f",&ptr->subject[0].score)
getchar()
printf("请输入添加学生的科目2名称:")
scanf("%s",&subname2)
getchar()
p = subname2
strcpy(ptr->subject[1].name,p)
printf("请输入添加学生的科目2成绩:")
scanf("%f",&ptr->subject[1].score)
getchar()
printf("请输入添加学生的科目3名称:")
scanf("%s",&subname3)
getchar()
p = subname3
strcpy(ptr->subject[2].name,p)
printf("请输入添加学生的科目3成绩:")
scanf("%f",&ptr->subject[2].score)
getchar()
putchar('\n')
return head
}
//删除学生
pstu DeleStu(pstu x)
{
int num
pstu head,ptr,qtr
head = x
ptr = head->next
qtr = head
printf("请输入要删除的学生的学号:")
scanf("%d",&num)
getchar()
while(ptr!=NULL)
{
if( ptr->num != num) //遍历查找链表结点,未找到跳过该结点
{
ptr = ptr->next
qtr = qtr->next
}
else //找到则删除结点
{
ptr = ptr->next
qtr->next = ptr
break
}
}
printf("该学生信息已删除!\n\n")
return head
}
//修改学生信息
pstu RwrStu(pstu x)
{
char namestu[20]
char *p
char subname1[20],subname2[20],subname3[20]
int num
pstu head,ptr
head = x
ptr = head->next
printf("请输入要修改的学生的学号:")
scanf("%d",&num)
getchar()
while(ptr!=NULL)
{
if( ptr->num == num )
{
printf("已找到该学生信息,请填入修改项目:")
printf("请输入修改学生的姓名:")
scanf("%s",namestu)
getchar()
p = namestu
strcpy(ptr->name,p)
printf("请输入修改学生的科目1名称:")
scanf("%s",subname1)
getchar()
p = subname1
strcpy(ptr->subject[0].name,p)
printf("请输入修改学生的科目1成绩:")
scanf("%f",&ptr->subject[0].score)
getchar()
printf("请输入修改学生的科目2名称:")
scanf("%s",subname2)
getchar()
p = subname2
strcpy(ptr->subject[1].name,p)
printf("请输入修改学生的科目2成绩:")
scanf("%f",&ptr->subject[1].score)
getchar()
printf("请输入修改学生的科目3名称:")
scanf("%s",subname3)
getchar()
p = subname3
strcpy(ptr->subject[2].name,p)
printf("请输入修改学生的科目3成绩:")
scanf("%f",&ptr->subject[2].score)
getchar()
printf("该学生信息已修改!\n\n")
break
}
else
{
ptr = ptr->next
}
}
return head
}
//查找学生,参数为链表指针,和学生学号
//不好,应该将学号输入放进子函数,简化主函数结构,减少子函数参数
void FindStu(pstu x,char y)
{
pstu head,ptr
head = x
ptr = head->next
while( ptr != NULL)
{
if( ptr->num == (int)y) //因主函数中为节省空间,学号输入采用char数据,故强行准换
{
printf("已找到该学生信息!\n如下:")
printf("%03d %s %s %5.2f %s %5.2f %s %5.2f\n",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,ptr->subject[1].name,ptr->subject[1].score,ptr->subject[2].name,ptr->subject[2].score) break //注意此处找到并输出信息后要手动退出循环
}
else
{
ptr = ptr->next
}
}
if( ptr == NULL ) //查询成功检测,while循环中若找到,则ptr停留在当前学生的结点上
{
printf("未能找到该学生信息!\n")
}
}
//统计科目分数区间段的学生,参数为链表指针,科目名称,分数区间上下限
//同理,参数的录入应放入子函数,简化结构和编程
void Count(pstu x,char *y,float q,float p)
{
pstu head,ptr
char name[20]
char flag=0 //手动设置的查找结果flag
head = x
ptr = head->next
strcpy(name,y)
//printf("%s %5.2f %5.2f\n",name,q,p) //检测输入参数的传递,调试程序用
while( ptr != NULL) //开始查找统计,科目查找用strcmp函数比较科目字符串,返回值0为字符串相等
{ //此处while循环体中,重复的查找步骤太多,应设置科目匹配flag,参照rank()函数
if( strcmp(name,ptr->subject[0].name) == 0 ) //通过flag将科目确认放在while之外,循环体内只做分数区间的扫描和输出
{
if( q <= ptr->subject[0].score && ptr->subject[0].score<= p )
{
printf("%03d %s %s %5.2f\n",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score)
flag++
}
}
if( strcmp(name,ptr->subject[1].name) == 0 )
{
if( q <= ptr->subject[1].score && ptr->subject[1].score<= p )
{
printf("%03d %s %s %5.2f\n",ptr->num,ptr->name,ptr->subject[1].name,ptr->subject[1].score)
flag++
}
}
if( strcmp(name,ptr->subject[2].name) == 0 )
{
if( q <= ptr->subject[2].score && ptr->subject[2].score<= p )
{
printf("%03d %s %s %5.2f\n",ptr->num,ptr->name,ptr->subject[2].name,ptr->subject[2].score)
flag++
}
}
ptr = ptr->next
}
if(flag==0)
{
printf("未能找到该课程该区间分数段的学生!\n")
}
}
//学科成绩排名,采用交换数据的方法,参数为链表指针,科目名称
//同理参数问题
//链表排序问题,此处用交换结点数据方法,还有其他多种排序方法
//如,交换结点,辅助指针数组排序(未实现,过程繁杂),插入法排序等
void Rank(pstu x,char *y)
{
pstu head,ptr,qtr
char name[20]
char len=0
char flag=0 //简化算法,设置科目查找结果判断值,flag=0表示科目输入为未知科目,不存在
int i=0 //i、j循环次数控制参数
int j=0
char temp_name[20] //数据交换时的暂存信息变量
float temp0,temp1,temp2
int temp_num
strcpy(name,y)
head = x
ptr = head->next
while( ptr != NULL) //测链表长度,不包括表头结点
{
ptr = ptr->next
len++
}
ptr = head->next //指针ptr用过之后记得回原位
//开始查找科目
if( strcmp(name,ptr->subject[0].name) == 0) flag=1
if( strcmp(name,ptr->subject[1].name) == 0) flag=2
if( strcmp(name,ptr->subject[2].name) == 0) flag=3
if( flag == 0)
{
printf("未找到该科目!")
return
}
//开始排序,冒泡法比较各结点数据
//此处3个并列的if用switch case更清晰结构
if( n == 1 )
{
for( i=0i<leni++)
{
ptr = head->next->next //每一次内循环之后,ptr、qtr必然在最后两个节点上
qtr = head->next //故在进行内循环之前,要重新复位ptr、qtr
for( j=0j<len-i-1j++)
{
if( qtr->subject[0].score < ptr->subject[0].score )
{
temp_num = qtr->num //交换数据,因数据格式(科目顺序)明确规定,故不再做科目名称的替换
strcpy(temp_name,qtr->name)
temp0 = qtr->subject[0].score
temp1 = qtr->subject[1].score
temp2 = qtr->subject[2].score
qtr->num = ptr->num
strcpy(qtr->name,ptr->name)
qtr->subject[0].score = ptr->subject[0].score
qtr->subject[1].score = ptr->subject[1].score
qtr->subject[2].score = ptr->subject[2].score
ptr->num = temp_num
strcpy(ptr->name,temp_name)
ptr->subject[0].score = temp0
ptr->subject[1].score = temp1
ptr->subject[2].score = temp2
}
qtr = qtr->next
ptr = ptr->next
}
}
}
if( n == 2 )
{
for( i=0i<leni++)
{
ptr = head->next->next
qtr = head->next
for( j=0j<len-i-1j++)
{
if( qtr->subject[1].score < ptr->subject[1].score )
{
temp_num = qtr->num
strcpy(temp_name,qtr->name)
temp0 = qtr->subject[0].score
temp1 = qtr->subject[1].score
temp2 = qtr->subject[2].score
qtr->num = ptr->num
strcpy(qtr->name,ptr->name)
qtr->subject[0].score = ptr->subject[0].score
qtr->subject[1].score = ptr->subject[1].score
qtr->subject[2].score = ptr->subject[2].score
ptr->num = temp_num
strcpy(ptr->name,temp_name)
ptr->subject[0].score = temp0
ptr->subject[1].score = temp1
ptr->subject[2].score = temp2
}
qtr = qtr->next
ptr = ptr->next
}
}
}
if( n == 3 )
{
for( i=0i<leni++)
{
ptr = head->next->next
qtr = head->next
for( j=0j<len-i-1j++)
{
if( qtr->subject[2].score < ptr->subject[2].score )
{
temp_num = qtr->num
strcpy(temp_name,qtr->name)
temp0 = qtr->subject[0].score
temp1 = qtr->subject[1].score
temp2 = qtr->subject[2].score
qtr->num = ptr->num
strcpy(qtr->name,ptr->name)
qtr->subject[0].score = ptr->subject[0].score
qtr->subject[1].score = ptr->subject[1].score
qtr->subject[2].score = ptr->subject[2].score
ptr->num = temp_num
strcpy(ptr->name,temp_name)
ptr->subject[0].score = temp0
ptr->subject[1].score = temp1
ptr->subject[2].score = temp2
}
qtr = qtr->next
ptr = ptr->next
}
}
}
//输出排序过后的链表
ptr = head->next
while( ptr != NULL )
{
printf("%03d %s %s %5.2f %s %5.2f %s %5.2f\n",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,
ptr->subject[1].name,ptr->subject[1].score,
ptr->subject[2].name,ptr->subject[2].score)
ptr = ptr->next
}
}
//保存文件并退出,文件操作
void SaveQuit(pstu x)
{
pstu head,ptr
FILE *fp
char filename[] = "D:\\编程学习\\编程实践\\c语言课程设计1 学生信息管理\\data.txt"
head = x
ptr = head->next
if( NULL == (fp = fopen(filename,"w")) ) //判断文件是否存在及可读
{
printf("error!")
exit(0)
}
while(ptr != NULL) //遍历链表结点,按data约定格式输出数据
{
fprintf(fp,"%03d %s %s %5.2f %s %5.2f %s %5.2f\r",
ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,
一、用例视图写出用例图的介绍,包括功能包、用例的简述等。不少于1000字。
二、用例描述1. Login英文名称:<Login> 中文名称:<登录> 参与者 :<User>
1.1 简要说明对登录的流程进行描述,操作者输入用户名、密码、选择用户类型进行登录。1.2 事件流1.2.1 基本流(1) 系统:显示登录界面;(2) 用户:输入登录信息,登录信息包括:用户名、密码、用户类型;(3) 用户:可能进行下面两种操作:(a) 用户:选择登录,则执行基本流(4);(b) 用户:选择重置,则返回到基本流(1);(4) 系统:检查用户的登录信息,可能有下边两种情况;(a) 登录成功:执行基本流(5);(b) 登录失败:执行备选流(1);(5) 登录成功,结束此用例。1.2.2 备选流(1) 登录失败:如果系统检测到用户名、密码不存在或错误,则提示用户输入的登录信息不正确,系统返回到选择登录前的状态,用户可以重新输入/修改登录信息,重新执行基本流(3)。1.3 特殊需求(约束和非功能性需求)
1.3.1 第一特殊需求要求用户密码安全。
1.4 前置条件1.4.1 第一前置条件 系统已启动到登录界面。
1.5 后置条件1.5.1 第一后置条件用户登录成功后,根据用户类型进入到相应界面。Administrator用户进入到管理员界面,Employee用户进入到个人用户界面。1.5.2 第二后置条件用户登录失败,返回到登录界面。
1.6 扩展点没有与此相关的内容。
1.7 附加说明1.7.1 附加说明1登录过程要求安全性。
1.8 优先级没有与此相关的内容。2. 略3. 略三、领域模型与用户字典1. 领域建模2. 用户字典2.1 Employee实 体 名Employee(员工)说明公司的一个雇员,具有一定的职务或岗位,按照职务或岗位或工作量领取薪水基本属性编号、姓名、级别、职务、当月薪水实 体 名ID(编号)说明员工的编号,由系统自动生成。4位阿拉伯数字,例如: 1234从属实体Employee实 体 名Name(姓名)说明员工的姓名姓名最多8个汉字或16个英文字母从属实体Employee
2.2 <略><第二条词汇>的定义在此处提供。应提供读者理解该概念所需的全部信息
2.3 <第一组词汇>[有时,可利用术语分组来提高可读性。例如,如果问题领域包含与建筑项目的统计和建设两方面都相关的术语(当开发建筑项目管理系统时就会出现这种情况),提供两个不同子领域中的术语会使读者混淆不清。为了解决这种问题,我们采用了术语分组的方法。当提供分组术语时,应提供一段简短说明来帮助读者理解<一组词汇>的含义。为了便于查找,同组内的术语应按字母顺序排列。] [<第一组词汇>的定义在此处提供。应提供读者理解该概念所需的全部信息。]
四、非功能性需求
1. 质量属性性能暂无要求安全性密码安全存储的安全易用性简单易用快捷操作持续可用性程序稳定可伸缩性暂无要求互操作性可更换数据库或存储成标准格式CSV可靠性不易死机测试严格鲁棒性能容忍非法操作易理解性易被开发人员看懂设计文档和代码规范可扩展性能增加功能可重用性系统的类可被重用可测试性易测试可维护性易修改错误、代码易理解可移植性易换平台易换数据库
2. 分析后的约束技术C++开发,程序员水平不高平台Win32数据库Csv文件或Access界面风格命令行时间一周其他暂无
1:第一步:设计数据库,一般像这种小型宿舍管理系统,选用mysql作为数据库,然后就是设计表,包括表中的字段名,字段的大小以及表之间的关系
2:第二布:确认使用的技术,作为java,你可以选用Springmvc作为mvc框架,毕竟它比较灵活和简单,然后Spring是必须的,用来管理事务,Hibernate作为后台数据库管理框架,jsp作为页面表现层。这样的程序比较健壮,扩展起来比较方便
3:在第二步的基础上,接下来就是建立Bean类,比如学生类、宿舍类等等,映射数据库表的字段,然后就是编写Service层、Dao层,等等建立数据处理逻辑
4:实现表现层,写jsp页面,你想在前台展示的内容就可以写在jsp里面,这里可以选用的技术有juqery,js。如果为了考虑用户体验,可以用ajax,实现异步无刷新交互。
5:前后台相互通信,用juint进行集成测试,看看数据是否按照逻辑准确的显示出来。后期测试等等
当然如果嫌麻烦,可以不采用ssh框架,可以直接用jsp+servlet写,这样比较简单,原理大概也差不多。只不过分层没这么清晰和明确了。
{
public:
//学生姓名
//学生编号
//学生性别
TSubject su
//等等
}
class TSubject //科目类
{
public:
//语文成绩
//数学成绩
//等等成绩
}
class TSort //排序类
{
public:
//冒泡
//快排
//等等
}
TSort 和 TSudent 为友元类