|
大小: 16318
备注:
|
← 于2020-04-25 09:16:09修订的的版本81 ⇥
大小: 595
备注:
|
| 删除的内容标记成这样。 | 加入的内容标记成这样。 |
| 行号 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瓯电信本
2. 05瓯信算
3. 05计本
在判题系统http://czk.8866.org/oj/上完成3题,并提交实验报告: