又写了一个大一新生的期末作业(机房收费管理系统)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
#include <stdio.h>
#include <string.h>
#include <math.h>
 
// 定义学生结构体
struct Student {
    char id[20];        // 学号
    char className[20]; // 班级
    char name[20];      // 姓名
    int startHour;      // 上机开始时间(小时)
    int startMinute;    // 上机开始时间(分钟)
    int endHour;        // 下机时间(小时)
    int endMinute;      // 下机时间(分钟)
    int isOnline;       // 是否在线
    double cost;        // 费用
};
 
// 全局变量
struct Student students[30];
int studentCount = 0;
const int MAX_STUDENTS = 30;
 
// 函数声明
void inputStudent();
void calculateCost(int index);
void searchStudent();
void displayComputerStatus();
double calculateTimeDifference(int startH, int startM, int endH, int endM);
void showMenu();
void saveToFile();
void loadFromFile();
void saveStudentInfo(const char* filename);
void loadStudentInfo(const char* filename);
void saveComputerLog(const char* filename);
void loadComputerLog(const char* filename);
void initializeDefaultStudents();
 
// 定义文件名常量
#define STUDENT_FILE "student_info.txt"
#define COMPUTER_LOG "computer_log.txt"
 
int main() {
    loadFromFile(); // 程序启动时加载数据
     
    int choice;
    while (1) {
        showMenu();
        printf("请输入您的选择: ");
        scanf("%d", &choice);
         
        switch (choice) {
            case 1:
                inputStudent();
                saveToFile(); // 添加学生后保存
                break;
            case 2: {
                int index;
                printf("请输入要结算的学生序号(0-%d): ", studentCount-1);
                scanf("%d", &index);
                calculateCost(index);
                saveToFile(); // 计算费用后保存
                break;
            }
            case 3:
                searchStudent();
                break;
            case 4:
                displayComputerStatus();
                break;
            case 0:
                saveToFile(); // 退出前保存
                printf("程序已退出!\n");
                return 0;
            default:
                printf("无效选择,请重试!\n");
        }
    }
    return 0;
}
 
void showMenu() {
    printf("\n====== 机房收费管理系统 ======\n");
    printf("1. 输入学生信息\n");
    printf("2. 计算上机费用\n");
    printf("3. 查询学生信息\n");
    printf("4. 显示机器使用情况\n");
    printf("0. 退出系统\n");
    printf("===========================\n");
}
 
void inputStudent() {
    if (studentCount >= MAX_STUDENTS) {
        printf("已达到最大学生数量!\n");
        return;
    }
 
    printf("请输入学生信息:\n");
    printf("学号: ");
    scanf("%s", students[studentCount].id);
    printf("班级: ");
    scanf("%s", students[studentCount].className);
    printf("姓名: ");
    scanf("%s", students[studentCount].name);
    printf("上机时间(时 分): ");
    scanf("%d %d", &students[studentCount].startHour,
                   &students[studentCount].startMinute);
     
    students[studentCount].isOnline = 1;
    students[studentCount].cost = 0;
    studentCount++;
    printf("学生信息录入成功!\n");
}
 
void calculateCost(int index) {
    if (index < 0 || index >= studentCount) {
        printf("无效的学生序号!\n");
        return;
    }
 
    if (!students[index].isOnline) {
        printf("该学生已经下机!\n");
        return;
    }
 
    printf("请输入下机时间(时 分): ");
    scanf("%d %d", &students[index].endHour, &students[index].endMinute);
 
    double hours = calculateTimeDifference(
        students[index].startHour,
        students[index].startMinute,
        students[index].endHour,
        students[index].endMinute
    );
 
    students[index].cost = ceil(hours) * 1.0;
    students[index].isOnline = 0;
 
    printf("费用计算完成!\n");
    printf("学生: %s\n", students[index].name);
    printf("上机时间: %.2f小时\n", hours);
    printf("费用: %.2f元\n", students[index].cost);
}
 
