假定某校有N各学生,系统可以根据学生每次上机时记录学号和上机时间,下机时自动计算费用。要求: (1)系统以菜单方式工作 (2)系统可以设置上机每小时的价格,默认为每小时1元, (3)系统可以输入功能N名学生的学号、专业,年级、姓名。 (4)计算功能:计算每个下机学生的上机费用,每小时1元。 (上机费用=上机时间* 价格 ,不足半小时按1小时的价格减半计算,超过半小时但不足一小时的按1小时计算) (5)查询功能:按条件(班级、学号、姓名)显示学生的上机时间。 (6)机器使用情况的显示(显示方式不限但要一目了然)用c语言简单表达
时间: 2023-12-23 11:02:16 浏览: 65
以下是一个简单的C语言程序实现上述要求:
```c
#include <stdio.h>
#include <string.h>
#define PRICE_PER_HOUR 1 // 每小时价格
typedef struct {
char id[10]; // 学号
char major[20]; // 专业
int grade; // 年级
char name[20]; // 姓名
} Student;
typedef struct {
char id[10]; // 学号
int start_time; // 上机开始时间
int end_time; // 下机结束时间
} Record;
int get_price(int minutes) {
int hours = (minutes + 29) / 60; // 四舍五入到小时
if (hours == 0) {
return PRICE_PER_HOUR / 2; // 不足半小时按半小时价格计算
} else if (minutes % 60 >= 30) {
return hours * PRICE_PER_HOUR; // 超过半小时但不足一小时按一小时计算
} else {
return (hours - 1) * PRICE_PER_HOUR + PRICE_PER_HOUR / 2; // 不足一小时按一小时计算
}
}
void add_student(Student students[], int *count) {
printf("请输入学号:");
scanf("%s", students[*count].id);
printf("请输入专业:");
scanf("%s", students[*count].major);
printf("请输入年级:");
scanf("%d", &students[*count].grade);
printf("请输入姓名:");
scanf("%s", students[*count].name);
(*count)++;
}
void add_record(Record records[], int *count, Student students[], int student_count) {
char id[10];
printf("请输入学号:");
scanf("%s", id);
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) { // 找到对应学生
printf("请输入上机开始时间(分钟):");
scanf("%d", &records[*count].start_time);
printf("请输入下机结束时间(分钟):");
scanf("%d", &records[*count].end_time);
strcpy(records[*count].id, id);
(*count)++;
return;
}
}
printf("未找到对应学生!\n");
}
void calculate_fee(Record records[], int count) {
printf("学号\t上机时间\t费用\n");
for (int i = 0; i < count; i++) {
int minutes = records[i].end_time - records[i].start_time;
int fee = get_price(minutes);
printf("%s\t%d\t\t%d\n", records[i].id, minutes, fee);
}
}
void query_record(Record records[], int count, Student students[], int student_count) {
char id[10];
printf("请输入查询学号:");
scanf("%s", id);
printf("学号\t姓名\t上机时间\n");
for (int i = 0; i < count; i++) {
if (strcmp(records[i].id, id) == 0) {
for (int j = 0; j < student_count; j++) {
if (strcmp(students[j].id, id) == 0) {
printf("%s\t%s\t%d\n", id, students[j].name, records[i].end_time - records[i].start_time);
break;
}
}
}
}
}
int main() {
Student students[100];
int student_count = 0;
Record records[1000];
int record_count = 0;
int choice = -1;
while (choice != 0) {
printf("请选择功能:\n");
printf("1. 添加学生\n");
printf("2. 添加上机记录\n");
printf("3. 计算费用\n");
printf("4. 查询记录\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student(students, &student_count);
break;
case 2:
add_record(records, &record_count, students, student_count);
break;
case 3:
calculate_fee(records, record_count);
break;
case 4:
query_record(records, record_count, students, student_count);
break;
case 0:
break;
default:
printf("无效选项!\n");
break;
}
}
return 0;
}
```
程序中使用了两个结构体,分别表示学生信息和上机记录。通过循环菜单实现了各种功能,其中计算费用和查询记录都需要遍历记录数组,逐个判断是否符合条件。程序只是一个最简单的示例,实际使用时需要根据需求进行修改和完善。
阅读全文