1、课程设计报告C/C+程序课程设计题目一: 建立简单学生成绩录入系统 题目二: 建立简单通话记录生成系统 班级 姓名 学号 题目一:建立简单学生成绩录入系统一 概述:本程序的目的是存储学生的信息,包括学号、姓名、成绩。程序运行后,输入相应的编号可以实现添加、删除、查询、打印学生信息,并且学生信息输入完毕后,学生将按照成绩由高到低进行排列,这点可以从打印出来的结果看出。二 软件结构: 本程序主要运用链表的使用规则来进行编写代码,从创建链表到插入链表,以及删除某个成员和显示链表等都是用指针来实现的。链表建立如下:numnamescorenextnumnamescorenextnumnamescore
2、nextnumnamescorenexthead- NULL 从图我们可以看出,如果要删除或是查询某个学生信息,只需找到head指针,然后用head=head-next,就可以依次找到所需要的东西。程序运行如下:添加:删除:查询:打印:三 关键代码struct Student int num; char name10; float score; Student *next;这一段是定义一个结构体类型Student,并且定义一个指向结构体的next指针,这是后面所有代码的铺垫,可谓是最基本的代码,同时也决定了后面的代码需实现链表的创建等操作。if(head=NULL) head=dest; el
3、se if(head-scorescore) dest-next=head; head=dest; else insert(head,dest);void insert(Student *head,Student *dest) Student *temp=head; while(temp-next!=NULL) if(head-scoredest-score&dest-score=temp-next-score) dest-next=temp-next; temp-next=dest; return; temp=temp-next; temp-next=dest; dest-next=NULL
4、;这段代码实现的是学生按成绩高低进行排列,分成三个部分:第一部分:当head=NULL;将dest赋给head,相当于添加第一个成员结构体。第二部分:需要在链表的最前面添加新成员结构体,dest-next=head;head=dest;运用此代码就可以达到目的。 第三部分:需要从链表的第二个成员结构体开始,实现插入新结构体的目的,此时,本程序新建了一个insert函数,通过调用此函数来添加新结构体,insert函数主要是判断成绩的高低,以确定需要插入的位置。难点代码:bool remove(Student* &head,float score) if(head=NULL) return NUL
5、L; if(head-score=score) Student *p=head; head=head-next; delete p; return true; Student* pf=head; Student* pc=head-next; if(pc=NULL) return false; do if(pc-score=score) break; pf=pc; pc=pc-next; while(pc!=NULL); pf-next=pc-next; delete pc; return true;删除,这段代码是本程序最难的代码,它没有想像的那么简单,也需要分成三个部分:第一部分:如果hea
6、d=NULL;return false;第二部分:如果要删除的是头节点,那么需先拿下头结点if(head-score=score) Student *p=head; head=head-next; delete p; return true; 用delete运算符撤销空间,并return true。第三部分:当所要删除的不是头结点时,就需要用循环来确定位置,并定义另外一个指针指向它,然后释放,并且 return true;如果循环结束还未找到要删除的节点,则return false。本部分重点在于remove函数的返回值,定义的类型为逻辑型,在判断链表中是否存在所要删除的节点时,可以从返回值为
7、true 和false 中得到,如果是true,打印“删除成功”。题目二:建立简单通话记录生成系统一 概述: 本程序的目的是记录通话记录,并把所有记录保存在一文件中,便于查看。具体目标是可以实现添加、删除、查询、保存和读取通话记录等操作。二 软件结构 程序与上一程序不同,利用的结构体数组的知识,将添加的通话记录保存在结构体数组中,之后的操作可以通过for循环及其他知识来实现。本程序没有用指针的方式,原因在于该程序软件要求能实现文件的保存和读取,用指针的方式很难实现,因此采用数组的方式以达到要求。typedef struct PhoneItemchar name20; int phonenum;
8、PI,*pPI; 此段代码是定义PhoneItem结构体 的内容,包含姓名和电话号码,并且将类型PhoneItem简写成PI,主要是为了方便以后的代码书写更简洁。PI phonerecord100;这句话就是定义PI类型数组,数组名为phonerecord,数组里的每个元素包含的内容就是结构体里定义的姓名和电话号码。通过phonerecordi.name,phonerecordi.phonenum来访问元素内容。运行结果如下:输入电话记录:删除电话记录:查询电话记录:读取电话记录:三 关键代码strcpy(phonerecordi.name,name);这句话的作用是将当前输入name 复制给
9、phonerecordi.name,这其中用了strcpy字符串复制函数,而且最简洁的方式就是运用此种方法。不能直接赋值过去的原因是name是数组名,name的值是地址,因而不可以这样做,以及代码中还会用到strcmp函数。static int i=0; int index; cinindex; if(index=1) i+=1; char name20; int phonenum; cout请输入信息:namephonenum; strcpy(phonerecordi.name,name); phonerecordi.phonenum=phonenum; static int i=0;定义一
10、个局部静态变量i,之所以用static的目的是这个i代表的是所添加的数组元素个数,因为元素个数会因为某些操作而变化,比如删除某个通话记录等,static的好处在于可以使i 的值保持为当前值且不被释放,这句话可以称为是本程序最巧妙的地方。之后的i+=1,是为了改变i的值,以保证i总是所输入的元素个数。else if(index=2) bool flag=false; int phonenum; coutphonenum; for(int j=1;j=i;j+) if(phonerecordj.phonenum=phonenum) for(;ji;j+) phonerecordj.phonenum
11、=phonerecordj+1.phonenum; strcpy(phonerecordj.name,phonerecordj+1.name); cout删除成功!endl; flag=true; break; if(flag=true) i-=1;这部分代码是实现删除通话记录这一操作,这里也定义bool型的flag来记录true 和false,通过嵌套循环找到要删除的数组元素,然后用赋值语句将该数组元素被下一元素遮盖,直到数组末尾,再写i-=1,将总数组元素个数减一,这样在以后的保存和读取中就不会显示已删除的元素,这段代码的内涵也较为丰富,知识覆盖面广。ofstream outfile; o
12、utfile.open(f1.txt,ios:binary); if(!outfile) coutfile open error!endl; exit(1); for(int j=1;j=i;j+) outfile.write(char*)&phonerecordj,sizeof(PI); outfile.close();这段是二进制文件的写入,运用ofstream,因此需要在开头写上#include,来包含头文件。这段代码是典型二进制文件写入的代码。else if(index=5) ifstream infile; infile.open(f1.txt,ios:binary); if(!infile) coutfile open error!endl; exit(1); PI temp; for(int j=1;j=i;j+) infile.read(char*)&temp,sizeof(PI); couttemp.name temp.phonenumendl; infile.close(); 这段代码是二进制文件读取的典型代码,与二进制文件写入相反,唯一区别的是定义了PI temp;利用temp.name 和temp.phonenum来实现数组元素的显示。本程序并没有将通话记录类似程序一那样进行排列,而是按照输入的顺序来显示的,这样从某一方面来可以体现程序的简洁性。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1