C++期末复习练手题

C++ 专栏收录该内容
20 篇文章 0 订阅

1 . 输出字符 ‘A’ 和 ‘a’ 的ASCII码值。

#include <iostream>
using namespace std;
int main()
{
    int i,j;
    i='A';
    j='a';
    cout<<"ASCII of 'A'="<<i<<endl<<"ASCII of 'a'="<<j<<endl;
    return 0;
}

输出:
ASCII of ‘A’=65
ASCII of ‘a’=97

2 . 输入两个小写字符,将其转换为大写

#include <iostream>
using namespace std;
int main()
{
    char c1,c2;
    cout<<"input two char: ";
    cin>>c1>>c2;
    c1=c1-32;
    c2=c2-32;
    cout<<"c1="<<c1<<endl<<"c2="<<c2<<endl;
}

输入:input two char: lc
输出:
c1=L
c2=C

3.输入两个浮点型数字,但要求输出的是整型

#include <iostream>
using namespace std;
int main()
{
    float c1,c2;
    cout<<"input two float: ";
    cin>>c1>>c2;
    c1=(int)c1;   //方法一
    c2=int(c2);   //方法二
    cout<<"c1="<<c1<<endl<<"c2="<<c2<<endl;
}

输入:input two char: 3.97 7.56
输出:
c1=3
c2=7

4.【密码编译题】输入字符串”CHINA”, 每个字母往后加4个ASCII字符后

#include <iostream>
using namespace std;
int main()
{
    char a[6]; //定义一个字符型数组
    for(int i=1;i<6;i++) 
    {
        cin>>a[i];
        a[i]=a[i]+4;//字符型数组的加法是对其ASCII码进行加减
    }

    for(int i=1;i<6;i++)    
        cout<<a[i];
    cout<<endl;
    return 0;
}

输入:CHINA
输出:GLMRE

5 . 输出整数179的十六进制和八进制表达结果。

#include <iostream>
using namespace std;
int main()
{
    int a=179;
    cout<<"hex="<<hex<<a<<endl<<"oct="<<oct<<a<<endl;
}

输出:
hex=b3
oct=263

6 . 控制符下的输出

#include <iostream>
#include <iomanip> //使用控制符输出要加头文件
using namespace std;
int main()
{
    int a=179;
    cout<<setfill('+')<<setw(10)<<a<<endl;
    //输出宽度为10位,空的位数用"+"填充
}

输出:+++++++179

7.单个字符的输入输出

#include <iostream>
using namespace std;
int main()
{
    char a,c;
    a=getchar();.//从终端输入一个字符
    c=a-32;
    putchar(c);
    putchar(10);//输出一个换行符,与putchar('\n')同义,10是'\n'的ASCII码值
}

输入:b
输出:B

8 . if的嵌套
在if的嵌套中,也可以加花括号来表示层级匹配关系,特别是在if与else数目不一样的情况下:

if()
    {if() 语句1}
    else 语句2

9 . 判断某年是否为闰年

#include <iostream>
using namespace std;
int main()
{
    int year;
    cout<<"input the year:";
    cin>>year;
    if ((year%400==0)||(year%100!=0 && year%4==0))//核心代码就这一句话
        cout<<year<<"is leap year"<<endl;
    else cout<<year<<" is not leap year"<<endl;
    return 0;
}

输入:input the year:1900
输出:1900 is not leap year

10.【递归】用递归方法求n阶勒让德多项式的值,递归公式见书p123,习题8。

#include <iostream>
using namespace std;
int main()
{
    double Legendre(double x,int n);
    double a;
    int b;
    cout<<"input the value of x: "; cin>>a;
    cout<<"input the value of n: "; cin>>b;

    cout<<"the value of "<<b<<"-class "<<"Legendre is: "<<Legendre(a,b)<<endl;

}
double Legendre(double x,int n)
{
    double lgd;
    if(n==0) lgd=1;
    else if (n==1) lgd=x;
    else lgd=((2*n-1)*x*Legendre(x,n-1)-(n-1)*Legendre(x,n-2))/n;
    return lgd;
}

这里写图片描述

11.【函数嵌套】写一个函数验证哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和,如10=3+7,在主函数中输入一个不小于6的偶数,然后调用函数gotbaha,在gotbaha函数中再调用prime函数,prime函数用于判断是否素数。

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int gotbaha(int );
    int a;
    cout<<"input the even number y: ";
    cin>>a;
    gotbaha(a);
    return 0;
}


