封装两个函数,求公约数和公倍数,然后进行各项计算
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
class Rational
{
private:
int mFz, mFm;
public:
Rational(int fz=0, int fm=1)
{
if (fz < 0 && fm < 0) //都是负数,抵消负号,都变成正数
{
mFz = -fz;
mFm = -fm;
}
else if (fz > 0 && fm < 0) //分子正,分母负,互换符号,保证分母为正
{
mFz = -fz;
mFm = -fm;
}
else
{
mFz = fz;
mFm = fm;
}
if (fm == 0)
cout << "分母为0,创建失败!" << endl;
}
Rational operator +(const Rational& a)
{
long long fm = gbs(mFm, a.mFm);
long long fz = fm / mFm * mFz + fm / a.mFm * a.mFz;
long long g = gys(fm, fz);
fm /= g;
fz /= g;
return Rational(fz, fm);
}
Rational operator -(const Rational& a)
{
long long fm = gbs(mFm, a.mFm);
long long fz = fm / mFm * mFz - fm / a.mFm * a.mFz;
long long g = gys(fm, fz);
fm /= g;
fz /= g;
return Rational(fz, fm);
}
Rational operator *(const Rational& a)
{
long long fm = mFm * a.mFm;
long long fz = mFz * a.mFz;
long long g = gys(fm, fz);
fm /= g;
fz /= g;
return Rational(fz, fm);
}
Rational operator /(const Rational& a)
{
if (a.mFz == 0 || a.mFm == 0)
{
cout << "除数不能为0!" << endl;
return Rational(0, 1);
}
long long fm = mFm * a.mFz;
long long fz = mFz * a.mFm;
long long g = gys(fm, fz);
fm /= g;
fz /= g;
return Rational(fz, fm);
}
void show()
{
cout << mFz << "/" << mFm;
}
int getFz() { return mFz; }
int getFm() { return mFm; }
//公约数
long long gys(const long long a, const long long b)
{
long long t = a > b ? b : a;
for (; t >= 1; t--)
{
if (a % t == 0 && b % t == 0)
return t;
}
return 1;
}
//公倍数
long long gbs(const long long a, const long long b)
{
return a * b / gys(a, b);
}
};
struct StRecord
{
char userName[30]; //用户名
int total; //总答题数
int success; //正确个数
};
//读文件
void ReadFile(const char* filename, StRecord record[], int& n)
{
ifstream is(filename);
if (is.is_open())
{
n = 0;
while (!is.eof())
{
record[n].userName[0] = 0;
is >> record[n].userName >> record[n].total >> record[n].success;
if (strlen(record[n].userName) > 0)
n++;
}
is.close();
}
else
cout << "文件读取失败!" << endl;
}
//写文件
void WriteFile(const char* filename, const char* userName,int total,int suc)
{
ofstream os(filename, ios::app); //以追加方式打开
os << userName << " " << total << " " << suc << endl;
os.close();
cout << "记录成功写入文件!" << endl;
}
Rational Caculate( Rational& r1, Rational& r2,char op)
{
if (op == '+')
{
Rational r3 = r1 + r2;
return r3;
}
else if (op == '-')
{
Rational r3 = r1 - r2;
return r3;
}
else if (op == '*')
{
Rational r3 = r1 * r2;
return r3;
}
else
{
Rational r3 = r1 / r2;
return r3;
}
}
int main()
{
int a, b, c, d;
int op;
int count = 0; //总题数
int suc = 0; //答对的个数
char tmp;
char name[30] = { 0 };
StRecord re[100];
int n = 0;
const char* filename = "record.txt";
//读取文件
ReadFile(filename, re, n);
cout << "请输入用户名:";
cin >> name;
//查找改用户记录
int flag = 0;
for (int i=0; i < n; i++)
{
if (strcmp(name, re[i].userName) == 0)
{
if (flag == 0)
cout << "用户名 总答题数 正确个数" << endl;
cout << re[i].userName << " " << re[i].total << " " << re[i].success << endl;
flag = 1;
}
}
if (flag == 0)
cout << "该用户暂无成绩记录!" << endl;
srand((unsigned int)time(0)); //生成随机数种子
while (1)
{
cout << "1.出题" << endl;
cout << "0.退出" << endl;
cin >> op;
if (op == 0)
break;
else if (op == 1)
{
cout << "1.手动输入" << endl;
cout << "2.随机生成" << endl;
cin >> op;
if (op == 1)
{
cout << "请输入第一个有理数(a/b):";
cin >> a >> tmp >> b;
cout << "请输入第二个有理数(c/d):";
cin >> c >> tmp >> d;
Rational r1(a, b);
Rational r2(c, d);
cin.get(); //吸收回车符
cout << "请输入操作符:";
tmp = cin.get();
Rational r3 = Caculate(r1, r2, tmp);
int e, f;
cout << "请输入结果(e/f):";
cin >> e >> tmp >> f;
count++;
if (e == r3.getFz() && f == r3.getFm())
{
cout << "正确!" << endl;
suc++;
}
else
cout << "错误!" << endl;
}
else if(op == 2)
{
a = rand() % 100; //生成[0,100)的随机数
b = rand() % 100;
c = rand() % 100;
d = rand() % 100;
int t = rand() % 4;//生成[0,4)的随机数,分别对应加减乘除
if (t == 0)
tmp = '+';
else if (t == 1)
tmp = '-';
else if (t == 2)
tmp = '*';
else
tmp = '/';
Rational r1(a, b);
Rational r2(c, d);
r1.show();
cout << " " << tmp << " ";
r2.show();
cout << " = ";
Rational r3 = Caculate(r1, r2, tmp);
int e, f;
cout << "请输入结果(e/f):";
cin >> e >> tmp >> f;
count++;
if (e == r3.getFz() && f == r3.getFm())
{
cout << "正确!" << endl;
suc++;
}
else
cout << "错误!" << endl;
}
}
}
cout << "总答题数:" << count << ",正确数:" << suc << endl;
WriteFile(filename, name, count, suc); //写入文件
return 0;
}
🧡引用不是新定义一个变量,而是给已存在变量取了一个别名,它和它引用的变量共用同一块内存空间,引用类型必须和引用实体是同种类型的
🧡引用在定义时必须初始化
🧡一个变量可以有多个引用
🧡引用一旦引用一个实体,再不能引用其他实体int a = 10; int& b = a; int e = 20; b = e;
上面b是a的引用,b = e(就是赋值),因为b和a地址一样,所以b和a的值都会变成20,但是地址还是原来的样子。
类型& 引用变量名(对象名) = 引用实体;
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}