实验六

task4

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 #define N 10
  5 
  6 typedef struct {
  7     char isbn[20];          // ISBN号
  8     char name[80];          // 书名
  9     char author[80];        // 作者
 10     double sales_price;     // 售价
 11     int  sales_count;       // 销售册数
 12 } Book;
 13 
 14 // 函数声明
 15 void output(Book x[], int n);
 16 void sort(Book x[], int n);
 17 double sales_amount(Book x[], int n);
 18 int validate_book(Book *book);
 19 
 20 int main() {
 21     // 初始化图书数据
 22     Book x[N] = {{"978-7-5327-6082-4", "门将之死", "罗纳德.伦", 42, 51},
 23                  {"978-7-308-17047-5", "自由与爱之地:入以色列记", "云也退", 49 , 30},
 24                  {"978-7-5404-9344-8", "伦敦人", "克莱格泰勒", 68, 27},
 25                  {"978-7-5447-5246-6", "软件体的生命周期", "特德姜", 35, 90},
 26                  {"978-7-5722-5475-8", "芯片简史", "汪波", 74.9, 49},
 27                  {"978-7-5133-5750-0", "主机战争", "布莱克.J.哈里斯", 128, 42},
 28                  {"978-7-2011-4617-1", "世界尽头的咖啡馆", "约翰·史崔勒基", 22.5, 44},
 29                  {"978-7-5133-5109-6", "你好外星人", "英国未来出版集团", 118, 42},
 30                  {"978-7-1155-0509-5", "无穷的开始:世界进步的本源", "戴维·多伊奇", 37.5, 55},
 31                  {"978-7-229-14156-1", "源泉", "安.兰德", 84, 59}};
 32     
 33     // 验证数据
 34     for (int i = 0; i < N; i++) {
 35         if (!validate_book(&x[i])) {
 36             printf("警告: 第 %d 本图书数据无效\n", i+1);
 37         }
 38     }
 39 
 40     printf("图书销量排名(按销售册数从高到低): \n");
 41     
 42     // 排序前输出原始数据
 43     printf("\n排序前的数据:\n");
 44     output(x, N);
 45     
 46     // 执行排序
 47     sort(x, N);
 48     
 49     // 排序后输出结果
 50     printf("\n排序后的结果:\n");
 51     output(x, N);
 52 
 53     // 计算并输出销售总额
 54     printf("\n图书销售总额: %.2f 元\n", sales_amount(x, N));
 55 
 56     return 0;
 57 }
 58 
 59 // 输出图书信息
 60 void output(Book x[], int n) {
 61     printf("| ISBN号                         | 书名                                  | 作者                         | 售价(元)  | 销售册数    |\n");
 62     
 63     for (int i = 0; i < n; i++) {
 64         printf("| %-30s | %-35s | %-28s | %9.2f | %11d |\n", 
 65                x[i].isbn, x[i].name, x[i].author, x[i].sales_price, x[i].sales_count);
 66     }
 67 }
 68 
 69 // 按销售册数降序排序(冒泡排序)
 70 void sort(Book x[], int n) {
 71     int i, j;
 72     Book temp;
 73     int swap_count = 0;  // 记录交换次数
 74     
 75     printf("\n开始排序...\n");
 76     
 77     for (i = 0; i < n-1; i++) {
 78         for (j = 0; j < n-i-1; j++) {
 79             if (x[j].sales_count < x[j+1].sales_count) {
 80                 // 交换两本书的位置
 81                 temp = x[j];
 82                 x[j] = x[j+1];
 83                 x[j+1] = temp;
 84                 swap_count++;
 85             }
 86         }
 87     }
 88     
 89     printf("排序完成,共进行了 %d 次交换\n", swap_count);
 90 }
 91 
 92 // 计算销售总额
 93 double sales_amount(Book x[], int n) {
 94     int i;
 95     double total = 0;
 96     
 97     for (i = 0; i < n; i++) {
 98         total += x[i].sales_price * x[i].sales_count;
 99     }
100     
101     return total;
102 }
103 
104 // 验证图书数据有效性
105 int validate_book(Book *book) {
106     if (book->sales_price <= 0) {
107         return 0;  // 售价必须大于0
108     }
109     
110     if (book->sales_count < 0) {
111         return 0;  // 销售册数不能为负数
112     }
113     
114     return 1;  // 数据有效
115 }
View Code

 

