1.描述
分析下面所给自定义类 myStrCla,以及随后给出的主函数及该程序执行后的屏幕显示结果。而后在类体外给出(补充)其三个成员函数的具体实现(用于完成所设定的自定义功能), 以使程序执行后的屏幕显示结果为:
abcdedcba
True
类定义及主函数部分的程序代码如下:
class myStrCla {
//自定义类 myStrCla
char str[101];
//存放字符串(假设字符串不超过 100 个字符)
int len;
//当前字符串的具体长度
public:
myStrCla(char* s) ;
//构造函数,由 s 带来字符串 str 的初值
void strOut();
//屏幕输出字符串 str
bool strIsPal();
//str 串是否为“回文串”(正读与反读相同的串)
};
输入
输入一共有一行,输入一个字符串,不超过100个字符
输出
输出有两行,第一部分是调用myStrCla类的strOut()函数输出字符串str,第二部分是调用myStrCla类的strIsPal()函数判断str串是否是“回文串”,输出False或True
样例输入
abcdedcba
样例输出
abcdedcba
True
#include <iostream>
using namespace std;
class myStrCla {
//自定义类 myStrCla
char str[101];
//存放字符串(假设字符串不超过 100 个字符)
int len;
//当前字符串的具体长度
public:
myStrCla(char* s) {
len = 0;
while (*(s + len) != '\0') {
str[len] = *(s + len);
len += 1;
}
}
//构造函数,由 s 带来字符串 str 的初值
void strOut() {
for (int i = 0; i < len; i++) {
cout << str[i];
}
cout <<endl;
}
//屏幕输出字符串 str
bool strIsPal() {
int first = 0, last = len - 1;
while (last >= first) {
if (str[last] != str[first]) {
return false;
}
last--;
first++;
}
return true;
}
//str 串是否为“回文串”(正读与反读相同的串)
};
int main() {
char s[101];
cin >> s;
myStrCla obj1(s);
obj1.strOut();
if (obj1.strIsPal())
cout << "True" << endl;
else
cout << "False" << endl;
}
2.描述
设计一个学生类(CStudent),它具有的私有数据成员是:注册号、姓名、数学、外语、 计算机课程的成绩。
具有的公有成员函数是:求三门课总成绩的函数 sum;求三门课平均成绩的函数 average;显示学生数据信息的函数display;设置学生数据信息的函数 setData。
然后通过主函数,从键盘对学生对象的数组(全班学生信息)进行输入,而后求出每一学生 的总成绩、平均成绩,并显示全班学生总成绩最高者那一同学的全部数据信息。
类函数定义方式如下:
class CStudent {
//学生类 CStudent
unsigned long reg_num;
//数据成员:注册号
char *name; (或者string name)
//数据成员:姓名
float math, eng, comp;
//数据成员:数学、英语、计算机成绩
public:
float sum();
//求三门课总成绩的函数 sum
float average();
//求三门课平均成绩的函数 average
void display();
//显示学生数据信息的函数 display
void setData(unsigned long r, char* n, float m, float e, float c);
//设置学生数据信息的函数 setData
};
输入
第一行输入1个数n(1<=n<=150),接下来输入n行,每行包括一个成员的注册号,姓名,数学成绩,英语成绩,计算机成绩;
输出
输出共有n+1行,前n行按顺序输出每个成员的总分和平均分;最后一行调用display()函数输出平均分最高成员的注册号,姓名,数学成绩,英语成绩,计算机成绩(若存在最高平均分相同的情况则输出首次出现最高平均分的那个学生)
样例输入
3
100001 ma 78 86 90
100002 li 85 91 88
100003 hu 82 89 88
样例输出
254 84.6667
264 88
259 86.3333
100002 li 85 91 88
#include<iostream>
using namespace std;
class CStudent {
unsigned long reg_num;
char *name;
float math, eng, comp;
public:
float sum();
float average();
void display();
void setData(unsigned long r, char* n, float m, float e, float c);
};
float CStudent::sum() {
return this->math+this->eng+this->comp;
}
float CStudent::average() {
return (this->math + this->eng + this->comp)/3;
}
void CStudent::display() {
cout << this->reg_num << " " << this->name << " " << this->math << " " << this->eng << " " << this->comp << endl;
}
void CStudent::setData(unsigned long r, char* n, float m, float e, float c) {
this->reg_num = r;
this->name = n;
this->math = m;
this->eng = e;
this->comp = c;
}
int main() {
CStudent stu[150];
unsigned long r;
float m;
float e;
float c;
int n;
const char *name;
cin >> n;
for (int i = 0; i < n; i++) {
name = new char();
cin>>r>>(char*)name>>m>>e>>c;
stu[i].setData(r,(char*)name, m, e, c);
}
int max = -1;
int max_index = 0;
for (int i = 0; i < n; i++) {
cout << stu[i].sum() << " " << stu[i].average() << endl;
if (max < stu[i].sum()) {
max = stu[i].sum();
max_index = i;
}
}
stu[max_index].display();
}
3.描述
队列是一种程序设计中常用的数据结构。它的结构与栈 stack 相类似,但队列中的数据 是先进先出。仿照对栈 stack 的定义,自定义一个队列类 queue,队列中需要进行保存并处 理的那一批同类型数据,使用一个大小为 maxsize 的数组来存放。
类函数定义方式如下:
const int max_size = 10;
class queue {
private:
float data[max_size];
//data 中存放队列的实际数据,maxsize 为事先定义的有名常量
int front, rear;
//首尾下标,队列数据放在 data[front+1]到 data[rear]之中
int num;
public:
queue(void);
//构造函数,置 front=rear=-1,num=0,意味着队列为空
bool Empty(void);
//判断队列是否为空(即判 num 是否为 0)
bool Full(void);
//判断队列是否已满(即判 num 是否等于 maxsize)
void Add(float);
//往队列尾部加入数据(加入到 data[rear+1]处,num 增 1)
float Delete(void);
};
输入
第一行输入一个数n,其后输入n行,每行有四种类型:
1、输入0+空格+一个浮点数a,意味着要向队列中添加一个数字a
2、输入1,意味着要从队列中删除一个数,并且将这个数输出
3、输入2,意味着需要调用队列是否为空函数并输出队列是否为空,若空为1,不空为0
4、输入3,意味着需要调用队列是否已满函数并输出队列是否已满,若已满输出1,若没满输出0
输出
见输入描述
样例输入
10
0 3
0 4
0 5
0 8
3
2
1
0 9
1
1
样例输出
0
0
3
4
5
#include<iostream>
using namespace std;
const int max_size = 10;
class queue {
private:
float data[max_size];
//data 中存放队列的实际数据,maxsize 为事先定义的有名常量
int front, rear;
//首尾下标,队列数据放在 data[front+1]到 data[rear]之中
int num;
public:
queue(void);
//构造函数,置 front=rear=-1,num=0,意味着队列为空
bool Empty(void);
//判断队列是否为空(即判 num 是否为 0)
bool Full(void);
//判断队列是否已满(即判 num 是否等于 maxsize)
void Add(float);
//往队列尾部加入数据(加入到 data[rear+1]处,num 增 1)
float Delete(void);
};
queue::queue(void) {
num = 0;
front = rear = -1;
}
bool queue::Empty() {
if (num == 0) {
return true;
}
else {
return false;
}
}
bool queue::Full() {
if (num == max_size) {
return true;
}
else {
return false;
}
}
void queue::Add(float a) {
num += 1;
rear =(rear+1)%max_size;
data[rear] = a;
}
float queue::Delete() {
num -= 1;
front = (front + 1) % max_size;
return data[front];
}
int main() {
queue q;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int op;
cin >> op;
if (op == 0) {
float a;
cin >> a;
q.Add(a);
}
else if (op == 1) {
cout << q.Delete() << endl;
}
else if (op == 2) {
cout << q.Empty() << endl;
}
else if (op == 3) {
cout << q.Full()<<endl;
}
}
}
4.描述
定义一个二维方阵类 matrix。通过重载二元运算符“+”、“-”、“*”和一元运算符“~”, 来实现矩阵加、矩阵减、矩阵乘以及矩阵转置。
Matrix类定义如下:
class matrix {
public:
int r, c;
//r行c列的矩阵
int** mem;
//矩阵数据
matrix(int a,int b);
//二参构造函数,分配a行b列的mem动态数组存放数据
~matrix();
//析构函数,释放 mem 动态数组
matrix operator+ (matrix & m); //矩阵加
matrix operator- (matrix & m); //矩阵减
matrix operator* (matrix & m); //矩阵乘
matrix operator~ (); //矩阵转置
void display(); //输出矩阵
};
输入
输入一共有3行,第一行输入4个正整数r1,c1,r2,c2,分别代表矩阵x的行r1和列c1,以及矩阵y的行r2和列c2。其中r1,c1,r2,c2均大于0。
输出
输出有4部分,每部分之间需要空一行,最后不空行;4部分分别输出x+y,x-y,x*y,~x的结果;如果两个矩阵不能相加、相减或相乘就在对应部分输出“err”
样例输入
2 3 3 2
1 2 3 4 5 6
1 2 3 -1 0 1
样例输出
err
err
7 3
19 9
1 4
2 5
3 6
#include <iostream>
using namespace std;
class matrix {
public:
int r, c;
//r行c列的矩阵
int** mem;
//矩阵数据
matrix(int a,int b);
//二参构造函数,分配a行b列的mem动态数组存放数据
~matrix();
//析构函数,释放 mem 动态数组
matrix operator+ (matrix & m); //矩阵加
matrix operator- (matrix & m); //矩阵减
matrix operator* (matrix & m); //矩阵乘
matrix operator~ (); //矩阵转置
void display(); //输出矩阵
};
matrix::matrix(int a, int b) {
r = a;
c = b;
if(r ==0 || c==0){
mem = NULL;
} else {
mem = new int*[r];
for(int i=0;i<r;i++){
mem[i] = new int[c];
}
}
}
matrix::~matrix() {
if(mem != NULL) {
for(int i=0;i<r;i++){
delete[] mem[i];
}
delete[] mem;
}
}
matrix matrix::operator+(matrix &m) {
matrix res(r,c);
if(r!=m.r || c!=m.c){
matrix tmp(0,0);
res = tmp;
}else {
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
res.mem[i][j] = mem[i][j] + m.mem[i][j];
}
}
}
return res;
}
matrix matrix::operator-(matrix &m) {
matrix res(r,c);
if(r!=m.r || c!=m.c){
matrix tmp(0,0);
res = tmp;
} else {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
res.mem[i][j] = mem[i][j] - m.mem[i][j];
}
}
}
return res;
}
matrix matrix::operator*(matrix &m) {
// 如果两个矩阵不能相乘
matrix res(r,m.c);
if(c != m.r){
matrix tmp(0,0);
res = tmp;
} else {
for(int i=0;i<r;i++){
for(int j=0;j<m.c;j++){
int tmp =0;
for(int x=0;x<c;x++){
tmp = tmp + mem[i][x] * m.mem[x][j];
}
res.mem[i][j] = tmp;
}
}
}
return res;
}
matrix matrix::operator~() {
matrix res(c,r);
for(int i=0;i<c;i++){
for(int j=0;j<r;j++){
res.mem[i][j] = mem[j][i];
}
}
return res;
}
void matrix::display() {
if(r==0){
cout << "err" << endl;
}
for(int i=0;i<r;i++){
for(int j=0;j<c-1;j++){
cout << mem[i][j] << " ";
}
cout << mem[i][c-1] << endl;
}
}
int main() {
int r1,c1,r2,c2;
cin >> r1 >> c1 >> r2 >> c2;
// 创建matrix对象
matrix x(r1,c1);
matrix y(r2,c2);
// 读取矩阵数据
for(int i=0;i<r1;i++){
for(int j=0;j<c1;j++){
cin >> x.mem[i][j];
}
}
for(int i=0;i<r2;i++){
for(int j=0;j<c2;j++){
cin >> y.mem[i][j];
}
}
(x+y).display();
cout << endl;
(x-y).display();
cout << endl;
(x*y).display();
cout <<endl;
(~x).display();
return 0;
}
5.描述
设计一个后缀式简单单步计算器类 MyCalcu1,具有如下一些功能:
(1)从键盘读入后缀式算式 str(为一个字符串),并通过一参构造函数新建对象cal,同时设置算式 str。
(2)可以进行加、减、乘、除运算,运算对象为实型数据。
(3)运算符没有优先级,即是说,总按“后缀式简单单步”形式执行。如:“9 3 - 4 *”,意味着先取运算对象 9 与 3 进行后缀的减法运算得结果 6,而后再将 6 与后面的 4 进行 后缀的乘法运算得结果 24,再往后遇到等号则将结果 24 输出而结束处理。
(4) 具有一定的排错功能,当用户输入错误的算式时输出“err”。
其中类MyCalcu1的定义如下:
class MyCalcu1{
public:
string expression;
//后缀表达式
MyCalcu1(string exp);
void process();
// 内部计算并输出后缀表达式的计算结果
};
输入
输入一行str,表示需要计算的后缀表达式,数字、符号之间使用空格分隔
输出
输出后缀表达式计算的结果,如果表达式错误,输出“err”
样例输入
12.3 5 / 8.1 + 1.5 *
样例输出
15.84
提示
1. 需要判断数字是否为实数:如:.01 1.0 -1.0 +1都是正确的实数, +-1 .-1 -0.9.1 ++1都是错误的实数。
2. 需要判断表达式是否可以计算,同时只需支持+ - * /即可。其余运算符输出“err”。
3. 需要实现类的成员方法process,之后在main函数中实例化MyCalcu1,并调用该方法实现后缀表达式的计算。
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
class MyCalcu1{
public:
string expression;
MyCalcu1(string exp);
void process();
};
MyCalcu1::MyCalcu1(string exp) {
expression = exp;
}
// 判断是否为正常的实数
bool isNumber(string s) {
bool sign = 0;
bool num = 0;
bool dec = 0;
int point = 0;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == '+' || s[i] == '-') {
//不能出现两个符号
if (sign) {
return false;
}
//如果符号位在最开始
if (i == 0) {
sign = 1;
}
//符号不能出现在其他位置
else {
return false;
}
}
else if (s[i] == '.') {
//只能存在一个点
if (point) {
return false;
}
point = 1;
}
else if (s[i] >= '0' && s[i] <= '9') {
//如果有小数点,当前数字就是小数位,小数位有效
if (point) {
dec = 1;
}
//否则就是整数位,整数位有效
else {
num = 1;
}
}
else {
//其他字符直接返回
return false;
}
}
//返回是否构成了有效的整数或者小数
return num || dec;
}
void MyCalcu1::process() {
stack<double> stack;
vector<string> vec;
// 按照空格对表达式进行拆分
string tmp = "";
int exp_size = expression.size();
for(int i=0;i<exp_size;i++){
if(expression[i]!=' '){
tmp += expression[i];
} else {
vec.push_back(tmp);
tmp = "";
}
}
vec.push_back(tmp);
// 开始进行计算
int vec_size = vec.size();
for(int i=0;i<vec_size;i++){
string str = vec[i];
// 是数字直接放进栈中
if(isNumber(str)){
stack.push(stod(str));
}
// 是否是运算符
else if(str=="+" || str == "-" || str == "*" || str == "/"){
// 取不出数字进行计算 表明表达式出错了
if(stack.size()<2) {
cout << "err" << endl;
return;
}
double b = stack.top();
stack.pop();
double a = stack.top();
stack.pop();
if(str == "+"){
a+=b;
} else if(str == "-"){
a-=b;
} else if(str == "*"){
a*=b;
} else if(str == "/"){
a/=b;
}
stack.push(a);
}
// 出现其他字符 出错
else {
cout << "err" << endl;
return;
}
}
if(stack.size()==1){
cout << stack.top() << endl;
} else {
cout << "err" << endl;
}
}
int main() {
string exp;
getline(cin,exp);
MyCalcu1 cal(exp);
cal.process();
return 0;
}
6.描述
设计一个简单的计算器类 MyCalcu2,具有如下一些功能:
(1) 从键盘读入中缀式算式 str(为一个字符串),并通过一参构造函数新建对象cal,同时设置算式 str。
(2) 可以进行加、减、乘、除运算,运算对象为实型数据,遇等号结束计算并显示结果。
(3) 运算要有优先级,乘除优先于加减。
(4) 具有一定的排错功能,当用户输入错误的算式时输出“err”。
类MyCalcu2的定义如下:
class MyCalcu2{
public:
string expression;
//中缀表达式
MyCalcu2(string exp);
void process();
// 内部计算并输出中缀表达式的计算结果
};
输入
输入一行str,表示需要计算的中缀表达式,数字、符号之间使用空格分隔
输出
输出中缀表达式计算的结果,如果表达式错误,输出“err”
样例输入
12.5 - 2.2 * 5 / 3 + 1.3 * 2
样例输出
11.4333
提示
1.实现类的方法process来实现计算功能
2.可以将中缀表达式转为后缀表达式进行计算,在转换过程中需要考虑优先级
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
class MyCalcu2{
public:
string expression;
MyCalcu2(string exp);
void process();
};
MyCalcu2::MyCalcu2(string exp) {
expression = exp;
}
// 获得计算符号的优先级
int getPriority(string ch)
{
int res =0;
if(ch == "+" || ch == "-"){
res = 1;
} else if(ch == "*" || ch =="/"){
res = 2;
}
return res;
}
// 判断是否为正常的实数
bool isNumber(string s) {
bool sign = 0;
bool num = 0;
bool dec = 0;
int point = 0;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == '+' || s[i] == '-') {
//不能出现两个符号
if (sign) {
return false;
}
//如果符号位在最开始
if (i == 0) {
sign = 1;
}
//符号不能出现在其他位置
else {
return false;
}
}
else if (s[i] == '.') {
//只能存在一个点
if (point) {
return false;
}
point = 1;
}
else if (s[i] >= '0' && s[i] <= '9') {
//如果有小数点,当前数字就是小数位,小数位有效
if (point) {
dec = 1;
}
//否则就是整数位,整数位有效
else {
num = 1;
}
}
else {
//其他字符直接返回
return false;
}
}
//返回是否构成了有效的整数或者小数
return num || dec;
}
void MyCalcu2::process() {
stack<string> sign;
stack<double> stack;
vector<string> vec;
// 将中缀的expression转为后缀放入vec中
string tmp = "";
int exp_size = expression.size();
for(int i=0;i<exp_size;i++){
if(expression[i]!=' '){
tmp += expression[i];
}
// 如果是空格 或者是最后一部分
if(expression[i]==' ' || i==exp_size-1)
{
// 是数字直接放入vec
if(isNumber(tmp)){
vec.push_back(tmp);
}
// 是计算符号
else if(tmp == "+" || tmp == "-" || tmp == "*" || tmp == "/"){
// 把优先级小的都从栈中弹出去
while(!sign.empty() && getPriority(sign.top())>=getPriority(tmp)){
vec.push_back(sign.top());
sign.pop();
}
sign.push(tmp);
}
// 出现错误字符
else {
cout << "err" << endl;
return;
}
tmp = "";
}
}
// 最后把sign中剩余的符号给放到vec中
while(!sign.empty()){
vec.push_back(sign.top());
sign.pop();
}
// 开始进行计算
int vec_size = vec.size();
for(int i=0;i<vec_size;i++){
string str = vec[i];
// 是数字直接放进栈中
if(isNumber(str)){
stack.push(stod(str));
}
// 是否是运算符
else if(str=="+" || str == "-" || str == "*" || str == "/"){
// 取不出数字进行计算 表明表达式出错了
if(stack.size()<2) {
cout << "err" << endl;
return;
}
double b = stack.top();
stack.pop();
double a = stack.top();
stack.pop();
if(str == "+"){
a+=b;
} else if(str == "-"){
a-=b;
} else if(str == "*"){
a*=b;
} else if(str == "/"){
a/=b;
}
stack.push(a);
}
// 出现其他字符 出错
else {
cout << "err" << endl;
return;
}
}
if(stack.size()==1){
cout << stack.top() << endl;
} else {
cout << "err" << endl;
}
}
int main() {
string exp;
getline(cin,exp);
MyCalcu2 cal(exp);
cal.process();
return 0;
}