




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/数据库底层编程#include#include#include#include#define LENname 100 /姓名字段最大长度#define LENfname 100 /文件名最大长度#define LENnode 100 /记录最大长度#define LENsubjectName 50 /科目名称长度int LEN;/统计当前记录数目int LenWillDel;/统计当前已被置为删除状态的记录数目int LENsubject=3;/3个科目/创建数据库表中字段及其结构如下:struct DataType int id;/学号字段,学号作为主关键字 char nameLENname;/姓名字段 float chinese;/语文成绩字段 float math;/数学成绩字段 float english;/英语成绩字段 int toFile;/作为导出表到文件的依据(默认状态不可导出,查询得到的记录状态改变,为1,此时允许将新表导出为新文件存储于磁盘上) int del;/删除记录的标志字段;DataType nodeLENnode;/新建文件(相当于在数据库中建一张新表),同时录入学生信息及其成绩void newFile() int id; char nameLENname; float chinese; float math; float english; LEN=-1; LenWillDel=0; for(;) LEN+; coutid; if(id=-1) break; nodeLEN.id=id; coutname; strcpy(nodeLEN.name,name); coutchinese; nodeLEN.chinese=chinese; coutmath; nodeLEN.math=math; coutenglish; nodeLEN.english=english; nodeLEN.del=0; /*从newFile()中可体会到如下组合的巧妙之处:-void newFile() LEN=-1; for(;) LEN+;/不管三七二十一,当前记录数目为0,如果往下没有被break,则新增记录有效,记录数目在下一次循环中,在检查是否满足条件之前增一. if(id=-1) break; doSomethine. -/以下组合看起来也不错哦_,找个时间验证-void newFile() LEN=0; for(;) if(id=-1) break; doSomethine. LEN+; -*/inline void showData(int i) if(nodei.del=0) couti setw(5)nodei.id setw(10) setw(10)nodei.chinese setw(10)nodei.math setw(10)nodei.english endl;void showData() if(LEN=0) coutno data!endl; return; cout下标setw(5)idsetw(10)namesetw(10)chinesesetw(10)mathsetw(10)englishendl endl; for(int i=0;iLEN;i+) if(nodei.del=0) showData(i); cout当前内存中有LEN条记录endl endl;void save() char fnameLENfname; coutfname; fstream f(fname,ios:out|ios:binary); for(int i=0;iLEN;i+) if(nodei.del=0) f.write(char*)&nodei,sizeof(nodei); f.close(); cout保存成功!endl;void save(int) char fnameLENfname; coutfname; fstream f(fname,ios:out|ios:app|ios:binary); for(int i=0;iLEN;i+) if(nodei.del=0) f.write(char*)&nodei,sizeof(nodei); f.close(); cout保存成功!endl;/导出当前表到文件中void save(char) char fnameLENfname; coutfname; fstream f(fname,ios:out|ios:binary); for(int i=0;iLEN;i+) if(nodei.del=0 & nodei.toFile=1)/当且仅当1和2(说明:1.没有被预删除 2.记录状态为允许导出) f.write(char*)&nodei,sizeof(nodei); f.close(); cout顺利导出新表!endl;void open() char fnameLENfname; coutfname; fstream f(fname,ios:in|ios:binary); LEN=-1; for(;) if(!f) break; LEN+; f.seekg(LEN*sizeof(nodeLEN); f.read(char*)&nodeLEN,sizeof(nodeLEN); f.close(); LenWillDel=0; /因为预删除数目没有记录于文件,因此对于新打开的文件,需要初始化预删除记录数目, /理所当然地,在我们成功地对当前记录进行预删除操作之前,当前预删除记录数目为0 showData();inline void showMenu() coutendl 0.退出 10.当前预删除记录 20.endl 1.新建/追加 11.某同学总分 21.endl 2.保存 12.某同学平均分 22.endl 3.打开 13.全班某科总分 23.endl 4.显示当前内存中数据14.全班某科平均分 24.endl 5.显示菜单 15.排序(按学号/按成绩)25.endl 6.关于 16.修改记录 26.endl 7.当前记录数目 17.按姓名查询列表 27.endl 8.当前预删除记录数目18.按姓名查某同学信息 28.endl 9.单条预删除 19.按成绩查询 29.endl endl;inline void about() coutendl 数据库底层编程实例:学生成绩管理系统 endl created by dzily,E-mail:,create date:2008.5.7 endl endl;inline void showLEN() cout当前记录:LENendl endl;inline void showLenWillDel() cout当前预删除记录:LenWillDelendl endl;/按语文成绩查找第一个符合条件的记录int BinSearchC(float chinese,int) int low=0,mid,high=LEN-1; while(low=high) mid=(low+high)/2; if(nodemid.chinese=chinese) return mid; else if(nodemid.chinesechinese) low=mid+1; else high=mid-1; return -1;/按学号查找学生信息(学号为主关键字)int BinSearch(int id) int low=0,mid,high=LEN-1; while(lowid) high=mid-1; else low=mid+1; return -1;/按学号排序void maopaoI() int i,j; DataType temp; for(i=0;iLEN-1;i+) for(j=0;jnodej+1.id) temp=nodej; nodej=nodej+1; nodej+1=temp; /按姓名查询,生成新的表void findNameList() int i; char nameLENname; coutname; for(i=0;iLEN;i+) if(strcmp(,name)=0)/已在showData(int)中说明:if(nodei.del=0),因此注意此处不要重复 showData(i);/按姓名找第一条符合条件的记录,返回记录下标int findName() char nameLENname; coutname; for(int i=0;iLEN;i+) if(nodei.del=0 & strcmp(,name)=0) return i; return -1;/查询语文成绩介于n1和n2之间的所有记录void searListC(float n1,float n2) int i; for(i=0;i=n1 & nodei.chinese=n2) nodei.toFile=1;/状态改变,允许导出 showData(i);/showData(int)中已说明:if(nodei.del=0) void searListM(float n1,float n2) int i; for(i=0;i=n1 & nodei.math=n2) nodei.toFile=1; showData(i);/showData(int)中已说明:if(nodei.del=0) void searListE(float n1,float n2) int i; for(i=0;i=n1 &nodei.english=n2) nodei.toFile=1; showData(i);/showData(int)中已说明:if(nodei.del=0) inline void showSearScoreMenu() cout请选择要查询的科目subject:endl 1.chineseendl 2.mathendl 3.englishendl;void searScore(int way,float n1,float n2) switch(way) case 1:searListC(n1,n2);break; case 2:searListM(n1,n2);break; case 3:searListE(n1,n2);break; default:cout参数不对endl; /按语文成绩排序void maopaoC() int i,j; DataType temp; for(i=0;iLEN-1;i+) for(j=0;jnodej+1.chinese) temp=nodej; nodej=nodej+1; nodej+1=temp; /按数学成绩排序void maopaoM() int i,j; DataType temp; for(i=0;iLEN-1;i+) for(j=0;jnodej+1.math) temp=nodej; nodej=nodej+1; nodej+1=temp; /按英语成绩排序void maopaoE() int i,j; DataType temp; for(i=0;iLEN-1;i+) for(j=0;jnodej+1.english) temp=nodej; nodej=nodej+1; nodej+1=temp; /排序菜单inline void maopaoMenu() cout请选择排序方式:endl 1.按学号endl 2.按语文成绩endl 3.按数学成绩endl 4.按英语成绩endl;void maopao(int way) switch(way) case 1:maopaoI();break; case 2:maopaoC();break; case 3:maopaoM();break; case 4:maopaoE();break; default:cout参数不对,请改之!endl; showData();void willDel() int temp; int id; coutid; temp=BinSearch(id); if(temp=-1) coutnot findendl; return; /if(nodei.del=0) /对于此处,此语句可有可无. /因为没有时,无论nodei.del=0还是nodei.del=1,都将nodei.del=1; /而有此语句时,针对nodei.del=0都执行nodei.del=1. /可看出,减少一次判断,就多给一个本来值为1的变量重新赋值为1.(得此失彼) /反过来,增加一次判断,就减少一个本来值为1的变量重新赋值为1.(失此得彼) /得失由来:根据追求高效编程的原则,如果内存已不是主要考虑的因素,在不影响软件功能的情况下,尽可能地去掉一些工作来减少CPU的工作量是一种得到,即得到更高效. /而此处有与无此语句,效果都一致,因此可有可无. /2008.5.7 10:16 dzily nodetemp.del=1; LenWillDel+;void showWillDel() for(int i=0;iLEN;i+) if(nodei.del=1) showData(i);void upd() int temp; int id; coutid; temp=BinSearch(id); if(temp=-1) coutnot findendl; return; coutid; nodetemp.id=id; /免得分配内存而不用,因为temp=-1时return了,还不如没有return才分配.就像下面: char nameLENname; float chinese; float math; float english; coutname; strcpy(,name); coutchinese; nodetemp.chinese=chinese; coutmath; nodetemp.math=math; coutenglish; nodetemp.english=english;/按记录号执行恢复预删除操作void unWillDel() int id; coutid; int temp; temp=BinSearch(id); if(temp=-1) coutnot findendl; return; if(nodetemp.del=1) nodetemp.del=0; LenWillDel-; else cout这是一条处于正常状态的记录,不能对其进行恢复预删除操作!endl;/求一个同学的总分float sum(int id) int temp; temp=BinSearch(id); if(temp=-1) return -1.0;/对不起,您所输入的学号所对应的学生信息不存在,请重新输入,如果还有其他疑问,请拨国际长途一万号咨询.前三分钟话费1元/秒,以后也是1元/秒(气死一个算一个_),不用谢! return (float)nodetemp.chinese+(float)nodetemp.math+(float)nodetemp.english);/求一个同学的平均分float ave(int id) float temp_sum; temp_sum=sum(id);/求平均前先求和,此过程由系统内部完成,用户使用时不需考虑 if(temp_sum=-1.0) return -1.0;/将找不到的信息往下传递 return temp_sum/(float)LENsubject;/求全班同学某一科目的总分float sum(char subject) int i; float temp_sum=0.0; if(strcmp(subject,chinese)=0) for(i=0;iLEN;i+) if(nodei.del=0) temp_sum+=(float)nodei.chinese; else if(strcmp(subject,math)=0) for(i=0;iLEN;i+) if(nodei.del=0) temp_sum+=(float)nodei.math; else if(strcmp(subject,english)=0) for(i=0;iLEN;i+) if(nodei.del=0) temp_sum+=(float)nodei.english; else return -1.0; /作为参数的科目名称不存在,请修改(注意科目名称全部是小写)! /因为函数的返回类型为float,因此保存类型一致. return temp_sum;/求全班同学某一科目的平均分float ave(char subject) float temp_ave; float temp_sum; temp_sum=sum(subject); if(temp_sum=-1.0) return -1.0;/将找不到科目的信息往下传递,同时退出函数 if(strcmp(subject,chinese)=0) temp_ave=temp_sum/(float)(LEN-LenWillDel); else if(strcmp(subject,math)=0) temp_ave=temp_sum/(float)(LEN-LenWillDel); else if(strcmp(subject,english)=0) temp_ave=temp_sum/(float)(LEN-LenWillDel); return temp_ave;/*int inputSubject() int temp; char subjectLENsubjectName; coutsubject; if(strcmp(subject,chinese)=0) temp=1; else if(strcmp(subject,math)=0) temp=2; else if(strcmp(subject,english)=0) temp=3; else temp=-1; return temp;*/void main() about(); showMenu(); int sn; for(;) coutendl sn; switch(sn) case 1: newFile(); break; case 2: cout请选择保存方式:endl 1.追加endl 2.替换endl 3.导出新表(替换方式)sn_save; if(sn_save=1) save(1);/追加保存方式,添加到原来的文件末尾 else if(sn_save=2) save();/替换保存方式,替换掉原来的文件 else if(sn_save=3) save(a); else cout保存方式输入不对endl; break; case 3: open(); break; case 4: showData(); break; case 5: showMenu(); break; case 6: about(); break; case 7: showLEN(); break; case 8: showLenWillDel(); break; case 9: willDel(); break; case 10: showWillDel(); break; case 11:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全方案咨询报告
- 中国邮政2025天津市秋招财务管理岗位高频笔试题库含答案
- 白酒消费者饮酒行为趋势分析与品牌定位研究-2025年洞察报告
- 白酒市场高端消费趋势分析与消费者饮酒场景研究-2025年报告
- 建设工程设计合同(专业建设工程设计合同)
- 简易购销合同样本
- 中国邮政2025仙桃市秋招平台产品经理岗位面试模拟题及答案
- 2025年抵押房屋买卖合同范本更新版
- 中国邮政2025新余市秋招合规审计岗位高频笔试题库含答案
- 盐池商业咨询方案
- 场景速写课件
- 矿山物品回收合同范本
- 小学音乐名师工作室学员个人学习计划
- 2025年运动员:体育与健康知识试题及答案
- 2025-2026学年度第一学期小学数学教研组工作计划
- 重庆风电基础知识培训课件
- 2025年携程笔试试题及答案
- 2025年调酒师职业资格考试模拟试题集锦及答案
- 田径竞赛规则修改(2025-2026)
- 2025年萤石产业市场行业当前市场规模及未来五到十年发展趋势报告
- 铭记历史+砥砺前行-2025-2026学年高一上学期抗战胜利80周年爱国教育主题班会
评论
0/150
提交评论