Debug是程序员的天职,寻找Bug的过程痛苦难熬啊……但是Debug出来之后顿时觉得世界一片美好^_^
E:\【资料】我的编程\DevC++\ProXYC Fin 的目录
2013/11/17 22:58 <DIR> .
2013/11/17 22:58 <DIR> ..
2013/11/17 20:58 78 diary.txt
2013/11/17 12:57 2,683 main.cpp
2013/11/17 18:11 1,735 Product XYC Ver4.0.dev
2013/11/17 18:09 34 Product.txt
2013/11/17 01:12 8,566 ProductList.cpp
2013/11/17 12:57 873 ProductList.h
2013/11/16 22:37 549 ProductNode.cpp
2013/11/16 23:15 684 ProductNode.h
8 个文件 15,202 字节
2 个目录 30,579,601,408 可用字节
Main.cpp
#include "ProductList.h" //Finished on Nov.17th 18:10 using namespace std; void menu() { cout <<" *┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓*\n" <<" *┃ 商品信息维护系统Ver4.0 ┃*\n" <<" *┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃*\n" <<" *┃ ◎从下面的功能中选择一个◎ ┃*\n" <<" *┃1.显示全部信息 5.进货(插入) 9.存盘 ┃*\n" <<" *┃2.查询型号 6.提货(删除) 0.结束(存盘退出) ┃*\n" <<" *┃3.查询名称 7.修改(更改) a.恢复(丢失存盘前更改) ┃*\n" <<" *┃4.查询品牌 8.退出(放弃存储) Copyright CYX ┃*\n" <<" *┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛*\n\n"; } //CYX Stand For Chendian Yanran Xujiali //主程序 int main() { ProductList pl; cout <<" *┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓*\n" <<" *┃ 商品信息维护系统 ┃*\n" <<" *┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃*\n" <<" *┃ 从下面的功能中选择一个! ┃*\n" <<" *┃ ┃*\n" <<" *┃ 1.开始营业 ┃*\n" <<" *┃ 2.退出系统 ┃*\n" <<" *┃ <Tip>测试用账号密码:okcd00 ┃*\n" <<" *┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛*\n\n"; cout<<"\n请选择:"; string choice; while(1) { cin>>choice; if(choice[0]=='2')exit(0); else if(choice[0]!='1')cout<<"此序号不存在,请重新输入!\n"; else if(pl.JudgeCode())//如果密码正确 { pl.ReadFile();//读入文件 while(1) { cout<<"请按回车继续..."; getchar(); getchar(); system("cls");//清屏 menu();//显示菜单 cout<<"请输入您需要的功能:(单字符 0-a)"; cin>>choice;//选择 switch(choice[0]) { case '1':pl.PrintList();break; //显示全部产品信息 case '2':pl.FindByNO();break; //按型号查询 case '3':pl.FindByName();break; //按名称查询 case '4':pl.FindByBrand();break; //按品牌查询 case '5':pl.Insert();break; //进货(插入结点) case '6':pl.Delete();break; //提货(删除结点) case '7':pl.Modify();break; //修改(修改结点) case '8':{cout<<"谢谢您的使用!\n";exit(0);} //放弃存储直接退出 case '9':pl.WriteFile();break; //存盘 case '0':{pl.WriteFile();cout<<"谢谢您的使用!\n请按回车退出此程序";getchar();exit(0);}//存盘退出 case 'a':{pl.DataResume();break;}//数据恢复 default:cout<<"您的输入不正确,请重新输入!\n"; } } } else cout<<"请选择:"; } }
ProductList.cpp
/////////////////////Note////////////////////////////////// //最大的Bug: ProductNode* nex 引用函数必须是nex->func() // // 话说ProductNode s就必须是s.func() // /////////////////////////////////////////////////////////// //**在单链表中有序插入结点**// //8th Correction 2013.11.17 #include "ProductList.h" //#define Cout(a) cout<<a->getNO()<<"\t\t"<<a->getName()<<"\t\t"<<a->getBrand()<<"\t\t"<<a->getPrice()<<"\t\t"<<a->getQuantity()<<endl; //偷个懒用define结果花了更多时间Debug……今天一天就用来debug了…… 11.17 15:00 ////////////////////////////////////////// string tmpNO;//型号 string tmpName;//名称 string tmpBrand;//品牌 int tmpPrice;//卖出价 int tmpQuantity;//数量 //鉴于不知道如何重载数据类型为 Product::getNO() 的运算符,直接绕一个弯读入好了 ////////////////////////////////////////// void ProductList::InitInsert(ProductNode* s) //插入初始化 { ProductNode* f=first; ProductNode* nex=first->next; while(nex&&nex->getPrice()<s->getPrice()){ f=nex; nex=nex->next;}//f结点始终为nex结点的前趋结点,退出循环时,s应插入f结点后 s->next=f->next; f->next=s; } //**读入文件**// //Readfile又闪退了……11.17 //Solved on 11.17 要把product.txt放入工程,而且大小写不能错= = void ProductList::ReadFile() { ifstream fin("product.txt");//输入文件流对象 if(fin.fail()) { cout<<" product.txt 文件读入错误!\n"; cout<<"请按回车键退出..."; getchar(); exit(0); } string oneline;//temp-文件的一行 ProductNode* r=first; while(getline(fin,oneline))//当文件没有结束,读一行 { istringstream sin(oneline);//字符串流,库函数sstream.h中的一员 ////////Try Once But Don't Know if it can be used////// ProductNode *s=new ProductNode; //NEW 一个新的结点 sin>>tmpNO>>tmpName>>tmpBrand>>tmpPrice>>tmpQuantity; s->setNO(tmpNO); s->setName(tmpName); s->setBrand(tmpBrand); s->setPrice(tmpPrice); s->setQuantity(tmpQuantity); InitInsert(s); }/////////////////////////////////////////////////////////// } //**输出链表数据**// //每次都会自动卡在PList这里……11.17 14:17 是While死循环了吗…… //把Cout Define去掉之后正常了,但是又闪退了= =,疯掉了= = void ProductList::PrintList()const { cout<<"产品信息如下:\n"; cout<<"型号"<<"\t\t"<<"名称"<<"\t\t"<<"品牌"<<"\t\t"<<"单价"<<"\t\t"<<"数量"<<endl; ProductNode* nex=first->next; while(nex) { cout<<nex->getNO()<<"\t\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t\t"<<nex->getPrice()<<"\t\t"<<nex->getQuantity()<<endl; nex=nex->next; } } //**营业结束,写入文件**// void ProductList::WriteFile() { ofstream fout("product.txt");//输出文件流对象 ProductNode* nex=first->next; while(nex) { fout<<nex->getNO()<<"\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t"<<nex->getPrice()<<"\t"<<nex->getQuantity()<<endl; nex=nex->next; } ofstream fout2("diary.txt");//清空日志文件(DEBUG 用),可注释掉 cout<<"存盘成功!\n"; } //析构函数 ProductList::~ProductList() { ProductNode* nex=first; ProductNode* q; while(nex) //释放单链表的每一个结点的存储空间 { q=nex; //暂存被释放结点 nex=nex->next; //工作指针nex指向被释放结点的下一个结点,使单链表不断开 delete q; } } //**根据型号查找**(结果不止一个,所以用void)// void ProductList::FindByNO() { string NO; bool flag=false;//假定没有此产品 cout<<"输入产品型号:"; cin>>NO; ProductNode* nex; for(nex=first->next;nex;nex=nex->next) if(nex->getNO()==NO) { if(flag==false)//只输出一次标题 cout<<"查询结果如下:\n"<<"型号"<<"\t\t"<<"名称"<<"\t\t"<<"品牌"<<"\t\t"<<"单价"<<"\t\t"<<"数量"<<endl; cout<<nex->getNO()<<"\t\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t\t"<<nex->getPrice()<<"\t\t"<<nex->getQuantity()<<endl; flag=true;//存在产品 } if(flag==false)cout<<"无此产品!"; } //**根据名称查找**// void ProductList::FindByName() { string Name; bool flag=false;//假定没有 cout<<"输入产品名称:"; cin>>Name; ProductNode* nex=first->next; for(nex=first->next;nex;nex=nex->next) if(nex->getName()==Name) { if(flag==false) cout<<"查询结果如下:\n"<<"型号"<<"\t\t"<<"名称"<<"\t\t"<<"品牌"<<"\t\t"<<"单价"<<"\t\t"<<"数量"<<endl; cout<<nex->getNO()<<"\t\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t\t"<<nex->getPrice()<<"\t\t"<<nex->getQuantity()<<endl; flag=true; } if(flag==false)cout<<"无此产品!"; } //**根据品牌查找**// void ProductList::FindByBrand() { string Brand; bool flag=false;//假定没有 cout<<"输入产品品牌:"; cin>>Brand; ProductNode* nex=first->next; for(nex=first->next;nex;nex=nex->next) if(nex->getBrand()==Brand) { if(flag==false) cout<<"查询结果如下:\n"<<"型号"<<"\t\t"<<"名称"<<"\t\t"<<"品牌"<<"\t\t"<<"单价"<<"\t\t"<<"数量"<<endl; cout<<nex->getNO()<<"\t\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t\t"<<nex->getPrice()<<"\t\t"<<nex->getQuantity()<<endl; flag=true; } if(flag==false)cout<<"无此产品!"; } //**进货,插入节点**// //2013.11.17 Insert Rewrite 4th void ProductList::Insert() { PrintList(); string NO,Name,Brand; cout<<"请输入产品信息插入(输入产品型号时输入z并按回车 停止插入并返回上一级)\n"; cout<<"产品型号:"; cin>>NO; if(NO[0]=='z') exit(0); //debug By XJL_ZoeCUR 11.17 18:07 Wrong by return -> exit(0) ProductNode *s=new ProductNode; s->setNO(NO); cout<<"产品名称:"; cin>>Name; s->setName(Name); cout<<"产品品牌:"; cin>>Brand; s->setBrand(Brand); ProductNode *nex=first->next; while (nex&&!(nex->getNO()==s->getNO()&&nex->getName()==s->getName()&&nex->getBrand()==s->getBrand())) nex=nex->next; ////这里的nex是一个指针,但是指针的话不知道如何才可以调用指针所指的类的函数///// //2013.11.17 不知道怎么就编译通过了…… 庆祝^_^ Lucky if(nex)//此类产品存在 { cout<<"此类产品存在!输入进货数量\n"; cout<<"产品数量:"; int Quantity; cin>>Quantity; s->setQuantity(Quantity); if(s->getQuantity()<=0){cout<<"数据错误!\n";return;} tmpQuantity=nex->getQuantity(); tmpQuantity+=s->getQuantity(); nex->setQuantity(tmpQuantity); tmpPrice=nex->getPrice(); s->setPrice(tmpPrice);//便于修改日志文件(ForDebug) } else//此类产品不存在 { cout<<"产品单价:"; cin>>tmpPrice; s->setPrice(tmpPrice); if(s->getPrice()<=0){cout<<"数据错误!\n";return;} cout<<"产品数量:"; cin>>tmpQuantity; s->setQuantity(tmpQuantity); if(s->getQuantity()<=0){cout<<"数据错误!\n";return;} InitInsert(s); } ofstream fout("diary.txt",ios::app);//向日志文件中添加记录 tmpNO=s->getNO(); tmpName=s->getName(); tmpBrand=s->getBrand(); tmpPrice=s->getPrice(); tmpQuantity=s->getQuantity(); fout<<"进货"<<"\t"<<tmpNO<<"\t"<<tmpName<<"\t\t"<<tmpBrand<<"\t"<<tmpPrice<<"\t"<<tmpQuantity<<endl; cout<<"修改成功\n"; PrintList(); } //**提货,数量减少or删除结点**// bool ProductList::Delete() { PrintList(); cout<<"输入卖出产品的信息!\n"; string NO,Name,Brand; cout<<"输入型号:(输入z返回)"; cin>>NO; if(NO[0]=='z')return false; cout<<"产品名称:"; cin>>Name; cout<<"产品品牌:"; cin>>Brand; //InitInsert(&s);//Something wrong ProductNode* nex=first->next; ProductNode* f=first; while (nex&&!(nex->getNO()==NO&&nex->getName()==Name&&nex->getBrand()==Brand)) //查找结点 { f=nex; nex=nex->next; } if (!nex)//产品不存在 { cout<<"此产品不存在!\n"; return false; } else//产品存在 { int Quantity; int Price=nex->getPrice();//修改日志用,因为nex结点要被删除 cout<<"输入提货数量:"; cin>>Quantity; while(Quantity>nex->getQuantity()){cout<<"输入的数量超出库存量,请重新输入!\n";cin>>Quantity;} if(Quantity<nex->getQuantity()) { tmpQuantity=nex->getQuantity(); tmpQuantity-=Quantity; nex->setQuantity(tmpQuantity); } else//数量相等,删除结点 { f->next=nex->next; delete nex; cout<<"此产品被删除!\n"; } cout<<"修改成功\n"; PrintList(); ofstream fout("diary.txt",ios::app);//向日志文件中添加记录 fout<<"提货"<<"\t"<<NO<<"\t"<<Name<<"\t\t"<<Brand<<"\t"<<Price<<"\t"<<Quantity<<endl; return true; } } //**数据恢复(读取日志文件进行相应操作)**// void ProductList::DataResume() { ifstream fin("diary.txt"); string Type;//进货or提货 string oneline; while(getline(fin,oneline))//当文件没有结束,读一行 { istringstream sin(oneline);//字符串流 ProductNode* s=new ProductNode; sin>>Type>>tmpNO>>tmpName>>tmpBrand>>tmpPrice>>tmpQuantity; s->setNO(tmpNO); s->setName(tmpName); s->setBrand(tmpBrand); s->setPrice(tmpPrice); s->setQuantity(tmpQuantity); if(Type=="进货") { ProductNode* nex=first->next; //工作指针nex初始化 while (nex&&!(nex->getNO()==s->getNO()&&nex->getName()==s->getName()&&nex->getBrand()==s->getBrand())) //查找第i个结点 nex=nex->next; if(nex)//此类产品存在 { tmpQuantity=nex->getQuantity(); tmpQuantity+=s->getQuantity(); nex->setQuantity(tmpQuantity); } else InitInsert(s);//此类产品不存在 } if(Type=="提货") { ProductNode* nex=first->next; //工作指针nex初始化 ProductNode* f=first; //工作指针nex初始化 while (nex&&!(nex->getNO()==s->getNO()&&nex->getName()==s->getName()&&nex->getBrand()==s->getBrand())) //查找第i-1个结点 { f=nex; nex=nex->next; } if (nex)//产品存在 { if(s->getQuantity()<nex->getQuantity()) { tmpQuantity=nex->getQuantity(); tmpQuantity-=s->getQuantity(); nex->setQuantity(tmpQuantity); } else if(s->getQuantity()==nex->getQuantity())//数量相等,删除结点 { f->next=nex->next; delete nex; } } } } cout<<"数据恢复成功\n"; PrintList(); } //**修改产品信息**// bool ProductList::Modify() { PrintList(); cout<<"输入要修改的产品信息!\n"; string NO,Name,Brand; cout<<"产品型号:(输入'z'返回)"; cin>>NO; if(NO[0]=='z')return false; cout<<"产品名称:"; cin>>Name; cout<<"产品品牌:"; cin>>Brand; ProductNode* nex=first->next; ProductNode* f=first; while (nex&&!(nex->getNO()==NO&&nex->getName()==Name&&nex->getBrand()==Brand)) //查找结点 { f=nex; nex=nex->next; } if (!nex) //结点nex不存在 { cout<<"此产品不存在!\n"; return false; } else //结点nex存在 { ofstream fout("diary.txt",ios::app);//向日志文件中添加记录 fout<<"提货"<<"\t"<<nex->getNO()<<"\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t"<<nex->getPrice()<<"\t"<<nex->getQuantity()<<endl; int Price,Quantity; cout<<"此产品信息如下:\n"; cout<<"型号:"<<nex->getNO()<<"\n名称:"<<nex->getName()<<"\n品牌:"<<nex->getBrand()<<"\n单价:"<<nex->getPrice()<<"\n数量:"<<nex->getQuantity()<<endl; cout<<"输入新型号:(输入z型号不变)"; cin>>NO; if(NO[0]!='z')nex->setNO(NO);//原来读入和输出又记反了T^T 2013.11.17 cout<<"输入新名称:(输入z名称不变)"; cin>>Name; if(Name[0]!='z')nex->setName(Name); cout<<"输入新品牌:(输入z品牌不变)"; cin>>Brand; if(Brand[0]!='z')nex->setBrand(Brand); cout<<"输入新单价:(输入0保持原价不变)"; cin>>Price; if(Price!=0)nex->setPrice(Price); cout<<"输入新数量:(输入0保持原数量不变)"; cin>>Quantity; if(Quantity!=0)nex->setQuantity(Quantity); //向日志文件中添加记录 fout<<"进货"<<"\t"<<nex->getNO()<<"\t"<<nex->getName()<<"\t\t"<<nex->getBrand()<<"\t"<<nex->getPrice()<<"\t"<<nex->getQuantity()<<endl; //按单价顺序调整记录顺序 if(!(Price==0||(Price>=f->getPrice()&&(nex->next==NULL||Price<=nex->next->getPrice()))))//需要调整 {//单价没有改变or 单价>前一个结点的单价(包括头结点)并且 单价<后一个结点的单价(包括后一个结点为空) f->next=nex->next;//先删除nex InitInsert(nex);//再按单价顺序插入nex } cout<<"修改成功!"; PrintList(); return true; } } //判断密码// bool ProductList::JudgeCode() const { bool power=true; while(1) { char goon; cout<<"输入用户名:"; string name; cin>>name; cout<<"输入6位密码:"; char code[7]; for(int i=0;i<7;i++) { code[i]=_getch();//#include<conio.h> if(i<6)cout<<'*'; } cout<<endl; if(name=="okcd00"&&code[0]=='o'&&code[1]=='k'&&code[2]=='c'&&code[3]=='d'&&code[4]=='0'&&code[5]=='0') break; else cout<<"用户名或密码错误,是否重新输入?(y/n):"; cin>>goon; if(goon=='n') {power=0;break;}; } return power; }
ProductList.h
//产品库存,使用链表存储 #include "ProductNode.h" using namespace std; class ProductList { ProductNode* first;//头结点 void InitInsert(ProductNode* s); //私有成员函数,读文件创建链表 public: ProductList(){first=new ProductNode;first->next=NULL;}//建立只有头结点的空链表 void ReadFile(); //营业开始,读入文件 void WriteFile(); //营业结束,写入文件 void Insert(); //进货,插入结点 void FindByNO(); //根据型号查找 void FindByName(); //根据名称查找 void FindByBrand(); //根据品牌查找 bool Delete(); //提货,删除结点 bool Modify(); //修改信息 void PrintList()const;//遍历单链表,按序号依次输出各元素 void DataResume(); //读入问卷 ~ProductList(); //析构函数 bool JudgeCode()const;//判断密码 private: }; /* istream operator <<(想写重载……但是括号里应该些什么呢……)//输出函数返回值的重载 { cout<< } */
ProductNode.cpp
#include "ProductNode.h" #include <cstring> //string &operator=(const string &s); //set private void ProductNode::setNO(string s){NO=s;} void ProductNode::setName(string s){Name=s;} void ProductNode::setBrand(string s){Brand=s;}; void ProductNode::setPrice(int i){Price=i;} void ProductNode::setQuantity(int q){Quantity=q;} //get private string ProductNode::getNO(){return NO;} string ProductNode::getName(){return Name;} string ProductNode::getBrand(){return Brand;} int ProductNode::getPrice(){return Price;} int ProductNode::getQuantity(){return Quantity;}
ProductNode.h
//产品结点,本来想用Struct来着的……老师不让……就改成类了 #include<string> #include<iostream> #include<fstream>//For file writing #include<cstdlib> #include<sstream>//istringstream & ostringstream #include<conio.h>//single input judging function using namespace std; class ProductNode { public: void setNO(string s); void setName(string s); void setBrand(string s); void setPrice(int i); void setQuantity(int q); string getNO(); string getName(); string getBrand(); int getPrice(); int getQuantity(); ProductNode* next; // class ProductList; private: string NO;//型号 string Name;//名称 string Brand;//品牌 int Price;//卖出价 int Quantity;//数量 //各种……is private with this context };