task5

  1 #include <stdio.h>
  2 
  3 typedef struct {
  4     int year;
  5     int month;
  6     int day;
  7 } Date;
  8 
  9 // 函数声明
 10 void input(Date *pd);                   // 输入日期
 11 int day_of_year(Date d);                // 计算日期是该年的第几天
 12 int compare_dates(Date d1, Date d2);    // 比较两个日期
 13 
 14 // 输入日期函数
 15 void input(Date *pd) {
 16     printf("请输入日期 (格式: YYYY-MM-DD): ");
 17     scanf("%d-%d-%d", &pd->year, &pd->month, &pd->day);
 18 }
 19 
 20 // 计算日期是该年的第几天
 21 int day_of_year(Date d) {
 22     // 每个月的天数(非闰年)
 23     int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 24     int sum = 0;
 25     int i;
 26 
 27     // 判断是否为闰年
 28     int is_leap = 0;
 29     if ((d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0)) {
 30         is_leap = 1;
 31     }
 32 
 33     // 如果是闰年且月份大于2月,总天数加1
 34     if (is_leap && d.month > 2) {
 35         sum += 1;
 36     }
 37 
 38     // 累加前几个月的天数
 39     for (i = 1; i < d.month; i++) {
 40         sum += days[i];
 41     }
 42 
 43     // 加上当月的天数
 44     sum += d.day;
 45 
 46     return sum;
 47 }
 48 
 49 // 比较两个日期
 50 int compare_dates(Date d1, Date d2) {
 51     // 先比较年份
 52     if (d1.year < d2.year) {
 53         return -1;
 54     } else if (d1.year > d2.year) {
 55         return 1;
 56     }
 57 
 58     // 年份相同,比较月份
 59     if (d1.month < d2.month) {
 60         return -1;
 61     } else if (d1.month > d2.month) {
 62         return 1;
 63     }
 64 
 65     // 月份相同,比较日期
 66     if (d1.day < d2.day) {
 67         return -1;
 68     } else if (d1.day > d2.day) {
 69         return 1;
 70     }
 71 
 72     // 年月日都相同
 73     return 0;
 74 }
 75 
 76 // 测试1:输入日期,计算是该年的第几天
 77 void test1() {
 78     Date d;
 79     int i;
 80 
 81     printf("\n测试1: 输入日期, 打印输出这是一年中第多少天\n");
 82     for (i = 0; i < 3; i++) {
 83         input(&d);
 84         printf("%d-%02d-%02d 是这一年的第 %d 天\n\n", 
 85                d.year, d.month, d.day, day_of_year(d));
 86     }
 87 }
 88 
 89 // 测试2:比较两个人的年龄
 90 void test2() {
 91     Date Alice_birth, Bob_birth;
 92     int i;
 93     int result;
 94 
 95     printf("\n测试2: 比较两个人的年龄大小\n");
 96     for (i = 0; i < 3; i++) {
 97         printf("输入Alice的出生日期: ");
 98         input(&Alice_birth);
 99         
100         printf("输入Bob的出生日期: ");
101         input(&Bob_birth);
102 
103         result = compare_dates(Alice_birth, Bob_birth);
104 
105         if (result == 0) {
106             printf("Alice和Bob一样大\n\n");
107         } else if (result == -1) {
108             printf("Alice比Bob大\n\n");
109         } else {
110             printf("Alice比Bob小\n\n");
111         }
112     }
113 }
114 
115 int main() {
116     printf("日期处理程序\n");
117     printf("====================\n");
118 
119     test1();
120     test2();
121 
122     printf("程序运行结束\n");
123     return 0;
124 }
View Code

 

task6

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 // 定义账户类型的枚举
 5 enum Role {admin, student, teacher};
 6 
 7 // 定义账户结构体
 8 typedef struct {
 9     char username[20];  // 用户名
10     char password[20];  // 密码
11     enum Role type;     // 账户类型
12 } Account;
13 
14 // 函数声明
15 void output(Account x[], int n);    // 输出账户信息,密码用*替代显示
16 
17 int main() {
18     // 初始化账户数组
19     Account x[] = {{"A1001", "123456", student},
20                    {"A1002", "123abcdef", student},
21                    {"A1009", "xyz12121", student},
22                    {"X1009", "9213071x", admin},
23                    {"C11553", "129dfg32k", teacher},
24                    {"X3005", "921kfmg917", student}};
25     
26     // 计算账户数量
27     int n = sizeof(x) / sizeof(Account);
28     
29     // 输出账户信息
30     printf("账户列表信息:\n");
31     printf("------------------------\n");
32     output(x, n);
33     
34     return 0;
35 }
36 
37 // 输出账户信息,密码用*替代显示
38 void output(Account x[], int n) {
39     int i, j;
40     
41     // 遍历账户数组
42     for (i = 0; i < n; i++) {
43         // 输出用户名
44         printf("用户名: %s    ", x[i].username);
45         
46         // 输出与密码长度相同的*
47         int len = strlen(x[i].password);
48         printf("密码: ");
49         for (j = 0; j < len; j++) {
50             printf("*");
51         }
52         
53         // 输出账户类型
54         printf("    类型: ");
55         switch (x[i].type) {
56             case admin:
57                 printf("管理员\n");
58                 break;
59             case student:
60                 printf("学生\n");
61                 break;
62             case teacher:
63                 printf("教师\n");
64                 break;
65             default:
66                 printf("未知类型\n");
67         }
68     }
69 }
View Code

 

