版本18和81间的区别 (跳过第63版)
于2005-12-25 12:29:22修订的的版本18
大小: 16318
编辑: czk
备注:
于2020-04-25 09:16:09修订的的版本81
大小: 595
编辑: czk
备注:
删除的内容标记成这样。 加入的内容标记成这样。
行号 1: 行号 1:
= 实验要求 = <<TableOfContents>>

= 实验基本要求 =
行号 7: 行号 9:
= 推荐实验环境 = = 集成开发环境指导 =
参见:[[C++集成开发环境]]
行号 9: 行号 12:
 * VC 2003 ( 集成 Microsoft C++ Compiler 7.1)
 * Dev-C++ ( 集成 MinGW,小巧,免费)
 * Emacs + GCC ( Linux平台下开发工具 )
如果机房电脑速度太慢参看[[温大机房优化脚本]]
行号 14: 行号 15:
 1. 使用递归的方法编写Fibonacci数列(1 1 2 3 5 8 ……)程序。输入n,输出数列中第n个数的值
 1. 用结构体、函数实现复数操作(复数的加减乘除),使如下的主程序可以正确运行{{{#!cplusplus
int main() {
    struct complex a, b, sum, diff, product;
    scanf("%f%f%f%f", &a.real, &a.imag, &b.real, &b.imag);
    sum = add(a, b);
    diff = substract(a, b);
    product = multiply(a, b);
    printf("sum:%f %f\n", sum.real, sum.imag);
    printf("diff:%f %f\n", diff.real, diff.imag);
    printf("product:%f %f\n", product.real, product.imag);
    return 0;
}
}}}
 1. 使用标准C++输入输出实现在屏幕上用以下格式输出乘法表,要求排列整齐(不考虑屏幕宽度不够时造成的折行)。输入:乘法表的行数(1<=n<=99)输出:如下乘法表,总共n行{{{
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
……
}}}
 1. Monty Hall游戏:该游戏来自电视节目Let's Make a Deal. 游戏中设有三扇门,其中一扇门后面是一辆汽车,另外两扇门后面各有一头山羊。玩家首先选择其中一扇门,然后节目主持人将另外两扇门中藏有山的那扇门打开,并给游戏参与者一个改选的机会。此时玩家可以维持原先的选择不变,也可以直接选择另一扇门,或者随机决定如何选择。最后玩家如果选中了那个藏有汽车的门,则获得胜利。请你写一个程序,计算游戏中玩家如何选择概率较高,不同的选择概率各是多少?
 1. 将前面实验中的复数程序用C++类重新实现
 1. 做一个存放整数的Stack栈类,包含如下成员函数:构造函数Stack(n):n指定栈中可以存放元素的最大个数;push(i):把元素i添加到栈尾部;pop():把尾部元素从栈中删除;top():取栈尾部的元素的值;size():取栈中间存放的元素个数;~Stack():析构函数(如果有必要的话);Stack(Stack & s ):拷贝构造函数(如果有必要)。使如下程序可以正常运行:{{{#!cplusplus
int main() {
    Stack s1(5);
    s1.push(1);
    s1.push(2);
    s1.push(3);
    Stack s2(s1);
    while(s1.size() > 0) {
        cout << s1.top() << endl;
        s1.pop();
    }
    s1.push(4);
    s1.push(5);
    while(s2.size() > 0) {
        cout << s2.top() << endl;
        s2.pop();
    }
}
}}}
 1. 改写前面的Stack类,使其可以统计Stack类对象的个数,GetStackNumber()函数返回对象的个数。
 1. 改写前面的Stack类,使Stack类在整个程序里面只能够存在一个对象。
 1. 用链表实现前面的stack类,实现相同的功能。
 1. 写Date类,实现如下功能:Date(year, month, day):构造函数,构造代表year年month月day日的Date对象;DaysFrom19900101():从1990年1月1日以来的天数,日期在1990年1月1日以后,返回正数,以前的返回负数;Add(days):计算出days天之后的新日期。days为负为之前;Delta(Date another):计算两天之间的日期差;Output():输出日期值,格式为“二〇〇五年十一月十三日”;WeekDay():返回这个日期是星期几,0表示星期天,1表示星期一,6表示星期六;静态成员函数today()返回今天的日期;所有的成员函数可以定义成const都定义成const。
 1. 实现Person, Student, GradStudent, Teacher类。类之间有正确的继承关系;每个类有对应的属性;每个类有构造函数,对属性初始化;每个类都没有默认构造函数;每个类都有一个print成员函数,输出属性的值。{{{#!cplusplus
int main() {
    Person p( ... ); // 省略号处填上所需的初始化参数。
    Student s( ... );
    Teacher t( ... );
    GradStudent g(...);
    p.print();
    s.print();
    t.print();
    g.print();
}
}}}
 1. 用虚函数实现前面实验中的print函数{{{#!cplusplus
int main() {
    Person *p[4];
    p[0] = new Person(...);
    p[1] = new Student(...);
    p[2] = new Teacher( ... );
    p[3] = new GradStudent(...);
    for( int i = 0; i < 4; i++)
        p[i]->print();
}
}}}
 1. 实现计算各种图形面积的程序。包括:Shape类:抽象基类,定义GetArea()和GetPerimeter()纯虚函数。Rectangle类:Shape的派生类,高、宽;Circle类:Shape的派生类,半径;每个类定义的构造函数,对成员进行初始化;在基类中定义虚函数GetArea, GetPerimeter,在派生类中override;每个类一个文件。{{{#!cplusplus
int main() {
    Shape *s[2];
    s[0] = new Rectangle(...);
    s[1] = new Circle(...);
    for ( int i = 0; i < 2; i++)
        cout<<s[i]->GetArea()<< s[i]->GetPerimeter() <<endl;
}
}}}
 1. 复数程序用运算符重载重新实现,使以下main函数可以运行{{{#!cplusplus
int main() {
    complex c1, c2, c3(-1.5, 1.5);
    cin >> c1 >> c2;
    complex c4 = c1 * c2;
    c4 *= c3;
    complex c5 = c1 + c2;
    c5 += c3;
    complex c6 = c4 - c5;
    cout << c4 << c5 << c6;
    cout << "c1 and c2 are" << ( c1 == c2 ? "equal" : "not equal") << endl;
}
}}}
 1. 实现自己的string类,类的声明如下:{{{#!cplusplus
class string{
    char *str; int size;
public:
    string();
    string(const char *s);
    string(const string &s);
    string& operator=(const char *);
    string& operator=(const string&);
    ~string();
    char &operator[](int i);
    char operator[](int i) const;
    bool operator==(const string &) const;
    string operator+(const string &) const;
    int length() const;
    operator char*();
    friend ostream&operator<<(ostream&, const string&);
    friend istream&operator>>(istream&, string &);
};
}}}
 1. 使用多继承实现,使以下程序可以运行:{{{#!cplusplus
int main() {
    Person *p[6];
    p[0] = new Person(...);
    p[1] = new Student(...);
    p[2] = new Teacher( ... );
    Assistent *a = new Assistent(...);
    Student *s = a;
    Teacher *t = a;
    p[3] = s;
    p[4] = t;
    p[5] = a;
    s->print();
    t->print();
    for( int i = 0; i < 6; i++)
        p[i]->print();
}
}}}
== 05瓯电信本 ==
[[05瓯电信本面向对象实验]]
行号 146: 行号 18:
= 实验参考答案 = == 05瓯信算 ==
行号 148: 行号 20:
 1. {{{#!cplusplus
#include <stdio.h>
int fibonacci(int n)
{
    if(n==1 || n==2)
        return 1;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}
int main() {
    int n;
    scanf("%d", &n);
    printf("%d", fibonacci(n));
}
}}}
 1. {{{#!cplusplus
#include <stdio.h>
[[05瓯信算面向对象实验]]
行号 166: 行号 22:
struct complex {
    double imag;
    double real;
};

struct complex add(struct complex a, struct complex b)
{
    struct complex c;
    c.imag = a.imag + b.imag;
    c.real = a.real + b.real;
    return c;
}

struct complex substract(struct complex a, struct complex b)
{
    struct complex c;
    c.imag = a.imag - b.imag;
    c.real = a.real - b.real;
    return c;
}

struct complex multiply(struct complex a, struct complex b)
{
    struct complex c;
    c.imag = a.imag * b.real + a.real * b.imag;
    c.real = a.real * b.real - a.imag * b.imag;
    return c;
}
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= i; j++) {
            cout << setw(5) << i*j;
        }
        cout << endl;
    }
}
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
int main() {
    int count;
    cin >> count;
    srand(time(NULL));
    int nochange = 0;
    int change = 0;
    int random = 0;
    for(int i = 0; i < count; i++) {
        int car = rand() % 3;
        int choice = rand() % 3;
        if(car == choice)
            nochange ++;
        else
            change ++;
        if(rand()%2)
            random++;
    }
    cout << (double)nochange / count << endl;
    cout << (double)change / count << endl;
    cout << (double)random / count << endl;
}
}}}
 1. {{{#!cplusplus
#include <iostream>
using namespace std;

class complex {
public:
    complex(double r = 0.0, double i = 0.0)
    : real(r), imag(i) {
    }
    complex add(complex a)
    {
        complex c;
        c.real = real + a.real;
        c.imag = imag + a.imag;
        return c;
    }
    void substract(complex a) {
        imag -= a.imag;
        real -= a.real;
    }
    void multiply(complex a) {
        double r = real * a.real - imag * a.imag;
        double i = real * a.imag + imag * a.real;
        real = r; imag = i;
    }
    void print() const{
        cout << real << '\t' << imag;
    }
private:
    double imag;
    double real;

};

int main() {
    double real, imag;
    cin >> real >> imag;
    complex a(real, imag);
    cin >> real >> imag;
    complex b(real, imag);
    complex sum = a.add(b);
    complex diff = a;
    diff.substract(b);
    complex product = a;
    product.multiply(b);
    sum.print();
    diff.print();
    product.print();
    return 0;
}
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <stdexcept>
using namespace std;

class stack {
public:
    stack(int capacity)
    : capacity_ (capacity), size_(0),
    data_ (new int[capacity]) {
    }
    void push(int i) {
        if(size_ < capacity_)
            data_[size_++] = i;
    }
    void pop() {
        if(size_ > 0)
            size_ --;
    }
    int top() const {
        if(size_ > 0)
            return data_[size_-1];
        else
            throw std::out_of_range("");
    }
    int size() const {
        return size_;
    }
    ~stack() {
        delete[] data_;
    }
    stack(stack& s)
    : size_(s.size_), capacity_(s.capacity_),
    data_(new int[s.capacity_]) {
        for(int i =0; i < size_; i++)
            data_[i] = s.data_[i];
    }
private:
    int *data_;
    int size_;
    int capacity_;
};
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <stdexcept>
using namespace std;

class stack {
public:
    stack(int capacity)
    : capacity_ (capacity), size_(0), data_(new int[capacity]) {
        stack_count_++;
    }
    void push(int i) {
        if(size_ < capacity_)
            data_[size_++] = i;
    }
    void pop() {
        if(size_ > 0)
            size_ --;
    }
    int top() const {
        if(size_ > 0)
            return data_[size_-1];
        else
            throw std::out_of_range("");
    }
    int size() const {
        return size_;
    }
    ~stack() {
        stack_count_--;
        delete[] data_;
    }
    stack(stack& s)
    : size_(s.size_), capacity_(s.capacity_), data_(new int[s.capacity_]) {
        stack_count_++;
        for(int i =0; i < size_; i++)
            data_[i] = s.data_[i];
    }
    static int GetStackNumber() {
        return stack_count_;
    }
private:
    static int stack_count_;
    int *data_;
    int size_;
    int capacity_;
};

int stack::stack_count_;

int main() {
    cout << stack::GetStackNumber()<< endl;
    stack s1(5);
    cout << s1.GetStackNumber()<< endl;
    s1.push(1);
    s1.push(2);
    s1.push(3);
    stack s2(s1);
    cout << s2.GetStackNumber()<< endl;
    while(s1.size() > 0) {
        cout << s1.top() << endl;
        s1.pop();
    }
    while(s2.size() > 0) {
        cout << s2.top() << endl;
        s2.pop();
    }
}
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <stdexcept>
using namespace std;

class stack {
public:
    void push(int i) {
        if(size_ < capacity_)
            data_[size_++] = i;
    }
    void pop() {
        if(size_ > 0)
            size_ --;
    }
    int top() const {
        if(size_ > 0)
            return data_[size_-1];
        else
            throw std::out_of_range("");
    }
    int size() const {
        return size_;
    }
    ~stack() {
        delete[] data_;
    }
    static stack &create(int capacity) {
        static stack s(capacity);
        return s;
    }
private:
    stack(stack& s);
    
    stack(int capacity)
    : capacity_ (capacity), size_(0), data_(new int[capacity]) {
    }

    int *data_;
    int size_;
    int capacity_;
};

int main() {
    stack &s1 = stack::create(5);
    s1.push(1);
    s1.push(2);
    s1.push(3);
    stack &s2 = stack::create(6);
    while(s1.size() > 0) {
        cout << s1.top() << endl;
        s1.pop();
    }
    while(s2.size() > 0) {
        cout << s2.top() << endl;
        s2.pop();
    }
}
}}}
 1. {{{#!cplusplus
#include <iostream>
#include <stdexcept>
#include <stdlib.h>
using namespace std;
struct node{
    int data;
    node *next;
};
class stack{
private:
    node *head;
public:
    stack(){
        head=NULL;
    }
    void push(int i){
        node *p=new node;
        p->next=head;
        p->data=i;
        head=p;
    }
    void pop(){
        node *p=head;
        if(p!=NULL){
            head=head->next;
            delete p;
        }
    }
    int size(){
        int count=0;
        for(node *p=head;p!=NULL;p=p->next)
            count++;
        return count;
    }
    int top(){
        return head->data;
    }
    stack(stack &s){
        head=NULL;
        node *tail=NULL;
        for(node *q=s.head;q!=NULL;q=q->next){
            node *p=new node;
            p->data=q->data;
            p->next=NULL;
            if(tail==NULL)
                tail=head=p;
            else{
                tail->next=p;
                tail=p;
            }
        }
    }
    ~stack(){
        while(head!=NULL)
            pop();
    }
};
}}}
 1.
 1.
 1. {{{#!cplusplus
#include <iostream>
#include <string>
using namespace std;

#define MALE true
#define FEMALE false
struct Date{
    int year, month, day;
    Date(int y, int m, int d): year(y), month(m), day(d) {}
};

class Person{
public:
    Person(string name, Date birth, bool gender)
    : name_(name), birth_(birth), gender_(gender) {
    }
    virtual void print() const {
        cout << name_;
        cout << birth_.year << birth_.month << birth_.day;
        cout << (gender_?"男":"女");
    }
protected:
    string name_ ;
    Date birth_;
    bool gender_;
};

class Student : public Person{
public:
    Student(string name, Date birth, bool gender, string id, string department)
    : Person(name, birth, gender), id_(id), department_(department)
    {}
    void print() const {
        Person::print();
        cout << id_ << department_;
    }
protected:
    string id_;
    string department_;
};


class Teacher : public Person{
public:
    Teacher(string name, Date birth, bool gender, string title, double salary)
    : Person(name, birth, gender), title_(title), salary_(salary)
    {}
    void print() const {
        Person::print();
        cout << title_ << salary_;
    }
protected:
    string title_;
    double salary_;
};

class GradStudent : public Student{
public:
    GradStudent(string name, Date birth, bool gender, string id, string department, Teacher *t)
    : Student(name, birth, gender, id, department) , tutor_(t)
    {}
    void print() const {
        Student::print();
        tutor_->print();
    }
protected:
    Teacher *tutor_;
};

int main() {
    Person *p[4];
    p[0] = new Person( "jack", Date(1980, 8, 8), MALE );
    p[1] = new Student( "rose", Date(1982, 8, 7), FEMALE, "0203813", "computer" );
    p[2] = new Teacher( "czk", Date(1979, 8, 27), MALE, "professor", 1000);
    p[3] = new GradStudent("lisa", Date(1982, 8, 7), FEMALE, "0203812", "computer", (Teacher *)p[2]);
    for(int i = 0; i < 4; i++) {
        p[i] -> print();
        cout << endl;
    }
}
}}}
== 05计本 ==
在判题系统[[http://czk.8866.org/oj/]]上完成3题,并提交实验报告:
  * [[attachment:面向对象实验模板.doc]]

实验基本要求

  • 用标准C++完成程序
  • 按照传统C语言风格进行命名和排版
  • 在程序必要的地方进行注释

集成开发环境指导

参见:C++集成开发环境

如果机房电脑速度太慢参看温大机房优化脚本

实验内容

1. 05瓯电信本

05瓯电信本面向对象实验

2. 05瓯信算

05瓯信算面向对象实验

3. 05计本

在判题系统http://czk.8866.org/oj/上完成3题,并提交实验报告:

C++实验 (2020-04-25 09:16:09由czk编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.