Ex9_13.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例9.13】将商店的货物,定义为一个货物数组类。数组对象动态建立,初始为2个元素,
  2. //不够用时扩充一倍。用文本数据文件建立数组元素对象,要求放在构造函数中,而数据的
  3. //保存和文件的关闭放在析构函数中。第一次运行时,建立空的数据文件,由键盘输入建立
  4. //数组元素对象,并写入文件,程序退出时,关闭文件;下一次运行由该文件构造对象,恢
  5. //复前一次做过的工作。
  6. #include<fstream>
  7. #include<iostream>
  8. #include<string>
  9. #include<iomanip>
  10. using namespace std;
  11. class inventory{
  12. string Description;//商品名称
  13. string No;//货号
  14. int Quantity;//数量
  15. double Cost;//价格
  16. double Retail;//零售
  17. public:
  18. inventory(string ="#",string="#",int =0,double =0,double =0);
  19. friend ostream&operator<<(ostream&dist,inventory&iv);//重载插入运算符
  20. friend istream&operator>>(istream&sour,inventory&iv);//重载提取运算符
  21. bool operator==(inventory &);//货号为关键字
  22. bool operator<=(inventory &);
  23. };
  24. inventory::inventory(string des,string no,int quan,double cost,double ret){
  25. Description=des;
  26. No=no;
  27. Quantity=quan;
  28. Cost=cost;
  29. Retail=ret;
  30. }
  31. ostream &operator<<(ostream&dist,inventory&iv){
  32. dist<<left<<setw(20)<<iv.Description<<setw(10)<<iv.No;
  33. dist<<right<<setw(10)<<iv.Quantity<<setw(10)<<iv.Cost<<setw(10)<<iv.Retail<<endl;
  34. return dist;
  35. }
  36. istream&operator>>(istream&sour,inventory&iv){     //文件流类作为形式参数必须是引用
  37. if(sour==cin){
  38. cout<<"请输入货物名称:"<<endl;
  39. sour>>iv.Description;
  40. cout<<"请输入货号:"<<endl;
  41. sour>>iv.No;
  42. cout<<"请输入货物数量:"<<endl;
  43. sour>>iv.Quantity;
  44. cout<<"请输入货物价格:"<<endl;
  45. sour>>iv.Cost;
  46. cout<<"请输入货物零售价格:"<<endl;
  47. sour>>iv.Retail;
  48. }
  49. else sour>>iv.Description>>iv.No>>iv.Quantity>>iv.Cost>>iv.Retail;
  50. return sour;
  51. }
  52. bool inventory::operator==(inventory & inven){
  53. return No==inven.No;
  54. }
  55. bool inventory::operator<=(inventory & inven){//为按货号排序重载关系运算符
  56. return No<=inven.No;
  57. }
  58. template <typename T>class Array{
  59. T *elements;
  60. int Subscript;           //已用最大下标值
  61. int maxSize;
  62. fstream datafile;
  63. public:
  64. Array(int=2);           //为了便于检验,缺省元素数暂为2
  65. ~Array();
  66. bool IsFull() const{return Subscript==maxSize-1;}
  67. void renews();         //内存扩大一倍
  68. void show(){
  69. cout<<"已用最大下标值"<<Subscript<<'t'<<"可用元素数"<<maxSize<<endl;
  70. }
  71. void ordinsert(T&);    //输入时以货号为关键字排序
  72. friend ostream&operator<<(ostream&dist,Array&ar);//重载插入运算符
  73. };
  74. template <typename T> Array<T>::Array(int maxs){
  75. maxSize=maxs;
  76. Subscript=-1;//私有数据不容许直接赋初值,必须在构造函数中赋初值
  77. T temp;
  78. elements=new T[maxSize];
  79. datafile.open("mydatafile.txt",ios::in);          //如文件不存在,打开失败
  80. if(!datafile==0){
  81. while(!datafile.eof()){
  82. datafile>>temp;
  83. if(datafile.eof()==0){//读到无数据可读后,即读入不成功,eofbit为1
  84. ordinsert(temp);//即使原文件未排序,读出也是排好序的,退出时按排好序的重存
  85. }
  86. }
  87. datafile.close();//必须放此处,打开成功才能关闭
  88. }
  89. datafile.clear(0);//采用标准库不可少,前面曾经读到文件结束或文件打开失败,流无法恢复
  90. }
  91. template <typename T> Array<T>::~Array(){
  92. int i;
  93. datafile.open("mydatafile.txt",ios::out);
  94. for(i=0;i<=Subscript;i++) datafile<<elements[i];
  95. datafile.close();
  96. delete[]elements;
  97. }
  98. template <typename T> void Array<T>::renews(){
  99. int i;
  100. T *temp=elements;
  101. maxSize*=2;
  102. elements=new T[maxSize];
  103. for(i=0;i<=Subscript;i++) elements[i]=temp[i];
  104. delete[]temp;
  105. }
  106. template <typename T> void Array<T>::ordinsert(T & elem){//输入时以货号为关键字排序
  107. int i,j;
  108. if(IsFull()) renews();
  109. for(i=0;i<=Subscript;i++) if(elem<=elements[i]) break;
  110. if(!(elem==elements[i])){
  111. for(j=Subscript;j>=i;j--) elements[j+1]=elements[j];
  112. Subscript++;
  113. }
  114. elements[i]=elem;
  115. show();
  116. }
  117. template <typename T> ostream&operator<<(ostream&dist,Array<T>&ar){
  118. int i;
  119. for(i=0;i<=ar.Subscript;i++) cout<<ar.elements[i];
  120. return dist;
  121. }
  122. int main(){
  123. Array<inventory> mylist;
  124. inventory temp;
  125. char ch;
  126. cout<<"是否输入新商品?Y or N"<<endl;
  127. cin>>ch;
  128. while(ch=='Y'||ch=='y'){
  129. cin.get();//吸收回车
  130. cin>>temp;
  131. mylist.ordinsert(temp);
  132. cout<<"是否继续输入?Y or N"<<endl;
  133. cin>>ch;
  134. }
  135. cout<<mylist;
  136. return 0;
  137. }