分数相加
问题描述
分数相加,两个分数分别是1/5和7/20,它们相加后的11/20。方法是先求出两个分数分母的最小公倍数,
通分后,再求出两个分子的和,最后约简结果分数的分子和分母(如果两个分数相加的结果是4/8,则必须将其月简成最简分数的形式1/2),
即用分子分母的最大公约数分别除分子和分母。求m,n最大公约数的一种方法为:将m,n较小的一个数赋给变量k,然后分别用{k,k-1,k-2, ,,, ,1}中
的数(递减)去除m和n,第一个能把m和n同时除尽的数就是m和n的最大公约数。假定m、n的最大公约数是v,
则它们的最小公倍数就是m*n/v。试建立一个分数类Fract,完成两个分数相加的功能。具体要求如下:
(1).私有数据成员
int num,den: num为分子,den为分母。
(2).公有成员函数
Fract(int a=0,int b=1):构造函数,用a和b分别初始化分子num,分母den。
int ged(int m,int n):求m,n的最大公约数。此函数供成员add()函数调用。
Fract add(Fract f):将参数分数f与对象自身相加,返回约简后的分数对象。
void show():按照num/den的形式在屏幕上显示分数。
(3).在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add完成f1和f2的相加,
将得到的分数赋给对象f3,显示分数对象f3。
#include<iostream>using namespace std;class Fract{private:int num, den;public:Fract(int a = 0, int b = 1);int ged(int m, int n);class Fract add(Fract f);void show(class Fract f);};Fract::Fract(int a, int b){num = a;den = b;}int Fract::ged(int m, int n){if (m < n){int temp = m;m = n;n = temp;}for (int i = n; i > 0; i--){if (m % i == 0 && n % i == 0){return i;}}}class Fract Fract::add(Fract f){int v = ged(den, f.den);int p = den * f.den / v;//最小公倍数int x = num * (p / den) + f.num * (p / f.den);int k = ged(x, p);int a = x / k;int b = p / k;class Fract f3(a, b);return f3;}void Fract::show(class Fract f){cout << f.num << "/" << f.den << endl;}int main(){class Fract f1(1, 5),f2(7,20);f1.show(f1.add(f2));return 0;}
类做数组运算
由一个已知一维数组派生出另一个一维数组的派生规则如下:新数组的每一元素等于原始数组的对应元素及其相邻两元素的平均值。
其中第0个元素的左邻元素约定为最后一个元素,最后一个元素的右邻元素约定为第0个元素。
假设原始数组为a[10],则b[0]=(a[9]+a[0]+a[1])/3,b[1]=(a[0]+a[1]+a[2])/3, b[2]=(a[1]+a[2]+a[3])/3,,,, , b[9]=(a[8]+a[9]+a[0])/3。
试建立一个实现此功能的类ARRAY。具体要求如下:
(1)私有数据成员
float a[10],b[10]:a存放原始数组,b存放派生数组。
(2)有成员函数
ARRAY(float t[10]):构造函数,初始化成员数组a。
void process():由数组a根据上述派生规则,用循环语句计算数组b的各元素。
void print():屏幕显示数组a和b。
(3)在主程序中对该类进行测试。使用测试数据{0,3,6,9,12,15,18,21,24,27}。
class ARRAY{float a[10],b[10];public:ARRAY(float t[10]){for(int i=0;i<10;i++)a[i]=t[i];}void process();void print(){for(int i=0;i<10;i++){if(i%10==5)cout<<'\n';cout<<a[i]<<'\t';}cout<<endl;for(i=0;i<10;i++){if(i%10==5)cout<<'\n';cout<<b[i]<<'\t';}cout<<endl;}};void ARRAY::process(){int i,j,k;for(i=0;i<10;i++){j=i-1;k=i+1;if(j<0)j=10+j;if(k>9)k=10-k;b[i]=(a[j]+a[i]+a[k])/3;}}void main(){float aa[10];for(int k=0;k<10;k++)aa[k]=(float)k*3;ARRAY arr(aa);arr.process();arr.print();}
图书管理
题目:定义一个图书类(Book),在该类定义中包括以下数据成员和成员函数:
1)、 数据成员: bookname(书名)、 author(作者), price(价格)和number(存书数量)。
2)、成员函数: display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。
3)、在main函数中,创建某一种图书对象(例如:C++程序设计),并对该图书进行简单的显示、借阅和归还管理。
要求:
1)、 用构造函数初始化,书名,作者,价格和存书数量, 其中作者为你自己的名字,存书数量为100。
2)、借阅管理使用while循环结构,且当输入字母”b”时,借阅图书,即调用borrow()成员函数;
当输入字母”r”时 归还图书,即调用restore()成员函数;当输入字母”s”,显示当前存书数量,即调用display(); 当输入字母”e”时,退出程序。
class Book{private :string bookname ;string author ;double price ;int num ;public :Book(){bookname = "Java" ;author = "xxs" ;price = 66.66 ;num = 100 ;}Book(string b,string a,double p,int n):bookname(b),author(a),price(p),num(n){}void display() ;void borrow() ;void restore() ;};void Book::display(){cout << "当前存书数量为: " << num << endl;}void Book::borrow(){num = num-1 ;cout << "书已借出,此时存书数量为: " << num << endl;}void Book::restore(){num = num+1 ;cout << "书已归还,此时存书数量为: " << num << endl;}int main(){cout << "输入 b 表示借阅图书 ;输入 r 表示归还图书 ; 输入 s 表示显示当前图书数量 ; 输入 e 表示退出程序。" <<endl;cout << endl;Book b("C++","好先生",88.0,20.0) ;b.display() ;char o ;while(1){cin >> o ;if(o == 'b')b.borrow() ;if(o == 'r')b.restore() ;if(o == 's')b.display() ;if(o == 'e')return -1;}return 0;}
