课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
课程设计报告
C/C++程序课程设计
题目一:
建立简单学生成绩录入系统
题目二:
建立简单通话记录生成系统
班级
姓名
学号
题目一:
建立简单学生成绩录入系统
一概述:
本程序的目的是存储学生的信息,包括学号、姓名、成绩。
程序运行后,输入相应的编号可以实现添加、删除、查询、打印学生信息,并且学生信息输入完毕后,学生将按照成绩由高到低进行排列,这点可以从打印出来的结果看出。
二软件结构:
本程序主要运用链表的使用规则来进行编写代码,从创建链表到插入链表,以及删除某个成员和显示链表等都是用指针来实现的。
链表建立如下:
num
name
score
next
num
name
score
next
num
name
score
next
num
name
score
next
head->
NULL
从图我们可以看出,如果要删除或是查询某个学生信息,只需找到head指针,然后用head=head->next,就可以依次找到所需要的东西。
程序运行如下:
添加:
删除:
查询:
打印:
三关键代码
structStudent
{intnum;
charname[10];
floatscore;
Student*next;
};这一段是定义一个结构体类型Student,并且定义一个指向结构体的next指针,这是后面所有代码的铺垫,可谓是最基本的代码,同时也决定了后面的代码需实现链表的创建等操作。
if(head==NULL)
head=dest;
elseif(head->score<=dest->score)
{
dest->next=head;
head=dest;
}
else
insert(head,dest);
voidinsert(Student*head,Student*dest)
{
Student*temp=head;
while(temp->next!
=NULL)
{
if(head->score>dest->score&&dest->score>=temp->next->score)
{dest->next=temp->next;
temp->next=dest;
return;
}
temp=temp->next;
}
temp->next=dest;
dest->next=NULL;
这段代码实现的是学生按成绩高低进行排列,分成三个部分:
第一部分:
当head=NULL;将dest赋给head,相当于添加第一个成员结构体。
第二部分:
需要在链表的最前面添加新成员结构体,dest->next=head;head=dest;运用此代码就可以达到目的。
第三部分:
需要从链表的第二个成员结构体开始,实现插入新结构体的目的,此时,本程序新建了一个insert函数,通过调用此函数来添加新结构体,insert函数主要是判断成绩的高低,以确定需要插入的位置。
难点代码:
boolremove(Student*&head,floatscore)
{if(head==NULL)
{
returnNULL;
}
if(head->score==score)
{Student*p=head;
head=head->next;
deletep;
returntrue;
}
Student*pf=head;
Student*pc=head->next;
if(pc==NULL)
returnfalse;
do
{if(pc->score=score)
break;
pf=pc;
pc=pc->next;
}while(pc!
=NULL);
pf->next=pc->next;
deletepc;
returntrue;
}删除,这段代码是本程序最难的代码,它没有想像的那么简单,也需要分成三个部分:
第一部分:
如果head=NULL;returnfalse;
第二部分:
如果要删除的是头节点,那么需先拿下头结点
if(head->score==score)
{Student*p=head;
head=head->next;
deletep;
returntrue;
}用delete运算符撤销空间,并returntrue。
第三部分:
当所要删除的不是头结点时,就需要用循环来确定位置,并定义另外一个指针指向它,然后释放,并且returntrue;如果循环结束还未找到要删除的节点,则returnfalse。
本部分重点在于remove函数的返回值,定义的类型为逻辑型,在判断链表中是否存在所要删除的节点时,可以从返回值为true和false中得到,如果是true,打印“删除成功”。
题目二:
建立简单通话记录生成系统
一概述:
本程序的目的是记录通话记录,并把所有记录保存在一文件中,便于查看。
具体目标是可以实现添加、删除、查询、保存和读取通话记录等操作。
二软件结构
程序与上一程序不同,利用的结构体数组的知识,将添加的通话记录保存在结构体数组中,之后的操作可以通过for循环及其他知识来实现。
本程序没有用指针的方式,原因在于该程序软件要求能实现文件的保存和读取,用指针的方式很难实现,因此采用数组的方式以达到要求。
typedefstructPhoneItem
{charname[20];
intphonenum;
}PI,*pPI;此段代码是定义PhoneItem结构体的内容,包含姓名和电话号码,并且将类型PhoneItem简写成PI,主要是为了方便以后的代码书写更简洁。
PIphonerecord[100];这句话就是定义PI类型数组,数组名为phonerecord,数组里的每个元素包含的内容就是结构体里定义的姓名和电话号码。
通过phonerecord[i].name,phonerecord[i].phonenum来访问元素内容。
运行结果如下:
输入电话记录:
删除电话记录:
查询电话记录:
读取电话记录:
三关键代码
strcpy(phonerecord[i].name,name);这句话的作用是将当前输入name复制给phonerecord[i].name,这其中用了strcpy字符串复制函数,而且最简洁的方式就是运用此种方法。
不能直接赋值过去的原因是name是数组名,name的值是地址,因而不可以这样做,以及代码中还会用到strcmp函数。
staticinti=0;
intindex;
cin>>index;
if(index==1)
{i+=1;
charname[20];
intphonenum;
cout<<"请输入信息:
"<cin>>name>>phonenum;
strcpy(phonerecord[i].name,name);
phonerecord[i].phonenum=phonenum;
}
staticinti=0;定义一个局部静态变量i,之所以用static的目的是这个i代表的是所添加的数组元素个数,因为元素个数会因为某些操作而变化,比如删除某个通话记录等,static的好处在于可以使i的值保持为当前值且不被释放,这句话可以称为是本程序最巧妙的地方。
之后的i+=1,是为了改变i的值,以保证i总是所输入的元素个数。
elseif(index==2)
{boolflag=false;
intphonenum;
cout<<"请输入要删除的电话号码:
";
cin>>phonenum;
for(intj=1;j<=i;j++)
{if(phonerecord[j].phonenum==phonenum)
{for(;j
{
phonerecord[j].phonenum=phonerecord[j+1].phonenum;strcpy(phonerecord[j].name,phonerecord[j+1].name);
}
cout<<"删除成功!
"<flag=true;
break;
}
}
if(flag==true)
i-=1;
这部分代码是实现删除通话记录这一操作,这里也定义bool型的flag来记录true和false,通过嵌套循环找到要删除的数组元素,然后用赋值语句将该数组元素被下一元素遮盖,直到数组末尾,再写i-=1,将总数组元素个数减一,这样在以后的保存和读取中就不会显示已删除的元素,这段代码的内涵也较为丰富,知识覆盖面广。
ofstreamoutfile;
outfile.open("f1.txt",ios:
:
binary);
if(!
outfile)
{cout<<"fileopenerror!
"<exit
(1);
}
for(intj=1;j<=i;j++)
{outfile.write((char*)&phonerecord[j],sizeof(PI));
}
outfile.close();这段是二进制文件的写入,运用ofstream,因此需要在开头写上#include,来包含头文件。
这段代码是典型二进制文件写入的代码。
elseif(index==5)
{ifstreaminfile;
infile.open("f1.txt",ios:
:
binary);
if(!
infile)
{cout<<"fileopenerror!
"<exit
(1);
}
PItemp;
for(intj=1;j<=i;j++)
{infile.read((char*)&temp,sizeof(PI));
cout<}
infile.close();
}
这段代码是二进制文件读取的典型代码,与二进制文件写入相反,唯一区别的是定义了PItemp;利用temp.name和temp.phonenum来实现数组元素的显示。
本程序并没有将通话记录类似程序一那样进行排列,而是按照输入的顺序来显示的,这样从某一方面来可以体现程序的简洁性。