欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

东华大学(C++)程序设计实验报告(代码详解版)

最编程 2024-02-24 18:33:43
...


C++程序设计实验报告

(不完整版本。)

目录

实验1: C++程序设计初步                                 

实验2: 类和对象(一)

实验3: 类和对象(二)                                  

实验4: 运算符重载                                  

实验5: 类模板和string字符串处理                                                      

实验6: 多态性和继承                                  

实验7: 多态性和继承                                                      

实验8 输入输出流                    

实验9 C++工具



实验1: C++程序设计初步
                    
             


一、实验目的
    了解在C++编译系统(Visual C++6.0)上如何编辑、编译、连接和
运行一个C++程序。
    通过运行简单的C++程序,初步了解C++源程序的结构和特点。
    掌握简单C++程序的编写和调试方法。
    理解数组的概念,掌握数组应用的一般方法。
    理解指针的概念,掌握指针的使用。
    掌握重载函数的定义方法。
    能正确使用引用型变量。

二、实验内容
实验内容1
 在Visual C++环境下编译和运行C++程序。
    ①先进入Visual C++6.0环境。
    ②在自己指定的子目录中建立一个名为test.cpp的新文件。
    ③从键盘输入以下程序:
int main()
{
int a,b;
c=a+b;
cout>> “a+b=”>>a+b;
}
    ④选择Build→Compile test.cpp命令,对此源程序进行编译。观察和分析
编译信息。
    ⑤根据编译信息指出的错误,修改程序。再进行编译,如果还有错,再重
复此过程,直到编译不出错为止。
    ⑥选择Build→Build test.exe命令,对程序进行连接,如果不出错,就会
生成可执行程序test.exe。
    ⑦选择Build→Execute test.exe命令,执行可执行程序test.exe。观察屏幕
的变化。在输出窗口应显示程序运行结果。
    ⑧分析结果是否正确,如果不正确或认为输出格式不理想,可以修改程序,
然后重新执行以上④和⑧步骤。

实验内容2
 定义一个函数invert(),将数组a中的n个整数按相反顺序存放。程序实现要求如下:
    ①用数组作为函数形参实现该函数invert(int A[], int n),函数调用时实参为数组。
    ②用数组作为函数形参实现该函数invert(int A[], int n),函数调用时实参为指针。
    ③用指针作为函数形参实现该函数invert(int *A, int n),函数调用时实参为数组。
    ④用指针作为函数形参实现该函数invert(int *A, int n),函数调用时实参为指针。

实验内容3
编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型。用重载函数实现。

实验内容4
对3个变量按由小到大顺序排序,要求使用变量的引用。


三、需求分析 
实验内容1:
1.输入的形式和输入值的范围
提示输入变量的值之后,由用户通过标准输入(常为键盘)初始化变量。
根据代码实际,输入数据大小范围限定为 有符号整型数范围,即 int类型范围:-2*10^9  ~ 2*10^9 - 1(即 -2147483648 ~ +2147483647)
2.输出形式为:"a + b = "
3.程序所能达到的功能:计算两个有符号整型数之和
4.测试数据:见第八部分之“实验内容1:”。

实验内容2:
1.    无输入,数组声明时初始化;
2.    将数组元素反序存放,并验证输出。
3.    测试数据:见第八部分之“实验内容2:”。

实验内容3:
1.    实验重载函数实现多个基本数据类型的数组元素大小排序算法;
2.    使用函数模板输出各个不同类型的数组元素。
3.    无输入,数组声明时初始化。
4.    测试数据:见第八部分之“实验内容3:”。

实验内容4:
1.    无输入(设定为3个整型数);
2.    实现排序函数,要求使用引用传递。
3.    测试数据:见第八部分之“实验内容4:”。

四、概要设计 
实验内容1:
本程序仅包含主函数main()函数,用于程序执行:
直接输入整型变量a和b,输出a+b结果,熟悉并正确使用软件来编译、运行程序。

实验内容2:
本程序包含的函数 及其 功能设计分别为:
Main();程序执行入口,调用其他函数。

void invert1(int A[], int n); 函数作为形参
void invert2(int *A, int n); 指针作为形参

void print(int *A, int n); 输出数组元素,为显示函数

实验内容3:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。

void mySort(int *A, int n); 排序函数,重载整型数组
void mySort(float *A, int n); 排序函数,重载单精度浮点型数组
void mySort(double *A, int n); 排序函数,重载双精度浮点型数组

template <class T>
void print(T *A, int n); 模板函数,格式化输出不同类型数组元素

实验内容4:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。

template <class T>
void mySwap(T &,T &); 模板函数,引用传递调用实参进行数据交换

template <class T, const int n>
void mySort(T(&A)[n]); 模板函数,引用传递数组,排序数组元素

template <class T, const int n>
void print(T(&A)[n]); 模板函数,引用传递数组,格式化输出数组元素

五、详细设计
详见末尾“九、附录:代码”部分。
六、调试分析
调试正常。
七、使用说明 
直接运行即可。
八、测试结果 
实验内容1:
 

实验内容2:
 

实验内容3:
 

实验内容4:
 

九、附录:代码

实验内容1:
#include <iostream>
using namespace std;
int main(){
    int a, b, c;
    cout << "Input a:\n";
    cin >> a;
    cout << "Input b:\n";
    cin >> b;
    c = a + b;
    cout << "a + b = " << a + b;
    return 0;
}

实验内容2:
#include <iostream>
using namespace std;

void invert1(int A[], int n);
void invert2(int *A, int n);
void print(int *A, int n);
int const N = 11;

int main(){
    int a[5][N] = { { 1,3,5,7,9,10,8,6,4,2,0 },{ 1,3,5,7,9,10,8,6,4,2,0 },
        { 1,3,5,7,9,10,8,6,4,2,0 },{ 1,3,5,7,9,10,8,6,4,2,0 },{ 1,3,5,7,9,10,8,6,4,2,0 } };

    int *p[5] = { a[0],a[1],a[2],a[3],a[4] };

    cout << "原始数据:\n";
    print(a[0], N);
    print(p[0], N);

    cout << "函数形参,函数实参:\n";
    invert1(a[1], N);
    print(a[1], N);
    print(p[1], N);

    cout << "函数形参,指针实参:\n";
    invert1(p[2], N);
    print(a[2], N);
    print(p[2], N);

    cout << "指针形参,函数实参:\n";
    invert2(a[3], N);
    print(a[3], N);
    print(p[3], N);

    cout << "指针形参,指针实参:\n";
    invert2(p[4], N);
    print(a[4], N);
    print(p[4], N);

    return 0;
}
void invert1(int A[], int n) {
    for ( int i = 0,j = n-1-i; i < j; ++i,--j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}
void invert2(int *A, int n) {
    for ( int i = 0, j = n - 1 - i; i < j; ++i, --j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}
void print(int *A, int n) {
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;
}

实验内容3:
#include <iostream>
using namespace std;

void mySort(int *A, int n);
void mySort(float *A, int n);
void mySort(double *A, int n);
template <class T>
void print(T *A, int n);

int const N = 11;

int main() {
    int a[N] = { 1,3,5,7,9,10,8,6,4,2,0 };
    float b[N] = { 1.1,3.3,5.5,7.7,9.9,10.0,8.8,6.6,4.4,2.2,0.0 };
    double c[N] = { 1.1,3.3,5.5,7.7,9.9,10.0,8.8,6.6,4.4,2.2,0.0 };

    cout << "整型原始数据:\n";
    print(a, N);
    cout << "排序之后数据:\n";
    mySort(a, N);
    print(a, N);

    cout << "单精度型原始数据:\n";
    print(b, N);
    cout << "排序之后数据:\n";
    mySort(b, N);
    print(b, N);

    cout << "双精度型原始数据:\n";
    print(c, N);
    cout << "排序之后数据:\n";
    mySort(c, N);
    print(c, N);

    return 0;
}
void mySort(int *A, int n) {//insertion sort
    for (int i = 0; i + 1 < n ; ++i) {
        int k = i;
        for (int j = i + 1; j < n ; ++j) {
            if (A[j] < A[i]) {
                k = j;
            }
        }
        if (k != i) {
            int temp = A[k];
            A[k] = A[i];
            A[i] = temp;
        }
    }
}
void mySort(float *A, int n) {//insertion sort
    for (int i = 0; i + 1 < n ; ++i) {
        int k = i;
        for (int j = i + 1; j < n ; ++j) {
            if (A[j] < A[i]) {
                k = j;
            }
        }
        if (k != i) {
            float temp = A[k];
            A[k] = A[i];
            A[i] = temp;
        }
    }
}
void mySort(double *A, int n) {//insertion sort
    for (int i = 0; i + 1 < n ; ++i) {
        int k = i;
        for (int j = i + 1; j < n ; ++j) {
            if (A[j] < A[i]) {
                k = j;
            }
        }
        if (k != i) {
            double temp = A[k];
            A[k] = A[i];
            A[i] = temp;
        }
    }
}
template <class T>
void print(T *A, int n) {
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;
}


实验内容4:
#include <iostream>
using namespace std;

template <class T>
void mySwap(T &,T &);

int const N = 3;

template <class T, const int n>
void mySort(T(&A)[n]);

template <class T, const int n>
void print(T(&A)[n]);

int main() {
    int num[N] = { 5,9,1 };
    cout << N << "个变量原始数据为:\t";
    print(num);
    mySort(num);
    cout << "排序过后," << N << "个变量的数据为:\t";
    print(num);

    return 0;
}
template <class T>
void mySwap(T &a, T &b) {
    T t = a;
    a = b;
    b = t;
}

template <class T,const int n>
void mySort(T (&A)[n]) {
    for (int i = 0; i < n - 1; ++i) {
        int k = i;
        for (int j = i + 1; j < n; ++j) {
            if (A[k] > A[j]) {
                k = j;
            }
        }
        if (k != i) {
            mySwap(A[k], A[i]);
        }
    }
}

template <class T, const int n>
void print(T(&A)[n]) {
    for (int i = 0; i < n; ++i) {
        if (i != n - 1) { cout << A[i] << " "; }
        else { cout << A[i] << endl; }
    }
}

C++程序设计实验报告


实验2: 类和对象(一)

一、实验目的
    掌握声明类的方法,类和类的成员的的概念以及定义对象的方法。
    深入理解C++中类的封装性。
    初步掌握用类和对象编制基于对象的程序。
    掌握对象的各种成员的使用方法。
    通过定义构造函数实现对象的初始化。
    学习检查和调试基于对象的程序。

二、实验内容
实验内容1
有以下程序:
#include <iostream>
using namespace std;
class Time      //定义Time类
{public:    //数据成员为公用的
  int hour;
  int minute;
int sec;
};
int main( )    
{ Time t1;    //定义t1为Time类对象
  cin>>t1.hour;    //输入设定的时间
  cin>>t1.minute;
  cin>>t1.sec;
  cout<<t1.hour<<“:”<<t1.minute<< “:”<<t1.sec<<endl;    //输出时间
  return 0;
}
改写程序,要求:
    将数据成员改为私有的;
    将输入和输出的功能改为由成员函数实现;
    在类体内定义成员函数。
然后编译和运行程序。请分析什么成员应指定为公用的?什么成员应指定为私有的?什么函数最好放在类中定义?什么函数最好放在类外定义?

答:
(1)代码详见“九、附录:代码”之“实验内容1”部分。
(2)分析如下:
    函数成员要作为对外接口,应指定为公用public;
    数据成员要保护其隐私,应指定为私有private;
    输入、输出、友元函数、运算符重载函数等成员函数,最好放在类中定义,因为要使用类中私有的数据成员。
这些函数的定义,可以直接在类中声明并实现,但是当函数体较大时,建议在类中声明,在类外实现。
    全局方法/函数(比如:实现算法的函数),内联inline函数,普通函数等,最好放在类外定义。

实验内容2
 分别给出如下的3个文件:
    含类定义的头文件student.h,
//student.h                                 (这是头文件,在此文件中进行类的声明)
class Student         //类声明
{ public:
void display( );    //公用成员函数原型声明
  private:
int num;
char name[20];
char sex;
 };
    包含成员函数定义的源文件student.cpp
//student.cpp    //在此文件中进行函数的定义
#include <iostream>
#include “student.h”    //不要漏写此行,否则编译通不过
void Student::display( )    //在类外定义display类函数
{ cout<<“num:”<<num<<endl;
  cout<<“name:”<<name<<endl;
  cout<<“sex:”<<sex<<endl;
}
    包含主函数的源文件main.cpp。
为了组成一个完整的源程序,应当有包括主函数的源文件:
//main.cpp    主函数模块
#include <iostream>
#include “student.h”    //将类声明头文件包含进来
int main( )
{Student stud;    //定义对象
 stud.display();    //执行stud对象的display函数
return 0;
}
请完善该程序,在类中增加一个对数据成员赋初值的成员函数set_value。上机调试并运行。


实验内容3
需要求3个长方柱的体积,请编一个基于对象的程序。数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能:
    由键盘分别输入3个长方柱的长、宽、高;
    计算长方柱的体积;
    输出3个长方柱的体积。
请编程序,上机调试并运行。


三、需求分析  
略。
四、概要设计 
实验内容1:
本程序包含的函数或类 及其 功能设计分别为:
main()函数,用于程序执行:
包含class Time类:
private数据成员:int hour;int minute;int sec;
public成员函数: 
void init(); 初始化数据成员
void output();输出数据成员

实验内容2:
本程序包含的函数 及其 功能设计分别为:
Main();程序执行入口,调用其他函数。
4个文件:
Main.cpp,student.h,student.cpp和main.h
相关内容较为繁杂,具体详见末尾“九、附录:代码”之“实验内容2”。

实验内容3:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。

包含class cuboid类:
Private 数据成员:
int Length; int Width; int Height; int Volume;int Area;
public 成员函数: 
void initBox(const int& x, const int&, const int&); 初始化数据成员
void setVolume();        计算体积
void setArea();    计算表面积
void show();    输出数据成员

五、详细设计
详见末尾“九、附录:代码”部分。
六、调试分析
调试正常。
七、使用说明 
直接运行即可。
八、测试结果 
实验内容1:
 
实验内容2:
 
实验内容3:
 
九、附录:代码

实验内容1:
#include <iostream>
using namespace std;
class Time{      
private:
    int hour;
    int minute;
    int sec;
public:
    void init() { cin >> hour >> minute >> sec; }
    void output(){ cout << hour << " : " << minute << " : " << sec << endl; }
};
int main(){
    Time t;    
    t.init();
    t.output();

    return 0;
}

实验内容2:
Main.cpp代码如下:
#include "student.h"//将类声明头文件包含进来
#include <iostream>
using namespace std;
int main(){
    Student stud;    //定义对象
    stud.set_value();
    stud.display();    //执行stud对象的display函数
    return 0;
}

main.h代码如下:
#pragma once

Student.h代码如下:
#ifndef PCH_H
#define PCH_H
// TODO: 添加要在此处预编译的标头
class Student         //类声明
{
public:
    void set_value(); //初始化
    void display();    //公用成员函数原型声明
private:
    int num;
    char name[20];
    char sex;
};
#endif //PCH_H

Student.cpp代码如下:
#include <iostream>
#include "student.h"    //不要漏写此行,否则编译通不过

void Student::display()    //在类外定义display类函数
{
    std::cout << "num:" << num << std::endl;
    std::cout << "name:" << name << std::endl;
    std::cout << "sex:" << sex << std::endl;
}

void Student::set_value() {
    std::cin >> num;
    std::cin.get();
    std::cin >> name;
    std::cin.get();
    std::cin >> sex;
}

实验二特别说明:
若是不能正常编译运行,还需要配置项目属性的预编译头,因为 VS2017默认使用的是pch.h,步骤如图:
 

实验内容3:
#include <iostream>
using namespace std;
class cuboid {
private:
    int Length; //长度
    int Width;  //宽度
    int Height;  //高度
    int Volume;
    int Area;
public:
    void initBox(const int& x, const int&, const int&); //设置尺寸
    void setVolume();                  //计算体积
    void setArea();                        //计算表面积
    void show();                    //输出信息,输出形式见“输出说明”
};

void cuboid::initBox(const int& x, const int& y, const int& z) {
    Length = x;
    Width = y;
    Height = z;
}
void cuboid::setVolume() {
    Volume = Length * Width * Height;
}
void cuboid::setArea() {
    Area = 2 * (Length * Width + Length * Height + Width * Height);
}
void cuboid::show() {
    cout << "长: "<< Length << " " << "宽: "<< Width << " " << "高: "<< Height << endl;
    cout << "体积: " << Volume << endl;
    cout << "表面积: "<< Area << endl;
}

int const N = 3;
int main() {

    int intLength, intWidth, intHeight;
    cuboid cub[N];
    for (int i = 0; i < N; ++i) {
        cout << "第" << i + 1 << "个长方体:" << endl;
        cout << "请输入长: ";
        cin >> intLength;
        cout << "请输入宽: ";
        cin >> intWidth;
        cout << "请输入高: ";
        cin >> intHeight;

        cub[i].initBox(intLength, intWidth, intHeight);
        cub[i].setVolume();
        cub[i].setArea();
        cub[i].show();

        cout << endl;
    }
    return 0;
}


C++程序设计实验报告


实验3: 类和对象(二)
                    
              


一、实验目的
    进一步加深对类和对象的理解。
    掌握类的构造函数和析构函数的概念和使用方法。
    掌握对对象数组、对象的指针及其使用方法。
    掌握友元的概念和使用。
    了解类模板的使用方法。


二、实验内容
实验内容1
有以下程序:
#include <iostream.h>
class Student
{public:
  Student(int n,float s):num(n),score(s){ }
  void change(int n,float s){num=n;score=s;}
  void display(){cout<<num<<“ ”<<score<<endl; }
 private:
   int num;
   float score;
};
void main()
{Student stud(101,78.5);
 stud.display();
stud.change(101,80.5);
stud.display();
}
阅读此程序,分析其执行过程,然后上机运行,对比输出结果。
修改上面的程序,增加一个fun函数,改写main函数。
在main函数中调用fun函数,在fun函数中调用change和display函数。
在fun函数中使用对象的引用(Student &)作为形参。
答:
(1)程序分析如下:
Mian函数为程序入口,开始执行;
先创建Student类对象stud并调用构造函数的初始化列表进行赋值,接着输出stud的数据成员num和score,数据分别为101和78.5;
再接着通过成员函数change修改成员数据,并在数据更新后再次输出,num和score依次分别为101和80.5。
对比:
程序运行结果详见“八、测试结果”之“实验内容1”部分。
运行结果与分析上述一致。
(2)程序修改:
具体代码详见“九、附录:代码”之“实验内容1”部分。


实验内容2
商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现已知当天3个销售员销售情况为
    销货员号(num)    销货件数(quantity)        销货单价(price)
        101                        5                        23.5
        102                        12                        24.56
        103                        100                        21.5
请编程序,计算出当日此商品的总销售款sum以及每件商品的平均售价。要求用静态数据成员和静态成员函数。
(提示:将折扣discount,总销售款sum和商品销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。
答:
已按照题目需求写好相关代码,满足静态限制条件。
具体代码详见“九、附录:代码”之“实验内容2”部分。


实验内容3
(3)有以下程序:
#include <iostream>
using namespace std;
class Date;                      //对Date类的提前引用声明
class Time                      //定义Time类
{public:
Time(int,int,int);
void display(Date &);    //display是成员函数,形参是Date类对象的引用
 private:
int hour;
int minute;
int sec;
};

class Date                               //声明Date类
{public:
Date(int,int,int);
friend void Time∷display(Date &);  //声明Time中的display函数为友元成员函数
 private:
int month;
int day;
int year;
};
Time∷Time(int h,int m,int s)            //类Time的构造函数
{hour=h;
minute=m;
sec=s;
}
void Time∷display(Date &d)   //display的作用是输出年、月、日和时、分、秒
{cout<<d.month<<“/”<<d.day<<“/”<<d.year<<endl;   //引用Date类对象中的私有数据
cout<<hour<<“:”<<minute<<“:”<<sec<<endl;        //引用本类对象中的私有数据
}
Date∷Date(int m,int d,int y)          //类Date的构造函数
{month=m;
day=d;
year=y;
}
int main( )
{Time t1(10,13,56);               //定义Time类对象t1
Date d1(12,25,2004);             //定义Date类对象d1
t1.display(d1);                  //调用t1中的display函数,实参是Date类对象d1
return 0;
}
请分析和运行此程序,注意友元函数Time::display的作用。将程序中的display函数不放在Time类中,而作为类外的普通函数,然后分别在Time和Date类中将display声明为友元函数。在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年、月、日和时、分、秒。修改后上机调试和运行。
答:
所给程序代码有标点错误,即 域名::符号使用了中文的了::。
修改为两个类的友元函数,代码详见“九、附录:代码”之“实验内容3”部分。

实验内容4
有以下使用类模板程序:
#include <iostream>
using namespace std;
template<class numtype>                //定义类模板
class Compare
{public:
Compare(numtype a,numtype b)
{x=a;y=b;}
numtype max( )
{return (x>y)?x:y;}
numtype min( )
{return (x<y)?x:y;}
private:
numtype x,y;
};
int main( )
{Compare<int> cmp1(3,7);            //定义对象cmp1,用于两个整数的比较
cout<<cmp1.max( )<< “is the Maximum of two integer numbers.”<<endl;
cout<<cmp1.min( )<< “is the Minimum of two integer numbers. ”<<endl<<endl;
Compare<float> cmp2(45.78,93.6);   //定义对象cmp2,用于两个浮点数的比较
cout<<cmp2.max( )<< “is the Maximum of two float numbers. ”<<endl;
cout<<cmp2.min( )<< “is the Minimum of two float numbers. ”<<endl<<endl;
Compare<char> cmp3(′a′,′A′);       //定义对象cmp3,用于两个字符的比较
cout<<cmp3.max( )<< “is the Maximum of two characters. ”<<endl;
cout<<cmp3.min( )<< “is the Minimum of two characters. ”<<endl;
return 0;
}
    运行此程序,体会类模板的作用。
    将它改写为在类模板外定义各成员函数。
答:
(一)    类模板的作用:使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能,因而可以减少不必要的重的代码工作。
(二)    程序已做修改:代码详见“九、附录:代码”之“实验内容4”部分。

三、需求分析  
略。
四、概要设计 
实验内容1:
本程序包含的函数或类 及其 功能设计分别为:
main()函数,用于程序执行:
包含class Student{}类:
private数据成员:int num; float score;
public成员函数: 
Student(int n, float s); 构造函数,初始化参数列表初始化数据成员
void change(int n, float s); 修改数据成员数值
void display(); 输出数据成员

实验内容2:
本程序包含的函数 及其 功能设计分别为:
Main();程序执行入口,调用其他函数。
包含class saleGoods{}类
Private 数据成员:
string num; //货号
double price; //销售单价
static int quantity; //销售件数
static double discount; //折扣价
static double sum; //总销售款
static double average; //每件商品的平均售价
public 成员函数: 
class Time 中:
void setSaleGoods(string num, int quantity, double price); 赋值操作
void setSum(); 计算sum
static void setAverage(); 计算average
void display(); 输出相关数据

实验内容3:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。

包含class Date{} 和 class Time{}两个类
Private 数据成员:
class Time 中:int hour; int minute; int sec;
class Date 中: int month; int day; int year;
public 成员函数: 
class Time 中:
Time(int, int, int);  构造函数,初始化相关数据成员
class Date 中:
Date(int, int, int); 构造函数,初始化相关数据成员
两个类都有的,友元函数:
friend void display(Date &, Time &); 输出函数

实验内容4:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。
template<class numtype>  
class Compare{} 类模板,实现不同数据类型的相同功能的类
Private 数据成员:numtype x, y;
public 成员函数: 
Compare(numtype a, numtype b); 构造函数,初始化数据成员
numtype max(); 经比较大小,返回较大数据成员
numtype min(); 经比较大小,返回较小数据成员
只不过要熟练掌握模板类的实现写法,形式、格式有所要求。

五、详细设计
详见末尾“九、附录:代码”部分。
六、调试分析
调试正常。
七、使用说明 
直接编译运行即可。
八、测试结果 
实验内容1:
 

实验内容2:
 

实验内容3:
 

实验内容4:
 


九、附录:代码
实验内容1:
#include <iostream>
using namespace std;
class Student{
public:
    Student(int n, float s) :num(n), score(s) { }
    void change(int n, float s) { num = n; score = s; }
    void display() { cout << num << " " << score << endl; }
private:
    int num;
    float score;
};
void fun(Student& );
int main(){
    Student stud(101, 78.5);
    fun(stud);
    return 0;
}
void fun(Student& stud){
    stud.display();
    stud.change(101, 80.5);
    stud.display();
}

实验内容2:
#include <iostream>
#include <string>

using namespace std;

class saleGoods {
private:
    string num; //货号
    //int quantity; //销售件数
    double price; //销售单价
    static int quantity; //销售件数
    static double discount; //折扣价
    static double sum; //总销售款
    static double average; //每件商品的平均售价

public:
    //static int quantity; //销售件数,main函数等类外调用,不可设为private私有保护
    
    void setSaleGoods(string num, int quantity, double price) {
        this->num = num; saleGoods::quantity = quantity; this->price = price;
    }
    //void setSaleGoods(string num, double price) {
    //    this->num = num; this->price = price;
    //}
    void setSum();
    static void setAverage();
    void display() { cout << "总销售款sum: " << saleGoods::sum << "\n每件商品的平均售价: " << " " << saleGoods::average << endl; }
};

int saleGoods::quantity = 0;
double saleGoods::discount = 0.98;
double saleGoods::sum = 0;
double saleGoods::average = 0;

void saleGoods::setAverage() {
    saleGoods::average = saleGoods::sum / saleGoods::quantity;
}
void saleGoods::setSum() {
    if (saleGoods::quantity > 10) {
        saleGoods::sum = saleGoods::quantity * price * saleGoods::discount;
    }
    else {
        saleGoods::sum = saleGoods::quantity * price;
    }
}
int const N = 3;
int main() {

    string num; 
    int quantity; 
    double price;
    saleGoods sg[N];

    for (int i = 0; i < N; ++i) {
        cout << "请输入第"<<i+1<<"个销货员的相关数据:\n" << "销货员号(num): ";
        cin >> num;
        cout << "销货件数(quantity): ";
        cin >> quantity;
        cout << "销货单价(price): ";
        cin >> price;
        
        sg[i].setSaleGoods(num, quantity, price);
        //sg[i].setSaleGoods(num, price);
        //saleGoods::quantity = quantity; //static int quantity;在类外调用静态数据成员的话,要将其设为public属性

        sg[i].setSum();
        saleGoods::setAverage();
        sg[i].display();
        cout << endl;
    }
    return 0;
}

//当 静态成员变量未有初始化时,有以下报错:
//error LNK2001: 无法解析的外部符号 “private: static int ETH::m_age” (?m_age@ETH@@0HA)


实验内容3:
#include <iostream>
using namespace std;
class Date;                //对Date类的提前引用声明
class Time                      //定义Time类
{
public:
    Time(int, int, int);
    //void display(Date &);    //display是成员函数,形参是Date类对象的引用
    friend void display(Date &, Time &);
private:
    int hour;
    int minute;
    int sec;
};

class Date                               //声明Date类
{
public:
    Date(int, int, int);
    //friend void Time::display(Date &);  //声明Time中的display函数为友元成员函数
    friend void display(Date &, Time &);
private:
    int month;
    int day;
    int year;
};
Time::Time(int h, int m, int s)            //类Time的构造函数
{
    hour = h;
    minute = m;
    sec = s;
}
//void Time::display(Date &d)   //display的作用是输出年、月、日和时、分、秒
void display(Date &d,Time &t) 
//特此强调说明,一定要通过对象调用私有数据成员
{
    cout << d.month << " / " << d.day << " / " << d.year << endl;   //引用Date类对象中的私有数据
    cout << t.hour << ":" << t.minute << ":" << t.sec << endl;        //引用本类对象中的私有数据
}

Date::Date(int m, int d, int y)          //类Date的构造函数
{
    month = m;
    day = d;
    year = y;
}
int main()
{
    Time t1(10, 13, 56);               //定义Time类对象t1
    Date d1(12, 25, 2004);             //定义Date类对象d1
    //t1.display(d1);                  //调用t1中的display函数,实参是Date类对象d1
    display(d1,t1);
    return 0;
}

实验内容4:
#include <iostream>
using namespace std;

template<class numtype>                //定义类模板
class Compare{
public:
    Compare(numtype a, numtype b);// {
    //    x = a; y = b;
    //}
    numtype max();// {
    //    return (x > y) ? x : y;
    //}
    numtype min();// {
    //    return (x < y) ? x : y;
    //}
private:
    numtype x, y;
};

//template<class numtype> class Compare{}说明了 Compare只是类的模板,而不是一个实实在在的类,故不能直接用于创建对象
//需要先 类模板实例化(即 指定好数据类型),然后再用于创建对象。

int main(){
    Compare<int> cmp1(3, 7);            //定义对象cmp1,用于两个整数的比较
    cout << cmp1.max() << " is the Maximum of two integer numbers." << endl;
    cout << cmp1.min() << " is the Minimum of two integer numbers." << endl << endl;
    Compare<float> cmp2(45.78, 93.6);   //定义对象cmp2,用于两个浮点数的比较
    cout << cmp2.max() << " is the Maximum of two float numbers." << endl;
    cout << cmp2.min() << " is the Minimum of two float numbers." << endl << endl;
    Compare<char> cmp3('a', 'A');       //定义对象cmp3,用于两个字符的比较
    cout << cmp3.max() << " is the Maximum of two characters." << endl;
    cout << cmp3.min() << " is the Minimum of two characters." << endl;
    return 0;
}
//在类模板外定义成员函数,应写成类模板形式:
//template <class 虚拟类型参数>
//函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) { … }

template<class numtype>
Compare<numtype> :: Compare(numtype a, numtype b) {
    x = a; y = b;
}

template<class numtype>
numtype Compare<numtype> :: max() {
    return (x > y) ? x : y;
}

template<class numtype>
numtype Compare<numtype> :: min() {
    return (x < y) ? x : y;
}


C++程序设计实验报告


实验4: 运算符重载
                    
              

一、实验目的
    进一步了解运算符重载的概念和使用方法。
    掌握几种常用的运算符重载的方法。
    了解转换构造函数的使用方法。
    了解在Visual C++6.0环境下进行运算符重载要注意的问题。

二、实验内容
事先编写好程序,上机调试和运行程序,分析结果。

实验内容1
声明一个复数类Complex,重载运算符 “+”、 “-”、 “*”、 “/”,使之能用于复数的加、减、乘、除,运算符重载函数作为Complex类的成员函数。编程序,分别求两个复数之和、差、积和商。
请思考:你编的程序能否用于一个整数与一个复数的算术运算?如4+(5-2i)
答:
还不能。由于运算符重载函数的形参只有复数类的对象的引用,故只能够用于都为复数形式的数之间进行相关运算。
不过程序代码可改进,即 通过重载函数实现多种形参,把整数作为形参进行设计即可,具体内容详见 “实验内容2”部分.

实验内容2
声明一个复数类Complex,重载运算符 “+”,使之能用于复数的加法运算。参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意。例如:c1+c2,i+c1, c1+i,均合法(设i为整数,c1,c2为复数)。
运行程序,分别求两个复数之和、整数和复数之和。


实验内容3
有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符 “+”,使之能用于矩阵相加。如c=a+b。如c=a+b。

实验内容4
声明一个Teacher(教师)类和一个Student(学生)类,二者有一部分数据成员是相同的,例如num(号码),name(姓名),sex(性别).。编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去。可以设想为:一位大学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为其教师的一部分。

三、需求分析  
略。
四、概要设计 
实验内容1:
本程序包含的函数或类 及其 功能设计分别为:
main()函数,用于程序执行:
包含class Complex类:
private数据成员:
double real; 实部 
double imag; 虚部
public成员函数: 
Complex(int real ,int imag ):real(real),imag(imag) { }
Complex(double real =.0, double imag=.0 ) 构造函数,初始化数据成员
Complex operator+(Complex& ); + 运算符重载函数
Complex operator-(Complex& ); - 运算符重载函数
Complex operator*(Complex& ); * 运算符重载函数
Complex operator/(Complex &); / 运算符重载函数
void display(); 输出数据成员
相关内容具体详见末尾“九、附录:代码”之“实验内容1”。

实验内容2:
本程序包含的函数 及其 功能设计分别为:
Main();程序执行入口,调用其他函数。
在实验内容1的基础上增加相关设计,即
Complex operator+(int& i); 
成员函数即可实现,复数在运算符右边,整型数数在右边
friend Complex operator+(int&, Complex& ); 
友元函数实现整型数在运算符左边,复数在右边
同理 可设计出其他的运算符的相关函数。
相关内容较为繁杂,具体详见末尾“九、附录:代码”之“实验内容2”。
实验内容3:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。

包含class Matrix类:
Private 数据成员:
public 成员函数: 
void input(); 输入函数,初始化数据成员
friend Matrix operator+(Matrix &, Matrix &); 友元函数实现运算符重载
friend Matrix operator-(Matrix &, Matrix &); 友元函数实现运算符重载
void display(); 输出数据成员
相关内容具体详见末尾“九、附录:代码”之“实验内容3”。

实验内容4:
本程序包含的函数及其功能设计为:
Main();程序执行入口,调用其他函数。
包含class Student类; 和 class Teacher类;

Private 数据成员:
class Student类:
int num; 号码  string name; 姓名
char sex; 性别  float score; 成绩

class Teacher类:
int num; 号码  string name; 姓名
char sex; 性别  float pay; 薪水

public 成员函数: 

class Student类:
Student(){} 构造函数用于初始化数据成员
Student(int& , string& , char& , float& );
int get_num() { return num; } 返回数据成员 号码 num
string get_name() { return name; } 返回数据成员 姓名 name
char get_sex() { return sex; } 返回数据成员 性别 sex
void display(); 输出数据成员

class Teacher类:
Teacher() {} 构造函数用于初始化数据成员
Teacher(int& , string& , char& , float& );
Teacher(Student& ); 复制构造函数,实现student留校任教变为teacher
void set_pay(float& ); 修改数据成员 薪水 pay
void display(); 数据成员的输出函数
需要注意的是,教师类class Teacher除了要有设计一个复制构造函数  Teacher::Teacher(Student& student);
还要给  数据成员 薪水 pay 设计相关赋值函数。
相关内容具体详见末尾“九、附录:代码”之“实验内容4”。


五、详细设计
详见末尾“九、附录:代码”部分。
六、调试分析
调试正常。
七、使用说明 
直接运行即可。
八、测试结果 
实验内容1:
 

实验内容2:
 

实验内容3:
 

实验内容4:
 

九、附录:代码
实验内容1:
#include<iostream>
using namespace std;
class Complex{
public:
    Complex(int real ,int imag ):real(real),imag(imag) { }
    Complex(double real =.0, double imag=.0 ) { this->real = real; this->imag = imag; }
    //Complex(Complex& c){ this->real = c.real; this->imag = c.imag; }
    Complex operator+(Complex& );
    Complex operator-(Complex& );
    Complex operator*(Complex& );
    Complex operator/(Complex &);
    void display();
private:
    double real;
    double imag;
};
//  (a+bi)+(c+di)=(a+c)+(b+d)i
Complex Complex::operator +(Complex &c2){
    Complex c;
    c.real = real + c2.real;
    c.imag = imag + c2.imag;
    return c;
}

//  (a+bi)-(c+di)=(a-c)+(b-d)i
Complex Complex::operator -(Complex &c2){
    Complex c;
    c.real = real - c2.real;
    c.imag = imag - c2.imag;
    return c;
}

// (a+bi)(c+di)=(ac-bd)+(ad+bc)i
Complex Complex::operator *(Complex &c2){
    Complex c;
    c.real = real * c2.real - imag * c2.imag;
    c.imag = real * c2.imag + imag * c2.real;
    return c;
}

// (a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +((bc-ad)/(c^2+d^2))i
// *this / c2
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 << "( " << real << " , " << imag << "i )" << endl;
}
int main(){

    Complex c1(1, -2), c2(3, 4), c3;

    cout << "c1 = "; c1.display();
    cout << "c2 = "; c2.display();
    cout << endl;

    c3 = c1 + c2;    
    cout << "c1 + c2 = "; c3.display();
    cout << endl;

    c3 = c1 - c2;
    cout << "c1 - c2 = "; c3.display();
    cout << endl;

    c3 = c1 * c2;
    cout << "c1 * c2 = "; c3.display();
    cout << endl;

    c3 = c1 / c2;
    cout << "c1 / c2 = "; c3.display();
    cout << endl;

    return 0;
}

实验内容2:
#include<iostream>
using namespace std;
class Complex{
public:
    Complex(int real ,int imag ):real(real),imag(imag) { }
    Complex(double real =.0, double imag=.0 ) { this->real = real; this->imag = imag; }
    //Complex(Complex& c){ this->real = c.real; this->imag = c.imag; }
    Complex operator+(Complex& );
    Complex operator+(int& i);
    friend Complex operator+(int&, Complex& );

    Complex operator-(Complex& );
    Complex operator-(int & );
    friend Complex operator-(int& , Complex& );

    Complex operator*(Complex& );
    Complex operator*(int& );
    friend Complex operator*(int&, Complex& );

    Complex operator/(Complex &);
    Complex operator/(int&);
    friend Complex operator/(int&, Complex&);

    void display();
private:
    double real;
    double imag;
};
//  (a+bi)+(c+di)=(a+c)+(b+d)i
Complex Complex::operator +(Complex &c2){
    Complex c;
    c.real = real + c2.real;
    c.imag = imag + c2.imag;
    return c;
}
// 复数右加整数
Complex Complex::operator +(int &i) {
    Complex c, c2(i);
    c.real = real + c2.real;
    c.imag = imag + c2.imag;
    return c;
}
// 复数左加整数
Complex operator+(int& i, Complex& c) {
     return c + i;
}

//  (a+bi)-(c+di)=(a-c)+(b-d)i
Complex Complex::operator -(Complex &c2){
    Complex c;
    c.real = real - c2.real;
    c.imag = imag - c2.imag;
    return c;
}
//复数减整数
Complex Complex::operator-(int &i) {
    Complex c, c2(i);
    c.real = real - c2.real;
    c.imag = imag - c2.imag;
    return c;
}
// 整数减复数
Complex operator-(int& i, Complex& cTemp) {
    Complex c,c1(i), c2(cTemp);
    c.real = c1.real - c2.real;
    c.imag = c1.imag - c2.imag;
    return c;
}

// (a+bi)(c+di)=(ac-bd)+(ad+bc)i
Complex Complex::operator *(Complex &c2){
    Complex c;
    c.real = real * c2.real - imag * c2.imag;
    c.imag = real * c2.imag + imag * c2.real;
    return c;
}
// 复数乘以整数
Complex Complex::operator *(int &i) {
    Complex c, c2(i);
    c.real = real * c2.real - imag * c2.imag;
    c.imag = real * c2.imag + imag * c2.real;
    return c;
}
// 整数乘以复数
Complex operator *(int& i, Complex& cTemp) {
    Complex c, c1(i), c2(cTemp);
    c.real = c1.real * c2.real - c1.imag * c2.imag;
    c.imag = c1.real * c2.imag + c1.imag * c2.real;
    return c;
}

// (a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +((bc-ad)/(c^2+d^2))i
// *this / c2
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;
}
// 复数除以整数
Complex Complex::operator /(int &i) {
    Complex c, c2(i);
    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;
}
// 整数除以复数
Complex operator /(int& i, Complex& cTemp) {
    Complex c, c1(i), c2(cTemp);
    c.real = (c1.real*c2.real + c1.imag * c2.imag) / (c2.real*c2.real + c2.imag*c2.imag);
    c.imag = (c1.imag*c2.real - c1.real * c2.imag) / (c2.real*c2.real + c2.imag*c2.imag);
    return c;
}

void Complex::display(){
    cout << "( " << real << " , " << imag << "i )" << endl;
}
int main(){

    Complex c1(1, -2), c2(3, 4), c3;
    int i = 3;

    cout << "c1 = "; c1.display();
    cout << "c2 = "; c2.display();
    cout << "i = " << i << endl << endl;

    c3 = c1 + c2;    
    cout << "c1 + c2 = "; c3.display();
    c3 = c1 + i;    
    cout << "c1 + i = "; c3.display();
    c3 = i + c1;    
    cout << "i + c1 = "; c3.display();
    cout << endl;

    c3 = c1 - c2;
    cout << "c1 - c2 = "; c3.display();
    c3 = c1 - i;
    cout << "c1 - i = "; c3.display();
    c3 = i - c1;
    cout << "i - c1 = "; c3.display();
    cout << endl;

    c3 = c1 * c2;
    cout << "c1 * c2 = "; c3.display();
    c3 = c1 * i;
    cout << "c1 * i = "; c3.display();
    c3 = i * c1;
    cout << "i * c1 = "; c3.display();
    cout << endl;

    c3 = c1 / c2;
    cout << "c1 / c2 = "; c3.display();
    c3 = c1 / i;
    cout << "c1 / i = "; c3.display();
    c3 = i / c1;
    cout << "i / c1 = "; c3.display();
    cout << endl;

    return 0;
}


实验内容3:
#include <iostream>
using namespace std;

int const n = 2;
int  const m = 3;

class Matrix {
public:
    Matrix();
    friend Matrix operator+(Matrix &, Matrix &);
    friend Matrix operator-(Matrix &, Matrix &);
    //friend Matrix operator*(Matrix &, Matrix &);
    //friend Matrix operator/(Matrix &, Matrix &);
    void input();
    void display();
private:
    int mat[n][m];
};
Matrix::Matrix(){
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            mat[i][j] = 0;
}
Matrix operator+(Matrix &a, Matrix &b){

    Matrix c;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            c.mat[i][j] = a.mat[i][j] + b.mat[i][j];
        }
    }
    return c;
}
Matrix operator-(Matrix &a, Matrix &b){
    Matrix c;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            c.mat[i][j] = a.mat[i][j] - b.mat[i][j];
        }
    }
    return c;
}

