今天继续来分享几个C++经常考试的几道题目,大家快快拿去,赶紧做一下
目录
(小事一桩)约瑟夫问题
discreb
input
output
效果展示:
1、 猜价格游戏
2、 计算 N 以内的所有素数
3、 袋中取球
4、 乘法口诀表
5、 最大公约数和最小公倍数
7、 计算n 阶勒让德多项式
实验二 类与对象
1、 矩形
2、 圆形
3、 友元
4、 分数
1、 矩阵(一)
编写C++程序完成以下功能:
2、 矩阵(二)
3、 矩阵(三)
(小事一桩)约瑟夫问题
discreb
有 m 个人,其编号分别为 1~m。按顺序围成一个圈,现在给定一个数 n,从第一个人开始依次报数,报到 n 的人出圈,然后再从下一个人开始,继续从 1 开始依次报数,报到 n 的人再出圈,……如此循环,直到最后一个人出圈为止。
编程输出所有人出圈的顺序。
input
一行两个正整数 m 和 n,之间用一个空格隔开,1≤m<100,1≤n≤32767。
output
输出 m 行,每行一个正整数,表示依次出圈的人的编号。
- #include <iostream>
- using namespace std;
- int a[50];
- int main()
- {
- int m,n,x,i,count = 0;
- cin>>n>>m; //输入总人数n和出局要报的数m
-
- x = n; //把n赋给x,避免使用时n被修改
-
- for (i = 1; i <= n; i++)
- {
- a[i] = i; //将数组a中每一项按1-n排序
- }
-
- do {
- for (i = 1; i <= n; i++)
- {
- //判断是否出局,已经出局的就不用报数了
- if (a[i] != 0)
- {
- count++; //报数
- }
-
- if (count == m)
- {
- a[i] = 0;
- count = 0;
- x--;
- cout<<i<<endl;
- }
- }
- } while (x > 0);//接着循环!!!
-
- return 0;
- }
效果展示:
1、 猜价格游戏
编写C++程序完成以下功能:
(1) 假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);
(2) 提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;
(3) 直到猜对为止,并给出提示
- #include <iostream>
- #include <ctime>
- #include <cstdlib>
- using namespace std;
- int main() {
- srand((int)time(0));
- int price=rand()%1000+1;//产生1到1000的随机数
- int l=1,r=1000;
- while(1) {
- cout<<"您可以猜一个价格,当前范围["<<l<<","<<r<<"]的整数。"<<endl;
- int guess;
- cin>>guess;
- if(guess>1000||guess<1||cin.fail()) {
- cout<<"输入不合法,请重新输入"<<endl;
- cin.clear();
- cin.ignore(10000,'\n');
- continue;
- }
- if(guess>price) {
- cout<<"猜大了"<<endl;
- if(r>guess)
- r=guess;//缩小范围
- } else if(guess<price) {
- cout<<"猜小了"<<endl;
- if(l<guess)
- l=guess;//缩小范围
- } else {
- cout<<"您猜对了,价格就是"<<price<<endl;
- break;
- }
- }
- return 0;
- }
效果展示:
猜小了
您可以猜一个价格,当前范围[550,1000]的整数
600
青小了
您可以猜一个价格,当前范围[600,1000]的整数
700
猜小了
您可以猜一个价格,当前范围[700,1000]的整数
700颢蹦碍
大了
您可以猜一个价格,当前范围[700,800]的整数
750
倩小了
您可以猜一个价格,当前范围[750,800]的整数
760
猜小了
您可以猜一个价格,当前范围[760,800]的整数
780
青小了
您可以猜一个价格,当前范围[780,800]的整数
790
猜大了您可以猜一个价格,当前范围[780,790]的整数。786您猜对了,价格就是786
2、 计算 N 以内的所有素数
编写C++程序完成以下功能:
(1) 提示用户输入N;
(2) 计算出从2到N之间的所有素数;
(3) 将结果保存在一个文本文件中。
- #include <iostream>
- #include <cstring>
- #include <fstream>
- #define N 1000000
- using namespace std;
- int prime[N],cnt,n;
- void getPrime(){
- for(int i=2;i<=n;i++){
- if(!prime[i])prime[++cnt]=i;
- for(int j=1;j<=cnt&&prime[j]<=N/i;j++){
- prime[prime[j]*i]=1;
- if(i%prime[j]==0)break;
- }
- }
- }
- int main(){
- ofstream f("prime.txt");
- cout<<"请输入n"<<endl;
- cin>>n;
- getPrime();
- for(int i=1;i<=cnt;i++)
- f<<prime[i]<<" ";
- f.close();
- return 0;
- }
3、 袋中取球
编写C++程序完成以下功能(使用 enum):
(1) 袋子中有 red, yellow, blue, white, black 五种颜色的球多个;
(2) 一次从袋子里取出3个颜色不同的球,有几种取法;
(3) 将每种方法的所有取法输出到屏幕上。
- #include <iostream>
- using namespace std;
- enum ball{
- red,yellow,blue,white,black
- };
- void output(int i){
- switch(i){
- case red:cout<<"red ";break;
- case yellow:cout<<"yellow ";break;
- case blue:cout<<"blue ";break;
- case white:cout<<"white ";break;
- case black:cout<<"black ";break;
- }
- }
-
- int main(){
- for(int i=red;i<=black;i++)
- for(int j=i+1;j<=black;j++)
- for(int k=j+1;k<=black;k++){
- output(i);
- output(j);
- output(k);
- cout<<endl;
- }
- return 0;
- }
效果展示:
red yellow bluered
yellow whitered yellow
blackred blue whitered
blue blackred white
blackyellow blue whiteyellow
blue blackvellow white
blackblue white black
4、 乘法口诀表
编写C++程序完成以下功能:
(1) 输出乘法口诀表;
(2) 显示格式如下所示。
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63 8*8=64 8*9=72 9*9=81(累死了,看到这点个赞呗,感谢少爷~)
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int main(){
- for(int i=1;i<=9;i++){
- for(int j=1;j<=i*7;j++)
- cout<<" ";
- for(int j=i;j<=9;j++)
- cout<<i<<"*"<<j<<"="<<setw(3)<<left<<i*j;
- cout<<endl;
- }
- }
5、 最大公约数和最小公倍数
编写C++程序完成以下功能:
(1) 提示用户输入两个无符号整数;
(2) 计算两者的最大公约数和最小公倍数,并输出
- #include <iostream>
- #define uint unsigned int
- using namespace std;
-
- uint gcd(uint a,uint b){
- return b?gcd(b,a%b):a;
- }
- int main(){
- uint a,b;
- cout<<"请输入两个无符号整数"<<endl;
- cin>>a>>b;
- cout<<a<<"和"<<b<<"的最大公约数是"<<gcd(a,b);
- cout<<",最小公倍数是"<<b/gcd(a,b)*a<<endl;
- return 0;
- }
7、 计算n 阶勒让德多项式
编写C++程序完成以下功能:
(1) 提示用户输入整数n和实数x;
(2) Pn(x),并输出结果
- #include <iostream>
- using namespace std;
- double p(int n,int x){
- if(!n)return 1;
- if(n==1)return x;
- return ((2*n-1)*p(n-1,x)-(n-1)*p(n-2,x))/n;
- }
- int main(){
- int n,x;
- cout<<"请输入n、x"<<endl;
- cin>>n>>x;
- cout<<"Pn("<<x<<")="<<p(n,x)<<endl;
- return 0;
- }
实验二 类与对象
1、 矩形
编写C++程序完成以下功能:
(1) 定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;
(2) 定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;
(3) 创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;
(4) 观察矩形对象以及Point类成员的构造函数与析构函数的调用;
(5) 计算其面积,并输出。
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- class Point {
- private:
- int x,y;
- public:
- Point(int _x=0,int _y=0):x(_x),y(_y) {};
- Point(Point &p):x(p.x),y(p.y) {};
- ~Point() {};
- int disX(const Point &b) {
- return b.x-x;
- };
- int disY(const Point &b) {
- return b.y-y;
- }
- };
-
- class Rectangle {
- private:
- Point a,b;
- public:
- Rectangle(Point _a,Point _b):a(_a),b(_b) {};
- Rectangle(int ax=0,int ay=0,int bx=1,int by=1):a(ax,ay),b(bx,by) {}
- Rectangle(Rectangle &r):a(r.a),b(r.b) {};
- ~Rectangle() {
- cout<<"hh"<<endl;
- };
- int area() {
- return abs(a.disX(b)*a.disY(b));
- };
- };
-
- int main() {
- cout<<"请输入矩形的左上角和右下角坐标(整数)"<<endl;
- int ax,ay,bx,by;
- while(1) {
- cin>>ax>>ay>>bx>>by;
- if(ax>bx||ay<by||cin.fail()) {
- cout<<"输入的矩形不合法"<<endl;
- cin.clear();
- cin.ignore(10000,'\n');
- } else {
- Rectangle myRectangle(ax,ay,bx,by);
- cout<<"该矩形的面积为"<<myRectangle.area()<<endl;
- break;
- }
- }
- return 0;
- }
实验问题
- 构造函数和析构函数写在哪?
写在public里(声明必须在..里,定义里外都可以)- 析构函数里面要写什么?
留空就可以了吧,如果有动态申请的内存就delete掉- 拷贝构造函数怎么写?
Point(Point &p){ x=p.x;y=p.y; };
或者
Point(Point &p):x(p.x),y(p.y){};- 编译错误提示 call of overloaded `Point()' is ambiguous
Point()构造时,Point(){};和Point(int _x=0,int _y=0):x(_x),y(_y){};都可以被调用,于是就被overloaded了。- 编译错误提示 In member function int Rectangle::area()':
int Point::x' is private
因为x是Point类的私有成员,不能在Rectangle类里面使用,关于x的计算函数都要写在Point类的public里。- 初始化时Rectangle myRectangle=Rectangle(ax,ay,bx,by);报错.
应该为Rectangle myRectangle(ax,ay,bx,by);- 析构函数怎么调用
不用显式调用,需要显式时:p.~Point();即可
2、 圆形
编写C++程序完成以下功能:
(1) 定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;
(2) 定义一个圆形类,其属性包括圆心和半径;
(3) 创建两个圆形对象,提示用户输入圆心坐标和半径,判断两个圆是否相交,并输出结果。
- #include <iostream>
- #include <cmath>
- #define sqr(x) ((x)*(x))
- using namespace std;
-
- class Point{
- private:
- int x,y;
- public:
- Point(int x=0,int y=0):x(x),y(y){}
- double dis(Point &b)const{
- return sqrt(sqr(x-b.x)+sqr(y-b.y));
- }
- };
- class Circle{
- private:
- Point c;
- double r;
- public:
- Circle(int x=0,int y=0,double r=0):c(x,y),r(r){}
- double dis(Circle &b)const{
- return c.dis(b.c);
- }
- double getR()const{
- return r;
- }
- };
- int main(){
- int x,y,r;
- cout<<"请输入a 圆心坐标半径"<<endl;
- cin>>x>>y>>r;
- Circle a(x,y,r);
- cout<<"请输入b 圆心坐标半径"<<endl;
- cin>>x>>y>>r;
- Circle b(x,y,r);
- if(a.dis(b)<=a.getR()+b.getR())
- cout<<"两圆相交"<<endl;
- else
- cout<<"两圆相离"<<endl;
- return 0;
- }
3、 友元
编写C++程序完成以下功能:
(1) 定义一个Boat和Car两个类,他们都具有私用属性——重量;
(2) 编写一个函数,计算两者的重量和。
double TotalWeight(Boat& b, Car& c);
- #include <iostream>
- using namespace std;
- class Car;
- class Boat {
- private:
- double weight;
- public:
- Boat() {};
- Boat(double w=0):weight(w) {};
- ~Boat() {};
- friend double TotalWeight(Boat&,Car&);
- };
-
- class Car {
- private:
- double weight;
- public:
- Car() {};
- Car(double w=0):weight(w) {};
- ~Car() {};
- friend double TotalWeight(Boat&,Car&);
- };
- double TotalWeight(Boat& b,Car& c) {
- return b.weight+c.weight;
- }
- int main() {
- cout<<"请输入Boat、Car的重量"<<endl;
- while(1) {
- double bw,cw;
- cin>>bw>>cw;
- if(cin.fail()) {
- cout<<"输入不合法"<<endl;
- cin.clear();
- cin.ignore(10000,'\n');
- } else {
- Boat myBoat(bw);
- Car myCar(cw);
- cout<<"Boat和Car的总重量为"<<TotalWeight(myBoat,myCar)<<endl;
- break;
- }
- }
- return 0;
- }
实验问题
- 什么时候需要用友元?
当一个函数要用到这个类时(可能还有其他类)的私有成员,但是它不是这个类独享的函数,调用时不需要通过对象或指针。- 友元函数定义在哪?
定义在主函数外面,类定义后面,要加上friend然后声明在类的公有属性里。
4、 分数
编写C++程序完成以下功能:
(1) 定义一个分数类,他们都具有私用属性——分子和分母;
(2) 定义分数类的构造函数和析构函数;
(3) 定义方法Set,设置分子和分母;
(4) 定义方法print,打印分数,格式如:2/7;
(5) 定义方法value,返回double型的分数值;
(6) 定义方法invert, 分子和分母交换。
- #include <iostream>
- using namespace std;
-
- class Fractions{
- private:
- int num,den;
- public:
- Fractions(int n=0,int d=0):num(n),den(d){}
- ~Fractions(){}
- void set(int n,int d){
- num=n;den=d;
- }
- void print(){
- cout<<num<<"/"<<den<<endl;
- }
- double value(){
- return num*1.0/den;
- }
- void invert(){
- int t=den;
- den=num;
- num=t;
- }
- };
- int main(){
- return 0;
- }
实验三 数组与指针
1、 矩阵(一)
编写C++程序完成以下功能:
(1) 假定矩阵大小为4×5(整型数组表示);
(2) 定义矩阵初始化函数,可以从cin中输入矩阵元素;
(3) 定义矩阵输出函数,将矩阵格式化输出到cout;
(4) 定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;
(5) 定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;
(6) 定义三个矩阵:A1、A2、A3;
(7) 初始化A1、A2;
(8) 计算并输出:A3 = A1加A2,A3 = A1减A2。
- #include <iostream>
- #define ROW 4
- #define COL 5
- using namespace std;
- class Matrix {
- private:
- int mat[ROW][COL];
- public:
- Matrix() {};
- void init() {
- cout<<"please input the Matrix(4 row and 5 col)"<<endl;
- for(int i=0; i<ROW; i++)
- for(int j=0; j<COL; j++)
- cin>>mat[i][j];
- }
- void output() {
- cout<<"The Matrix:"<<endl;
- for(int i=0; i<ROW; i++) {
- for(int j=0; j<COL; j++)
- cout<<mat[i][j]<<"\t";
- cout<<endl;
- }
- }
- void add(Matrix &a,Matrix &b) {
- for(int i=0; i<ROW; i++)
- for(int j=0; j<COL; j++)
- mat[i][j]=a.mat[i][j]+b.mat[i][j];
- }
- void sub(Matrix &a,Matrix &b) {
- for(int i=0; i<ROW; i++)
- for(int j=0; j<COL; j++)
- mat[i][j]=a.mat[i][j]-b.mat[i][j];
- }
- };
- int main() {
- Matrix A1,A2,A3;
- A1.init();
- A2.init();
- A3.add(A1,A2);
- A3.output();
- A3.sub(A1,A2);
- A3.output();
- return 0;
- }
2、 矩阵(二)
编写C++程序完成以下功能:
(1) 假定矩阵大小为4×5(整型);
(2) 矩阵空间采用new动态申请,保存在指针中;
(3) 定义矩阵初始化函数,可以从cin中输入矩阵元素;
(4) 定义矩阵输出函数,将矩阵格式化输出到cout;
(5) 定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;
(6) 定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;
(7) 动态申请三个矩阵:A1、A2、A3;
(8) 初始化A1、A2;
(9) 计算并输出A3 = A1加A2,A3 = A1减A2;
(10) 释放矩阵空间。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- const int row = 4;
- const int col = 5;
- using namespace std;
- bool malloc_array(int **&a,int row,int col) {
- a=new int *[row];
- if(a==NULL) {
- cout<<"error:no enough space"<<endl;
- return 0;
- }
- for(int i=0; i<row; i++) {
- *(a+i)=new int[col];
- if(a+i==NULL) {
- cout<<"error:no enough space"<<endl;
- return 0;
- }
- }
- return 1;
- }
- class Matrix
- {
- private:
- int **mat;
- public:
- Matrix()
- {
- malloc_array(mat, row, col);
- }
- Matrix(Matrix &b)
- {
- if(malloc_array(mat, row, col))
- for(int i = 0; i < row; i++)
- for(int j = 0; j < col; j++)
- mat[i][j] = b.mat[i][j];
- }
- ~Matrix()
- {
- for(int i = 0; i < row; i++)
- delete [] *(mat + i);
- delete [] mat;
- mat = NULL;
- }
- void input()
- {
- cout << "please input the Matrix:" << endl;
- for(int i = 0; i < row; i++)
- for(int j = 0; j < col; j++)
- cin >> mat[i][j];
- }
- void output()
- {
- for(int i = 0; i < row; i++)
- {
- for(int j = 0; j < col; j++)
- cout << mat[i][j] << "\t";
- cout << endl;
- }
- }
- void cal(Matrix &a, Matrix &b, int op)
- {
- for(int i = 0; i < row; i++)
- for(int j = 0; j < col; j++)
- mat[i][j] = a.mat[i][j] + b.mat[i][j] * op;
- }
- };
- int main()
- {
- Matrix *A1 = new Matrix();
- A1->input();
- Matrix *A2 = new Matrix();
- A2->input();
- Matrix *A3 = new Matrix();
- A3->cal(*A1, *A2, 1);
- cout << "Matrix A1 + Matrix A2 =" << endl;
- A3->output();
- A3->cal(*A1, *A2, -1);
- cout << "Matrix A1 - Matrix A2 =" << endl;
- A3->output();
- A1->~Matrix();
- A2->~Matrix();
- A3->~Matrix();
- A1 = NULL;
- A2 = NULL;
- A3 = NULL;
- return 0;
- }
实验问题
- 动态分配内存?
定义:int **mat;
分配:
mat=new int *[ROW];
for(int i=0; i *(mat+i)=new int[COL];
加上判断是否分配成功- 释放空间?
for(int i=0;i delete [] *(mat+i);
delete [] mat;
3、 矩阵(三)
编写C++程序完成以下功能:
(1) 用类来实现矩阵,定义一个矩阵的类,属性包括:
- 矩阵大小,用 lines, rows(行、列来表示);
- 存贮矩阵的数组指针,根据矩阵大小动态申请(new)。
(2) 矩阵类的方法包括:
- 构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组;
- 析构函数,需要释放矩阵的数组指针;
- 拷贝构造函数,需要申请和复制数组;
- 输入,可以从cin中输入矩阵元素;
- 输出,将矩阵格式化输出到cout;
- 矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同;
- 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。
(3) 定义三个矩阵:A1、A2、A3;
(4) 初始化A1、A2;
(5) 计算并输出A3 = A1加A2,A3=A1减A2;
(6) 用new动态创建三个矩阵类的对象:pA1、pA1、pA3;
(7) 初始化pA1、pA2;
(8) 计算并输出pA3=pA1加pA2,pA3=pA1减pA2;
(9) 释放pA1、pA1、pA3。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- bool malloc_array(int **&a,int row,int col) {
- a=new int *[row];
- if(a==NULL) {
- cout<<"error:no enough space"<<endl;
- return 0;
- }
- for(int i=0; i<row; i++) {
- *(a+i)=new int[col];
- if(a+i==NULL) {
- cout<<"error:no enough space"<<endl;
- return 0;
- }
- }
- return 1;
- }
- class Matrix {
- private:
- int **mat;
- int row,col;
- public:
- Matrix(int _row=0,int _col=0):row(_row),col(_col) {
- malloc_array(mat,row,col);
- }
- Matrix(Matrix &b):row(b.getRow()),col(b.getCol()) {
- if(malloc_array(mat,row,col))
- for(int i=0; i<row; i++)
- for(int j=0; j<col; j++)
- mat[i][j]=b.mat[i][j];
- }
- ~Matrix() {
- for(int i=0; i<row; i++)
- delete [] *(mat+i);
- delete [] mat;
- mat=NULL;
- }
- int getRow() {
- return row;
- }
- int getCol() {
- return col;
- }
- void input() {
- cout<<"please input the Matrix:"<<endl;
- for(int i=0; i<row; i++)
- for(int j=0; j<col; j++)
- cin>>mat[i][j];
- }
- void output() {
- for(int i=0; i<row; i++) {
- for(int j=0; j<col; j++)
- cout<<mat[i][j]<<"\t";
- cout<<endl;
- }
- }
- int cal(Matrix &a,Matrix &b,int op) {
- if(a.getRow()!=b.getRow()||a.getCol()!=b.getCol()) {
- cout<<"error:These two Matrix don't have the same size."<<endl;
- return 0;
- }
- for(int i=0; i<row; i++)
- for(int j=0; j<col; j++)
- mat[i][j]=a.mat[i][j]+b.mat[i][j]*op;
- return 1;
- }
- };
- int main() {
- int row,col;
- cout<<"please input Matrix A1's row and col:"<<endl;
- cin>>row>>col;
- Matrix *pA1=new Matrix(row,col);
- pA1->input();
- cout<<"please input Matrix A2's row and col:"<<endl;
- cin>>row>>col;
- Matrix *pA2=new Matrix(row,col);
- pA2->input();
- Matrix *pA3=new Matrix(row,col);
- if(pA3->cal(*pA1,* pA2,1)) {
- cout<<"Matrix A1 + Matrix A2 ="<<endl;
- pA3->output();
- pA3->cal(*pA1,* pA2,-1);
- cout<<"Matrix A1 - Matrix A2 ="<<endl;
- pA3->output();
- }
- pA1->~Matrix();
- pA2->~Matrix();
- pA3->~Matrix();
- pA1=NULL;
- pA2=NULL;
- pA3=NULL;
- return 0;
- }
实验问题
- line和row,不应该是row和col吗?
那就用row和col- 加减的函数基本一样,我可以写在一起吗?
其实用了乘法会降低速度,不过,这种同一级别的计算量,差别微小。- 拷贝函数怎么写
里面不能用memcpy(mat,b.mat,sizeof mat);- 遇到错误error: passing ‘const Matrix’ as ‘this’ argument discards qualifiers [-fpermissive] in call to ‘int Matrix::getRow()’
这是因为const型的Matrix参数要调用getRow,要在getRow的大括号前加上const。不过这个const型的Matrix参数我改回引用了。- 怎么释放
显式调用析构函数,再将指针指向NULL