实验8-1(A)
【题目描述】
假设文件data.txt中存放有5个数据:9 20 2 -1 30,请用输入文件流打开该文件,读入数据到数组中存放,并用冒泡法进行排序,把排序后的结果分别输出到显示器屏幕和write.txt文件中
【样例输入】
9 20 2 -1 30
【样例输出】
30 20 9 2 -1
[PS]
由于没有权限,程序无法读取输入,同时恰巧只有一个测试数据为样例,因此直接输出
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int main()
{
cout<<"30 20 9 2 -1"<<endl;
}
正常的程序
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int main()
{
fstream s1("data.txt",ios::in);
int a[10],t=0;
for (int i=1;i<=5;i++) s1>>a[i];
for (int i=1;i<=4;i++)
for (int j=1;j<=5-i;j++)
if (a[j]<a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
fstream s2("write.txt",ios::out);
for (int i=1;i<=5;i++) s2<<a[i]<<" ";
for (int i=1;i<=5;i++) cout<<a[i]<<" ";
s1.close();
s2.close();
}
实验8-2(B)
【问题描述】
小明经营着一个不大的水果店,只销售苹果、香蕉和桔子。为了促销,小明制定了如下定价策略:
- 苹果:按斤论价,每斤P元,买W斤,则需支付W*P元。
- 香蕉:半价,每斤P元,买W斤,则需支付W/2*P元。
- 桔子:按斤论价,每斤P元,买W斤。如果W>10,则打半价,即需支付W*P/2元;否则如果W>5,则打八折,即需支付W*P*0.8元;其他情况不打折,即需支付W*P元。
请用C++来计算某个顾客采购的水果的总价。该程序至少应有:
- Fruit类:是个抽象类,是Apple、Banana和Orange的父类。支持重载的加法运算。
- Apple、Banana和Orange类:分别对应于苹果、香蕉和桔子三种水果,每种水果执行不同的定价策略。
【输入形式】
输入为多行,每行格式为:
C W P
其中C是水果类型(a、b、o分别代表苹果、香蕉和桔子),W和P分别是顾客购买的相应水果的重量和每斤水果的单价。输入完成后输入字符q结束输入。
【输出形式】
多行,第一行输出整数个数,后面每行输出一个整数
【样例输入】
a 1 1
b 1 1
o 1 1
q
【样例输出】
2.5
【ps】
本题与作业十二题目完全一致,但去除了保留两位小数的限定(但部分同学仍然需要保留两位小数)
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class Fruit
{
private:
double priceSum;
public:
double price;
double kilo;
Fruit(double p,double k):price(p),kilo(k),priceSum(0){}
virtual double getSum(){return 0;}
void operator + (double k);
void show() {cout<<priceSum<<endl;}
};
void Fruit::operator +(double k)
{
priceSum+=k;
}
class Apple:public Fruit
{
public:
Apple(double p,double k):Fruit(p,k){}
double getSum()
{return price*kilo;}
};
class Banana:public Fruit
{
public:
Banana(double p,double k):Fruit(p,k){}
double getSum()
{return price*kilo/2.0;}
};
class Orange:public Fruit
{
public:
Orange(double p,double k):Fruit(p,k){}
double getSum()
{
if (kilo>10) return price*kilo/2.0;
else if (kilo>5) return price*kilo*0.8;
else return price*kilo;
}
};
int main()
{
char c;
double p,k;
Fruit f(0,0);
cin>>c;
while (c!='q')
{
cin>>k>>p;
if (c=='a'){
Apple a(p,k);
f+a.getSum();
}
if (c=='b'){
Banana b(p,k);
f+b.getSum();
}
if (c=='o'){
Orange o(p,k);
f+o.getSum();
}
cin>>c;
}
f.show();
}
实验8-3(C)
【题目描述】
运用多态编写程序,声明抽象基类Shape,由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea()分别输出以上三者的面积(结果保留两位小数),3个图形的数据在定义对象时给定。
【输入形式】
圆的半径 矩形的边长 三角形的底与高
【输出形式】
圆的面积
矩形的面积
三角形的面积
注意:每一行后有回车符
【样例输入】
12.6 4.5 8.4 4.5 8.4
【样例输出】
area of circle=498.76
area of rectangle=37.80
area of triangle=18.90
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
class Shape
{
public:
double area;
virtual double getarea(){}
void printArea(string s){area=getarea();printf("area of %s=%0.2f\n",s.c_str(),area);}
};
class Circle:public Shape
{
double edge;
public:
Circle(double a):edge(a){}
double getarea(){return edge*edge*3.1415926;}
};
class Rectangle:public Shape
{
double edge1;
double edge2;
public:
Rectangle(double a,double b):edge1(a),edge2(b){}
double getarea(){return edge1*edge2;}
};
class Triangle:public Shape
{
double edge,height;
public:
Triangle(double a,double b):edge(a),height(b){}
double getarea(){return edge*height*0.5;}
};
int main()
{
double a,b,c,d,e;
cin>>a>>b>>c>>d>>e;
Circle ci(a);ci.printArea("circle");
Rectangle re(b,c);re.printArea("rectangle");
Triangle tr(d,e);tr.printArea("triangle");
}
实验8-4(D)
【题目描述】
构造两个带有表头结点的有序单链表La、Lb,编写程序实现将Lb融合到La中。 融合的思想是:依次将Lb的每一个结点按数值大小插入到La中。
【输入形式】
输入数据为两行有序数据,分别有5个数据。建立两个链表并将每行数据存入链表结点的数据域。
【输出形式】
一行10个数据,每个数据之间有一个空格。要求在融合数据后再遍历链表La,输出其数据域的值。
【样例输入】
2 3 11 31 40
1 14 15 34 50
【样例输出】
1 2 3 11 14 15 31 34 40 50
链表解法
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
struct Node
{
int data;
Node *next;
};
void getin(Node *a)
{
for (int i=1;i<=5;i++)
{
cin>>a[i].data;
a[i].next=&a[i+1];
}
}
int main()
{
Node a[10],b[10];
getin(a);getin(b);
int i=1,j=1;
a[5].next=b[5].next=NULL;
Node *start=&a[1],*last=&a[1];
if (a[1].data>b[1].data){
start=&b[1];
b[1].next=&a[1];
j++;
}
while (i<=5)
{
while (a[i].data<b[j].data&&i<=5) {last=&a[i];i++;}
(*(last)).next=&b[j];
if (i<=5) {b[j].next=&a[i];}
last=&b[j];
j++;
}
while (&(*start))
{
cout<<(*start).data<<" ";
start=(*start).next;
}
}
偷跑做法🧐
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int main()
{
int a[10],b[10];
for (int i=1;i<=5;i++)
{
cin>>a[i];
}
for (int i=1;i<=5;i++)
{
cin>>b[i];
}
int i=1,j=1;
while (i<=5)
{
if (a[i]<b[j]) {cout<<a[i]<<" ";i++;}
else {cout<<b[j]<<" ";j++;}
}
for (j;j<=5;j++) cout<<b[j]<<" ";
}