int gotbaha(int y)
{
    int prime(int );
    int j;
    for (int i=2;i<=ceil(y/2);i++)
    {
        j=y-i;
        if (prime(i) && prime(j)) 
            {
                cout<<y<<"="<<i<<"+"<<j<<endl;
                break;//满足条件后跳出循环
            }
    }
    return 0;
}

int prime(int x)
{
    bool pr=true;
    for (int i=2;i<x;i++)
        if (x%i==0) pr=false;
    return pr;
}

输入:input the even number y: 34
输出:34=3+31

12 . 【函数调用】

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int area(int ,int ,int );
    int x,y,z;
    cout<<"input the 3 edges: ";
    cin>>x>>y>>z;
    if (x+y>z && x+z>y && y+z>x)
        cout<<"area="<<area(x,y,z)<<endl;//三角形判别条件
    else cout<<"it is not a triangle"<<endl;
}

int area(int a,int b,int c)
{
    int s;
    int ar;
    s=(a+b+c)/2;
    ar=sqrt(s*(s-a)*(s-b)*(s-c));
    return ar;//尤其注意被调用函数的返回值
}

13 . 【阶乘的递归实现】求a!+b!+c!的值,用一个函数fact(n)求n!。a,b,c的值由主函数输入,最终得到的值在主函数中输出。

#include <iostream>
using namespace std;
int main()
{
    int fact(int n);
    int a,b,c,sum;
    cin>>a>>b>>c;
    sum=fact(a)+fact(b)+fact(c);
    cout<<sum;
}
int fact(int n)
{
    int f;
    if(n==1) f=1;
    else f=fact(n-1)*n;
    return f;
}

14 . 【while循环 · 迭代法】用牛顿迭代法求方程的根。方程为
ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为4,3,2,1,由主函数输入。求x在1附近个一个实根。求出根后由主函数输出。
注:牛顿迭代法公式:x2=x1-f1/f2

//心得:往往写while循环都在循环体外和循环体内把函数写两遍
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double newton(int a,int b,int c,int d);
    cout<<newton(4,3,2,1)<<endl;
}

double newton(int a,int b,int c,int d)
{
    double f1,f2,x,x1,x2,m;
    f1=a*x1*x1*x1+b*x1*x1+c*x1+d;
    f2=3*a*x1*x1+2*b*x1+c;//f2是f1的导数
    x1=1; //赋一个初值,随便找一个值开始
    x2=x1-f1/f2;//迭代关键

    while(abs(x1-x2)>0.00001) //结束循环的条件
    {
        x1=x2;
        f1=a*x1*x1*x1+b*x1*x1+c*x1+d;
        f2=3*a*x1*x1+2*b*x1+c;
        x2=x1-f1/f2;    
    }
    return x2;
}

15.
这里写图片描述

#include <iostream>
using namespace std;
int main()
{
    char c;
    while((c=getchar())!='\n')
    {
        if(('z'>=c && c>='w') || ('Z'>=c && c>='W')) c=c-22;
        if(('v'>=c && c>='a') || ('W'>=c && c>='A')) c=c+4;
        cout<<c; //小心:在C++语言中没有连等的表达
    }
    cout<<endl;
}

输入:I am going to Beijing!
输出:M eq ksmrk xs Fimnmrk!

16 . 【循环应用题】猴子当天吃掉的桃子数为前一天剩下桃子数的一半再多一个,到第10天时,只剩下一个桃子了,求:第一天的桃子数
分析:写出通项公式是关键
S1-1/2*S2-1=S2,设S1为前一天所剩桃子数,S2为当天所剩桃子数
==>S1=2*S2+2

#include <iostream>
using namespace std;
int main()
{
    int s=1,n=1;
    while(n<10)
    {
        n++;
        s=2*s+2;
    }
    cout<<s<<endl;
}

17 . 有3个国家名,要求找出按字母顺序排在最前面的国家。要求用函数调用。

#include <iostream>
#include <string>
using namespace std;
int main()
//step 1:输入三个国家的字符串
{
    void stringcmp(char string[][]);
    char str[4][20];
    for(int i=1;i<4;i++)
        cin>>str[i];
    stringcmp(str);
}


