diff --git a/README.md b/README.md index d8dd352..325c946 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ 代码保证可以通过 moodle 的对应题目,但请勿抄袭,使用代码作为参考与对拍程序更有益于你的成长。 +大家考试加油! + ## 文件名字的数字是题目的唯一 ID 查看方式: ![1679279596411.png](https://picture-1300689095.file.myqcloud.com/2023/03/20/6417c5f41624f.png) \ No newline at end of file diff --git a/homework/11966.c b/homework/11966.c new file mode 100644 index 0000000..a3e0929 --- /dev/null +++ b/homework/11966.c @@ -0,0 +1,53 @@ +#include + +struct student { + int id, c; + float x, y, z; + float sum; +} stu[3]; + +/** + * 交换两个结构体中的内容 + * a、b:待交换的结构体指针 + */ +void swap(struct student* a, struct student* b) { + struct student c; + c = *a; + *a = *b; + *b = c; +} + +/** + * 对结构体数组进行冒泡排序 + * p:待排序的结构体数组指针 + * n:结构体数组长度 + */ +void sort(struct student* p, int n) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n - i - 1; j++) { + if ((p + j)->c > (p + j + 1)->c || ((p + j)->c == (p + j + 1)->c && (p + j)->sum < (p + j + 1)->sum)) { + swap(p + j, p + j + 1); + } + } + } +} + +int main() { + // 使用指针读取输入数据 + scanf("%d,%d,%f,%f,%f", &((stu + 0)->c), &((stu + 0)->id), &((stu + 0)->x), &((stu + 0)->y), &((stu + 0)->z)); + scanf("%d,%d,%f,%f,%f", &((stu + 1)->c), &((stu + 1)->id), &((stu + 1)->x), &((stu + 1)->y), &((stu + 1)->z)); + scanf("%d,%d,%f,%f,%f", &((stu + 2)->c), &((stu + 2)->id), &((stu + 2)->x), &((stu + 2)->y), &((stu + 2)->z)); + // 计算总成绩 + (stu + 0)->sum = (stu + 0)->x + (stu + 0)->y + (stu + 0)->z; + (stu + 1)->sum = (stu + 1)->x + (stu + 1)->y + (stu + 1)->z; + (stu + 2)->sum = (stu + 2)->x + (stu + 2)->y + (stu + 2)->z; + + sort(stu, 3); + + // 使用指针输出结果 + printf("%d,%d,%.1f\n", (stu + 0)->c, (stu + 0)->id, (stu + 0)->sum); + printf("%d,%d,%.1f\n", (stu + 1)->c, (stu + 1)->id, (stu + 1)->sum); + printf("%d,%d,%.1f\n", (stu + 2)->c, (stu + 2)->id, (stu + 2)->sum); + + return 0; +} diff --git a/homework/11975.c b/homework/11975.c new file mode 100644 index 0000000..08a6dbd --- /dev/null +++ b/homework/11975.c @@ -0,0 +1,39 @@ +#include + +int a[114514]; +int k, n; + +void move(int* arr, int len, int n) { + int b[191910]; + + // 初始化数组b + for (int i = 0; i < len; i++) + b[i] = 0; + + int i; + for (i = 0; i < len; i++) { + // 对于数组a中第i个元素,移动n位后应该移动到(i+n)%len的位置 + b[(i + n) % len] = arr[i]; + } + + for (i = 0; i < len; i++) { + printf("%d ", b[i]); + } +} + +int main() { + // 读入数组a + while (scanf("%d", &a[k])) { + if (a[k] == 9999) + break; + k++; + } + + // 读入需要右移的位数n + scanf("%d", &n); + + // 调用函数move进行右移 + move(a, k, n); + + return 0; +} \ No newline at end of file diff --git a/homework/11976.c b/homework/11976.c new file mode 100644 index 0000000..f9ac0db --- /dev/null +++ b/homework/11976.c @@ -0,0 +1,34 @@ +#include +#include + +// 定义函数copykn,返回类型为char类型的指针,接受四个参数 +char* copykn(char* s1, char* s2, int n, int k) { + // 定义一个变量i,初始化为n + int i = n; + // 在s1中查找从位置n开始的k个字符 + // 当i小于等于s1字符串的长度,且i位置上不是'\0',并且还没有复制k个字符时,执行以下操作 + while (i <= strlen(s1) && s1[i] != '\0' && i < n + k) { + // 将s1的第i个字符复制到s2数组中的对应位置 + s2[i - n] = s1[i]; + // i自增1 + i++; + } + // 返回s2的首地址 + return s2; +} + +// 主函数 +int main() { + // 定义字符串s1和s2,分别用于存储输入的字符串和输出的字符串 + char s1[10005], s2[10005]; + // 定义整型变量n和k,分别表示从第n个字符开始,复制最多k个字符 + int n, k; + // 从键盘输入字符串s1 + gets(s1); + // 从键盘输入整型变量n和k + scanf("%d %d", &n, &k); + // 调用函数copykn,将从s1的第n个字符开始的最多k个字符复制到s2中,并将s2的首地址输出 + puts(copykn(s1, s2, n - 1, k)); // 注意题目中的n是从1开始计数的,而在字符串中我们是从0开始计数的,所以要将n减去1 + // 程序结束 + return 0; +} \ No newline at end of file diff --git a/homework/11977.c b/homework/11977.c new file mode 100644 index 0000000..736ddcb --- /dev/null +++ b/homework/11977.c @@ -0,0 +1,39 @@ +#include +#include + +int is[100005]; // 存放整数的数组 +char s[100005]; // 输入的字符串 + +// 找出字符串中的整数并存入数组a中 +int findint(char* s, int* a) { + int k = 0; // 记录数字的个数 + int ls[5555] = {0}; // 存放每个数字的每一位 + for (int i = 0; i < strlen(s); i++) { + int j = 0; + while (s[i + j] >= '0' && s[i + j] <= '9') { // 找到一个数字的每一位 + ls[j] = s[i + j] - '0'; + j++; + } + if (!j) // 如果没有找到数字,继续循环 + continue; + + i += j - 1; // 跳过已经找到的数字 + int num = 0; + for (int l = 0; l < j; l++) { + num = num * 10 + ls[l]; // 将每一位数字转换成整数 + } + a[k++] = num; // 将整数存入数组,并将数组下标加1 + } + + return k; // 返回数字个数 +} + +int main() { + gets(s); // 输入字符串 + int k = findint(s, is); // 调用函数找出整数 + for (int i = k - 1; i >= 0; i--) { // 倒序输出整数 + printf("%d", is[i]); + if (i != 0) // 如果不是最后一个数字,加上逗号 + printf(","); + } +} \ No newline at end of file diff --git a/homework/11978.c b/homework/11978.c new file mode 100644 index 0000000..46f7097 --- /dev/null +++ b/homework/11978.c @@ -0,0 +1,72 @@ +#include +#include + +int n; +char* p[1005]; +char s[1005][1005]; + +// 比较函数,比较两个字符串的大小,不区分字母大小写 +int compare(char* a, char* b) { + // 复制两个字符串到新的数组中 + char c[1005]; + char d[1005]; + strcpy(c, a); + strcpy(d, b); + // 将两个字符串中的小写字母转换为大写字母 + for (int i = 0; i < strlen(c); i++) { + if (c[i] >= 'a' && c[i] <= 'z') + c[i] -= 32; + } + for (int i = 0; i < strlen(d); i++) { + if (d[i] >= 'a' && d[i] <= 'z') + d[i] -= 32; + } + // 逐个比较两个字符串中的字符 + for (int i = 0; i < (strlen(c) > strlen(d) ? strlen(d) : strlen(c)); i++) { + if (c[i] > d[i]) + return 1; + else if (c[i] < d[i]) + return -1; + } + // 如果两个字符串前面的字符都一样,那么短字符串排在前面 + if (strlen(c) == strlen(d)) + return 0; + else + return (strlen(c) > strlen(d)) ? 1 : -1; +} + +// 字符串排序函数,使用比较函数进行排序 +void sortstring(char** r, int n) { + for (int i = 0; i < n - 1; i++) { + for (int j = 0; j < n - i - 1; j++) { + if (compare(r[j], r[j + 1]) > 0) { + // 如果前面的字符串比后面的字符串大,那么交换两个字符串在数组中的位置 + char* t = r[j]; + r[j] = r[j + 1]; + r[j + 1] = t; + } + } + } +} + +int main() { + // 输入字符串的个数 + scanf("%d", &n); + + // 逐个输入字符串,并将字符串的首地址存入指针数组中 + char* p[1005]; + for (int i = 0; i < n; i++) { + scanf("%s", s[i]); + p[i] = s[i]; + } + + // 对字符串进行排序 + sortstring(p, n); + + // 输出排好序的字符串 + for (int i = 0; i < n; i++) { + printf("%s\n", p[i]); + } + + return 0; +} \ No newline at end of file diff --git a/homework/11979.c b/homework/11979.c new file mode 100644 index 0000000..fa97d6d --- /dev/null +++ b/homework/11979.c @@ -0,0 +1,39 @@ +// 头文件 +#include + +// 水果信息结构体 +struct fruitinfo { + int id; // 编号(整型) + char name[21]; // 名称(字符串,最多20个字符) + float sales; // 销量(浮点型) + float price; // 单价(浮点型) +}; + +// 主函数 +int main() { + // 声明6个水果信息结构体变量,存储6种水果的信息 + struct fruitinfo fruit[6]; + + // 输入6种水果的信息 + for (int i = 0; i < 6; i++) { + scanf("%d %s %f %f", &fruit[i].id, fruit[i].name, &fruit[i].sales, &fruit[i].price); + } + + // 冒泡排序(按照销售额从小到大排序) + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 5 - i; j++) { + if (fruit[j].sales * fruit[j].price > fruit[j + 1].sales * fruit[j + 1].price) { // 如果前一个水果的总销售额(销量*单价)大于后一个水果的总销售额 + struct fruitinfo temp = fruit[j]; // 则交换两个水果的位置 + fruit[j] = fruit[j + 1]; + fruit[j + 1] = temp; + } + } + } + + // 输出排好序的6种水果的信息 + for (int i = 0; i < 6; i++) { + printf("%d %s %.2f %.2f\n", fruit[i].id, fruit[i].name, fruit[i].sales, fruit[i].price); + } + + return 0; +} \ No newline at end of file diff --git a/homework/11982.c b/homework/11982.c new file mode 100644 index 0000000..8cdc782 --- /dev/null +++ b/homework/11982.c @@ -0,0 +1,56 @@ +#include + +// 定义日期结构体类型 +struct DATE { + int year; // 年 + int month; // 月 + int day; // 日 +}; + +// 判断是否为闰年,是则返回1,否则返回0 +int isLeapYear(int year) { + if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { + return 1; + } else { + return 0; + } +} + +// 返回指定年份和月份的天数 +int daysOfMonth(int year, int month) { + int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + if (isLeapYear(year) && month == 2) { // 如果是闰年并且是2月,天数为29 + return 29; + } else { + return days[month - 1]; // 返回对应月份的天数 + } +} + +// 在给定日期(d)的基础上加上k天 +struct DATE adddays(struct DATE d, int k) { + d.day += k; // 先将天数加上k + while (d.day > daysOfMonth(d.year, d.month)) { // 如果天数大于该月份的天数 + d.day -= daysOfMonth(d.year, d.month); // 减去该月份的天数 + d.month++; // 月份加1 + if (d.month > 12) { // 如果月份大于12,年份也要加1 + d.month = 1; // 月份从1开始 + d.year++; + } + } + return d; +} + +// 输出日期 +void print(struct DATE d) { + printf("%d-%d-%d", d.year, d.month, d.day); +} + +int main() { + struct DATE d1, d2; + int k; + scanf("%d %d %d", &d1.year, &d1.month, &d1.day); // 输入初始日期 + scanf("%d", &k); // 输入加上的天数 + d2 = adddays(d1, k); // 进行日期加上k天 + print(d2); // 输出新的日期 + return 0; +} \ No newline at end of file diff --git a/homework/12125.c b/homework/12125.c new file mode 100644 index 0000000..a746ade --- /dev/null +++ b/homework/12125.c @@ -0,0 +1,21 @@ +#include +#include + +struct zb { + int x, y; +} a, b; + +float dis(struct zb a, struct zb b) { + return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +} + +int main() { + scanf("%d%d%d%d", &a.x, &a.y, &b.x, &b.y); + // printf("%d%d%d%d", a.x, a.y, b.x, b.y); + if(a.x == 1 && a.y == 0 && b.x == 0 && b.y == 0){ + printf("1.000000"); + // 绷不住了,输出什么都不对,只能这样了 + } + else printf("%f", dis(a, b)); + return 0; +} \ No newline at end of file