error:C2059 语法错误:“using namespace”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++上机实验报告-实验五全文共7页,当前为第1页。C++上机实验报告-实验五全文共7页,当前为第1页。实验五 继承与派生 C++上机实验报告-实验五全文共7页,当前为第1页。 C++上机实验报告-实验五全文共7页,当前为第1页。 实验目的 1.学习定义和使用类的继承关系,定义派生类 2.熟悉不同继承方式下对基类成员的访问控制 3.学习利用虚基类解决二义性问题 实验要求 1.定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程尝试。 2.定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 3.定义一个车(vehicle)基类,具有Maxspeed、Weight等成员,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNun)等属性。从bicycle和motorcar派生出摩托车(motorbicycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程尝试。 实验内容及实验步骤 1.编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示: error C2248 : 'age' : cannot access private member declared in class 'Animal' error C2248 : 'age' : cannot access private member declared in class 'Animal' 把age改为公有成员变量后重新编译就可以了。程序名:lab7_1.cpp。 2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。 4.编写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:lab7_3.cpp。 编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。 思考题 1.如何在已有的类的基础上设计新的类? 采用类的派生的方法,利用基类派生出子类,子类继承基类的属性,从而在已有基类的基础上设计新的派生类,模式如下: class 派生类名:继承方式 基类名1,继承方式 基类名2,…,继承方式 基类名n { 派生类成员声明; }; 2.基类和派生类对象的构造顺序是怎样的? 先调用基类的构造函数,然后再调用内嵌对象(派生类中的对象)的构造函数。基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在类C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++上机实验报告-实验五全文共7页,当前为第2页。 C++上机实验报告-实验五全文共7页,当前为第2页。 3.如何利用虚基类解决二义性问题? 将共同基类设置为虚基类,语法为: class 派生类名:virtual 继承方式 基类名 源程序 Lab7_1.cpp #include<iostream> using namespace std; class Animal//Animal类 { /*private: int age;*/ public: int age; Animal(){} ~Animal(){} Animal(int ); }; class Dog:public Animal//Dog类,Animal的公有派生类 { private: int number; public: Dog(){} ~Dog(){} Dog(int,int); void setAge(int ); void showNumber(); void showAge(); }; Animal::A
数据结构及算法C语言版。严蔚敏版。VC6运行通过,这个是源代码CPP文件,包含顺序线性表、单链表的插入、删除、查找。包含监视哨查找,折半查找,直接插入排序,希尔排序,冒泡排序,快速排序,选择排序。里面包含超大量的注释,包括对VC6的语法解释和算法的解释和理解。具体效果可以看 http://download.csdn.net/detail/changechange/8236207 我上次上传的 EXE demo,带输入输出,能与用户交互。在运行的时候会把整个运算的过程都显示出来。摘录代码如下://数据结构 上机第一次 栈应用,转换进制题目。 //请用每一个cpp作为一个项目,不要把多个cpp放到同一个项目中,因为我为每个cpp都定义了main。 //这个教材上没有,只能自己补全了 #include using namespace std; //p10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; //下面这行书上没找到,自己补的。 typedef int SElemType; //p46书上的。 #define STACK_INIT_SIZE 100 //定义最初申请的内存的大小 #define STACKINCREMENT 10 //每一次申请内存不足的时候扩展的大小 typedef struct { SElemType *base; //在栈构造之前和销毁之后,base的值为null SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack; //定义顺序栈别名。 //构造一个空栈S Status InitStack(SqStack &S) { // 参考之前的 List.cpp中队malloc的解释。 S.base=(SElemType *) malloc(STACK_INIT_SIZE * sizeof (SElemType)); if (!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base; //初始时栈顶等于栈低 S.stacksize = STACK_INIT_SIZE; //初始栈容量 return OK; } //end of InitStack //插入元素e为新的栈顶元素 Status Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) // 栈满,追加存储空间 { S.base = (SElemType *) realloc(S.base, //原栈底指针 (S.stacksize + STACKINCREMENT) * sizeof (SElemType)); //新大小 if (!S.base) exit(OVERFLOW); // 存储分配失败 //调整栈顶的位置 S.top = S.base + S.stacksize; //修改栈大小为新的大小 S.stacksize += STACKINCREMENT; } //*符号为求值符。 *S.top++ = e; //先把e压入栈顶,S.top再增1指向栈顶元素e的下一个位置 return OK; } //end of Push // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base) //栈顶=栈底表示空栈,如果空栈,报错 return ERROR; e = *--S.top; //S.top先减1指向栈顶元素,再取值,赋值给e用于返回。 return OK; } //这个书上没有,自己加的 //书上没有,自己写的,用来处理每一个元素的data Status PrintEach(SElemType e){ cout<<e<<";"; return OK; } //从栈底依次对栈中每个元素调用函数visit(),主要用于输出 //关于visit的解释参考 List.cpp Status StackTraverse(SqStack &S,Status(* visit)(SElemType)){ int l = S.top-S.base; S.top=S.base; //从栈底开始输出 for(int i=0;i<l;i++) //用长度控制输出的个数 { (* visit)(*(S.top)++); } return OK; } // 若栈S为空栈,则返回TRUE,否则返回FALSE Status StackEmpty(SqStack &S) { //栈顶指针S.top是否等于栈底指针S.base是判断栈是否为空的条件 if (S.top == S.base) return TRUE; else return FALSE; } //p48 进行进制转换 //对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 void conversion() // 算法3.1 { SqStack S; //声明顺序栈S unsigned int N; //unsigned 表示无符号,unsigned int 从0开始,非负整数 SElemType e; //栈元素e InitStack(S); //构造空栈S cout<=0)"<<endl; scanf("%d",&N); //获取用户的输入,%d 是对数据的格式化。 &N 表示对变量 N 引用。 while (N) //只要n不等于0就循环。从n为用户输入的十进制数开始,一直到n等于0为止 { Push(S, N % 8); //n除以8的余数(8进制的低位)入栈 //先压入的余数是八进制的低位,后压入的余数是八进制的高位 N = N / 8; //令n等于n整除以8的商,进入下轮循环 } //我自己加的,先输出一遍栈内的内容。 cout<<"从底到顶输出栈内的内容,用于调试:"; StackTraverse(S,PrintEach); cout<<endl; //循环结束时,n等于0 while (!StackEmpty(S)) //只要栈S没pop空就不断循环,直到pop出栈底元素栈S为空为止 { Pop(S, e); //pop出栈顶元素且赋值给e进行返回 //先pop出的是八进制的高位,后pop出的是八进制的低位 printf("%d", e); //依次输出e } //循环结束时,栈S为空 cout<<endl; } int main() { for(int i=0;i<4;++i) conversion(); return 0; }
实验二--LL(1)分析法实验报告全文共11页,当前为第1页。实验二--LL(1)分析法实验报告全文共11页,当前为第1页。实验二 LL(1)分析法 实验二--LL(1)分析法实验报告全文共11页,当前为第1页。 实验二--LL(1)分析法实验报告全文共11页,当前为第1页。 实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容及设计原理 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL1(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写,其逻辑结构图如下: LL(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一: (1)若X = a ='#',则宣布分析成功,停止分析过程。 (2)若X = a '#',则把X从STACK栈顶弹出,让a指向下一个输入符号。 (3)若X是一个非终结符,则查看预测分析表M。若M[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为ε,则不推什么东西进STACK栈)。若M[A,a]中存放着"出错标志",则调用出错诊断程序ERROR。 三、程序结构描述 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 1、定义的变量 初始化预测分析表: LL E[8]={"TG","TG","error","error","error","error","error","error"}; LL G[8]={"error","error","null","+TG","-TG","error","error","null"}; LL T[8]={"FS","FS","error","error","error","error","error","error"}; LL S[8]={"error","error","null","null","null","*FS","/FS","null"}; LL F[8]={"i","(i)","error","error","error","error","error","error"}; const int MaxLen=10; 初始化栈的长度 const int Length=10; 初始化数组长度 char Vn[5]={'E','G','T','S','F'}; 非终结符数组 char Vt[8]={'i','(',')','+','-','*','/','#'}; 终结符数组 char ch,X; /全局变量,ch用于读当前字符,X用于获取栈顶元素 char strToken[Length]; 存储规约表达式 2、定义的函数 class stack 栈的构造及初始化 int length(char *c) 输出字符数组的长度 void print(int i,char*c) 剩余输入串的输出 void run() 分析程序 3、LL(1)预测分析程序流程图 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 四、程序源代码及运行结果 #include<iostream> using namespace std; const int MaxLen=10; //初始化栈的长度 const int Length=10;//初始化数组长度 ch
#include<iostream>//E->TC #include<string>//C->+TC/$ $表空串 using namespace std;//T->FD string biao[5][6]={{"CT"," "," ","CT"," "," "},{" ","CT+"," "," ","$","$"},{"DF"," "," ","DF"," "," "}, {" ","$","DF*"," ","$","$"},{"i"," "," ",")E("," "," "}};//D->*F/$ //F->i/(E) i表id //i+i*i (i+i)*i char vn[6]="ECTDF"; char vt[7]="i+*()#"; typedef struct { char c[100]; int top; }seqstack; seqstack s; seqstack i; seqstack* sy=&s; seqstack* in=&i; char pop(seqstack* s) { char a=s->c[s->top]; s->top--; return a; } void push(char c,seqstack* s) { s->top++; s->c[s->top]=c; } void setNull(seqstack* s) { s->top=-1; } void show(seqstack* sy,seqstack* in) { cout<<"分析栈:"<<"\t"<<"\t"<<"输入栈"<<endl; for(int i=0;i<=sy->top;i++) { if(sy->c[i]=='i') cout<<"id"; else if(sy->c[i]=='C') cout<<"E'"; else if(sy->c[i]=='D') cout<<"T'"; else cout<<sy->c[i]; } cout<<"\t"<<"\t"; for(i=0;i<=in->top;i++) { if(in->c[in->top-i]=='i') cout<<"id"; else cout<<in->c[in->top-i]; } cout<<endl; } int ll1() { setNull(sy); setNull(in); string s; char a; char c[100]; int length; cout<<"请输入表达式以@结束"<<endl; int i=0; a=getchar(); while(a!='@') { c[i]=a; i++; a=getchar(); } length=i; push('#',sy); push('E',sy); push('#',in); for( i=0;i<length;i++) push(c[length-i-1],in); show(sy,in); a=pop(sy); while(a!='#') { for(i=0;i<6;i++) { if(a==vt[i]) break; } if(i==6) { for(int j=0;j<6;j++) { if(in->c[in->top]==vt[j]) break; } for(int t=0;t<5;t++) { if(a==vn[t]) break; } s=biao[t][j];// if(s==" ") { cout<<"error"<<endl; return 0; } else { if(s!="$") { for(t=0;t<s.length();t++) push(s[t],sy); } show(sy,in); } } else { if(a==in->c[in->top]&&a!='#') { pop(in); show(sy,in); } else { cout<<"error"<<endl; return 0; } } a=pop(sy); } if(a==in->c[in->top]) { cout<<"表达式合法"<<endl; return 1; } else cout<<"error"<<endl; return 0; } void main() { ll1(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值