更新作业

This commit is contained in:
Luthics 2023-04-24 14:29:25 +08:00
parent 5832c427f9
commit 406d2a973d
9 changed files with 355 additions and 0 deletions

View File

@ -4,6 +4,8 @@
代码保证可以通过 moodle 的对应题目,但请勿抄袭,使用代码作为参考与对拍程序更有益于你的成长。 代码保证可以通过 moodle 的对应题目,但请勿抄袭,使用代码作为参考与对拍程序更有益于你的成长。
大家考试加油!
## 文件名字的数字是题目的唯一 ID ## 文件名字的数字是题目的唯一 ID
查看方式: 查看方式:
![1679279596411.png](https://picture-1300689095.file.myqcloud.com/2023/03/20/6417c5f41624f.png) ![1679279596411.png](https://picture-1300689095.file.myqcloud.com/2023/03/20/6417c5f41624f.png)

53
homework/11966.c Normal file
View File

@ -0,0 +1,53 @@
#include <stdio.h>
struct student {
int id, c;
float x, y, z;
float sum;
} stu[3];
/**
*
* ab
*/
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;
}

39
homework/11975.c Normal file
View File

@ -0,0 +1,39 @@
#include <stdio.h>
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;
}

34
homework/11976.c Normal file
View File

@ -0,0 +1,34 @@
#include <stdio.h>
#include <string.h>
// 定义函数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;
}

39
homework/11977.c Normal file
View File

@ -0,0 +1,39 @@
#include <stdio.h>
#include <string.h>
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(",");
}
}

72
homework/11978.c Normal file
View File

@ -0,0 +1,72 @@
#include <stdio.h>
#include <string.h>
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;
}

39
homework/11979.c Normal file
View File

@ -0,0 +1,39 @@
// 头文件
#include <stdio.h>
// 水果信息结构体
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;
}

56
homework/11982.c Normal file
View File

@ -0,0 +1,56 @@
#include <stdio.h>
// 定义日期结构体类型
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;
}

21
homework/12125.c Normal file
View File

@ -0,0 +1,21 @@
#include <math.h>
#include <stdio.h>
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;
}