【神のDebug】C++作业,10小时debug的结果
来源:互联网 发布:js 特效 同意网站协议 编辑:程序博客网 时间:2024/05/22 15:33
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:10using 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 4thvoid 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;//先删除nexInitInsert(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 privatestring 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 functionusing 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 };
- 【神のDebug】C++作业,10小时debug的结果
- debug和release的不同结果
- 作业的debug反思(求亚军)
- 后台作业DEBUG
- 作业debug思考
- 简洁的C debug方法
- 神一般的debug
- 一些oj的返回结果:通过结果找错误,debug。
- 【C#】#if DEBUG 与 如何更好更快的debug
- DEBUG
- debug
- DEBUG
- debug
- debug
- debug
- DEBUG
- Debug
- Debug
- java调用外部脚本或者程序,看了别人的代码,算是转载吧。
- C#学习(messageBox,pictureBox,窗口切换)
- HashMap的工作原理
- 提高android应用的效率--主要讲解listview的优化
- Xcode view button 链接到 事件
- 【神のDebug】C++作业,10小时debug的结果
- Js控制录入域为浮点数
- UIImage 简介
- Centos yum的详细使用方法
- jdom学习:读取xml文件
- GCC 基本使用规则
- Timing Wheel 定时轮算法
- JAVA内存使用--如何计算一个Java对象占用的字节数
- textview随seekbar一起移动