问答题 [C++代码] class Product { //产品 private: string pid; //产品识别码 string description; //产品描述 double price; ///产品单价 public: void setProductPrice(double price); //设置产品单价 string getProduetld(); //获取产品识别码 string getProduetDescriprion 0; //获取产品描述 double getProductPrice0; //获得产品单价 //其他成员省略 }; class ProductList { //产品列表类 private: vector <Product> products; public: ProductList(); Product getProductBylndex(int i); //获得产品列表中的第i件产品 void addProduct(Product t); //在产品列表中加入一件产品 Product * getProductByID(string pid); //获得识别码为pid的产品指针 unsigned iht getProductAmount(); //获得产品列表中的产品娄量 }; class OrderItem { //订单条目类 private: Product *productPtr; //指向被订购产品的指针 int quantity; //订购数量 public: OrderItem (Product *,iht); Product * getProductptr O; //获得指向被订购产品的指针 int getQuantity (); //获取被订刚强产品数量 }; class Order { //订单类 private: unsigned int orderid; //订单识别号 vector<Orderltem> items; //订单内容(订单项) public: Order(unsigned int orderid); //获得识别码为fid的产品在当前订单中被订购的数量 int getOrderedAmount(string fid); void additem(Product *productPtr,unsigned int n); //在订单中增加一个订单项 }; class OrderList { //订单列表类 private: vector<Order> orders; public: OrderList(); //Begin()返回指向订单列表第一个元素的迭代器(指针) virtual vector<Order>::iterator OrderList::Begin(); //End()返回指向订单列表最后一个元素之后的迭代器(指向一个不存在的元素) virtual vector<Order>::iterator orderList::End(); void addOrder(Order t); //在订单列表中加入一份订单 //其他成员省略 }; class SalesSystem{ private: ProductList catalog; //产品目录 OrderList sales; //订单列表 public: SalesSystem(); void statistic(); //统计所有产品的订购情况 //其他成员省略 }; //在订单中查找识别码为tid的产品的订购数量,若该产品没有被订购,则返回0 int Order::getOrderedAmount(string tid) { for (int k=0; k < items.size(); k++) { if({{U}} (1) {{/U}}==tid) return {{U}}(2) {{/U}}; } return 0; } //方法statistic()依次统计产品目录中每个产品的订购总量,并打印输出 //每个产品的识别码、描述、订购总量和订购金额 void SalesSystem::statistic() { unsigned int k, t, ordered_qty = 0; vector<Order>::iterator it; Product p; cout<<''产品识别码/t描述/t/t订购数量/t金额''<<endl; for (k = 0; k < catalog.gctProductAmount(); k++){//遍历产品列表 p ={{U}} (3) {{/U}}; //从产品列表取得一件产品信息存入变量p ordered_qty = 0; //通过迭代器变量it遍历订单列表中的每一份订单 for (it = sales. Begin();{{U}} (4) {{/U}} : it++) { //根据产品识别码获得产品p在当前订单中被订购的数量 t ={{U}} (5) {{/U}}(p.getProductld()); ordered_qty +=t; } cout << p.getProducfld() << "/t/t"<< p.gntProductDescription() << "/t/t"; cout <<ordered_qty << "/t/t" << p.getProductPrice() * ordered_qty << endl; } }
【正确答案】
【答案解析】items[k].getProductptr()->getProductId() (2) items [k].getQuantity() (3) catalog.getProductBylndex(k) (4) it != sales. End() , 或 it < sales.End() (5) it->getOrderedAmount [分析]试题六 本题考查C++程序设计及STL的使用。 从题中可知,类Order的数据成员orderid表示一份订单的识别号,从题目给出的类图中可知,每份订单上可有多个订单项,因此数据成员items是个类型为Orderltem的向量(数组)。类Order的成员函数getOrderedAmount()的功能是在订单中查找指定识别码的产品的订购数量,其定义如下: int Order::getOrderedAmount(string tid) { for (int k = O; k < items.size(); k++) { if ({{U}} (1) {{/U}}== fid) return{{U}} (2) {{/U}}; } remm 0; } 对于每个订单项,显然需要取出对应产品的识别号。从以上代码可以看出,变量k用于遍历并索引一份订单中的每个订单项(items[k])。由于Orderltem类提供的成员函数 getProductptr()可获取指向被订购产品的指针,因此可通过“items[k].getProduetptr() ->getProduetld()”获取被订购产品的识别号,若指定的产品识别号等于该订单项的产品识别号,就通过“items[k].getQuantity()”返回该产品被订购的数量。 类SalesSystem的成员函数statistic()用于统计产品目录中每个产品的订购总量,并打印输出每个产品的识别码、描述、订购总量和订购金额。若要统计产品目录中每个产品的订购总量,需要对3个对象集合进行遍历:产品目录(ProductList)、订单列表 (OrderList)以及Order(需要对订单中的所有订单项进行查询,统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程: ①从产品目录中取出一个产品。对应语句“for(k=0;k<catalog.getProductAmount(); k++)”用于遍历产品目录中的每件产品。由于存放产品目录(产品列表)的数据成员catalog的类型为ProductList,要取得某产品的相关信息,需要通过ProductList类提供的成员函数getProductBylndex(int i)获得产品目录中的第i件产品,因此空(3)处应填入“catalog.getProductBylndex(k)”。 ②查询给定产品在每份订单中的订购情况。对应的语句“for(it=sales.Begin(); {{U}}(4) {{/U}};it++)”用于遍历所有的订单,对于给定产品和订单,可调用订单类Order的成员函数getOrderedAmount(tid)获得识别码为dd的产品在当前订单中被订购的数量。由于类 OrderList提供的方法Begin()、End()分别指向订单列表的第一个元素和最后一个元素之后,而迭代器变量it实际是指向订单列表(向量sales)中某订单的指针,因此空(4)处应填入“it!=sales.End()”或“it<sales.End()”,空(5)处填入“it->getOrderedAmount”。