void Matrix::input(){
    cout << "input value of matrix: ( " << n << " X " << m << " )" << endl;
    int i, j;
    for (i = 0; i < n; i++){
        for (j = 0; j < m; j++){
            cin >> mat[i][j];
        }
    }
}
void Matrix::display() {
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            cout << mat[i][j] << " ";
        }
        cout << endl;
    }
}
int main(){
    Matrix a, b, c;
    a.input();
    b.input();

    cout << endl << "Matrix a:" << endl;
    a.display();
    cout << endl << "Matrix b:" << endl;
    b.display();

    c = a + b;
    cout << endl << "Matrix c = Matrix a + Matrix b :" << endl;
    c.display();

    c = a - b;
    cout << endl << "Matrix c = Matrix a - Matrix b :" << endl;
    c.display();

    return 0;
}

实验内容4:
#include <iostream>
#include <string>

using namespace std;

class Student{
public:
    Student(){}
    Student(int& , string& , char& , float& );
    int get_num() { return num; }
    string get_name() { return name; }
    char get_sex() { return sex; }
    void display();
private:
    int num;
    string name;
    char sex;
    float score;
};

Student::Student(int& num, string& name, char& sex, float& score){
    this->num = num;
    this->name = name;
    this->sex = sex;
    this->score = score;
}
void Student::display() {
    cout << "num: " << num << "\nname: " << name << "\nsex: " << sex << "\nscore: " << score << "\n\n";
}

