7-1 计算正方体、圆柱体的表面积、体积


#include
#include<string>
#include
using namespace std;
class Container
{
  protected:
     static double pi;
  public:
     virtual double area()=0; //纯虚函数,计算对象的表面积
     virtual double volume()=0; //纯虚函数,计算对象的体积
     static double sumofarea(Container *c[],int n) ; //静态成员函数,计算所有对象的面积之和(指针数组) 
     static double sumofvolume(Container *c[],int n); //静态成员函数,计算所有对象的体积之和
};
double Container::pi=3.1415926;

Container *c[100];
double sumofarea(Container *c[],int n) 
{ 
  double s=0;
  int i=0;
  for(i=0;iarea();
      
      }
      cout<<setprecision(2)<return s;
}
double sumofvolume(Container *c[],int n)
{ 
  double v=0;
  int i=0;
  for(i=0;ivolume(); 
      
      }
      cout<<setprecision(2)<return v;
}
class Cube:public Container //立方体 
{
    public:
        double a;
        Cube(){}
        Cube(double len):a(len){}
        virtual double area()
        {
            return a*a*6;
            }    
       virtual double volume()
        {
            return a*a*a;
        }
};
class Cylinder:public Container
{
    public:
        double r;
        double h;
         Cylinder(){}//不带参构造函数 
       Cylinder(double R,double h):r(R),h(h){}//构造函数 
        virtual    double area()
        {
            return pi*r*r+2*pi*r*h;
            }    //求面积 
        virtual double volume()
        {
            return pi*r*r*h; 
        }//求体积 
};
//Cube类、Cylinder类均继承抽象类Container。
//Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。
int main()
{
    Cube *pbe; Cylinder *per;
    int n,i;
    cin>>n;
    for(i=0;istring c;
        cin>>c;
        if(c=="cube"){
                pbe=new Cube();
                cin>>pbe->a;
                c[i]=pbe;}//将指向cube类的指针存放到指针数组中 
        if(c=="cylinder"){
                per=new Cylinder();
                cin>>per->r>>per->h;
                c[i]=per;}
        }
   sumofarea(c,n);
    sumofvolume(c,n);
    return 0;
}
为什么会出现这个问题报错[Error] invalid conversion from 'Cube*' to 'char' [-fpermissive]
以及[Error] invalid conversion from 'Cylinder*' to 'char' [-fpermissive]

基于Monster 组和GPT的调写:
在main函数的for循环中,当输入“cube”或“cylinder”时,你试图将指向Cube或Cylinder对象的指针赋值给字符数组c中的c[i]元素,这是错误的操作,因为c[i]的类型是char而不是Cube或Cylinder指针类型。正确的做法是将c[i]赋值为指向Cube或Cylinder对象的指针,即c[i] = pbe或c[i] = per。你可以这样修改你的代码:

Cube *pbe; 
Cylinder *per;
Container *c[100];
int n,i;
cin>>n;
for(i=0;i<n;i++){
    string obj_type;
    cin>>obj_type;
    if(obj_type=="cube"){
        pbe=new Cube();
        cin>>pbe->a;
        c[i]=pbe;
    }
    if(obj_type=="cylinder"){
        per=new Cylinder();
        cin>>per->r>>per->h;
        c[i]=per;
    }
}


