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;
}