class Tele //功能类 {
public:
Tele(); //构造函数 ~Tele(); //析构函数
void Save(); //数据保存到文件 TeleNumber * Search(char *); //信息查找 void Sort(); //排序 void Insert(); //插入 void Delete(); //删除
void Change(); //更改个人信息 void Show(); //显示个人信息 void Swap(TeleNumber *,TeleNumber *); private:
TeleNumber * End,* Head;
ifstream infile; //定义读,写文件对象 ofstream outfile; };
在Tele的构造函数中建立单链表存储结构体TeleNumber:
Tele::Tele() {
Head=new TeleNumber; //头插法建立单链表 Head->Next=new TeleNumber; End=Head->Next;
infile.open(\打开外存文件,看是否有数据存在
while(!infile.eof()) //如果有,则打开,并将数据读取到程序 {
End->ReadFile(infile);
if(End->name[0]=='\\0')break; End->Next=new TeleNumber; End=End->Next; }
// infile.close(); }
文件保存:
void Tele::Save() //保存文件 {
outfile.open(\建立外存文件a1.txt for(TeleNumber *p=Head->Next;p!=End;p=p->Next)
outfile<
cout<<\保存成功!\}
主界面及其功能设计: int main() {
bool flag=true; Tele tele; char name[20]; while(flag) {
//system(\
Cout<< “ 个人电话号码查询系统 \ cout<<\请选择您所需要的操作: \ cout<<\增加电话号码 \ cout<<” B.显示电话号码 \ cout<<\排序个人电话 \ cout<<\查找个人电话 \ cout<<\删除个人信息 \ cout<<\修改个人信息 \ cout<<\保存个人信息 \ cout<<\退出系统 \ char x; do{
cin>>x; {
switch(x) {
case 'A':tele.Insert();break; case 'B':tele.Show();break; case 'C':tele.Sort();break;
case 'D':cout<<\请输入查找人姓名\ cin>>name;
tele.Search(name);break; case 'E':tele.Delete();break;
case 'F':tele.Change();break; case 'G':tele.Save();break;
case 'K':cout<<\谢谢您的使用!\
default:break; }
}
}while(x!='K'); }
return 0; }
(6)附录:运行结果
查找:
修改:
四、火烧连营
(1)需求规格说明:
【问题描述】:
“火烧连营”是三国演义中的著名典故之一广为流传,假定文本文件c1.txt 是火烧连营中的军营分布图,每个字符A 代表一个营帐,营帐是可燃物,其他字符代表不可燃的空白地段,文件共有40 行70 列,从键盘输入任意点的x 和y值(x<70,y<40)作为着火点,“火烧连营”后,被燃烧的营帐标上字符’X’。
【基本要求】:
从文本c1.txt读入内容,再从键盘输入任意点的x 和y值(x<70,y<40)作为着火点,“火烧连营”后,被燃烧的营帐标上字符’X’,并把整个结果输出到文件c2.txt
(2)总体设计与要求:
【算法设计】:
设计思想:
在上课时老师给我们讲过一个迷宫的例子,就是从一个点出发,前后左右遍历跟这个点相关联的连通点,而这道题目就和迷宫题有相似之处,只要开辟一个堆栈,先将着火点压栈,然后重复一下操作:栈顶点出栈并标记X,同时将符合被燃烧条件的邻居点入栈。。。。,直到栈空为止。
设计表示:
输入着火点
遍历
输出结果 Stack.File.Add() 可燃点弹出 着火点压栈 判断是否可燃 Infile.c1.txt 读入数据 fire.[i][j] File.IsEmpty() Delete()
(3)程序结构分析:
本程序虽然也是涉及到外存与内存但没有要求相互对应,只需将外存数据读入内存,在
内存中把着火点表示出来就好了,所以相对来说还是比电话号码查询要简单,最主要的步骤就是前后左右遍历着火点,直到所有与之连通点都被遍历就好了,这需要几个if语句想嵌套就好了。
(4)编程遇到的问题及改进方法:刚开始遍历营帐时没出什么大的问题,但在火
烧完要输出结果时遇到了问题,输出图案不对,因为在读文件时,只顾着读而忽略了,每读完一行时都要换行,最后在for语句中加了个换行的指令,图案就对了。
(5)编码:
判断是否可燃: bool judge(char a) {
if(a=='A') {
return 1;