第一篇:C++上机实验:名称空间和头文件
实验6 名称空间和头文件
1.实验目的
学习并理解变量的作用域;掌握头文件的使用方法;掌握名称空间的作用和使用方法。
2.实验要求
(1)掌握全局变量和静态变量的作用域。
(2)掌握头文件的使用方法。
(3)掌握名称空间的使用方法。
3.实验内容
(1)全局变量一般在函数的外部定义,运行下面程序并思考变量的作用域。
#include
int a=3;//全局变量
int main(){
int a=5;cout< (2)静态变量(static).静态变量之所以是因为静态,是因为他在整个程序生命周期的地址静止不变。也就是说在整个程序里面只保存有一份拷贝。运行下面两个程序并思考静态变量的规则。 #include int max_so_far(int curr)//求至今(本次调用)为止最大值 { static int biggest=0;//该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期,如果去掉static,同学们看看程序运行的结果是什么? cout< if(curr > biggest) biggest = curr; return biggest;} int main() { cout< return 0; } #include void fun1() { static int value = 1;//体会静态变量的作用:函数调用结束后,其所占用的地址依然存在 value=value+1; cout< } int main() { fun1(); fun1(); fun1(); return 0; } (3)为了实现协同开发,减少开发时间,降低错误,提高效率,C++提供了头文件和名称空间机制。一般函数、全局变量、类、名称等的声明放在扩展名为.h(称为接口interface文件)的头文件中,而其实现部分则放在相同主名,扩展名为.cpp(称为实现implementation文件),而用户的应用程序则是调用(称为应用application文件) //E:cfun.h 头文件的定义 #ifndef FUN_H #define FUN_H #include //E:cfun.cpp 实现部分的定义 #include int f(int x){ } #include //E:ccpp1.cpp 应用程序的定义 int main(){ } cout< (4)名称空间主要是为了解决重名的问题 #ifndef FUN_H #define FUN_H #include namespace n1{ namespace n2{ #endif #include //extern int n1::a=1;//extern int n2::a=2;int f(int);} int f(int);} int n1::f(int x){ } int n2::f(int x){ } #include } cout< (1)利用头文件的方式,写出实现数学运算(+,-,*,/,%,^)的函数库(mathsx),然后在主程序中调用,体会头文件的作用 (2)利用名称空间的方法,分别在两个名称空间中实现交换两个变量的值的函数,分别用指针和引用作为参数swap(int *, int *)以及swap(int & ,int &)然后在主程序中调用,体会函数的阐述传递的规则 第二次上机实验报告 姓名:王小宁 班级: 学号: 031012 1234 第一题: 题目: 编写一个类,声明一个数据成员和一个静态数据成员,其构造函数初始化数据成员,并把静态数据成员加1,其析构函数把静态数据成员减1.(1)编写一个应用程序,创建该类的3个对象,然后显示其数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响。 (2)修改该类,增加静态成员函数并访问静态数据成员,并声明静态数据成员为保护成员。体会静态成员函数的使用,静态成员之间与非静态成员之间互访问题。 编程思想: 首先,定义一个类,其中含有两个类的私有变量,一个静态数据变量,定义构造函数,将初值赋给两个私有变量,并将静态数据变量加1,并显示.定义一个析构函数,并通过析构函数将静态成员变量减1.并显示。 修改以上的类,增加一个静态成员函数并通过静态成员函数来访问静态成员变量。在主函数中利用一个指向函数的指针指向这个静态成员函数,并通过这个指针来访问类中的静态数据。代码实现: 代码1: #include static int count; A(int a=0,int b=0) { X=a; Y=b; count++; cout<<“startcount=”< count--; cout<<“overcount=”< int GetX(){return X;} int GetY(){return Y;} private: int X,Y;};int A::count=0;int main(){ int *countp=&A::count;A z(2,3);cout<<“x=”< cout<<“x=”< 问题及心得: 在这次试验中,我理解了静态变量与普通变量之间的差异与联系。在实验过程中因未初静态变量始化而无法通过编译,并且注意到静态变量一定要在类外初始化。 题目2: 创建一个Person类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。其功能有修改姓名、显示数据信息。要求其功能函数的原型放在类定义中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。其中数据成员为保护的,函数为公有的。 编程思想: 创建一个PERSON类,定义姓名、街道地址、市、省和邮政编码分别为CHAR型的指针私有型变量。在定义公有型的构造函数,并在构造函数中申请动态内存来保存初始化的内容,并用相应的私有性的指针变量指向,再利用复制函数则指针中将会存放入输入内容。定义公有的析构函数释放动态申请的空间。定义一个公有的改变函数改变其中一个变量,方法与构造函数相似。 代码实现: #include private: char *name;char *street;char *pro;char *city;char *code; public: Person(char *aname,char *astreet,char *apro,char *acity,char *acode){ name=new char[strlen(aname)+1]; strcpy(name,aname); street=new char[strlen(astreet)+1]; strcpy(street,astreet); pro=new char[strlen(apro)+1]; strcpy(pro,apro); city=new char[strlen(acity)+1]; strcpy(city,acity); code=new char[strlen(acode)+1]; strcpy(code,acode); cout<<“constructor”< delete[] name; delete[] street; delete[] pro; delete[] city; delete[] code; cout<<“destructor”< delete[] name; name=new char[strlen(aname)+1]; strcpy(name,aname);} void show(){ cout<<“姓名:”< cout<<“街道地址:”< cout<<“省份:”< cout<<“城市:”< cout<<“邮政编码:”< 运行结果: 实验心得: 通过这个实验,我们学会了对类的私有的字符数组变量的初始化。利用指针动态分配空间。 C++上机实验报告 实验名称:实验 专业班级: 姓 名: 学 号: 实验日期: 11 实验 目录 1.实验目的 2.实验内容 3.程序代码 4.调试结果 5.实验心得 1.实验目的 实验10(1)进一步了解运算符重载的概念和使用方法;(2)掌握几种常用的运算符重载的方法;(3)了解转换构造函数的使用方法; (4)了解在Visual C++6.0环境下进行运算符重载要注意的问题。实验11(1)了解继承在面向对象程序设计中的重要作用;(2)进一步理解继承和派生的概念; (3)掌握通过继承派生出一个新的类的方法;(4)了解虚基类的作用和用法。 2.实验内容 实验10 事先编好程序,上机进行调试和运行程序,分析结果。(1)声明一个复数类Complex,重载运算符“+”,“-”,“*”,“/”,使之能用于复数的加,减,乘,除,运算符重载函数作为Complex类成员的函数。编程序,分别求两个复数之和,差,积和商。(2)声明一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意。 运行程序,分别求两个复数之和,整数和复数之和,(3)有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于两个矩阵相加 (4)声明一个Teacher(教师)类和一个Student(学生)类,二者有一部分数据成员是相同的,例如num(号码),name(名字),sex(性别)。编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上三个相同的数据成员移植过去。可以设想为:一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说任然是有用的,应当保留并成为其教师的数据的一部分。 实验11 事先编写好程序,上机调试和运行程序,分析结果。 (1)将教材第11章例11.1的程序片段补充和改写成一个完整的、正确的程序,用公用继承方式。在程序中应当包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。 (2)将教材第11章例11.3的程序修改、补充,写成一个完整、正确的程序,用保护继承方式。在程序中应包括输入数据的函数。(3)修改上面第(2)题的程序,改为用公用继承方式。上机调试程序,使之能够正确运行并得到正确的结果。 对这两种继承方式做比较分析,考虑在什么情况下二者不能互相替换。 (4)分别声明Teacher(教师)类和Cadre(干部)类,采用多 重继承方式由这两个类派生出新类Teacher-Cadre(教师兼干部)。要求: Ⅰ.在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 Ⅱ.在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务)。在Teacher-Cadre类中还包含数据成员wages(工资)。 Ⅲ.在基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。Ⅴ.在类体中声明成员函数,在类外定义成员函数。 Ⅵ.在派生类Teacher-Cadre的成员函数show中调用Teacher类中的display函数,输出性命、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。 3.程序代码 实验10(1) #include Complex Complex::operator +(Complex &c2){Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;} Complex Complex::operator-(Complex &c2){Complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;} Complex Complex::operator*(Complex &c2){Complex c;c.real=real*c2.real-imag*c2.imag;c.imag=imag*c2.real+real*c2.imag;return c;} Complex Complex::operator/(Complex &c2){Complex c;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);return c;} void Complex::display(){cout<<“(”< (2) #include double real; double imag;}; Complex Complex::operator+(Complex &c){return Complex(real+c.real,imag+c.imag);} Complex Complex::operator+(int &i){return Complex(real+i,imag);} void Complex::display(){cout<<“(”< Complex operator+(int &i,Complex &c){return Complex(i+c.real,c.imag);} int main(){Complex c1(3,4),c2(5,-10),c3;int i=5;c3=c1+c2;cout<<“c1+c2=”;c3.display();c3=i+c1;cout<<“i+c1=”;c3.display();c3=c1+i;cout<<“c1+i=”;c3.display();return 0;}(3) #include int mat[2][3];}; Matrix::Matrix(){for(int i=0;i<2;i++)for(int j=0;j<3;j++)mat[i][j]=0;} Matrix operator+(Matrix &a,Matrix &b){Matrix c;for(int i=0;i<2;i++)for(int j=0;j<3;j++){c.mat[i][j]=a.mat[i][j]+b.mat[i][j];} return c;} void Matrix::input(){cout<<“input value of matrix:”< void Matrix::display(){for(int i=0;i<2;i++){for(int j=0;j<3;j++){cout< #include int num; char name[20]; char sex; float score;}; Student::Student(int n,char nam[],char s,float sco){num=n;strcpy(name,nam);sex=s;score=sco;} class Teacher {public: Teacher(){} Teacher(Student&);Teacher(int n,char nam[],char sex,float pay);void display();private: int num; char name[20]; char sex; float pay;}; Teacher::Teacher(int n,char nam[],char s,float p} {num=n;strcpy(name,nam);sex=s;pay=p;} Teaxher::Teacher(Student& stud){num=stud.get_num();strcpy(name,stud.get_name());sex=stud.get.sex();pay=1500;} void Teacher::display(){cout<<“num:”< #include void get_value() {cin>>num>>name>>sex;} void display() {cout<<”num:“< cout<<”sex:“< int num; char name[10];char sex;}; class Student1:public Student {public: void get_value_1(){get_value();cin>>age>>addr;} void display_1(){cout<<”age:“< char addr[30];}; int main(){Student1 stud1;stud1.get_value_1();stud1.display();stud1.display_1();return 0;}(2) #include void display();protected: int num; char name[10]; char sex;}; void Student::get_value(){cin>>num>>name>>sex;} void Student::display(){cout<<”num:“< class Student1:protected Student {public: void get_value_1();void display1();private: int age;char addr[30];}; void Student1::get_value_1(){get_value();cin>>age>>addr;} void Student1::display1(){cout<<”num:“< int main(){Student1 stud1;stud1.get_value_1();stud1.display1();return 0;}(3) #include int num; char name[10]; char sex;}; void Student::get_value(){cin>>num>>name>>sex;} void Student::display(){cout<<”num:“< class Student1:public Student {public: void get_value_1();void display1();private: int age; char addr[30];}; void Student1::get_value_1(){get_value();cin>>age>>addr;} void Student1::display1(){cout<<”num:“< int main(){Student1 stud1;stud1.get_value_1();stud1.display1();return 0;}(4) #include Teacher(int,char[],char);void display();private: int num;char name[20];char sex;}; Teacher::Teacher(int n,char nam[],char s){num=n;strcpy(name,nam);sex=s;} void Teacher::display(){cout<<”num:”< class BirthDate {public: BirthDate(int,int,int);void display();void change(int,int,int);private: int year;int month;int day;}; BirthDate::BirthDate(int y,int m,int d){year=y;month=m;day=d;} Void BithDate::display(){cout<<”birthday:”< void BirthDate::change(int y,int m,int d){year=y;month=m;day=d;} class Professor:public Teacher {public: Professor(int,char[],char,int,int,int,float);void display();void change(int,int,int);private: float area;BirthDate birthday;} Professor::Professor(int n,char name[20],char s,int y,int m,int d,float a): Teacher(n,name,s),birthday(y,m,d),area(a){} void Professor::display(){Teacher::display();birthday.display();cout<<”area:”< Int main(){Professor profl(3012,”Zhang”,’f’,1949,10,1,125.4);cout< 4.调试结果 实验10(1)c1+c2=(8,-6i)c1-c2=(-2,14i)c1*c2=(55,-10i)c1/c2=(-0.2,0.4)(2)c1+c2=(8,-6i)i+c1=(8,4i)c1+i=(8,4i) (3) input value of Matrix:11 22 33 44 55 66 input value of Matrix:12 13 14 15 16 17 Matrix a: 11 22 33 44 55 66 Matrix b: 12 13 14 15 16 17 Matrix c=Matrix a + Matrix b : 23 25 47 59 71 83 (4)student1 : num :20010 name:Wang sex:m score;89.5 Teacher2: num:20010 name:Wang sex:m pay:1500 实验11(1) 10101 Li M 20 Beijing num:10101 name:Li sex:M age:20 address:Beijing (2) 10101 Li M 20 Beijing num:10101 name:Li sex:M age:20 address:Beijing (3) 10101 Li M 20 Beijing num:10101 name:Li sex:M age:20 address:Beijing (4)The original data: num:3012 name:Zhang sex:f area:125.4 The new data: num:3012 name:Zhang sex:f birthday:6/1/1950 area:125.4 5.实验心得 这一次上机实验,除了了解到了运算符重载的概念和用法,掌握几种常用的运算符重载的方法,了解转换构造函数的使用方法,同时也能了解虚基类的用法,理解继承与派生的概念。 但是,最主要的,我觉得,是通过这一次的上机实验,我了解到,有的实验本身是没有程序错误的,但是,也会由于实验环境的影响而不能正常运行。换句话说,有的程序并不能在Visaul C++的环境下运行,而不是程序自身的问题。所以,对于没办法调试成功的程序,我们也不能一味的认为程序有错误,要学会理性的判断程序的对错,再下结论。 C++课程上机实验常见错误汇集 1. 调试器错误信息:syntax error : missing ';' 原因:在源码中遗失“;” 2.调试器错误信息:例:error C2065: 'cout' : undeclared identifier.原因:例如cout/cin/endl/<>>等在命名空间中定义的符号和标示符无法使用。缺少命名空间使用定义:即缺少“using namespace std;” 3. 调试器错误信息:例:error C2065: 'i' : undeclared identifier原因:变量未定义就直接使用.C++语言中,变量的使用必需遵循先声明定义,后使用的原则。 4.调试器错误信息:error C2018: unknown character '0xa3' 原因:在程序中使用中文标示符,如将英文”;”错误输入成了”;”在C++中,除程序注释可以采用中文外,其余字符要求使用英文。不少同学在建立工程或程序名称时也使用中文名称,建议改掉这种习惯。 5.调试器错误信息:例:error C2676: binary '>>' : 'class std::basic_ostream 原因:在使用输入输出流的时候错误使用了标示符“>>”“<<”,例cout>>a; 6.调试器错误信息:warning C4305: 'initializing' : truncation from 'const double' to 'float' 原因:定义的变量类型与使用不对应,如声明为float,但实际给与了一个double的值,例:float pi=3.***; 7.调试器错误信息:warning C4700: local variable 'a' used without having been initialized 原因:变量在赋值之前就使用,例:int a, b, c;c=a+b;cin>>a>>b; 8. error C2556: 'int __cdecl main(void)' : overloaded function differs only by return type from 'void __cdecl main(void)' E:tempalskdfldid.cpp(4): see declaration of 'main' E:tempalskdfldid.cpp(15): error C2371: 'main' : redefinition;different basic types 原因:在一个工程中包含多于一个的main函数 9.调试器错误信息:error C2447: missing function header(old-style formal list?) 原因:在函数定义的()后面使用分号 例:void chang(); {„..} 10.调试器错误信息:error C2660: 'chang' : function does not take 2 parameters 原因:函数声明/定义/调用参数个数不匹配。 例:void chang(int a,int b, float c) {„} void main() {„chang(3,4);} 11、atal error C1010: unexpected end of file while looking for precompiled header directive。 原因:寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include “stdafx.h”) 12、fatal error C1083: Cannot open include file: 'R„„.h': No such file or directory 原因:不能打开包含文件“R„„.h”:没有这样的文件或目录。 13、error C2011: 'C„„': 'class' type redefinition 原因:类“C„„”重定义。 14、error C2018: unknown character '0xa3' 原因:不认识的字符'0xa3'。(一般是汉字或中文标点符号) 15、error C2057: expected constant expression 原因:希望是常量表达式。(一般出现在switch语句的case分支中) 16、error C2065: 'IDD_MYDIALOG' : undeclared identifier 原因:“IDD_MYDIALOG”:未声明过的标识符。 17、error C2082: redefinition of formal parameter 'bReset' 原因:函数参数“bReset”在函数体中重定义。 18、error C2143: syntax error: missing ':' before '{' 原因:句法错误:“{”前缺少“;”。 19、error C2146: syntax error : missing ';' before identifier 'dc' 原因:句法错误:在“dc”前丢了“;”。 20、error C2196: case value '69' already used 原因:值69已经用过。(一般出现在switch语句的case分支中) 21、error C2509: 'OnTimer' : member function not declared in 'CHelloView'原因:成员函数“OnTimer”没有在“CHelloView”中声明。 22、error C2511: 'reset': overloaded member function 'void(int)' not found in 'B' 原因:重载的函数“void reset(int)”在类“B”中找不到。 23、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention 原因:类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。 24、error C2660: 'SetTimer' : function does not take 2 parameters原因:“SetTimer”函数不传递2个参数。 25、warning C4035: 'f„„': no return value 原因:“f„„”的return语句没有返回值。 26、warning C4553: '= =' : operator has no effect;did you intend '='?原因:没有效果的运算符“= =”;是否改为“=”? 27、warning C4700: local variable 'bReset' used without having been initialized 原因:局部变量“bReset”没有初始化就使用。 28、error C4716: 'CMyApp::InitInstance' : must return a value原因:“CMyApp::InitInstance”函数必须返回一个值。 29、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing 原因:连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭) 30、error LNK2001: unresolved external symbol “public: virtual _ _thiscall C„„::~C„„(void)” 原因:连接时发现没有实现的外部符号(变量、函数等)。 上机实验: 1、回文是指正读,反读均相同的字符序列,如“abba”和“abdba”均是回文,但是“good”不是回文,试用STACK类编写该程序。 #include int top = 1;char *cMyStack =(char *)malloc((iLen/2+1)*sizeof(char));//定位对原始数组的检测索引初始位置 cMyStack[0] = iLen/2;if(1 == iLen%2){ ++cMyStack[0];} //将原始数组的一半元素入栈 for(top=1;top<=iLen/2;top++){ cMyStack[top] = *(cScr+top-1);} //从栈顶开始依次匹配 while(*(cScr+cMyStack[0])== cMyStack[--top] && cMyStack[0]++ < iLen){} if(0 == top){//是回文数 free(cMyStack);return 1;} else {//不是回文数 free(cMyStack);return 0;} } 运行结果: 2.利用两个栈类S1、S2模拟一个队列时,编写一程序利用栈的运算实现队列的插入、删除以及判断队列空的运算。 #include template assert(!mStack2.empty());mStack2.pop();} template sq.pushBack(1);printQueue(sq);sq.pushBack(2);printQueue(sq);sq.pushBack(3);printQueue(sq);sq.popFront();printQueue(sq);sq.popFront();printQueue(sq);sq.popFront();printQueue(sq);return 0;} 运行结果: 实验2: 声明复数的类Complex,使用友元函数add实现复数的加法。 #include < iostream > using namespace std; class Complex { private: double real, image;public : Complex(){} Complex(double a,double b) { real = a;image = b;} void setRI(double a, double b){ real = a;image = b;} double getReal(){ return real;} double getImage(){ return image;} void print(){ if(image>0) cout<<“复数:”<< real <<“ + ”<< image <<“i”<< endl;if(image<0) cout<<“复数:”<< real <<“-”<< image <<“i”<< endl;} friend Complex add(Complex ,Complex);//声明友元函数 }; Complex add(Complex c1, Complex c2)//定义友元函数 { Complex c3; c3.real = c1.real + c2.real;//访问Complex类中的私有成员 c3.image = c1.image + c2.image;return c3;} void main(){ Complex c1(29, 0.634), c2, c3;c2.setRI(85,106.012);c3 = add(c1, c2); cout<<“复数一:”;c1.print();cout<<“复数二:”;c2.print();cout<<“相加后:”;c3.print();} 结果: 实验三: 7-5 定义一个基类Shape,在此基础上派生出一个Rectangle和Circle,二者都有getArea()函数计算对象的面积。使用Rectangle类创建一个派生类Square.#include public: Shape(){} double GetArea() { return 0.1;} };class Rectangle: public Shape { public: Rectangle(double w,double h) { width=w;height=h;} double GetArea(){ return width*height;} private: double width,height;};class Circle:public Shape { private: double r; public: Circle(double rr){ r=rr;} double GetArea(){ return PI*r*r;} }; int main(){ Rectangle * rec=new Rectangle(5,6); Circle * cir=new Circle(5); cout<<“RecArea:”< cout<<“CirArea:”< return 1; } 运行结果: 7-10.定义一个Object类,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。#include object(){ cout<<“构造object对象”< class box:public object { private: int Height,Width;public: box(){ cout<<“构造box对象”<第二篇:C++上机实验报告
第三篇:C++上机实验报告
第四篇:C++课程上机实验常见错误汇集
第五篇:C++实验