double calculateTimeDifference(int startH, int startM, int endH, int endM) {
    int totalMinutes = (endH * 60 + endM) - (startH * 60 + startM);
    return totalMinutes / 60.0;
}
 
void searchStudent() {
    printf("\n查询方式:\n");
    printf("1. 按班级查询\n");
    printf("2. 按学号查询\n");
    printf("3. 按姓名查询\n");
     
    int choice;
    char searchTerm[20];
    printf("请选择查询方式: ");
    scanf("%d", &choice);
    printf("请输入查询关键字: ");
    scanf("%s", searchTerm);
 
    printf("\n查询结果:\n");
    printf("%-10s%-10s%-10s%-15s%-15s\n",
           "学号", "班级", "姓名", "状态", "上机时间");
 
    for (int i = 0; i < studentCount; i++) {
        int match = 0;
        switch (choice) {
            case 1:
                match = (strcmp(students[i].className, searchTerm) == 0);
                break;
            case 2:
                match = (strcmp(students[i].id, searchTerm) == 0);
                break;
            case 3:
                match = (strcmp(students[i].name, searchTerm) == 0);
                break;
        }
 
        if (match) {
            printf("%-10s%-10s%-10s%-15s%02d:%02d\n",
                   students[i].id,
                   students[i].className,
                   students[i].name,
                   students[i].isOnline ? "在线" : "已下机",
                   students[i].startHour,
                   students[i].startMinute);
        }
    }
}
 
void displayComputerStatus() {
    int online = 0;
    int offline = 0;
 
    for (int i = 0; i < studentCount; i++) {
        if (students[i].isOnline) {
            online++;
        } else {
            offline++;
        }
    }
 
    printf("\n机器使用情况统计:\n");
    printf("总学生数:%d\n", studentCount);
    printf("当前在线:%d\n", online);
    printf("已经下机:%d\n", offline);
     
    printf("\n使用情况图示:\n");
    printf("在线学生: ");
    for (int i = 0; i < online; i++) {
        printf("█");
    }
    printf(" (%d)\n", online);
     
    printf("离线学生: ");
    for (int i = 0; i < offline; i++) {
        printf("█");
    }
    printf(" (%d)\n", offline);
}
 
// 添加保存到文件的函数
void saveToFile() {
    // 保存学生基本信息
    saveStudentInfo(STUDENT_FILE);
    // 保存上机记录
    saveComputerLog(COMPUTER_LOG);
}
 
// 添加从文件加载的函数
void loadFromFile() {
    FILE *fp = fopen(STUDENT_FILE, "r");
    if (fp == NULL) {
        printf("首次运行,初始化30名学生信息...\n");
        initializeDefaultStudents();
        saveToFile(); // 保存初始化的数据
        return;
    }
    fclose(fp);
     
    // 加载学生基本信息
    loadStudentInfo(STUDENT_FILE);
    // 加载上机记录
    loadComputerLog(COMPUTER_LOG);
}
 
// 保存学生基本信息(文本格式)
void saveStudentInfo(const char* filename) {
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
        printf("无法打开文件 %s!\n", filename);
        return;
    }
     
    fprintf(fp, "学生总数: %d\n", studentCount);
    fprintf(fp, "学号\t班级\t姓名\t状态\t费用\n");
     
    for (int i = 0; i < studentCount; i++) {
        fprintf(fp, "%s\t%s\t%s\t%s\t%.2f\n",
                students[i].id,
                students[i].className,
                students[i].name,
                students[i].isOnline ? "在线" : "离线",
                students[i].cost);
    }
     
    fclose(fp);
    printf("学生基本信息已保存到 %s\n", filename);
}
 
