MOOC哈工大2020C语言程序设计精髓练兵区编程题第七周

1 谐均值计算(4分)

题目内容:

两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个double参数的函数,计算这两个参数的谐均值。函数原型为:

double Calculate(double x,double y);

double Calculate(double x,double y);

int main() 
{
    double x,y;
    printf("Input two doubles:\n");
    scanf("%lf%lf",&x,&y);
    printf("1/((1/x+1/y)/2) = %0.3f\n",Calculate(x,y));
    return 0;
}


double Calculate(double x,double y)
{
    return  1/((1/x+1/y)/2);
}

2 输出指定行列数的字符(4分)

题目内容:

编写一个函数,函数原型:void Chline(char ch, int column, int row);

该函数的3个参数是一个字符和两个整数。字符参数是需要输出的字符。第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。编写一个调用该函数的程序。

void Chline(char ch, int column, int row);

int main()
{
    char c;
    int column,row;
    printf("input a char:\n");
    scanf(" %c",&c);
    printf("input column and row:\n");
    scanf("%d%d",&column,&row);
    Chline(c,column,row);
    return 0;
}

void Chline(char ch, int column, int row)
{
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < column; ++j) 
        {
            printf("%c",ch);
        }
        printf("\n");
    }
}

3 魔术师猜数(4分)

题目内容:

在一种室内互动游戏中,魔术师要每位观众心里想一个三位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少,则魔术师一定能猜出观众心里想的原数abc是多少。例如,观众甲说他计算的和值是1999,则魔术师立即说出他想的数是443,而观众乙说他计算的和值是1998,则魔术师说:“你算错了!”。请编程模拟这个数字魔术游戏。要求用函数实现,函数原型为:int Magic(int m);

其中形参m代表观众计算的和值。

int Magic(int m);

int main()
{
    int n,flag;
    scanf("%d",&n);
    flag = Magic(n);
    if(flag == -1)
    {
        printf("The sum you calculated is wrong!\n");
    }
    else
    {
        printf("The number is %d\n",flag);
    }
    return 0;
}

int Magic(int m)
{
    int a,b,c,sum;
    for (int a = 1; a < 10; ++a)
    {
        for (int b = 1; b < 10; ++b)
        {
            for (int c = 1; c < 10; ++c)
            {
                sum = 100 * (a + b + b + c + c) + 10 * (a + a + b + c + c) + (a + a + b + b + c);
                if(m == sum)
                {
                    return a * 100 + b * 10 + c;
                }
            }
        }
    }
    return -1;
}

4 计算礼炮声响次数(4分)

题目内容:

在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。

int main()
{
    int a = 0, b = 0, c = 0, count = 0;
    while (a <= 5 * 20 || b <= 6 * 20 || c <= 7 * 20)
    {
        if(a % 5 == 0 || b % 6 == 0 || c % 7 == 0)
        {
            count ++;
        }
        if(a <= 5 * 20)
        {
            a++;
        }
        if(b <= 6 * 20)
        {
            b++;
        }
        if(c <= 7 * 20){
            c++;
        }
    }
    printf("n=%d",count);
    return 0;
}

5 水手分椰子(4分)

题目内容:

n(1<n<=5)个水手在岛上发现一堆椰子,先由第1个水手把椰子分为等量的n堆,还剩下1个给了猴子,自己藏起1堆。然后,第2个水手把剩下的n-1堆混合后重新分为等量的n堆,还剩下1个给了猴子,自己藏起1堆。以后第3、4个水手依次按此方法处理。最后,第n个水手把剩下的椰子分为等量的n堆后,同样剩下1个给了猴子。请用迭代法编程计算并输出原来这堆椰子至少有多少个,n的值要求从键盘输入。若输入的n值超出要求的范围,程序输出"Error!"。

提示:分成的等量的堆数应该与水手的数量一致.


int divide(int n, int m);
static int people;

int main() 
{
    int n;
    printf("Input n(1<n<=5):\n");
    scanf("%d", &n);
    people = n;
    if(n > 1 && n <= 5)
    {
        for (int i = 1; ; i++)
        {
            if(divide(i, n))
            {
                printf("y=%d\n", i);
                break;
            }
        }
    }
    else
    {
        printf("Error!\n");
    }
    return 0;
}

int divide(int n, int m)
{
    if(n / people == 0 || n % people != 1)
    {
        return 0;
    }
    if(m == 1)
    {
        return 1;
    }
    return divide(n - n / people - 1, m - 1);
}

6 递归法计算游戏人员的年龄(4分)