// step 2:调用字符串比较函数
void stringcmp(char string[][])
{
    char min[20];
    strcpy(min,string[1]);//将min数组设为常数字符
    for(int i=1;i<3;i++)
    {
        if(strcmp(string[i+1],min)<0)//strcmp()函数要求第二个参数为常数
            strcpy(min,string[i+1]);//给数组赋值只能采用strcpy()函数
    }
    cout<<min<<endl;
}

输入:GERMANY FRANCH CHINA
输出:CHINA

18 . 逆序输出CHINA

#include <iostream>
#include <string>
using namespace std;
int main()
{
    char word[6];
    int n=5;//定义n变量,表示字符串长度,即该字符数组中含有多少个字符
    for(int i=1;i<6;i++)
        cin>>word[i];
    while(n!=0)
    {
        cout<<word[len];
        n--;
    }
    return 0;
}

输入:CHINA
输出:ANIHC

19 . 10个数选择排序法(从大到小)
原理:
1) 外循环执行n-1次,内循环每次比较和交换n-i次(i为第i次外循环)
2) 从数组第一位开始循环,后面从第二个元素开始直到访问完数组中最后一个元素为止,遇到最小值则与之交换;然后进行第二次循环,从数组第二个元素开始,从第三个元素开始访问之后的所有元素,遇到最小值则与之交换……

#include <iostream>
using namespace std;
int main()
{
    void quicksort(int b[]);
    int a[11];
    cout<<"input 10 numbers: ";
    for(int i=1;i<11;i++)
        cin>>a[i];
    quicksort(a);
    for(int i=1;i<11;i++)
        cout<<"sorted array: "<<a[i]<<endl;
    return 0;
}

void quicksort(int b[])
{
    for (int i=1;i<10;i++)
    {
        int max=b[i],m=i;//初始值很关键
        for (int j=(i+1);j<11;j++)
        {
            if (b[j]>max)  
                {
                    max=b[j];
                    m=j;
                }
        }//最里面一层循环是把i之后元素的最大值及其脚标找到
        b[m]=b[i];
        b[i]=max;
    }//最外层循环的作用是交换元素

}

20 . 折半查找(二分查找)
given:一个由大到小排好序的10个元素的数组
求:输入一个元素,查找该元素在数组中位置,即索引

· 思想:
step1: 每次从数组的中间元素开始找起
step2: 然后根据目标数字与中间元素的大小关系,锁定该中间元素的左区间或右区间
step3:重复步骤2,直至目标元素=中间元素

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    void binary_search(int t,int b[],int n);
    int a[11]={0,20,19,17,15,9,6,5,3,2,1},len=10;
    int target;//注意这里的处理技巧,10个数,使得a[1]~a[10]有意义,则第一个元素必须是0
    cout<<"input a number that you want to search: ";
    cin>>target;
    binary_search(target,a,len);
    return 0;
}

void binary_search(int t,int b[],int n)
{
    int lb=1,ub=10,bn;
    bn=ceil((lb+ub)/2);
    while(b[bn]!=t)
    {
        if (t>b[bn]) 
        {
            ub=bn-1;
            bn=ceil((lb+ub)/2);
        }
        else
        {
            lb=bn+1;
            bn=ceil((lb+ub)/2);
        }
    }
    cout<<"the index of this item is: "<<bn<<endl;
}

21 . 找一个五个元素数组中的第二大的值

#include <iostream>
using namespace std;
int main()
{
    int a[6]={0,1,2,3,4,5};
    //第一次循环先找最大值
    int max=a[1],sec=a[1];
    for (int i=2;i<6;i++)
        if (max<a[i]) max=a[i];

    //第二次循环找次大值
    for (int i=2;i<6;i++)
        if (sec<a[i] && a[i]<max) sec=a[i];
    cout<<"max="<<max<<" , sec="<<sec<<endl;
    return 0;
}

22 . 生成随机整数

//产生[1,10的随机整数]
#include <iostream>
using namespace std;
int main()
{
    int x;
    for (int i=1;i<11;i++)
    {
        x=(rand()%10)+1;
        cout<<x<<" ";
    }

}
//产生[0,10的随机整数]
#include <iostream>
using namespace std;
int main()
{
    int x;
    for (int i=1;i<11;i++)
    {
        x=(rand()%11);
        cout<<x<<" ";
    }

}

23 . 分解质因数