// 加载学生基本信息(文本格式)
void loadStudentInfo(const char* filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("未找到文件 %s,将创建新文件。\n", filename);
        return;
    }
     
    char line[256];
    // 跳过前两行(标题行)
    fgets(line, sizeof(line), fp);
    fgets(line, sizeof(line), fp);
     
    studentCount = 0;
    while (fscanf(fp, "%s\t%s\t%s\t%s\t%lf\n",
                  students[studentCount].id,
                  students[studentCount].className,
                  students[studentCount].name,
                  line, // 临时存储状态
                  &students[studentCount].cost) == 5) {
         
        students[studentCount].isOnline = (strcmp(line, "在线") == 0);
        studentCount++;
         
        if (studentCount >= MAX_STUDENTS) break;
    }
     
    fclose(fp);
    printf("已从 %s 加载 %d 条学生记录\n", filename, studentCount);
}
 
// 保存上机记录(文本格式)
void saveComputerLog(const char* filename) {
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
        printf("无法打开文件 %s!\n", filename);
        return;
    }
     
    fprintf(fp, "上机记录\n");
    fprintf(fp, "学号\t开始时间\t结束时间\t费用\n");
     
    for (int i = 0; i < studentCount; i++) {
        fprintf(fp, "%s\t%02d:%02d\t",
                students[i].id,
                students[i].startHour,
                students[i].startMinute);
         
        if (!students[i].isOnline) {
            fprintf(fp, "%02d:%02d\t%.2f\n",
                    students[i].endHour,
                    students[i].endMinute,
                    students[i].cost);
        } else {
            fprintf(fp, "在线中\t0.00\n");
        }
    }
     
    fclose(fp);
    printf("上机记录已保存到 %s\n", filename);
}
 
// 加载上机记录(文本格式)
void loadComputerLog(const char* filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("未找到文件 %s,将创建新文件。\n", filename);
        return;
    }
     
    char line[256];
    // 跳过前两行(标题行)
    fgets(line, sizeof(line), fp);
    fgets(line, sizeof(line), fp);
     
    for (int i = 0; i < studentCount; i++) {
        char status[20];
        fscanf(fp, "%*s\t%d:%d\t%s",
               &students[i].startHour,
               &students[i].startMinute,
               status);
         
        if (strcmp(status, "在线中") == 0) {
            students[i].isOnline = 1;
            fscanf(fp, "%*f\n");
        } else {
            students[i].isOnline = 0;
            fscanf(fp, "%d:%d\t%lf\n",
                   &students[i].endHour,
                   &students[i].endMinute,
                   &students[i].cost);
        }
    }
     
    fclose(fp);
    printf("已从 %s 加载上机记录\n", filename);
}
 
// 添加初始化学生信息的函数
void initializeDefaultStudents() {
    // 预设的班级列表
    const char* classes[] = {"计算机1班", "计算机2班", "软件1班", "软件2班", "网络1班"};
    studentCount = 30;  // 设置为30名学生
     
    for (int i = 0; i < studentCount; i++) {
        // 生成学号 (例如: 2024001, 2024002, ...)
        sprintf(students[i].id, "2024%03d", i + 1);
         
        // 分配班级 (循环使用预设的班级)
        strcpy(students[i].className, classes[i % 5]);
         
        // 生成姓名 (例如: 学生1, 学生2, ...)
        sprintf(students[i].name, "学生%d", i + 1);
         
        // 设置上机时间 (8:00 到 17:00 之间随机分配)
        students[i].startHour = 8 + (i % 10);  // 8:00 到 17:00
        students[i].startMinute = (i * 2) % 60; // 0到58的偶数分钟
         
        // 初始状态都设为在线
        students[i].isOnline = 1;
        students[i].cost = 0.0;
    }
     
    printf("已初始化30名学生信息。\n");
     
    // 显示初始化的学生信息
    printf("\n初始化的学生信息如下:\n");
    printf("%-10s%-15s%-10s%-15s\n", "学号", "班级", "姓名", "上机时间");
    printf("----------------------------------------\n");
     
    for (int i = 0; i < studentCount; i++) {
        printf("%-10s%-15s%-10s%02d:%02d\n",
               students[i].id,
               students[i].className,
               students[i].name,
               students[i].startHour,
               students[i].startMinute);
    }
    printf("----------------------------------------\n");
}

  

 

posted @   财神给你送元宝  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示