今天软件工程讲的jackson的软件开发方法,给了一个小例子,虽然例子不太实际,但对于理解软件开发过程,及jackson程序设计的各种规范还是有些用的,下面回顾一下。
老师不让拷ppt,笔记在书记113页。主要是把数据库中的考生信息文件和考生成绩文件合并起来。
jackson方法:
1,数据结构的表示。
2,输入结构与输出结构的对应关系。
3,确定结构图。
4,列出分配所有的操作和条件。
操作:1,停止。1,打开两个文件。3,建立输出文件。4,从输入文件中各读一条记录。5,生成一条新记录。6,将新记录写入到文件中。7,关闭所有文件。
条件:I(1),文件结束。
跟据图写出伪代码
产生新文件 seq
打开两个输入文件
建立一个输出文件
从输入文件各读一条记录
分析考生记录 iter until 文件结束
分析考生记录 seq
产生准考证号
产生姓名
产生地址
产生考分
生成新记录
将新记录写入到输出文件
处理考生记录 end
分析考生记录文件结束 end
关闭全部文件
停止
产生新文件 end
然后就是用源代码实现上面的伪代码了。
在这之前,说说自己的看法。
首先,这个例子的工作完全可以通过数据库的连接操作完成,敲几行SQL语句就可以实现。
再则,数据库中是用表存数据的,结构图中总是说打开文件呀,关闭文件呀,觉得有点不妥。
最后,结构图中第二层的4操作(从输入文件各读一条记录)完全是没有用的,直接放到下面的循环中更好。
下面是源代码。
已通过编译调试。
用的是access数据库。
程序可以正常运行的前提是数据库中有三张表,StudentInfo,StudentGrade,StudentCom,前两张记录了考生的基本信息,后一张为空。
StudentInfo中有Num,Name,Address字段,StudentGrade有Num,Grade字段。StudentCom中有Num,Name,Adrress,Grade字段。
正常的结果是,会把StudentInfo,StudentGrade的信息合并到StudentCom中。
#include
#include
//引入ADO库文件 注意C:\Program Files\Common Files\System\ado\msado15.dll这是指系统盘下,
//如果你的系统盘是D盘的话 那么应该是D:\Program Files\Common Files\System\ado\msado15.dll
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
using namespace std;
void main()
{
::CoInitialize(NULL); //初始化OLE/COM库环境
_ConnectionPtr pCon; //申明Connection指针
//申明Recordset指针
_RecordsetPtr pRecSou1; //申明StudentInfo表的指针
_RecordsetPtr pRecSou2; //申明StudentGrade表的指针
_RecordsetPtr pRecDes; //申明StudentCom表指针
pCon.CreateInstance(__uuidof(Connection)); //处始化Connection指针
pRecSou1.CreateInstance(__uuidof(Recordset)); //处始化Recordset指针
pRecSou2.CreateInstance(__uuidof(Recordset)); //处始化Recordset指针
pRecDes.CreateInstance(__uuidof(Recordset)); //处始化Recordset指针
try
{
//连接数据库
pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
cout<Open("SELECT * FROM StudentInfo",
_variant_t((IDispatch*)pCon,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
//adOpenStatic: 静态 adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
pRecSou2->Open("SELECT * FROM StudentGrade",
_variant_t((IDispatch*)pCon,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
pRecDes->Open("SELECT * FROM StudentCom",
_variant_t((IDispatch*)pCon,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
}
catch(_com_error e)
{
cout<MoveFirst();
pRecSou2->MoveFirst();
_variant_t ra;
pCon->Execute("delete * from StudentCom",&ra,adCmdText);
_bstr_t Info_Num;
_bstr_t Name;
_bstr_t Address;
_bstr_t Com_Num;
_bstr_t Grade;
while (!pRecSou1->adoEOF && !pRecSou2->adoEOF)
{
Info_Num = pRecSou1->GetCollect("Num");
Name = pRecSou1->GetCollect("Name");
Address = pRecSou1->GetCollect("Address");
Com_Num = pRecSou2->GetCollect("Num");
Grade = pRecSou2->GetCollect("Grade");
if (strcmp((char*)Info_Num,(char*)Com_Num)==0)
{
pRecDes->AddNew();
pRecDes->PutCollect("Num",Info_Num);
pRecDes->PutCollect("Name",Name);
pRecDes->PutCollect("Address",Address);
pRecDes->PutCollect("Grade",Grade);
pRecDes->Update();
pRecSou1->MoveNext();
pRecSou2->MoveNext();
}
else
{
cout<<"error"<Close();
pRecSou1->Close();
pRecSou2->Close();
pCon->Close();
}
catch (_com_error e)
{
cout<
#include
#include
#include
using namespace std;
int kmps(char *,char* ,int);
void main()
{
fstream file1,file2,fileDes;
char bufInfo[64];
char bufGread[64];
char bufCom[64];
file1.open("studentInfo.txt");//存放学生信息的文件
file2.open("studnetGrade.txt");//存放学生成绩的文件
fileDes.open("studentCom.txt",ios::out);//合并后的文件
while (!file1.eof() && !file2.eof())
{
file1.getline(bufInfo,64);
file2.getline(bufGread,64);
int index = kmps(bufGread,")",0);
strcat(bufInfo,bufGread+index);
sprintf(bufCom,"%s\n",bufInfo);
fileDes.write(bufCom,strlen(bufCom));
cout<=slen)
return i-slen+1;
else
return 0;
}
在工程文件中有要有两个文件。StudentInfo.txt和StudentGrade.txt文件
StudentInfo.txt文件格式如(准考证号)(姓名)(地址)
StudentGrade.txt文件格式如(准号证号)(成绩)
每条记录一行。