1.随机函数库

π的近似值的计算有很多种方法,其中之一是用随机数。对于下图所示的圆和正方形,如圆的半径为r,它们的面积之比关系如下。

C语言 · 软件开发过程实例_#include

从中可得:

C语言 · 软件开发过程实例_管理系统_02

C语言 · 软件开发过程实例_C语言_03

··· 正方形和它的内切圆 ···

可以通过如下的计算方式计算π的值:假设圆的半径为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;
}

C语言 · 软件开发过程实例_C语言_04

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

C语言 · 软件开发过程实例_管理系统_05