题目内容:

有n个人围坐在一起,问第n个人多大年纪,他说比第n-1个人大2岁;问第n-1个人,他说比第n-2个人大2岁,.....,问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,问第n个人多大年纪。

递归函数原型:unsigned int ComputeAge(unsigned int n);

提示:

计算年龄的递归公式为:

unsigned int ComputeAge(unsigned int n);

int main()
{
    unsigned int n;
    scanf("%u", &n);
    printf("The person's age is %u\n", ComputeAge(n));
    return 0;
}

unsigned int ComputeAge(unsigned int n)
{
    if(n == 1)
    {
        return 10;
    }
    return ComputeAge(n - 1) + 2;
}

7 递归法计算两个数的最大公约数(4分)

题目内容:

利用最大公约数的性质计算。对正整数a和b,当a>b时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的上述性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。这三条性质,也可以表示为: 

性质1  如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b)

性质2  如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)

性质3  如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b

int Gcd(int a, int b);

int main()
{
    int a, b;
    printf("Input a,b:");
    scanf("%d,%d", &a, &b);
    if(a > 0 && b > 0)
    {
        printf("%d\n", Gcd(a, b));
    }
    else
    {
        printf("Input error!\n");
    }

    return 0;
}


int Gcd(int a, int b)
{
    if(a == b)
    {
        return a;
    }
    return a > b ? Gcd(b, a - b) : Gcd(a, b - a);
}

8 寻找中位数v1.0(4分)

题目内容:

编写一个函数返回三个整数中的中间数。函数原型为: int mid(int a, int b, int c); 

函数功能是返回a,b,c三数中大小位于中间的那个数。

int mid(int a, int b, int c);

int main()
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    printf("The result is %d\n",mid(a, b, c));
    return 0;
}

int mid(int a, int b, int c)
{
    int median;
    if(a - b > 0 && c - a > 0)
    {
        median =  a;
    }
    else if(b - a > 0 && c - b > 0)
    {
        median = b;
    }
    else
    {
        median = c;
    }
    return median;
}

9 还原算术表达式(4分)

题目内容:

编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99<n<1000)的值要求从键盘输入。

 

int main()
{
    int n, x, y, z, flag = 0;
    printf("Input n(n<1000):\n");
    scanf("%d" , &n);
    if(n > 99 && n < 1000)
    {
        //flag为1时不需要继续循环了
        for (x = 0; x <= 9 && flag != 1; x++)
        {
            for (y = 0; y <= 9 && flag != 1; y++)
            {
                for (z = 0; z <= 9; z++)
                {
                    //x * 100 + y * 10 + z + y * 100 + z * 10 + z
                    if(n == x * 100 + y * 110 + z * 12)
                    {
                        flag = 1;
                        printf("X=%d,Y=%d,Z=%d\n", x, y, z);
                        break;
                    }
                }
            }
        }
        if(!flag)
        {
            printf("Invalid\n");
        }

    }

    return 0;
}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言程序设计精髓MOOC》第三主要内容是关于指针和数组的学习。 首先是指针的介绍和使用。指针是C语言中一个非常重要的概念,它可以用来间接访问内存中的数据,通过指针可以实现对变量地址的操作。在学习过程中,我们了解了指针的定义和声明,以及指针与数组之间的关系。指针在程序设计中的应用非常广泛,特别是在动态内存分配和函数调用等方面,有着重要的作用。 其次是数组的使用。数组是一种由相同类型的元素组成的集合,它在C语言中非常常用。在第三的学习中,我们了解了数组的定义、初始化和遍历等基本操作,还学习了一些在数组中常用的算法和技巧。通过多维数组和指针数组的学习,我们可以更灵活地处理多个数据。 除了指针和数组,第三还涉及到了C语言中的结构体(struct)和文件的输入输出操作等内容。结构体是一种可以封装多个不同类型的数据的自定义数据类型,它在实际的程序设计中经常被用于组织和管理数据。文件的输入输出操作涉及了C语言中如何读写文件以及相关的文件处理函数等知识点。 通过学习《C语言程序设计精髓MOOC》第三的内容,我们对指针和数组有了更深入的认识,并且掌握了它们的基本用法和应用技巧。这对于进一步学习和理解C语言程序设计以及其他高级编程语言都非常有帮助。此外,通过作业和练习的完成,我们可以检验和巩固所学的知识,提高我们自己的编程能力。希望通过这门课程的学习,能够让我们对C语言有更全面和深入的了解,为以后的学习和工作打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值