文章摘要
本文介绍了五个C++编程示例,涵盖了基本的输入输出操作、动态内存分配、线性方程组的求解、引用参数的使用以及生日悖论概率的计算。第一个示例展示了如何从键盘读取两个整数并执行基本的算术运算,然后输出结果。第二个示例使用new和delete操作符动态分配内存,并从键盘读取一个3x3整数数组,计算其元素之和、最大值和最小值。第三个示例通过枚举法解决了百钱问题,即计算将100元人民币兑换成1分、2分和5分的人民币的不同组合数量。第四个示例展示了如何使用引用参数在函数中交换两个整数的值。第五个示例计算了在给定人数的情况下,所有同学的生日都不重复的概率,并通过仿真模拟进行了验证,展示了数学计算和模拟结果之间的差异。
T1
编写一个用输入和输出流运算符进行的输入和输出的程序。从键盘输入两个数,分别对两个数进行加,减,乘和除的运算。并输出计算结果,如:
23+123=146。
直接模拟即可:
CPP
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
std::cout << a << '+' << b << '=' << a + b << std::endl;
std::cout << a << '-' << b << '=' << a - b << std::endl;
std::cout << a << '*' << b << '=' << a * b << std::endl;
std::cout << a << '/' << b << '=' << 1.0 * a / b << std::endl;
return 0;
}运行结果:
BASH
root@lsj-nas2:/vol2/1000/c程/信息技术实践# cd "/vol2/1000/c程/信息技术实践/" && g++ 1-1.cpp -o 1-1 && "/vol2/1000/c程/信息技术实践/"1-1
1 8
1+8=9
1-8=-7
1*8=8
1/8=0.125T2
用
new和delete运算符动态分配内存空间的方法编写程序。从键盘输入 整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。
同样直接模拟即可,注意分配空间时需要使用二维指针以便连续分配:
CPP
#include <climits>
#include <iostream>
int main() {
int(*q)[3] = new int[3][3];
int sum = 0, max = INT_MIN, min = INT_MAX;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int t;
std::cin >> t;
sum += t;
if (t > max) {
max = t;
}
if (t < min) {
min = t;
}
}
}
std::cout << "SUM:" << sum << std::endl;
std::cout << "MAX:" << max << std::endl;
std::cout << "MIN:" << min << std::endl;
return 0;
}运行结果:
BASH
root@lsj-nas2:/vol2/1000/c程/信息技术实践# cd "/vol2/1000/c程/信息技术实践/" && g++ 1-2.cpp -o 1-2 && "/vol2/1000/c程/信息技术实践/"1-2
1 2 3
4 5 6
7 8 9
SUM:45
MAX:9
MIN:1T3
编写 C++ 风格的程序,解决百钱问题:将 1 元人民币兑换成 1, 2, 5 分的人民币,有多少种换法?
即为线性方程组的求解,二重循环简单枚举即可:
CPP
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
const int TOTAL = 100;
int count = 0;
for (int five = 0; five <= TOTAL / 5; five++) {
for (int two = 0; two <= (TOTAL - 5 * five) / 2; two++) {
int one = TOTAL - 5 * five - 2 * two;
count++;
cout << setw(4) << count << " | " << setw(6) << one << " | "
<< setw(6) << two << " | " << setw(6) << five << endl;
}
}
cout << "总共有 " << count << " 种换法。" << endl;
return 0;
}运行结果:
BASH
root@lsj-nas2:/vol2/1000/c程/信息技术实践# cd "/vol2/1000/c程/信息技术实践/" && g++ 1-3.cpp -o 1-3 && "/vol2/1000/c程/信息技术实践/"1-3
1 | 100 | 0 | 0
2 | 98 | 1 | 0
3 | 96 | 2 | 0
4 | 94 | 3 | 0
5 | 92 | 4 | 0
6 | 90 | 5 | 0
7 | 88 | 6 | 0
8 | 86 | 7 | 0
9 | 84 | 8 | 0
...
535 | 4 | 3 | 18
536 | 2 | 4 | 18
537 | 0 | 5 | 18
538 | 5 | 0 | 19
539 | 3 | 1 | 19
540 | 1 | 2 | 19
541 | 0 | 0 | 20
总共有 541 种换法。T4
在主函数中定义 2 个整型元素 a,b,用引用作函数参数的方法,在函数
void swap(int &x, int &y)中实现将数据交换存放,并在主函数中打印出来。
简单地指针传参:
CPP
#include <iostream>
using namespace std;
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a, b;
cin >> a >> b;
cout << "a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}运行结果:
BASH
root@lsj-nas2:/vol2/1000/c程/信息技术实践# cd "/vol2/1000/c程/信息技术实践/" && g++ 1-4.cpp -o 1-4 && "/vol2/1000/c程/信息技术实践/"1-4
1 9
a = 1, b = 9
a = 9, b = 1T5
假设我们班有 50 名同学,每个同学都报出自己的生日,每个同学的生日都不相重的概率只有 0.0296,如果有 100 个同学,不相重的概率为 。相重复的概率如此之大与我们主观想象不同。写一个程序,输入同学的人数 n 计算出其生日不重复的概率。然后再用仿真的方法,利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
简单模拟即可,注意此处代码中的static_cast是更高级的类型转换方法:
CPP
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
double calculateProbability(int n) {
if (n > 365) {
return 0.0;
}
double prob = 1.0;
for (int i = 0; i < n; i++) {
prob *= (365.0 - i) / 365.0;
}
return prob;
}
double simulateProbability(int n, int trials = 100000) {
if (n > 365) {
return 0.0;
}
srand(static_cast<unsigned int>(time(nullptr)));
int noRepeatCount = 0;
for (int t = 0; t < trials; t++) {
vector<int> birthdays;
bool hasRepeat = false;
for (int i = 0; i < n; i++) {
int birthday = rand() % 365 + 1;
if (find(birthdays.begin(), birthdays.end(), birthday) !=
birthdays.end()) {
hasRepeat = true;
break;
}
birthdays.push_back(birthday);
}
if (!hasRepeat) {
noRepeatCount++;
}
}
return static_cast<double>(noRepeatCount) / trials;
}
int main() {
srand(static_cast<unsigned int>(time(nullptr)));
cout << "========== 生日悖论概率计算程序 ==========" << endl;
int n;
cout << "请输入同学的人数: ";
cin >> n;
double mathProb = calculateProbability(n);
double simProb = simulateProbability(n);
double repeatMathProb = 1 - mathProb;
double repeatSimProb = 1 - simProb;
cout << "========================================================" << endl;
cout << " 人数: " << n << " 人" << endl;
cout << "========================================================" << endl;
cout << " 数学计算结果:" << endl;
cout << " 生日不重复概率: " << fixed << setprecision(4) << mathProb * 100
<< "%" << endl;
cout << " 生日重复概率: " << repeatMathProb * 100 << "%" << endl;
cout << "--------------------------------------------------------" << endl;
cout << " 仿真模拟结果 (100000次模拟):" << endl;
cout << " 生日不重复概率: " << simProb * 100 << "%" << endl;
cout << " 生日重复概率: " << repeatSimProb * 100 << "%" << endl;
cout << "--------------------------------------------------------" << endl;
cout << " 误差: " << abs(mathProb - simProb) * 100 << "%" << endl;
cout << "========================================================" << endl;
cout << endl;
return 0;
}运行结果:
BASH
root@lsj-nas2:/vol2/1000/c程/信息技术实践# cd "/vol2/1000/c程/信息技术实践/" && g++ 1-5.cpp -o 1-5 && "/vol2/1000/c程/信息技术实践/"1-5
========== 生日悖论概率计算程序 ==========
请输入同学的人数: 60
========================================================
人数: 60 人
========================================================
数学计算结果:
生日不重复概率: 0.5877%
生日重复概率: 99.4123%
--------------------------------------------------------
仿真模拟结果 (100000次模拟):
生日不重复概率: 0.6080%
生日重复概率: 99.3920%
--------------------------------------------------------
误差: 0.0203%
========================================================本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 烧鸡
评论
隐私政策
0/500
滚动到此处加载评论...

