写在开头:

此文章仅供学习交流使用,我也是刚学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;
}