#include <iostream>
using namespace std;
int main()
{
    void prime_factor(int b);
    int a;
    cout<<"input a number: ";
    cin>>a;
    prime_factor(a);
    return 0;
}
void prime_factor(int b)
{
    for (int i=2;i<=b;i++)
    {
        while (b%i==0) 
        {
        b=b/i;
        cout<<i<<" ";
        }
    }

}

24 . 最大公因数gcd和最小公倍数lcm

#include <iostream>
using namespace std;
int main()
{
    void gcd_lcm(int m,int n);
    int a,b;
    cout<<"input two number: ";
    cin>>a>>b;
    gcd_lcm(a,b);
}

void gcd_lcm(int m,int n)
{
    int de,gcd,lcm,mul;
    mul=m*n;
    while(m%n!=0)
    {
        de=m%n;
        m=n;
        n=de;
    }
    gcd=n;//辗转相除以后,最大公因数gcd为n
    lcm=mul/gcd;
    cout<<"gcd="<<gcd<<" lcm="<<lcm<<endl;

25 . 重载之复数加法

#include <iostream>
using namespace std;
class complex
{
    public:
        complex (int a=0,int b=0);
        friend complex operator+(complex n1,complex n2);
        void display();
    private:
        int real,imag;
};


complex::complex (int a,int b)
{
    real=a;
    imag=b;
}

complex operator+(complex n1,complex n2)
{
    complex n3;
    n3.real=n1.real+n2.real;
    n3.imag=n1.imag+n2.imag;
    return n3;
}

void complex::display()
{
    cout<<"("<<real<<","<<imag<<"i"<<")"<<endl;
}

int main()
{
    complex c1(3,4),c2(5,6),c3;
    c3=c1+c2;
    cout<<"c3=";
    c3.display();
}

26 . 重载之复数乘法

#include <iostream>
using namespace std;
class complex
{
public:
    complex(int a=0,int b=0); //第一个函数:构造函数,与类同名,参数为每个对象中的成员变量
    friend complex operator*(complex n1,complex n2);  //第二个函数:重载函数,参数为对象
    void display(); //第三个函数:成员函数,功能是用以输出
private:
    int real,imag;
};

// 1) 构造函数
complex::complex(int a,int b)
{
    real=a;
    imag=b;
}

// 2) 重载函数
complex operator*(complex n1,complex n2)
{
    complex n3;
    n3.real=n1.real*n2.real-n1.imag*n2.imag;
    n3.imag=n1.real*n2.imag+n1.imag*n2.real;
    return n3;
}

// 3) 输出成员函数
void complex::display()
{
    cout<<"("<<real<<","<<imag<<"i)"<<endl;
}

int main()
{
    complex c1(3,4),c2(5,6),c3;
    c3=c1*c2;
    cout<<"c3=";
    c3.display();
}

27、定义一个具有26个下标变量的字符数组,初始值为”A”到”Z”的26个英文字母,用户从键盘输入 任意4个数(1到26之间,表示对应字符的位置),显示对应序号上的字符。例如输入1 3 2 4,显示 ACBD。

#include <iostream>
using namespace std;
int main()
{
    int a[4];
    char b[4];
    cout<<"input 4 numbers: ";
    for(int i=0;i<4;i++)
    {
        cin>>a[i];
        b[i]=a[i]+64;
        cout<<b[i]<<" ";
    }
    cout<<endl;

}

28 . 自定义一个函数(VB)或类的方法(JAVA、C++),功能:按两个参数(直角三角形的直角 边的长度)的值,计算并返回三角形的面积值。再定义一个程序,功能:从键盘输入两个数(直 角三角形的直角边的长度),调用上述自定义函数或方法,计算并输出三角形的面积值。

有一个小小的心得:如果想要用成员函数传递参数时,这时候就不要写成员函数了,直接写构造函数就好了,当然,如果不要传递参数,那么成员函数还是可以用的。

方法一:无参的成员函数,无构造函数

#include <iostream>
using namespace std;
class t
{
    public:
        void tr();
        void area();
    private:
        int edge1,edge2;
};

void t::tr()
{
    int a,b;
    cout<<"input two edges: ";
    cin>>a>>b;
    edge1=a;edge2=b;
}


void t::area()
{
    int ta;
    ta=(edge1*edge2)/2;
    cout<<"the area of the triangle is: "<<ta<<endl;
}

int main()
{
    t t1;
    t1.tr();
    t1.area();
    return 0;
}

方法二:定义构造函数,带参数


//说明:比起上面一段代码而言,就改动了如下地方:成员函数 --> 构造函数
#include <iostream>
using namespace std;
class t
{
    public:
        t(int a=0,int b=0);//声明成员函数的地方变成了构造函数
        void area();
    private:
        int edge1,edge2;
};

t::t(int a,int b)//在类体外定义成员函数的代码变成了定义构造函数的代码
{
    cout<<"input two edges: ";
    cin>>a>>b;
    edge1=a;edge2=b;
}


void t::area()
{
    int ta;
    ta=(edge1*edge2)/2;
    cout<<"the area of the triangle is: "<<ta<<endl;
}

int main()
{
    t t1;
    t1.area();
    return 0;
}

29 .
从键盘上输入任意6个整数,分别计算并显示出奇、偶数的和。

#include <iostream>
using namespace std;
int main()
{
    int a[6],even=0,odd=0;
    cout<<"input 6 integers: ";
    for(int i=1;i<7;i++) 
    {
        cin>>a[i];
        if (a[i]%2==0) even=even+a[i];
        else odd=odd+a[i];
    }
    cout<<"sum of even is: "<<even<<endl<<"sum of odd is: "<<odd<<endl;
}

30 . 找出并显示出1-200之间所有能被7整除但不能被5整除的整数。
代码一:什么格式都不控制

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    for(int i=1;i<200;i++)
        if(i%7==0 && i%5!=0) cout<<i<<" ";
}
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int s=0;
    for(int i=1;i<200;i++)
    {
        if(i%7==0 && i%5!=0) 
        {
            cout<<i<<setw(2)<<" ";//每个数字占有2个单位长度
            s++; //定义一个自加变量,用于控制没行输出个数
            if (s%5==0) cout<<endl; //每行输出五个
        }

    }

}

