资源描述
C++实践报告
计 算 机 程 序 设 计
实 践 报 告
专业班级:
学 号:
姓 名:
2010年6月
铁矿石信息管理系统
摘要:经过近两周24学时的C++计算机实践,我基本上完成了对所要求的熟悉使用C++编写一个关于铁矿石信息管理系统的程序。对于使用C++面向对象的编程思想也有了更深的体会。
关键词:铁矿石信息、系统、指针、链表、增加删除信息、结构体、类成员函数使用、全局变量
1、铁矿石信息管理系统的开发设计思想
1、铁矿石基本信息管理系统可以通过输入输出某一铁矿石的一些信息,如序号、编号、TFe FeO CaO MgO SiO2 Al2O3 LoI等进行对铁矿石信息的处理。
2、为了更方便地表示一个铁矿石的基本信息,可以先定义一个结构体(Emp_info),在这个结构体中包含了一个铁矿石的所有基本信息。
3、定义一个类(Employee),在类中定义必要的成员函数,用这些函数可以对结构体中的铁矿石信息进行需要的处理,如添加铁矿石信息函数(AddItem)、删除铁矿石信息函数(RemoveItem)、查找铁矿石信息函数(Search)等。然后通过调用成员函数来实现系统的功能。
4、用类Employee定义一个全局变量employee,设计主函数及其所调用的函数,通过employee来使用类中的成员函数达到处理数据的目的。
2、铁矿石基本信息管理系统功能及系统设计介绍
1、系统的功能
铁矿石基本信息管理系统能根据已输入的数据信息进行必要的数据处理,然后可以根据提示添加或删除铁矿石信息,还可以对有误信息进行修改。出于需要可以对某些或全部的铁矿石信息进行输出。系统的总的功能如图所示:铁矿石信息系统
输出主菜单
输入选项
添加铁矿石信息
删除铁矿石信息
修改铁矿石信息
输出指定铁矿石信息
输出全部铁矿石信息
退出
结束
是
否
为完成这些功能首先需要一个可以存储数据的数据单元,即一个结构体Emp_info,在这个结构体中定义必要的变量:pay[7]。其所对应的具体变量如下表所示。
pay[0]
pay[1]
pay[2]
pay[3]
pay[4]
pay[5]
Pay[6]
TFe
FeO
CaO
MgO
SiO2
Al2O3
LoI
定义了结构体后需要定义一个类Employee,在类中定义了两个私有成员函数Find和Print用来查找和输出铁矿石工资信息,五个公有成员函数分别为ListCount()、AddItem()、RemoveItem()、AmendItem()、List()、Search()。然后根据不同的功能分别编写成员函数。
2、系统主要模块设计
⑴类成员函数的设计
①、AddItem()成员函数的设计
添加信息是所有功能实现的一个必要条件,因此十分重要。在AddItem()之前还有一个统计此前链表数目的函数ListCount(),然后返回一个链表数值。在AddItem()成员函数实现之初需要先判断当前链表是否为空,这可以通过之前的ListCount()函数的返回值是否为零来判断。若没有直接添加信息,若有,还需考虑输入的是否为之前存储过的,若是存储过的需返回一个通知的消息,否则可以用结构体Emp_info开辟(new Emp_info)一个新的数据域存储所输入的数据,并将其地址赋给上一个结点的next,这样就完成了添加信息的目的。
②RemoveItem()成员函数的设计
删除成员函数是在之前输入的信息有误时对原数据作一定的纠正,这增加了系统的功能和可用性,给使用者也带来一定便利之处。
此处删除是按照使用者数的学号进行查找删除的,具体实现步骤如图。
通过图示方法能成功删除一些无使用价值的信息。
③、AmendItem()函数的设计
修改函数的作用与删除函数相似,其设计较前两个成员函数容易。先调用一个查找函数,查找到这个链表的位置,然后调用输入输出函数重新对链表中的变量赋值。
④Search()函数的设计
处于显示页面的优化的需要,在查找之前先输出〝Search......〞。定义一个p指针存放用Find()函数找到的满足要求的数据域的地址,然后调用输出函数将所得数据域内变量值一一对应输出即可。
⑤、Find()函数的设计
前面的几个函数几乎无不调用了Find()函数,因此Find()函数也是个功能实现的重要的一个部分。查找时首先需要判断是否当前列表为空,如果为空查找将无意义,不为空时才对链表中的数据进行查找。当链表不为空时,先用Emp_info结构体定义一个指向head的指针,然后使用while循环(由于链表数未知,因此此处选用while语句)来进行查找符合条件的数据域。当p指向数据域中num值与所给定的num值一致,则停止,并返回这个指针,否则返回一个无法找到的消息。
⑥Print()、List()函数的设计
这两个函数的程序设计比较简单,只是进行简单的函数调用即可。值得注意的是,在Print()函数和List()函数中显示在主面板上的变量信息的顺序必须与程序源代码中一致,否则将会使输入输出甚至其他运算出现错误。
⑵、定义一个全局变量,用Employee类来定义,后面的主函数及主调函数所做的操作都可以基于这个全局变量。
⑶、主函数及主调函数的设计
根据系统的功能可以先将系统的主要功能列出:1、输入相对应铁矿石信息;2、查找指定铁矿石编号的基本信息;3、修改制定铁矿石编号的基本信息;4、输出全部铁矿石的基本信息;5、删除指定铁矿石的基本信息;6、退出程序。因此可以设计函数:
Menu()--用于显示主菜单并输入一个选择的值;
Exit()--用于退出程序;
Input()--用于输入员工工资数值;
AddNew()--用于输入或添加新的数据;
DoFind()--查找指定编号(num)的铁矿石信息;
DoDelete()--用于删除指定编号(num)的铁矿石信息;
DoAmendItem()--用于修改指定编号(num)铁矿石工资信息;
List()--用于列出当月全部铁矿石工资信息;
Main()--调用各个函数实现系统的总体功能。
在各个函数的设计过程中,用于主要是引用全局变量中的成员函数,因此设计难度不是太高。在全部了解了系统的功能及设计流程之后,这些函数只需要一些简单的调用和循环就可实现其功能。其中,在main()函数中使用了swith语句来实现选择功能。
⑷调试运行及系统的优化
由于在编写程序过程中思路清晰,前后主要函数模块的编写都是独立编写的,再整体整合到一个程序中,因此调试时只是遇到了几个拼写错误,主要的语法及编译错误都没出现。
3、总结
经过近两周的C++计算机编程实践,我基本上完成了对所要求的熟悉使用C++编写一个企业铁矿石基本信息管理系统的程序。对于使用C++我用了更深的体会。
在本学期的开始学C++面向过程的程序编写时,我对那种面向过程,调用函数进行计算解决问题的方式觉得理所当然,觉得这种方式对于解决一切问题都有效。到了学使用面向对象编程语言编写程序时觉得很不适应。在这近两周的编程实践中,我体会到了这种面向对象编程的益处。面向对象的编程方式可以通过定义一个类,在类中定义一些能完成特定功能的成员函数来进行数据的处理,从而完成特定的功能。就好像一个公司中有新的任务,公司可以通过不同部门的独立完成特定的任务来实现某一功能。这可以大大简化任务执行的过程,简化编程,降低变成难度。
这次实践也使我懂得自己亲自动手做事能带来许多收获,不放过任一可能出错的环节,仔细用心做事。。。
附源代码:
#include<iostream>
using namespace std;
struct Emp_info
{
int A,num;
float pay[7];
Emp_info *next;
};
class Employee
{
private:
Emp_info *head;
void Print(Emp_info *);
Emp_info *Find(int);
public:
Employee(){head=NULL;}
int ListCount();
void AddItem(int A,int num,float pay[7]); //添加一个对象到表尾
void RemoveItem(int); //删除指定对象信息
void AmendItem(int); //修改指定对象的信息
void List(); //列出所有对象的信息
void Search(int); //查找指定编号对象的信息
};
int Employee::ListCount () //统计链表数,并返回一个整数
{
if(!head)return 0;
Emp_info *p=head;
int n=0;
while(p) {n++;p=p->next;}
return n;
}
void Employee::AddItem (int A,int num,float pay[7]) //增加一个铁矿石信息
{
if(!head)
{
head=new Emp_info;
for(int i=0;i<7;i++)
head->pay[i]=pay[i];
head->A=A;
head->num=num;
head->next=NULL;
return;
}
Emp_info *t=head;
while(t&&t->num!=num) t=t->next;
if(t)
{
cout<<"操作失败;铁矿石编号为"<<num<<"的记录已经存在!"<<endl;
return;
}
Emp_info *p=head;
while(p->next ) p=p->next;
Emp_info *p1=new Emp_info;
p1->num=num;
p1->A=A;
for(int i=0;i<7;i++)
p1->pay[i]=pay[i];
p1->next=NULL;
p->next=p1;
return;
}
void Employee::RemoveItem(int num) //删除指定铁矿石编号的记录
{
Emp_info *t=Find(num);
if(!t) return;
Emp_info *p=head;
if(head==t) //如果第一个记录即是要删除的记录
{
head=head->next;
delete p;
cout<<"成功删除铁矿石编号为"<<num<<"的记录!"<<endl<<endl;
return;
}
while(p->next!=t)p=p->next;
Emp_info *p1=p->next;
p->next=p1->next;
delete p1;
cout<<"成功删除铁矿石编号为"<<num<<"的记录!"<<endl<<endl;
return;
}
void Employee::AmendItem(int num) //修改指定铁矿石编号的记录
{
float a,b,c,d,e,f,g,h,i;
Emp_info *p=Find(num);
if(!p)return;
cout<<"请重新输入相应信息"<<endl;
cout<<"序号 铁矿石编号 TFe FeO CaO MgO SiO2 Al2O3 LoI"<<endl;
cin>>a>>b>>c>>d>>e>>f>>g>>h>>i;
p->A=a;
p->num=b;
p->pay[0]=c;
p->pay[1]=d;
p->pay[2]=e;
p->pay[3]=f;
p->pay[4]=g;
p->pay[5]=h;
p->pay[6]=i;
return;
}
void Employee::Print(Emp_info *p) //输出指定铁矿石编号的记录
{
cout.setf(ios::left); //设置左对齐
cout.width(6); //设置域宽为6
cout.precision(6); //设置显示有6位有效数字
cout<<p->A<<" ";
cout<<p->num<<" ";
cout<<p->pay[0]<<" "<<p->pay[1]<<" "<<p->pay[2]<<" "<<p->pay[3]<<" "<<p->pay[4]<<" "<<p->pay[5]<<" "<<p->pay[6]<<endl;
return;
}
void Employee::List() //列出所有记录
{
if(ListCount==0)
{
cout<<"当前列表为空,请先输入数据!"<<endl;
return;
}
Emp_info *p=head;
cout<<"共有记录"<<ListCount()<<"个"<<endl;
cout<<"序号 铁矿石编号 TFe FeO CaO MgO SiO2 Al2O3 LoI "<<endl;
while(p){Print(p);p=p->next;}
cout<<endl;
return;
}
void Employee::Search (int num) //查找指定铁矿石编号记录并输出
{
cout<<"Search......"<<endl;
Emp_info *p=Find(num);
if(p)
{
cout<<"序号 铁矿石编号 TFe FeO CaO MgO SiO2 Al2O3 LoI "<<endl;
Print(p);
}
cout<<endl;
}
Emp_info *Employee::Find(int num) //查找指定铁矿石编号的记录
{
if (ListCount()==0)
{
cout<<"当前列表为空,请先输入数据!"<<endl;
return NULL;
}
Emp_info *p=head;
while(p)
{
if(p->num==num) break;
p=p->next;
}
if(!p)
{
cout<<"错误:找不到该记录!\n";
return NULL;
}
return p;
}
Employee employee; //定义一个全局变量
int Menu() //主菜单
{
cout<<"\n ***************菜单***************"<<endl<<endl;
int n=1,select=-1;
cout<<" "<<n++<<". 输入或添加铁矿石的信息"<<endl<<endl;
cout<<" "<<n++<<". 查找指定铁矿石编号的信息"<<endl<<endl;
cout<<" "<<n++<<". 修改制定铁矿石编号的信息"<<endl<<endl;
cout<<" "<<n++<<". 输出铁矿石的相关信息"<<endl<<endl;
cout<<" "<<n++<<". 删除指定铁矿石的信息"<<endl<<endl;
cout<<" 0. 退出"<<endl<<endl;
cout<<" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"<<endl;
cout<<" [请选择(输入相应数字)]:";
cin>>select;
return select;
}
char Exit() //退出
{
char s;
cout<<"确定要退出程序吗?[Y/N]:";
cin>>s;
return s;
}
void Input(int *A,int *num,float pay[7]) //输入信息
{
cout<<"请输入\n序号 铁矿石编号 TFe FeO CaO MgO SiO2 Al2O3 LoI"<<endl;
cin>>*A;
if(*A==-1)return;
cin>>*num>>pay[0]>>pay[1]>>pay[2]>>pay[3]>>pay[4]>>pay[5]>>pay[6];
return;
}
void AddNew() //增加一个新的记录
{
int num=0,A=0;
float pay[7]={0,0,0,0,0,0,0};
cout<<endl<<"当输入的序号为-1是表示结束输入"<<endl;
Input(&A,&num,pay);
while(A!=-1)
{
employee.AddItem(A,num,pay);
Input(&A,&num,pay);
}
return;
}
void DoFind() //查找记录
{
int num;
cout<<endl<<"当输入的铁矿石为-1是表示结束输入"<<endl;
do{
cout<<"请输入要查找的铁矿石的编号";
cin>>num;
if(num==-1)continue;
employee.Search(num);
}while(num!=-1);
return;
}
void DoDelete() //删除记录
{
cout<<endl<<"当输入的铁矿石编号为-1是表示结束输入"<<endl;
int num;
do
{
cout<<"请输入要删除的铁矿石的编号:";
cin>>num;
if(num==-1)continue;
employee.RemoveItem(num);
}while(num!=-1);
return;
}
void AmendItem() //修改记录
{
cout<<endl<<"当输入的铁矿石编号为-1是表示结束输入"<<endl;
int num;
do
{
cout<<"请输入要修改的铁矿石的编号:";
cin>>num;
if(num==-1)continue;
employee.AmendItem(num);
}while(num!=-1);
return;
}
void List() //列出所有记录
{
employee.List();
}
int main() //主函数
{
cout<<" Welcome!\n 铁矿石基本信息管理系统\n 作者:zpy (版权所有,翻版必究!!!)\n";
int select;
char s;
while(1)
{
select=Menu();
switch(select)
{
case 0:
s=Exit();
if(s=='y'||s=='Y')return 0;
break;
case 1:
AddNew();
break;
case 2:
DoFind();
break;
case 3:
AmendItem();
break;
case 4:
List();
break;
case 5:
DoDelete();
break;
default:
cout<<"无效输入!"<<endl;
}
}
return 0;
}
- 26 -
展开阅读全文