[c++] 实验八 类+继承+流输入输出+有序插入链表

本系列实验涵盖了C++编程的多个方面,包括使用输入输出流读写文件并进行冒泡排序,实现抽象基类和多态计算不同水果的总价,计算圆形、矩形和三角形的面积,以及通过链表操作融合两个有序链表。实验涉及文件操作、排序算法、面向对象编程和链表操作等核心概念。
摘要由CSDN通过智能技术生成


实验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)

【问题描述】
小明经营着一个不大的水果店,只销售苹果、香蕉和桔子。为了促销,小明制定了如下定价策略:

  1. 苹果:按斤论价,每斤P元,买W斤,则需支付W*P元。
  2. 香蕉:半价,每斤P元,买W斤,则需支付W/2*P元。
  3. 桔子:按斤论价,每斤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]<<" ";
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值