31、用户从键盘上输入一组整数(a1,a2,…,a10)和另一组整数(b1,b2,…,b10),假设这两组整数中的每 一个整数的取值范围为0-30(包含0和30),计算并显示a1*b10+a2*b9+a3*b8+…+a10*b1和 a1*b1+a2*b2+a3*b3+…+a10*b10的值。

#include <iostream>
using namespace std;
int main()
{
    int sum1(int m[],int n[],int len);
    int sum2(int m[],int n[],int len);
    int a[6],b[6];
    cout<<"input array a[]: ";
    for (int i=1;i<6;i++) cin>>a[i];
    cout<<"input array b[]: ";
    for (int i=1;i<6;i++) cin>>b[i];
    cout<<"sum1="<<sum1(a,b,5)<<endl;
    cout<<"sum2="<<sum2(a,b,5)<<endl;
}

int sum1(int m[],int n[],int len)
{
    int ss1[len+1],s=0;
    for(int i=1;i<(len+1);i++)
    {
        ss1[i]=m[i]*n[len-i+1];
        s=s+ss1[i];
    }
    return s;   

}

int sum2(int m[],int n[],int len)
{
    int ss2[len+1],s=0;
    for(int i=1;i<(len+1);i++)
    {
        ss2[i]=m[i]*n[i];
        s=s+ss2[i];
    }
    return s;
}

32、计算并显示1-2-3+4-5-6+7-8-9+…n的值。其中n为程序运行时用户从键盘上输入的一个100-200 之间的整数。

#include <iostream>
using namespace std;
int main()
{
    int n,s=0,j;
    cout<<"input a number(100~200): ";
    cin>>n;
    for(int i=1;i<(n+1);i++)
    {
        if (i%3==0 || (i+1)%3==0)  j=i*(-1);
        else j=i;//小心:这里要用另一个变量保存i的值
        s=s+j;
    }
    cout<<"the sum is: "<<s<<endl;
}

33 . 编写一个函数(或者是方法),其功能为:用户从键盘上输入一个字符串,输出该字符串的 第3个字符。


#include <iostream>
#include <string>
using namespace std;
int main()
{
    string word;
    cout<<"input a string: ";
    cin>>word;
    cout<<"the third item of this string is:"<<word[2]<<endl;
}

这里写图片描述

  • 23
    点赞
  • 0
    评论
  • 48
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值