C++语言程序设计 蒋光远/于红 第二章C++基础

1.C++中define与const定义常量的区别是什么?

define:定义宏常量——不分配内存空间,只存在于程序代码区——在程序运行过程中可进行多次拷贝——可以进行安全检查
const:定义有类型的变量——在静态存储区分配空间——运行过程中内存只有一个拷贝——无安全检查

2.C++的I/O流运算符与C语言的输入输出有什么区别?

C++:cout和cin是在iostream中预定义的全局流对象,用于标准输出和输入。
C语言:scanf和 printf这两个函数分别称为格式输入函数和格式输出函数。其意义是按指定的格式输入输出值。函数定义包含在stdio.h的头文件中。

3.简易计算器,从键盘输入两个整数和一个字符(+、-、*、/),分别对两个数进行加减乘除的运算。如输入23 123 +;输出计算结果23+123=146。要求利用I/O流运算符进行输入输出。

#include<iostream>
using namespace std;
double oper(int x,int y,char z)
{

    if(z=='+')
        return x+y;
    if(z=='-')
        return x-y;
    if(z=='*')
        return x*y;
    if(z=='/')
        return x*1.00/y*1.00;
}
int main()
{
    int a,b;
    double result;
    char c;
    cin>>a>>b>>c;
    result=oper(a,b,c);
    cout<<a<<c<<b<<'='<<result<<endl;
}

4.解决换钱问题:将1元硬币兑换成1分、2分、5分的人民币,有多少种换法?

#include<iostream>
using namespace std;
int main()
{
    int N=0;
    for(int a=0;a<=100;a++)
        for(int j=0;j<=50;j++)
            for(int k=0;k<=20;k++)
    {
        if(a+2*j+5*k==100)
                N++;
    }
        cout<<N<<endl;

        return 0;
}

5.分别用用穷举法和迭代法计算两个整数的最大公约数。

#include<iostream>
using namespace std;
int gcd(int a,int b)    //最大公约数迭代法
{
    int c=a>b? a:b;  //返回大的数
    int d=a<b? a:b;
    while(d!=0)
    {
         int e=d;
         d=c%d;
         c=e;
     }
     return c;
}
int gcd2(int a,int b)  //最大公约数穷举法
{
     if(b>a)
     swap(a,b);
     if(a==0||b==0)
        return a+b;
     for(int i=a;i>0;i--)
     if(a%i==0&&b%i==0)
        return i;
}
int main()
{
    int a,b,r1,r2;
    cin>>a>>b;
    r1=gcd(a,b);  
    cout<<r1<<endl;
    r2=gcd2(a,b);
    cout<<r2<<endl;
}

6.输入一个整型数组,数组有正有负。数组中连续的一个或多个连续的整数元素构成一个子数组,求所有子数组中和最大的子数组。

#include<iostream>
using namespace std;
const int n = 10;
int main()
{
    int i, j, k;
    int sum = 0, result = 0, min, max;
    int *arr = new int[n];
    for (i = 0; i < n; i++)
        cin >> arr[i];
//从左向右遍历,求子数组左下标
    for (i = 0; i < n; i++)
    {
        sum = 0;
        for (k = i; k < n; k++)
        {
            sum += arr[k];
            if (result < sum)
            {
                result = sum;
                min = i;	//最后一次执行该语句即为子数组的左下标,无需初始化
            }
        }
    }	//此处已可以求得最大的子数组的和,结果为result。
    sum = 0;
    for (i = min; i < n; i++)
    {
        sum += arr[i];
        if (sum == result)
            max = i;	//当sum和result相等时,可知子数组右下标
    }
    cout << "和最大的子数组:";
    for (i = min; i <= max; i++)
        cout << arr[i] << ' ';
    delete[] arr;
    cout << endl << "求和结果:" << result << endl;
}

7.函数设计重载不当会产生二义性问题,二义性主要体现在参数隐式类型转换和默认参数两个方面,举例说明这两方面的问题,你认为该如何解决?

8.在正整数中定义两个整形元素a、b,用引用做函数参数,在函数void swap(int &x,int &y)中实现将数据a、b交换存放,并在主函数中输出交换后的结果。

#include<iostream>
using namespace std;
void swap(int &x,int &y)    //用引用作为参数交换
{
    int temp=0;
    temp=x;
    x=y;
    y=temp;
}
int main()
{
    int a,b;
    cin>>a>>b;
    swap(a,b);
    cout<<a<<' '<<b;
    return 0;
}

下面再给出用指针作为参数交换存储空间中数据的值的方法:

#include<iostream>
using namespace std;
void swap(int *x,int *y)      //用指针做参数交换存放
{
    int temp=0;
    temp=*x;
    *x=*y;
    *y=temp;
}
int main()
{
    int a,b;
    cin>>a>>b;
    swap(a,b);
    cout<<a<<' '<<b;
    return 0;
}

9.假设一个班级有50名同学,每个同学都报出自己的生日,每个同学的生日都不相同的概率只有0.0296,如果有100个同学,不想冲的概率为3.0725*10-7。写一个程序,输入同学的人数n,利用统计方法计算计算出其生日不重复的概率。然后再用仿真的方法,利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。学生的生日产生可以用随机函数rand()产生,调用rand()前首先调用srand()函数设置种子,以上函数需要包含头文件头文件stdlib.h。

#include<iostream>
#include<cstdlib>
#include<ctime>
#define MAX 1000
using namespace std;
double reckon(int N)   //统计方法得出概率
{
    double product=1.0;
    for(int i=1;i<=N;i++)
    {
        product*=(365-i)*1.0/365.0;
    }
    return product;
}
bool hasSame(int *stu, int n)//判断一组数据是否存在相同的数
{
    int i, j;
    for(i=0; i<n-1; i++)
        for (j = i + 1; j < n; j++)
        {
            if (stu[i] == stu[j])
                return true;
        }
    return false;
}
void statistics(int n)   //仿真方法得出概率
{
    int  i, j, *stu;
    double p;	//存放概率
    srand(int(time(0)));

        int count = 0;	//初始化计数器
        stu = new int[n];	//存放学生的出生日期
        for (i = 0; i < MAX; i++)
        {
            for (j = 0; j < n; j++)
                stu[j] = rand() % 366 + 1;

            if (hasSame(stu, n))	//判断这一组数据是否存在相同的数
                count++;	//计数器
        }
        p = double(count) / MAX;
        cout << 1-p << endl;
        cout << "------" << endl;	//分割线
}
int main()
{
    int num;
    double pro=1.0;
    cin>>num;
    pro=reckon(num);
    statistics(num);
    cout<<pro<<endl;
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值