我的代码中也有这几步操作
Cube *pbe;
Cylinder *per;
c[i]=per
c[i]

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7701210
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:7-1 求特殊方程的正整数解 (10 分)
  • 除此之外, 这篇博客: 7-1 哈夫曼编码(数组实现方法)中的 实现代码如下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • //  main.cpp
    //  哈夫曼编码
    //
    //  Created by 梦有蝶 on 2019/11/15.
    //  Copyright © 2019 梦有蝶. All rights reserved.
    //
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main() {
        int n,m;//n为节点个数,m为待检测编码的套数
        cin>>n;
        char NodeName[n];//存放节点名称
        unsigned int c[n*2-1][2];
        //定义无符号数int型二维数组,数组长度为哈夫曼树的节点个数,其中c[*][0]存放的是该节点的权值,c[*][1]为该节点的【父节点的位序】
        unsigned int cl[n];//定义无符号数int型数组,用来存放各个节点到根节点的路径长度
        
        //数组初始化
        for (int i=0;i<n; i++)
        {
            cin>>NodeName[i];
            cin>>c[i][0];
            c[i][1]=0;
            cl[i]=0;
        }
        for(int i=0;i<n-1;i++)
        {
            c[n+i][0]=0;
            c[n+i][1]=0;
        }
        
        //数组构建
        for (int i=0; i<n-1; i++) {
            int min=0;
            while (c[min][1]!=0) {//找到第一个c[j][1]=0的,即找到第一个没有父节点的节点
                min++;
            }
            for(int j=0;j<n+i;j++)//在c[j][1]=0(没有父节点的节点)之中找到权值最小的
            {
                if(c[j][1]==0)
                {
                    if(c[j][0]<c[min][0])
                        min=j;
                }
            }
            c[min][1]=n+i;//此时找到的节点,把数组中第一个未使用(但是已经被赋值为0,0)的节点的位序作为它的【父节点的位序】
            c[n+i][0]=c[min][0];//父节点的权值等于子节点的权值之和
            
            min=0;
            while (c[min][1]!=0) {
                min++;
            }
            for(int j=0;j<n+i;j++)//再次在没有父节点的节点之中找到权值最小的
            {
                if(c[j][1]==0)
                {
                    if(c[j][0]<c[min][0])
                        min=j;
                }
            }
            c[min][1]=n+i;//此时找到的节点,把数组中第一个未使用(但是已经被赋值为0,0)的节点作为它的【父节点的位序】
            c[n+i][0]+=c[min][0];//父节点的权值等于子节点的权值之和
        }
        
        //计算各个节点的路径长度
        for(int i=0;i<n;i++)
        {
            //数组构建完成后,只有最后一个节点没有父节点
            while (c[i][1]!=0) {//最后一个父节点的【父节点的为序】为0
                c[i][1]=c[c[i][1]][1];//子节点向上寻父节点,将当前节点的父节点的【父节点的位序】作为当前节点的【父节点的位序】
                cl[i]++;//路径长度加一
            }
        }
        //计算总路径长度
        int Length=0;
        for(int i=0;i<n;i++)
            Length+=c[i][0]*cl[i];
        
        cin>>m;//读取待检测的编码的套数
        int p[m];//用来存取各套编码是否为哈夫曼编码,是则为1,否则为0
        for(int i=0;i<m;i++)//为p[m]赋初始值为1
            p[i]=1;
        char cn[m][n];//建立字符数组存储节点名称
        string hc[m][n];//建立字符串数组存储待检测的哈夫曼编码
        for(int i=0;i<m;i++)//读取节点名称以及编码
            for(int j=0;j<n;j++)
                {
                    cin>>cn[i][j];
                    cin>>hc[i][j];
                }
        
        //检测哈夫曼编码
        for (int i=0; i<m; i++) {
            int l=0;
            for (int j=0; j<n; j++) {
                l+=c[j][0]*hc[i][j].length();
            }
            if(l!=Length)//如果编码总长度与哈夫曼编码总长度不一致
            {
                p[i]=0;
                continue;
            }
            else
            {
                for(int j=0;j<n;j++)
                    for(int k=0;k<n;k++)
                    {
                        if(k!=j)
                        {
                            int q;
                            q = hc[i][j].find(hc[i][k]);
                            //在hc[i][j]这个字符串中查找hc[i][k],并把找到的位置返回给q
                            if(q==0)
                            //如果找到的是第一个位置,说明编码不是前缀码,不是哈夫曼编码
                            p[i]=0;
                        }
                    }
            }
        }
       
        //输出结果
        for(int i=0;i<m;i++)
        {
            if(p[i]==1)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
        
        return 0;
    }
    
  • 您还可以看一下 邱石老师的5小时零基础入门小程序云开发课程中的 1-7初始化小程序云开发环境小节, 巩固相关知识点