课程设计报告一、需求分析描述问题,简述题目要解决的问题是什么?规定软件做什么。
编写一个简单的4S店汽车销售管理程序,帮助管理汽车销售信息。
要求具有汽车销售信息管理的功能。
汽车销售信息管理包括汽车销售基本信息的录入、删除和修改等功能。
本课程设计的具体任务就是设计一个汽车销售管理信息系统,它是一款利用现代计算机代替人工处理,从而减轻工作人员的劳动强度,提高工作质量和效率,提高信息资源的利用率和企业管理水平的实用销售管理系统。
运用面向对象的程序设计方法,要求选择动态数组类模板或链表类模板,任务中要运用I/O流对象对文件进行读写操作。
本题程序应提供的基本管理功能有:1)添加:即增加一个汽车到汽车信息中;2)显示:即在屏幕上显示所有汽车的信息。
3)存储:即将汽车信息保存在一个文件中。
4)装入:即将文件中的信息读入程序。
5)查询:可根据汽车数据查找汽车信息。
若找到,显示在屏幕上。
6)修改:可修改汽车信息。
二、算法设计1.设计思想:程序结构(UML图),重要的数据结构; 主要算法思想(文字描述);创建汽车类,每条汽车信息都用该类来实现,包含1汽车型号,2汽车编号,3汽车价格,4是否售出,5汽车颜色,6汽车品牌,7生产厂家,8出厂时间,9产品售况,10外观描述等。
用一个单向链表来管理汽车信息,作为链表的值指针指向这些类对象,通过链表的遍历可以操作这些数据。
2.设计表示:各个及其作用,每个函数的功能要详细描述;本课程设计包含三个类,分别是:节点类、链表类、汽车类,每个类都有成员函数,其中节点类仅有构造函数,用于节点类的初始化;在链表类中不仅有Link();//构造函数,初始化变量;bool linkIsEmpty();//判断链表是否为空;void linkInsert(Node *newnode);//向链表中插入新的结点;bool linkDelete(int nid);//从链表中删除的结点;void linkClear();//清空链表中数据;void linkView();//查看链表中数据;Node* linkFind(int nid);//在链表中查找id为nid结点,返回指向该结点的指针;Node* getHead();//获取头指针;在汽车类中,Car();Car::Car()//构造函数,对变量进行初始化;Link();//调用成员对象的构造函数;carLoad();//从文件中读取数据,创建链表;void carClear();//清空汽车记录;void carInsert();//判断汽车编号是否存在,插入汽车记录设置数据被修改;void carDelete();//删除汽车记录;void carFind();//查找某编号的汽车记录;void carModify();//修改某编号的汽车信息,链表为空的情况,获得找到的结点的指针,指针值不为(为)NULL时;void carView();//显示所有汽车的记录;void carLoad();//从文件中读入数据,创建链表,关闭文件,读取汽车信息;void carSave();将数据保存到文件;void Exit();//退出程序//判断数据是否修改;void showMenu();//显示菜单;void showTip();//显示操作提示;void doMenu(char n);//执行相应菜单项功能;在主函数main()函数中,运用switch开关语句进行选择菜单的编写,输入相应的数字以实现对应的功能。
运用文件保存软件项目信息,并可实现对相关信息的读取。
运用system("cls")对所有数据进行清除操作即清除屏幕。
3.实现注释:任务中各项要求的实现程度;在完成基本要求的基础上运用面向对象的程序设计方法,要求选择动态数组类模板或链表类模板,任务中要运用I/O流对象对文件进行读写操作。
程序应输入不少于10个汽车信息,应考虑到汽车型号相同的情况。
这个要求的完成情况与实现程度与要求相比稍有瑕疵,因为我对于汽车的情况了解有限,所以仅实现了以下几个功能:清空:清除所有汽车数据,添加:增加一个汽车到汽车信息中,删除:删除指定汽车数据,查找:根据汽车数据查找汽车信息,修改:可修改汽车信息,显示:在屏幕上显示所有汽车的信息,存储:将汽车信息保存在一个文件中,退出:安全的退出本系统。
4.算法设计中一些新的想法:在主要描述本算法的应用或发现其不足之处或有新的思路和想法方面,程序要求中没有要求该系统具有删除汽车信息的功能,之后将其加上,感觉这个系统就更加完善了,功能更加齐全了。
三、用户手册请按提示进行操作,在选择功能时,应在指定的数字范围中进行输入,否则将会提示输入错误,在进行日期输入时,形如20110629的形式输入,操作完成时,应进行保存,否则系统会自动提示你进行保存。
四、调试及测试在调试过程中遇到的一些问题时不可避免的,我会看书和上网查询去解决。
比如,当我用DEV-CPP编写的程序时,编译后,运行,闪一下就没了??后来上网查询才把这个问题给解决:在return 0下面加一个getchar();可以了。
五、小结就本课程设计进行小结,可以包括设计过程收获,本系统的不足及有待改进之处。
就本课程设计,我认为非常符合当今的世界格局,汽车如今已经成为我们生活中必不可少的东西,基于4S店的汽车管理系统是非常符合生活实际的设计课题。
但是,要运用C++中的类的思想来完成还是有一定难度的。
在实际编程中也的确如此,对汽车类的编写,及模块化的操作说实话的确却很难,因此用了网上的资源进行了整合,但是字字都是自己编写的,其中艰辛汗水都是真正的付出,可把我给累挺了!此外还对c++和c语言的联系有了些许了解,比如在C++下的头文件是许多C语言头文件,在C++下的头文件通常改头换面变成前面加个c,后面去掉.h,如:math.h stdlib.h cmath cstdlib 等等。
整个系统的设计过程对于我来说算是个学习、探索的过程,通过实践和对比别人开发程序的过程。
在整个设计过程中,出现过很多的问题,很多繁琐的东西都需要反复的修改,主要是前期工作不彻底,对系统的需求分析的要求认识不够清楚,使得在后边的工作中不得不经常反复去修改。
使我体会到设置中每一步的重要性。
所以在分析一个问题时,我们需要站在一个有远见的高度。
通过此次设计,我不但对C++语言编程有了更深刻的认识,积累了使用软件工程的思想来开发软件的经验,更重要的是学会了在对待问题时应该考虑到哪些方面和怎么解决问题。
虽然时间紧迫但我学会了很多,也感到自身知识的贫乏,希望在日后的努力中能做出更完善的系统。
六、参考文献[1].郑莉等编著《C++语言程序设计(第四版)》北京:清华大学出版社,2010.7[2].郑莉等编著《C++语言程序设计(第三版)上机用书》北京:清华大学出版社[3].李春葆等编著《C++程序设计学习与上机实验指导》北京:清华大学出版社[4].范辉等编著《Visual C++6.0程序设计简明教程》高等教育出版社[5].李龙澍《C++程序设计实训教程》北京:清华大学出版社[6].洪国胜等编著《C++ Builder程序设计轻松上手》北京:清华大学出版社[7].严蔚敏等《数据结构(c语言版)》北京:清华大学出版社,1997年4月第1版。
[8].胡学钢等《数据结构算法设计指导》北京:清华大学出版社,1999年第1版。
附录:1、源程序清单:#include<iostream> //cin cout#include<cstdlib>#include<string>#include <fstream> //文件输入输出流类、磁盘文件的流缓冲区类#include<sstream> //字符串输入输出流类、字符串缓冲区流类#include<iomanip> //setw操作符域宽设置using namespace std;class Node//结点类,用于存放汽车的各种数据{public:int id; //汽车编号string name; //汽车型号string sale; //是否售出string color; //汽车颜色int price; //汽车价格string firm; //生产厂商int outtime; //出厂时间Node *next; //指向下一结点的指针Node(int nid=0,string nname="noname",string nsale="0",string ncolor="0",int nprice=0,string nfirm="0",int nouttime=0);//构造函数,初始化变量};class Link//Link类,把数据以链表的形式存储,链表的每个结点为一个Node对象{private:Node *head; //链表的头指针,为Node对象类型的指针public :Link();//构造函数,初始化变量bool linkIsEmpty();//判断链表是否为空void linkInsert(Node *newnode);//向链表中插入新的结点bool linkDelete(int nid);//从链表中删除的结点void linkClear();//清空链表中数据void linkView();//查看链表中数据Node* linkFind(int nid);//在链表中查找id为nid结点,返回指向该结点的指针Node* getHead();//获取头指针};Node::Node(int nid,string nname,string nsale,string ncolor,int nprice,string nfirm,int nouttime){id=nid;name=nname;sale=nsale;color=ncolor;price=nprice;firm=nfirm;outtime=nouttime;next=NULL;}Link::Link() //构造函数,初始化链表为空{head=NULL;}bool Link::linkIsEmpty() //判断链表是否为空,空则返回true{return(head==NULL);}void Link::linkInsert(Node *newnode) //按id值从小到大的顺序,插入新的结点{Node *p1;if(!head)//链表为空的情况head=newnode;else if((head->id)>(newnode->id)) //插入到第一个结点的情况{newnode->next=head;head=newnode;}else //插入到第二个及以后情况{p1=head;while(1){if(!(p1->next)){p1->next=newnode;break;}else if((p1->next)->id>newnode->id){newnode->next=p1->next;p1->next=newnode;break;}p1=p1->next;}}}bool Link::linkDelete(int nid) //删除结点,成功则返回true{Node *p;if(head==NULL)//链表为空的情况return false;if(head->id==nid) //删除的为第一个结点的情况{head=head->next;return true;}p=head;while(p->next) //删除的为第二个及以后结点的情况{if((p->next)->id==nid){p->next=(p->next)->next;return true;}p=p->next;}return false;}void Link::linkClear() //清空链表{head=NULL;}Node* Link::linkFind(int nid) //查找id值为nid的结点,返回该结点的指针{Node *p=head; //没找到符合条件的结点的话,返回的指针值为NULL while(p){if(p->id==nid)break;elsep=p->next;}return p;}void Link::linkView() //显示链表数据{Node *p=head;cout<<setw(6)<<"汽车编号"<<" "<<setw(10)<<"汽车型号"<<" "<<setw(10)<<"是否售出"<<" "<<setw(10)<<"汽车颜色"<<" "<<setw(10)<<"汽车价格"<<" "<<setw(10)<<"生产厂家"<<" "<<setw(10)<<"出厂时间"<<endl;while(p){cout<<setw(6)<<p->id<<" "<<setw(10)<<p->name<<" "<<setw(10)<<p->sale<<" "<<setw(10)<<p->color<<" "<<setw(10)<<p->price<<" "<<setw(10)<<p->firm<<" "<<setw(10)<<p->outtime<<endl;p=p->next;}}Node* Link::getHead(){return head;}//类Car,用于包装Link类及菜单操作class Car{private:Link clink;//Link对象成员bool k;//记录数据是否被修改public:Car();void carClear();void carInsert();void carDelete();void carFind();void carModify();void carView();void carLoad();void carSave();void Exit();//退出程序void showMenu();//显示菜单void showTip();//显示操作提示void doMenu(char n);//执行相应菜单项功能};Car::Car(){Link();//调用成员对象的构造函数carLoad();//从文件中读取数据,创建链表k=false;//设置数据被修改}void Car::carClear() //清空汽车记录{clink.linkClear();cout<<"成功清空汽车记录!"<<endl;}void Car::carInsert() //插入汽车记录{Node *p=new Node();cout<<"请输入汽车编号:";cin>>p->id;cout<<"请输入汽车型号:";cin>>p->name;cout<<"请输入是否售出:";cin>>p->sale;cout<<"请输入汽车颜色:";cin>>p->color;cout<<"请输入汽车价格:";cin>>p->price;cout<<"请输入生产厂家:";cin>>p->firm;cout<<"请输入出厂时间:";cin>>p->outtime;if(!clink.linkFind(p->id)) //判断汽车编号是否存在 {clink.linkInsert(p);k=true;}elsecout<<"汽车编号为"<<p->id<<"的车已存在,插入失败!"<<endl; }void Car::carDelete() //删除汽车记录{int i;if(clink.linkIsEmpty())//链表为空的情况cout<<"没有汽车记录!"<<endl;else{cout<<"请输入汽车编号:";cin>>i;if(clink.linkDelete(i)){cout<<"成功删除编号为"<<i<<"的汽车记录!"<<endl;k=true;}elsecout<<"没有找到编号为"<<i<<"的汽车!"<<endl;}}void Car::carFind() //查找某编号的汽车记录{int n;Node *p;if(clink.linkIsEmpty())//链表为空的情况cout<<"没有汽车记录!"<<endl;else{cout<<"请输入要查找汽车的编号:";cin>>n;p=clink.linkFind(n);//获得找到的结点的指针if(p) //指针值不为NULL时{cout<<setw(6)<<"汽车编号"<<" "<<setw(10)<<"汽车型号"<<" "<<setw(10)<<"是否售出"<<" "<<setw(10)<<"汽车颜色"<<" "<<setw(10)<<"汽车价格"<<" "<<setw(10)<<"生产厂家"<<" "<<setw(10)<<"出厂时间"<<endl;cout<<setw(6)<<p->id<<" "<<setw(10)<<p->name<<" "<<setw(10)<<p->sale<<" "<<setw(10)<<p->color<<" "<<setw(10)<<p->price<<" "<<setw(10)<<p->firm<<" "<<setw(10)<<p->outtime<<endl;}else//指针值为NULL时cout<<"没有找到编号为"<<n<<"的汽车记录!"<<endl;}}void Car::carModify() //修改某编号的汽车信息{int n;Node *p;if(clink.linkIsEmpty())//链表为空的情况cout<<"没有汽车记录!"<<endl;else{cout<<"请输入要修改汽车的编号:";cin>>n;p=clink.linkFind(n);//获得找到的结点的指针if(p) //指针值不为NULL时{cout<<"原汽车信息为:"<<endl;cout<<setw(6)<<"汽车编号"<<" "<<setw(10)<<"汽车型号"<<" "<<setw(10)<<"是否售出"<<" "<<setw(10)<<"汽车颜色"<<" "<<setw(10)<<"汽车价格"<<" "<<setw(10)<<"生产厂家"<<" "<<setw(10)<<"出厂时间"<<endl;cout<<setw(6)<<p->id<<" "<<setw(10)<<p->name<<" "<<setw(10)<<p->sale<<" "<<setw(10)<<p->color<<" "<<setw(10)<<p->price<<" "<<setw(10)<<p->firm<<" "<<setw(10)<<p->outtime<<endl;cout<<"请输入新的汽车信息"<<endl;cout<<"请输入汽车编号:";cin>>p->id;cout<<"请输入汽车型号:";cin>>p->name;cout<<"请输入是否售出:";cin>>p->sale;cout<<"请输入汽车颜色:";cin>>p->color;cout<<"请输入汽车价格:";cin>>p->price;cout<<"请输入生产厂家:";cin>>p->firm;cout<<"请输入出厂时间:";cin>>p->outtime;}else//指针值为NULL时cout<<"没有找到编号为"<<n<<"的汽车记录!"<<endl; }}void Car::carView() //显示所有汽车的记录{if(clink.linkIsEmpty())cout<<"没有汽车记录!"<<endl;elseclink.linkView();}void Car::carLoad() //从文件中读入数据,创建链表{Node *p;int nid;ifstream infile("data.txt");if(!infile)cerr<<"错误:数据文件不能打开!\n";elsewhile(infile>>nid) //读取汽车编号,直到读空{p=new Node();p->id=nid;infile>>p->name>>p->sale>>p->color>>p->price>>p->firm>>p->outtime;//读取汽车信息clink.linkInsert(p);}infile.close(); //关闭文件}void Car::carSave() //将数据保存到文件{Node *p=clink.getHead();ofstream outfile("data.txt");if(!outfile)cerr<<"错误:数据文件不能打开!\n";else{while(p){outfile<<p->id<<' '<<p->name<<' '<<p->id<<' '<<p->name<<' '<<p->sale<<' '<<p->color<<' '<<p->price<<' '<<p->firm<<' '<<p->outtime<<endl;p=p->next;}k=false;cout<<"保存成功!"<<endl;}}void Car::Exit(){char s='Y';if(k) //判断数据是否修改{cout<<"数据已经改变,是否保存?(y/n):";cin>>s;if(s=='y'||s=='Y')carSave();}cout<<"已安全退出,";system("pause");exit(0);}void Car::showMenu(){cout<<"|------------------------------------------------|"<<endl;cout<<"| 汽车销售管理系统 |"<<endl;cout<<"|------------------------------------------------|"<<endl;cout<<"| 1.清空:清除所有汽车数据 |"<<endl;cout<<"| 2.添加:增加一个汽车到汽车信息中 |"<<endl;cout<<"| 3.删除:删除指定汽车数据 |"<<endl;cout<<"| 4.查找:根据汽车数据查找汽车信息 |"<<endl;cout<<"| 5.修改:可修改汽车信息 |"<<endl;cout<<"| 6.显示:在屏幕上显示所有汽车的信息 |"<<endl;cout<<"| 7.存储:将汽车信息保存在一个文件中 |"<<endl;cout<<"| 0.退出:安全的退出本系统 |"<<endl;cout<<"|------------------------------------------------|"<<endl<<endl; }void Car::showTip(){cout<<endl;cout<<"-------------------操作完成---------------------"<<endl;cout<<"--------------选择继续下一个操作----------------"<<endl;cout<<"请选择:";}void Car::doMenu(char n){switch(n){case '1':carClear();break;case '2':carInsert();break;case '3':carDelete();break;case '4':carFind();break;case '5':carModify();break;case '6':carView();break;case '7':carSave();break;case '0':Exit();break;default:cout<<"输入错误!";}}int main(){Car c;char i='9';c.showMenu();cout<<"选择对应数字进行操作:"; while(1){cin>>i;system("cls"); //清除屏幕 c.showMenu();c.doMenu(i);c.showTip();}}2、测试数据:3、运行结果:(1)添加汽车信息(2)修改汽车信息(3)显示汽车信息(4)删除汽车信息(5)保存汽车信息。