task7

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 typedef struct {
  5     char name[20];      // 姓名
  6     char phone[12];     // 手机号
  7     int  vip;           // 是否为紧急联系人,1表示是,0表示否
  8 } Contact;
  9 
 10 // 函数声明
 11 void set_vip_contact(Contact x[], int n, char name[]);  // 设置紧急联系人
 12 void output(Contact x[], int n);    // 输出联系人信息
 13 void display(Contact x[], int n);   // 排序并显示联系人信息
 14 
 15 #define N 10
 16 
 17 int main() {
 18     // 初始化通讯录
 19     Contact list[N] = {{"刘一", "15510846604", 0},
 20                        {"陈二", "18038747351", 0},
 21                        {"张三", "18853253914", 0},
 22                        {"李四", "13230584477", 0},
 23                        {"王五", "15547571923", 0},
 24                        {"赵六", "18856659351", 0},
 25                        {"周七", "17705843215", 0},
 26                        {"孙八", "15552933732", 0},
 27                        {"吴九", "18077702405", 0},
 28                        {"郑十", "18820725036", 0}};
 29     
 30     int vip_cnt, i;
 31     char name[20];
 32 
 33     // 显示原始通讯录
 34     printf("显示原始通讯录信息:\n");
 35     printf("--------------------------------\n");
 36     output(list, N);
 37 
 38     // 设置紧急联系人
 39     printf("\n输入要设置的紧急联系人个数: ");
 40     scanf("%d", &vip_cnt);
 41 
 42     printf("输入%d个紧急联系人姓名:\n", vip_cnt);
 43     for (i = 0; i < vip_cnt; i++) {
 44         scanf("%s", name);
 45         set_vip_contact(list, N, name);
 46     }
 47 
 48     // 显示排序后的通讯录
 49     printf("\n显示通讯录列表:(按姓名字典序升序排列,紧急联系人最先显示)\n");
 50     printf("--------------------------------\n");
 51     display(list, N);
 52 
 53     return 0;
 54 }
 55 
 56 // 设置紧急联系人
 57 void set_vip_contact(Contact x[], int n, char name[]) {
 58     int i;
 59     
 60     for (i = 0; i < n; i++) {
 61         if (strcmp(x[i].name, name) == 0) {
 62             x[i].vip = 1;  // 标记为紧急联系人
 63             printf("%s 已被设置为紧急联系人\n", name);
 64             return;  // 找到后立即返回
 65         }
 66     }
 67     
 68     // 如果没找到该联系人
 69     printf("未找到名为 %s 的联系人\n", name);
 70 }
 71 
 72 // 按要求排序并显示联系人信息
 73 void display(Contact x[], int n) {
 74     Contact temp;
 75     int i, j;
 76     
 77     // 冒泡排序:紧急联系人优先,然后按姓名字典序
 78     for (i = 0; i < n - 1; i++) {
 79         for (j = 0; j < n - i - 1; j++) {
 80             // 如果前一个不是紧急联系人而后一个是,交换它们
 81             if (x[j].vip < x[j+1].vip) {
 82                 temp = x[j];
 83                 x[j] = x[j+1];
 84                 x[j+1] = temp;
 85             }
 86             // 如果都是紧急联系人或者都不是,按姓名字典序比较
 87             else if (x[j].vip == x[j+1].vip) {
 88                 if (strcmp(x[j].name, x[j+1].name) > 0) {
 89                     temp = x[j];
 90                     x[j] = x[j+1];
 91                     x[j+1] = temp;
 92                 }
 93             }
 94         }
 95     }
 96     
 97     // 输出排序后的联系人列表
 98     printf("姓名        电话            紧急联系人\n");
 99     printf("--------------------------------\n");
100     for (i = 0; i < n; i++) {
101         printf("%-10s%-15s", x[i].name, x[i].phone);
102         if (x[i].vip) {
103             printf("    *\n");
104         } else {
105             printf("\n");
106         }
107     }
108 }
109 
110 // 输出联系人信息
111 void output(Contact x[], int n) {
112     int i;
113     
114     printf("姓名        电话            紧急联系人\n");
115     printf("--------------------------------\n");
116     
117     for (i = 0; i < n; i++) {
118         printf("%-10s%-15s", x[i].name, x[i].phone);
119         if (x[i].vip) {
120             printf("    *\n");
121         } else {
122             printf("\n");
123         }
124     }
125 }
View Code

 

posted @ 2025-06-02 21:02  西嘻哈  阅读(9)  评论(0)    收藏  举报