1.随机函数库
π的近似值的计算有很多种方法,其中之一是用随机数。对于下图所示的圆和正方形,如圆的半径为r,它们的面积之比关系如下。
从中可得:
··· 正方形和它的内切圆 ···
可以通过如下的计算方式计算π的值:假设圆的半径为1,产生-1~1之间的两个随机实数x和y。这个点是正方形中的一个点。如果x²+y²≤1,则点落在圆内。重复n次上述动作,并记录点落在圆内的次数m,则通过π=4m/n可得π的近似值。重复的次数越多,得到的π值越精确。这种技术称为“蒙特卡洛积分法”。用本章所学的随机函数库实现该程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double calculatePi(int n) {
int m = 0; // 点落在圆内的次数
srand(time(NULL)); // 初始化随机数种子
for (int i = 0; i < n; i++) {
double x = (double)rand() / RAND_MAX * 2 - 1; // 产生-1到1之间的随机实数
double y = (double)rand() / RAND_MAX * 2 - 1;
if (x * x + y * y <= 1) {
m++;
}
}
double pi = 4.0 * m / n;
return pi;
}
int main() {
int n = 2000000; // 重复的次数,可以根据需要调整
double pi = calculatePi(n);
printf("π的近似值为:%f\n", pi);
return 0;
}
2.设计一个工资管理系统
实现的功能有添加员工、删除员工、调整员工工资、输出工资单。每个员工包含的信息有工号、姓名、工资,工号自动生成。员工离职后,工号不能再被使用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_EMPLOYEES 100
// 员工结构体
typedef struct {
int id;
char name[50];
double salary;
int active; // 是否在职,1表示在职,0表示离职
} Employee;
// 全局变量
Employee employees[MAX_EMPLOYEES];
int numEmployees = 0;
int nextId = 1;
// 添加员工
void addEmployee(char name[], double salary) {
if (numEmployees >= MAX_EMPLOYEES) {
printf("无法添加新员工,员工人数已达上限。\n");
return;
}
Employee newEmployee;
newEmployee.id = nextId++;
strcpy(newEmployee.name, name);
newEmployee.salary = salary;
newEmployee.active = 1;
//这是一个递增的工号,确保每个员工都有一个唯一的工号。
employees[numEmployees++] = newEmployee;
printf("员工添加成功,工号为:%d。\n", newEmployee.id);
}
// 删除员工
void deleteEmployee(int id) {
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].id == id && employees[i].active) {
employees[i].active = 0;
found = 1;
break;
}
}
if (found) {
printf("员工删除成功。\n");
} else {
printf("找不到指定的员工或该员工已离职。\n");
}
}
// 调整员工工资
void adjustSalary(int id, double newSalary) {
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].id == id && employees[i].active) {
employees[i].salary = newSalary;
found = 1;
break;
}
}
if (found) {
printf("员工工资调整成功。\n");
} else {
printf("找不到指定的员工或该员工已离职。\n");
}
}
// 输出工资单
void printPayroll() {
printf("工资单:\n");
for (int i = 0; i < numEmployees; i++) {
if (employees[i].active) {
printf("工号:%d\t姓名:%s\t工资:%.2f\n", employees[i].id, employees[i].name, employees[i].salary);
}
}
}
int main() {
int choice;
char name[50];
double salary;
int id;
while (1) {
printf("\n工资管理系统\n");
printf("1. 添加员工\n");
printf("2. 删除员工\n");
printf("3. 调整员工工资\n");
printf("4. 输出工资单\n");
printf("0. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入员工姓名:");
scanf("%s", name);
printf("请输入员工工资:");
scanf("%lf", &salary);
addEmployee(name, salary);
break;
case 2:
printf("请输入要删除的员工工号:");
scanf("%d", &id);
deleteEmployee(id);
break;
case 3:
printf("请输入要调整工资的员工工号:");
scanf("%d", &id);
printf("请输入新的工资:");
scanf("%lf", &salary);
adjustSalary(id, salary);
break;
case 4:
printPayroll();
break;
case 0:
printf("感谢使用工资管理系统,再见!\n");
exit(0);
default:
printf("无效的选择,请重新输入。\n");
break;
}
}
return 0;
}