黑白双芙 2023-11-18 18:03 采纳率: 66.7%
浏览 9
已结题

自制头文件错误如何修改

下面是我自己写的头文件,报错:
第112行 [Error] unknown type name 'class'
第113行 [Error] expected '=', ',', ';', 'asm' or 'attribute' before '{' token

#include <windows.h>
#include <ctype.h>
#include <string.h>
#define Nu NULL
#define LL {long long}
#define In int
#define Do double
#define Bo bool
#define Tr true
#define Fl false
#define Ch char
#define Vo void
#define Wc wchar_t
#define Us unsigned
#define Sh short
#define Re register
#define IC include
#define Co const
#define Cl class
#define Pu public
#define Pri private
#define Pro protected
#define St struct
#define Un union
#define Ex extern 
#define Au auto
#define Ve vector
#include <stdio.h>
#define exrt(exrt1,exrt2) pow(exrt1,1.0/exrt2)
#define MEM(mem) memset(mem,0,sizeof(mem))
//---------------------------------------------
#define BTC SetConsoleTextAttribute
#define STH GetStdHandle(STD_OUTPUT_HANDLE)
#define FG FOREGROUND
#define BG BACKGROUND
#define IS INTENSITY
#define CL COMMON_LVB
#define LE LEADING_BYTE
#define TE TRAILING_BYTE
#define GH BACKGROUND
#define GL INTENSITY
#define GV COMMON_LVB
#define RV LEADING_BYTE
#define UN TRAILING_BYTE
#define STI std::stoi
#define ITS std::to_string
//---------------------------------------------
#define SetSize(col,row) {           \
                            \
    char cmd[64];                 \
    sprintf(cmd, "mode con cols=%d lines=%d", col, row);\
    system(cmd);\
}
#define Fixed SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX)
#define Title(title) SetConsoleTitle(title);
#define Sever FreeConsole()
#define NewWin AllocConsole()
//---------------------------------------------
#define IA(ia) isaldha(ia)
#define ID(id) isdigit(id)
#define IP(ip) isprint(ip)
#define TU(tu) toupper(tu)
#define TL(tl) tolower(tl)
#define LB(lb,lbch) lower_bound(lb,sizeof(lb),lbch)
#define RE(re,rl) reverse(re,re+rl); 
#define RO(ro,rm,rl) rotate(ro,ro+rm,ro+rl)
#define EQ(eq1,eqL,eq2) equal(eq1,eq1+eqL,eq2)
#define ME(me1,me1l,me2,me2l,me3) merge(eq1, eq1+eq1l, eq2, eq2l, eq3)
//---------------------------------------------
#define SUI(sui1,sui1l,sui2,sui2l,sui3) set_union(sui1,sui1+sui1l,sui2,sui2+sui2l,sui3)
#define SIS(sis1,sis1l,sis2,sis2l,sis3) set_intersection(sis1,sis1+sis1l,sis2,sis2+sis2l,sis3)
#define OIA ios::sync_with_stdio(false)
#define O2op {pragma GCC optimize(2)}
#define O3op {pragma GCC optimize(3)}
#define NFre {\
    char *p1,*p2,buf[100000];\
    #define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)\
    int read()\
    {\
        int x=0,f=1;\
        char ch=nc();\
        while(ch<48||ch>57)\
        {\
            if(ch=='-')\
               f=-1;\
               ch=nc();\
        }\
        while(ch>=48&&ch<=57)\
            x=x*10+ch-48,ch=nc();\
           return x*f;\
    }\
}
#define NFwr {\
    void write(int x)\
    {\
        if(x<0)\
            putchar('-'),x=-x;\
        if(x>9)\
            write(x/10);\
        putchar(x%10+'0');\
    }\
}
//---------------------------------------------
#define Ar2(Aa,Am,An,At) \
for(int i=0;i<=Am;i++)\
{\
    for(int j=0;j<=An;j++)\
    {\
        Aa[i][j]=At;\
    }\
} 
class ALN//错误在这里
{//错误在这里
    //大数加法
    public:
    string Add(string num1, string num2)
    {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        string ret; //存储两个字符串相加后的结果
        int carry = 0; //进位(初始时进位设置为0)
        while (end1 >= 0 || end2 >= 0)
        {
            //1、取出num1中本次待相加的数字
            int a = 0;
            if (end1 >= 0)
            {
                a = num1[end1] - '0';
                end1--;
            }
            //2、取出num2中本次待相加的数字
            int b = 0;
            if (end2 >= 0)
            {
                b = num2[end2] - '0';
                end2--;
            }
        //3、将这两个数字相加(注意加上进位)
            int sum = a + b + carry;
        //4、判断是否需要进位
            if (sum > 9)
            {
                sum -= 10;
                carry = 1; //需要进位,将carry设置为1
            }
            else
            {
                carry = 0; //不需要进位,将carry设置为0
            }
            ret += (sum + '0');
        }
        if (carry != 0) //判断是否还需进位(可能两个数的最高位相加后会进位)
            ret += '1';

        reverse(ret.begin(), ret.end()); //将ret字符串进行反转
        return ret; //返回两个字符串相加后的结果
    }
    //大数比较
    int Cmp(string& num1, string& num2)
    {
        if ((num1.size() > num2.size()) || (num1.size() == num2.size() && num1 > num2)) return 1; //num1大于num2,返回1
        else if ((num1.size() < num2.size()) || (num1.size() == num2.size() && num1 < num2)) return -1; //num1小于num2,返回-1
        else return 0; //num1等于num2,返回0
    }
    //大数减法
    string Less(string num1, string num2)
    {
        //保证num1大于等于num2
        if (Cmp(num1, num2) == -1)
        {
            return "-" + Less(num2, num1); //num1小于num2,则返回num2-num1所得到的结果的负值
        }
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        string ret; //存储两个字符串相减后的结果
        int borrow = 0; //借位(初始时借位设置为0)
        while (end1 >= 0)
        {
            //1、取出num1中本次待相减的数字
            int a = num1[end1] - '0';
            end1--;
            //2、取出num2中本次待相减的数字
            int b = 0;
            if (end2 >= 0)
            {
                b = num2[end2] - '0';
                end2--;
            }
            //3、将这两个数字相减(注意减去借位)
            int differ = a - b - borrow;
            //4、判断是否需要进位
            if (differ < 0)
            {
                differ = 10 + differ;
                borrow = 1; //需要借位,将borrow设置为1
            }
            else
            {
                borrow = 0; //不需要借位,将borrow设置为0
            }
            ret += (differ + '0');
        }
        reverse(ret.begin(), ret.end()); //将ret字符串进行反转
        //过滤掉ret字符串前面的'0'
        size_t pos = ret.find_first_not_of('0');
        if (pos == string::npos) //ret中全部为'0',则两个数相减后的结果为0
        {
            return "0";
        }
        return ret.substr(pos); //返回两个字符串相减后的结果
    }
    string MTP(string num1, string num2)
    {
        if (num1 == "0" || num2 == "0") //两个操作数中有一个为0,则结果为0
            return "0";

        int m = num1.size(), n = num2.size();
        vector<int> arr(m + n, 0); //开辟数组arr的大小为m+n,并且全部初始化为0
    
        //1、取乘数的每一位与被乘数的每一位相乘,将结果累加到数组arr的对应下标位置
        for (int i = n - 1; i >= 0; i--) //取乘数的每一位
        {
            int a = num2[i] - '0';
            for (int j = m - 1; j >= 0; j--) //取被乘数的每一位
            {
                int b = num1[j] - '0';
                arr[i + j + 1] += a*b; //乘数第i位与被乘数第j位相乘后的结果累加到数组arr中下标为i+j+1的位置
            }
        }

        //2、从后往前对数组arr进行进位操作
        int end = m + n - 1;
        while (end > 0)
        {
            arr[end - 1] += arr[end] / 10; //进位的值加到前一个位置
            arr[end] %= 10; //进位后剩下的值存放到当前位
            end--; //处理下一位
        }

        //3、依次将数据尾插到字符串ret当中
        string ret; //存放两个字符串相乘后的结果
        int flag = 1; //默认有效值从数组arr当中下标为1的位置开始
        if (arr[0] != 0)    flag = 0; //若数组arr当中下标为0的位置的值不为0,则有效值从第0位开始
        for (int i = flag; i < m + n; i++)
        {
            ret += (arr[i] + '0');
        }
        return ret; //返回两个字符串相乘后的结果
    }
    //大数除法
    string divide(string num1, string num2, int n,bool pd)
    {
        if (num2 == "0") //除数不能为0
            return "error";
        string ret; //存储两个字符串相除后的结果
        string tmp; //余数
    //1、先计算小数点前面的数
        if (num1.size() < num2.size()) //num1的位数小于num2
        {
            ret += "0."; //商为0
            tmp = num1; //余数为num1
            if(!pd)return "0";
        }
        else //num1的位数大于等于num2
        {
            size_t len = num2.size(); //除数的长度
            tmp = num1.substr(0, len); //先取出被除数的高len位
            while (1)
            {
                //a、计算tmp当中最多有多少个num2(tmp除以num2的商)
                int count = 0;
                while (Cmp(tmp, num2) != -1) //tmp大于等于num2,则说明商可以更大
                {
                    tmp = Less(tmp, num2);
                    count++; 
                }

            //b、将商值尾插到ret当中
                ret += (count + '0');

            //c、如果num1的所有位都被取完了,则小数点之前的结果计算完毕
                if (len >= num1.size()||!pd)
                    break;
    
                //d、如果num1当中还有未取的位,则继续从num1中一位尾插到tmp当中
                tmp += num1[len];
                len++; //下一次待取位下标
            }
            ret += "."; //小数点之前的结果计算完毕,加上小数点
    
            //如果ret最高位为0,且该位后面不是小数点,则需要将这个0过滤掉
            if (ret.size() != 2 && ret[0] == '0')
                ret = ret.substr(1);
        }
    //2、再计算小数点后面的数(保留n位小数)
        for (int i = 0; i < n; i++)
        {
            if (tmp == "0") //tmp为0(余数为0)
            {
                ret += "0"; //则直接在ret后面补0即可
            }
            else //tmp不为0(余数不为0)
            {
                tmp += "0"; //在余数后面补0,继续进行计算

                //a、计算tmp当中最多有多少个num2(tmp除以num2的商)
                int count = 0;
                while (Cmp(tmp, num2) != -1)
                {
                    tmp = Less(tmp, num2);
                    count++;
                }
    
                //b、将商值尾插到ret当中
                ret += (count + '0');
            }
        }
        return ret; //返回两个字符串相除后的结果
    }
    string DVD(string num1,string num2, int n,bool pd)//若pd=false,除法仅算到整数,反之
    {
        return divide(num1,num2,n,pd);
    }
    string DVD(string num1,string num2,bool pd)
    {
        return divide(num1,num2,2,pd);
    }
    string RMD(string num1,string num2)//余数
    {
        return Less(num1,MTP(divide(num1,num2,0,false),num2));
    }
};    
        

求更正。

  • 写回答

1条回答 默认 最新

  • Loup&卡普 2023-11-19 20:58
    关注

    你是不是用了 C 编译器 编译 C++?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月25日
  • 已采纳回答 8月17日
  • 修改了问题 11月18日
  • 修改了问题 11月18日
  • 展开全部

悬赏问题

  • ¥15 关于stm32hal库驱动ft6336触摸屏遇到的问题
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22