写在开头:
此文章仅供学习交流使用,我也是刚学c语言的菜鸟,代码写的一坨,请勿直接抄袭,请勿直接抄袭,请勿直接抄袭,大家共同进步!!!(虽然但是代码块右上角有一键复制,但那是给你复制到编译器测试用的)
做题网站传送门:C语言程序设计_杭州电子科技大学_中国大学MOOC(慕课) (icourse163.org)
注意:
在第五章数组作业中我的答案用到了变长数组(用变量定义数组),可以通过MOOC的OJ,但一些编译器可能会出现错误(如Visual Studio 2022等),可以将其修改为静态数组(将定义数组的变量换位一个可能出现的最大值)。
第一章编程作业
1
本题要求编写程序,输出一个短句“Welcome to HDU!”。(10分)
题目内容:
本题要求编写程序,输出一个短句“Welcome to HDU!”。
输入格式:
本题目没有输入。
输出格式:
在一行中输出短句“Welcome to HDU!”(引号无需输出)。
#include <stdio.h> int main(){ printf("Welcome to HDU!"); return 0; }
2
输入两个整数,计算、输出两数之和。(10分)
题目内容:
输入两个整数,计算、输出两数之和。
输入格式:
输入一行,包含用空格分隔的两个整数(32位int整数)。
输出格式:
输出一个整数,表示两数之和(32位int整数)。
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); printf("%d", a + b); return 0; }
3
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。现给定某人身高,请你计算其标准体重应该是多少?(10分)
题目内容:
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。现给定某人身高,请你计算其标准体重应该是多少?
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为公斤,保留小数点后1位。
#include <stdio.h> int main() { int H; double W; scanf("%d", &H); W = (H - 100) * 0.9; printf("%.1lf", W); return 0; }
第二章编程作业
1
请编写程序,输入三角形的底 和高 ,计算并输出三角形的面积。(10分)
题目内容:
请编写程序,输入三角形的底 和高 ,计算并输出三角形的面积。
输入格式
一行包含两个正实数,空格分隔,表示底和高
输出格式
一个实数,2 位小数
#include <stdio.h> int main() { float a, h; scanf("%f %f", &a, &h); printf("%.2f", a * h / 2); return 0; }
2
本题要求编写程序,计算并输出2个正整数的和、差、积。题目保证输入和输出全部在整型范围内。(10分)
题目内容:
本题要求编写程序,计算并输出2个正整数的和、差、积。题目保证输入和输出全部在整型范围内。
输入格式:
输入在一行中给出2个正整数A和B。
输出格式:
分行按照格式“A 运算符 B = 结果”顺序输出和、差、积。
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); printf("%d+%d=%d\n", a, b, a + b); printf("%d-%d=%d\n", a, b, a - b); printf("%d*%d=%d\n", a, b, a * b); return 0; }
3
阿福打算向朋友借钱,请输入一个浮点数m和一个整数n,分别表示他想借的钱数和借期,程序输出他的意图。(10分)
题目内容:
阿福打算向朋友借钱,请输入一个浮点数m和一个整数n,分别表示他想借的钱数和借期,程序输出他的意图。
输入格式:
输入在一行中给出1个浮点数和1个整数,二者均大于0。
输出格式:
输出的钱数保留两位小数,格式如下所示:
你好,可以借我XX.XX元钱吗?
X天后一定还!
#include <stdio.h> int main() { double m; int n; scanf("%lf %d", &m, &n); printf("你好,可以借我%.2lf元钱吗?\n%d天后一定还!",m, n); return 0; }
第三章编程作业
1
判断闰年(10分)
题目内容:
输入年份判断该年份是否是闰年。闰年的判定条件是能被400整除
或能被4整除但不能被100整除的年份。
输入格式:
输入年份,判断其是否闰年。
输出格式:
YES 或 NO
#include <stdio.h> int main() { int year; scanf("%d", &year); if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { printf("YES"); } else { printf("NO"); } }
2
移花接木(10分)
题目内容:
输入两个浮点数,将第二个数的小数部分拼接到第一个数的整数部分,
将第一个数的小数部分拼接到第二个数的整数部分。然后输出新生成的浮点数。
输入格式:
输入两个浮点数。(注意可能有负数)
输出格式:
输出新生成的两个浮点数。(输出保留6位小数)
#include <stdio.h> int main() { double num1, num2; int int_part1, int_part2; double f_part1, f_part2; double new_num1, new_num2; scanf("%lf %lf", &num1, &num2); int_part1 = (int)num1; f_part1 = num1 - int_part1; int_part2 = (int)num2; f_part2 = num2 - int_part2; if (int_part1 * f_part2>=0){ new_num1 = int_part1 + f_part2; } else{ new_num1 = int_part1 - f_part2; } if (int_part2 * f_part1 >= 0) { new_num2 = int_part2 + f_part1; } else { new_num2 = int_part2 - f_part1; } printf("%.6lf %.6lf\n", new_num1, new_num2); return 0; }
3
三目运算(10分)
题目内容:
输入四个浮点数,只用三目运算符(不能用if等条件语句或循环语句),
找出其中的最大值和最小值。
输入格式:
第一行输入四个数值;
输出格式:
最大值 最小值(结果保留两位小数).
#include <stdio.h> int main() { double a[4]; int n = 4; for (int i = 0; i < n; i++) { scanf("%lf", &a[i]); } double max = a[0], min = a[0]; for (int i = 1; i < n; i++) { max = a[i] > max ? a[i] : max; } for (int i = 1; i < n; i++) { min = a[i] < min ? a[i] : min; } printf("%.2lf %.2lf", max, min); return 0; }
第四章编程作业
1
阿福家的电费(10分)
题目内容:
入秋了,家里的用电量也减少了许多。阿福收到了新一期的电费通知单,却发现本期电费与高温天的电费不相上下。杭州现行的阶梯电价是按照年用电量来划分的,这说明阿福家的低价电额度已用完,接下来可得节约用电咯。阿福想自己验证一下,今年以来代扣的总电费到底是否正确。请编写一个程序,已知今年1月份以来的各月用电量,根据电价规定,计算出今年应缴的总电费是多少。
杭州现行的阶梯电价标准分三档:
第一档:电量为年用电量2760度及以下部分,电价不作调整,标准电价为0.538元/度;
第二档:电量为年用电量2761至4800度的部分,电价在第一档基础上加价0.05元,为0.588元/度;
第三档:电量超过4800的部分,电价在第一档基础上加价0.3元,为0.838元/度。
输入格式:
输入占一行,给出若干个整数(以输入-1表示结束),分别表示从1月开始各个月份的用电量(单位是度),注意:-1不算用电量。
输出格式:
输出总电费(单位是元),结果保留1位小数。
#include <stdio.h> int main() { int useage, total_useage = 0, j = 0; double total_cost = 0.0; // 读取并计算总电费 do { scanf("%d", &useage); total_useage += useage; j++; } while (useage != -1); total_useage += 1; // 计算费用 if (total_useage == 0) { total_cost = 0; } else if (total_useage <= 2760) { total_cost = total_useage * 0.538; } else if (total_useage <= 4800) { total_cost = 2760 * 0.538 + (total_useage - 2760) * 0.588; } else { total_cost = 2760 * 0.538 + (4800 - 2760) * 0.588 + (total_useage - 4800) * 0.838; } printf("%.1f\n", total_cost); return 0; }
2
幂级数求近似值(10分)
题目内容:
已知函数。。的幂级数展开式为。。。 。现给定一个实数x 和一个整数n ,利用此幂级数展开式的前n+1项之和,求。。 的近似值。
输入格式:
输入在一行中给出一个实数 x 和一个整数n。
输出格式:
输出展开式的前n+1项之和,保留4位小数。
// 泰勒级数展开 #include <stdio.h> // 计算阶乘 // double factorial(int n) // { // double result = 1.0; // for (int i = 1; i <= n; i++) // { // result *= i; // } // return result; // } int main() { double x, sum = 1.0, term = 1.0; int n; scanf("%lf %d", &x, &n); for (int i = 1; i <= n; i++) { term *= x / i; sum += term; } printf("%.4lf\n", sum); return 0; }
3
素数口袋(10分)
题目内容:
阿福有一个口袋,可以用来装各个素数。他从2开始,依次判断各个自然数是不是素数,如果是素数就把这个数字装入口袋。口袋的承载量就是包里所有数字之和,但口袋的承载量有限。假设口袋的承载量是L,表示只能装得下总和不超过L的素数。现给出一个正整数L,请问口袋里能装下几个素数?将这些素数从小到大输出,再输出最多能装下的素数个数。
输入格式:
输入一个正整数L(2<=L<=10000),表示最大承载量。
输出格式:
输出包括两行,第一行从小到大输出能装下的所有素数,数与数之间用空格隔开(注意:行末无空格)。
第二行输出"count = 素数个数"。
#include <stdio.h> #include <stdbool.h> int arr[10000]; int ss(int num) { for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return false; } } return true; } int main() { int num = 2, L, sum = 0, cnt = 0; scanf("%d", &L); while (1) { if (ss(num)) { sum += num; if (sum <= L) { arr[cnt] = num; cnt++; } else { break; } } num++; } for (int i = 0; i < cnt - 1; i++) { printf("%d ", arr[i]); } printf("%d\n", arr[cnt - 1]); printf("count = %d", cnt); return 0; }
第五章编程作业
1
支撑数(10分)
题目内容:
找出一个数列中全部的“支撑数”。
“支撑数”有这样的特征:它们不在第一个,也不在最后一个,而且比左边和右边相邻的数都大。
输入格式:
第一行输入一个整数n,表示数列中有n个整数。(3<=n<=100)
第二行输入n个整数。
输出格式:
分行输出所有的支撑数,每行输出一个支撑数(保证至少有一个)。
#include <stdio.h> int main() { int n; scanf("%d", &n); int arr[n]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (int i = 1; i < n - 1; i++) { if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) { printf("%d\n", arr[i]); } } return 0; }
2
上三角矩阵(10分)
题目内容:
上三角矩阵指主对角线以下的元素都为0的矩阵(不包括主对角线);主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数N(2≤N≤10)。
随后N行,每行给出N个整数,其间以空格分隔。
输出格式:
如果输入的矩阵是上三角矩阵,输出YES,否则输出NO。
#include <stdio.h> int main() { int N; scanf("%d", &N); int arr[N][N]; int flag = 1; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &arr[i][j]); } } for (int i = 1; i < N; i++) { for (int j = 0; j < i; j++) { if (arr[i][j] != 0) { flag = 0; break; } } if (!flag) { break; } } if (flag) { printf("YES\n"); } else { printf("NO\n"); } return 0; }
3
按绝对值排序(10分)
题目内容:
输入n(n<=100)个整数,按照绝对值从大到小排序后输出
输入格式:
输入数据的第一个数字为n,接着是n个整数。
输出格式:
按照绝对值从大到小排序后输出n个整数,两数之间空格隔开,最后一个数后面无空格。
#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d", &n); int arr[n]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } // 冒泡排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (abs(arr[j]) < abs(arr[j + 1])) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } for (int i = 0; i < n; i++) { if (i > 0) { printf(" "); } printf("%d", arr[i]); } printf("\n"); return 0; }
第六章编程作业
1
判断是否为完数。(10分)
题目内容:
编写函数,判断一个正整数a是否为完数,如果是完数,函数返回值为1;否则为0.(完数:一个数的所有因子之和等于该本身,如6、28都是完数;6=1+2+3; 28=1+2+4+7+14)
输入格式:
输入一个正整数。
输出格式:
如果是,输出“是完数”,否则输出“不是完数”
#include <stdio.h> // 判断是否为完数的函数 int judge(int a) { int sum = 0; // 找因子并求和 for (int i = 1; i <= a / 2; i++) { if (a % i == 0) { sum += i; } } if (sum == a) { return 1; } else { return 0; } } int main() { int a; scanf("%d", &a); if (judge(a)) { printf("是完数\n"); } else { printf("不是完数\n"); } return 0; }
2
递归求Fabonacci数列(10分)
题目内容:
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
题目保证输入输出在长整型范围内。建议用递归实现.
输入格式:
输入一个正整数n
输出格式:
输出f(n)的值。
#include <stdio.h> // 递归函数求斐波那契数列的第n项 int fibonacci(int n) { if (n == 1 || n == 2) { return 1; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; scanf("%d", &n); int result = fibonacci(n); printf("%d\n", result); return 0; }
3
输出一个整数的逆序数(10分)
题目内容:
实现一个求整数的逆序数的简单函数。
输入格式:
输入一个整数(可正可负)。
输出格式:
输出它的逆序,注意考虑正负。
#include <stdio.h> int reverse(int number); int main() { int n; scanf("%d", &n); printf("%d\n", reverse(n)); return 0; } int reverse(int number) { int re_num = 0; int a = number; if (number < 0) { a *= -1; } while (a > 0) { re_num = re_num * 10 + a % 10; a /= 10; } if (number < 0) { re_num *= -1; } return re_num; }
第七章编程作业
1
删除数列中的指定数(10分)
题目内容:
请使用指针的方法编写程序,程序的功能是先输入10个整数存储到数组a中,再输入一个指定的数x,把数组中的x数据删除掉,并保证数组中剩余的数还是连续存储的。
比如输入10个整数:3 2 8 6 5 8 7 9 8 5,存入数组,然后输入一个数8,把数组中的8全部删除。最后数组中剩下的数:3 2 6 5 7 9 5,在数组a中还是连续存储的。
要求定义函数实现删除功能:int del_num(int *p, int n, int x);其中函数的返回值为删除指定数后数组中剩余数据的个数。
输入格式:
输入10个整数,和1个指定数。
输出格式:
输出剩余数,以空格隔开,最后一个数后面没有空格。
#include <stdio.h> // 删除指定元素的函数 int del_num(int *p, int n, int x) { int *q = p; // q指向数组的开头 int *end = p + n; // 指向数组的末尾 // 遍历数组 while (q < end) { if (*q == x) { // 如果当前元素是要删除的元素 // 将后续元素向前移动一位 int *temp = q; while (temp < end - 1) { *temp = *(temp + 1); temp++; } end--; // 数组有效长度减1 } else { q++; // 继续检查下一个元素 } } return end - p; // 返回删除后的数组长度 } int main() { int a[10]; int x; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } scanf("%d", &x); int new_length = del_num(a, 10, x); for (int i = 0; i < new_length; i++) { if (i > 0) { printf(" "); } printf("%d", a[i]); } printf("\n"); return 0; }
2
求一组数中的最大值、最小值及总和。(10分)
题目内容:
求一组数中的最大值、最小值及总和。要求定义函数
int f(int a[],int n,int *pmax,int *pmin)
函数返回总和,并分别通过指针pmax 和 pmin将最大值、最小值赋值给主函数中的对应变量。
输入格式:
第1行为正整数n(n>2),表示一组数的个数 第2行包含n个整数,用空格分隔。
输出格式:
一行包含3个整数,分别为最大值、最小值及总和
#include <stdio.h> int f(int a[], int n, int *pmax, int *pmin); int main() { int n, max, min, sum; int a[30000]; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } sum = f(a, n, &max, &min); printf("%d %d %d", max, min, sum); return 0; } int f(int a[], int n, int *pmax, int *pmin) { int sum = 0; *pmax = *pmin = a[0]; for (int i = 0; i < n; i++) { sum += a[i]; if (a[i] < *pmin) { *pmin = a[i]; } if (a[i] > *pmax) { *pmax = a[i]; } } return sum; }
第八章编程作业
1
查找字符串(10分)
题目内容:
给定一个字符串,在字符串中找到第一个连续出现至少k次的字符。
输入格式:
第一行包含一个正整数k,表示至少需要连续出现的次数。1 <= k <= 100。
第二行包含需要查找的字符串。字符串长度在1到100之间,且不包含任何空白符。
输出格式:
若存在连续出现至少k次的字符,输出该字符;否则输出NO。
#include <stdio.h> int main() { int k; char str[101]; scanf("%d", &k); scanf("%s", str); int len = 0; while (str[len] != '\0') len++; int count = 1; // 当前字符连续出现的次数 for (int i = 1; i < len; i++) { if (str[i] == str[i - 1]) { count++; } else { count = 1; // 重置计数 } if (count >= k) { printf("%c\n", str[i]); return 0; } } printf("NO\n"); return 0; }
2
求最大字符串(10分)
题目内容:
本题要求编写程序,针对输入的N个字符串,输出其中最大的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
输出最大的字符串。
#include <stdio.h> #include <string.h> int main() { int N; char max[80]; // 存储最大字符串 char str[80]; // 存储每次输入的字符串 scanf("%d", &N); // 初始化 max scanf("%s", max); for (int i = 1; i < N; i++) { scanf("%s", str); if (strcmp(str, max) > 0) { strcpy(max, str); // 将str复制到max } } printf("%s\n", max); return 0; }
第九章编程作业
1
最高分的学生(10分)
题目内容:
输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。
输入格式:
第一行输入一个正整数N(N <= 100),表示学生人数。接着输入N行,每行格式如下: 分数 姓名 分数是一个非负整数,且小于等于100; 姓名为一个连续的字符串,中间没有空格,长度不超过20。
输出格式:
输出最高分数的学生姓名。每行包含一个姓名
#include <stdio.h> struct student { int score; char name[21]; }; int main() { int N; scanf("%d", &N); struct student s[N]; int maxScore = -1; for (int i = 0; i < N; i++) { scanf("%d %s", &s[i].score, s[i].name); if (s[i].score > maxScore) { maxScore = s[i].score; } } for (int i = 0; i < N; i++) { if (s[i].score == maxScore) { printf("%s\n", s[i].name); } } return 0; }
2
计算平均成绩(10分)
题目内容:
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。
输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。
#include <stdio.h> struct info { char num[6]; char name[11]; int score; }; int main() { int N; scanf("%d", &N); struct info s[N]; int sum = 0; for (int i = 0; i < N; i++) { scanf("%s %s %d", s[i].num, s[i].name, &s[i].score); sum += s[i].score; } double average = sum * 1.0 / N; printf("%.2lf\n", average); for (int i = 0; i < N; i++) { if (s[i].score < average) { printf("%s %s\n", s[i].name, s[i].num); } } return 0; }
Comments NOTHING