class Teacher{
public:
    Teacher() {}
    Teacher(Student& );// 留校担任教师。。
    Teacher(int& , string& , char& , float& );
    void set_pay(float& );
    void display();
private:
    int num;
    string name;
    char sex;
    float pay;
};

Teacher::Teacher(int& num, string& name, char& sex, float& pay) {
    this->num = num;
    this->name = name;
    this->sex = sex;
    this->pay = pay;
}

Teacher::Teacher(Student& student){
    num = student.get_num();
    name = student.get_name();
    sex = student.get_sex();
}
void Teacher::set_pay(float& pay) {
    this->pay = pay;
}

void Teacher::display(){
    cout << "num: " << num << "\nname: " << name << "\nsex: " << sex << "\npay: " << pay << "\n\n";
}

int main(){

    int num;
    string name;
    char sex;
    float score, pay;
    cout << "Input Student`s Message:\n";
    cout << "num(int): ";
    cin >> num;
    cin.get();
    cout << "name(string): ";
    getline(cin ,name);
    cout << "sex(char): ";
    cin >> sex;
    cout << "score(float): ";
    cin >> score;

    Student student(num, name, sex, score);
    cout << endl;
    cout << "student:" << endl;
    student.display();

    cout << "As A Teacher,Input Pay:\n";
    Teacher teacher(student);
    cout << "pay(float): ";
    cin >> pay;
    teacher.set_pay(pay);

    cout << "teacher:" << endl;
    teacher.display();

    return 0;
}

C++程序设计实验报告


实验5: 类模板和string字符串处理
                    
              
                    


一、实验目的
    进一步理解类模板的概念。
    掌握类模板的定义、实例化过程。
    掌握类模板运用的运用,进一步理解C++中代码重用思想。
    理解C++中的string类。
    使用C++标准类库中的string定义字符串对象。
    能使用string类成员函数、操作符对字符串对象进行各种操作。

二、实验内容
事先编写好程序,上机调试和运行程序,分析结果。

实验内容1
定义一个通用队列模板类,队列中数据元素类型可以是字符型、双精度型和其他数据类型。队列的基本操作包括队列初始化、队列的析构、进队列、出队列、判断队列是否为空、判断队列是否为满队列等,并测试该队列。


实验内容2
编写程序,对输入文件中的内容进行分析,统计文件的行数、单词数和每