MOOC哈工大C语言程序设计精髓编程题在线测试第十一周

时间:2024-04-16 13:10:33

1 山地训练(4分)

题目内容:

为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练。她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。假设整条山路划分成T个长度相同的路段(1 <= T <= 100,000),并且小白用si表示第i个路段的路况,用u、f、d这3个字母分别表示第i个路段是上坡、平地、下坡。小白跑完一段上坡路的耗时是U秒(1 <= U <= 100),跑完一段平地的耗时是F秒(1 <= F <= 100),跑完一段下坡路的耗时是D秒(1 <= D <= 100)。注意,沿山路原路返回时,原本是上坡的路段变成了下坡路段,原本是下坡的路段变成了上坡路段。小白想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多少个路段。请你编程帮助她计算。

函数原型:long Fun(long M, long T, long U, long F, long D, char str[]);

函数功能:计算在限时M秒内T个路段的情况下,最多往返可跑的路段数。

         参数:M,T,U,F,D分别代表限时、路段数,以及上坡、平地、下坡的耗时

              数组str保存整条山路的路段状况

         返回值:最多可跑的路段数

#define STR_LEN 80

long Fun(long M, long T, long U, long F, long D, char str[]);

int main()
{
    long m, t, u, f, d, num;
    char str[STR_LEN + 1];
    printf("Input M,T,U,F,D:");
    scanf("%ld%ld%ld%ld%ld", &m, &t, &u, &f, &d);
    printf("Input conditions of road:");
    scanf("%s", str);
    num = Fun(m, t, u, f, d, str);
    printf("num=%ld\n", num);
    return 0;
}

long Fun(long M, long T, long U, long F, long D, char str[])
{
    long i;
    long sum = 0;
    for(i = 0; i < T; i++)
    {
        if(str[i] == \'f\')
            sum += 2*F;
        else
            sum += U + D;
        if(sum > M)
            return i;
    }
    return T - 1;
}

2 奇偶数分离(4分)

题目内容:

 

输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。

函数原型如下所示:

void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数

解题思路:用两个循环分别输出奇数和偶数,在输出第一个数时用"%d"格式字符,在输出其余数时用",%d"格式字符,用标志变量记录和判断是否是第一个奇数或偶数。

#define N 100

//数组a[]存放用户输入的n个整数
void Separate(int a[], int n);

int main()
{
    int n, a[N];
    printf("Input n:");
    scanf("%d", &n);
    printf("Input numbers:");
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
    }
    Separate(a, n);
    return 0;
}

void Separate(int a[], int n)
{
    int count = 1;
    for (int i = 0; i < n; ++i)
    {
        if(a[i] % 2 != 0)
        {
            if(count == 1)
            {
                printf("%d", a[i]);
            }
            else
            {
                printf(",%d", a[i]);
            }
            count++;
        }
    }
    count = 1;
    printf("\n");
    for (int i = 0; i < n; ++i)
    {
        if(a[i] % 2 == 0)
        {
            if(count == 1)
            {
                printf("%d", a[i]);
            }
            else
            {
                printf(",%d", a[i]);
            }
            count++;
        }
    }
}

3 子串判断(4分)

题目内容:从键盘输入两个长度小于80的字符串A和B,且A的长度大于B的长度,编程判断B是不是A的子串,如果是,则输出”Yes”,否则输出”No”。这里所谓的该串的子串是指字符串中任意多个连续的字符组成的子序列。

函数原型:int IsSubString(char a[], char b[]);

函数功能:判断b是否是a的子串,是则返回1,否则返回0

#define STR_LEN 80

int IsSubString(char a[], char b[]);

int main()
{
    char a[STR_LEN + 1], b[STR_LEN + 1];
    int result;
    printf("Input the first string:");
    gets(a);
    printf("Input the second string:");
    gets(b);
    result = IsSubString(a, b);
    if(result)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }
    return 0;
}

int IsSubString(char a[], char b[])
{
    int i = 0, j = 1, flag;
    while (a[i] != \'\0\')
    {
        //首字符相同
        if(a[i] == b[0])
        {
            flag = 1;
            while (b[j] != \'\0\')
            {
                if(a[i + j] != b[j])
                {
                    flag = 0;
                    break;
                }
                j++;
            }
            if(flag)
            {
                return 1;
            }
        }
        i++;
    }
    return 0;
}

4 星期查找(4分)

题目内容:

任意输入英文的星期几,通过查找如图所示的星期表,输出其对应的数字,若查到表尾,仍未找到,则输出错误提示信息。

提示:用一个二维字符数组weekDay来存放如图所示的星期表的内容(字符串)。输入待查找的字符串,然后在星期表中顺序查找与输入字符串相匹配的字符串。找到的字符串在星期表数组中的第一维下标(行号)即为题目所求。

int main()
{
    char *weekDay[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    char str[10];
    int flag = 0, i = 0;
    printf("Please enter a string:\n");
    gets(str);
    for (i = 0; i < 7; i++)
    {
        if(strcmp(str, weekDay[i]) == 0)
        {
            flag = 1;
            break;
        }
    }
    if(flag)
    {
        printf("%s is %d\n", str, i);
    }
    else
    {
        printf("Not found!\n");
    }
    return 0;
}