Loading

2个月搞定计算机二级C语言——真题(11)解析

1. 前言

今天双 11,正好轮到讲第 11 篇,直接来个三 11。

那么本篇我们讲解2个月搞定计算机二级C语言——真题11

真题11-程序评分

2. 程序填空题

2.1 题目要求

真题11-程序填空

2.2 提供的代码

#include   <stdio.h>
#include   <ctype.h>
#pragma warning (disable:4996)
void fun(int* cd, int* cu, int* cs)
{
    char  c;
    printf("用回车键结束输入!\n");
    while ((c = getchar()) != '\n')
    {
        /**********************found***********************/
        if (c >= '0' && ____(1)____)  ++*cd;
        /**********************found***********************/
        if (____(2)____ && c <= 'Z')  ++*cu;
        /**********************found***********************/
        if (c >= 'a' && ____(3)____)  ++*cs;
    }
}

main()
{
    int cd, cu, cs;
    cd = cu = cs = 0;
    fun(&cd, &cu, &cs);
    printf("数字的个数: %d\n", cd);
    printf("大写字母的个数: %d\n", cu);
    printf("小写字母的个数: %d\n", cs);
}

2.3 解题思路

这道题是对于范围的判断,在字符中数字的范围是'0'~'9',小写字母的范围是'a'~'z',大写字母的范围是'A'~'Z'

要统计个数,只需要判断是否符合这个范围即可。

第(1)处填空:

数字的范围,即 0 到 9。

if (c >= '0' && c <= '9')  ++*cd;

第(2)处填空:

大写字母的范围,即 A 到 Z。

if (c >= 'A' && c <= 'Z')  ++*cu;

第(3)处填空:

小写字母的范围,即 a 到 z。

if (c >= 'a' && c <= 'z')  ++*cs;

2.4 代码实现

填写完整的代码:

#include   <stdio.h>
#include   <ctype.h>
#pragma warning (disable:4996)
void fun(int* cd, int* cu, int* cs)
{
    char  c;
    printf("用回车键结束输入!\n");
    while ((c = getchar()) != '\n')
    {
        /**********************found***********************/
        if (c >= '0' && c <= '9')  ++*cd;
        /**********************found***********************/
        if (c >= 'A' && c <= 'Z')  ++*cu;
        /**********************found***********************/
        if (c >= 'a' && c <= 'z')  ++*cs;
    }
}

main()
{
    int cd, cu, cs;
    cd = cu = cs = 0;
    fun(&cd, &cu, &cs);
    printf("数字的个数: %d\n", cd);
    printf("大写字母的个数: %d\n", cu);
    printf("小写字母的个数: %d\n", cs);
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

3. 程序修改题

3.1 题目要求

真题11-程序修改

3.2 提供的代码

#include <stdio.h>
int  fun(int  n, int  a[], int* k)
{
    int  m = 0, i, t;
    t = n;
    /**********found**********/
    for (i = 0; i < n; i++)
        if (n % i == 0)
        {
            a[m] = i;  m++;  t = t - i;
        }
    /**********found**********/
    k = m;
    /**********found**********/
    if (t = 0)  return  1;
    else  return  0;
}

main()
{
    int  n, a[10], flag, i, k;
    printf("请输入一个整数:    ");  scanf("%d", &n);
    flag = fun(n, a, &k);
    if (flag)
    {
        printf(" %d 是完数,其因子是:  ", n);
        for (i = 0; i < k; i++)   printf("  %d ", a[i]);
        printf("\n");
    }
    else    printf(" %d 不是完数.\n ", n);
    getchar();
}

3.3 解题思路

第(1)处修改:

我们知道 0 是不能做除数的,所以这里i的初始值不能为 0,应从 1 开始。

for (i = 1; i < n; i++)

第(2)处修改:

这里要做的是将m的值通过指针int* k传递回去,即存放因子个数,所以这里需要对指针k进行解引用操作。

*k = m;

第(3)处修改:

语法错误,一个=为赋值,两个==为判断左右值是否相等。

if (t == 0)  return  1;

3.4 代码实现

修改后的代码:

#include <stdio.h>
int  fun(int  n, int  a[], int* k)
{
    int  m = 0, i, t;
    t = n;
    /**********found**********/
    for (i = 1; i < n; i++)
        if (n % i == 0)
        {
            a[m] = i;  m++;  t = t - i;
        }
    /**********found**********/
    *k = m;
    /**********found**********/
    if (t == 0)  return  1;
    else  return  0;
}

main()
{
    int  n, a[10], flag, i, k;
    printf("请输入一个整数:    ");  scanf("%d", &n);
    flag = fun(n, a, &k);
    if (flag)
    {
        printf(" %d 是完数,其因子是:  ", n);
        for (i = 0; i < k; i++)   printf("  %d ", a[i]);
        printf("\n");
    }
    else    printf(" %d 不是完数.\n ", n);
    getchar();
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

4. 程序设计题

4.1 题目要求

真题11-程序设计

4.2 提供的代码

#include <stdio.h>
float  fun(int m, int n)
{



}

main()   /* 主函数 */
{
    void NONO();
    printf("P=%f\n", fun(12, 8));
    NONO();
    getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
    FILE* fp, * wf;
    int i, m, n;
    float s;

    fp = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++) {
        fscanf(fp, "%d,%d", &m, &n);
        s = fun(m, n);
        fprintf(wf, "%f\n", s);
    }
    fclose(fp);
    fclose(wf);
}

4.3 解题思路

这道题也不难,让我们用函数fun完成公式求p的值。

公式中是三个阶乘做乘除运算,所以我们需要先计算出阶乘,在return时直接套入公式就可以了。

在程序中用了三个for循环,分别计算m!n!(m-n)!,最后通过return (_m / (_n * _mn));返回计算结果P

4.4 代码实现

填写完整的代码:

#include <stdio.h>
float  fun(int m, int n)
{
    float _m = 1.0, _n = 1.0, _mn = 1.0;
    int i = 0;

    // 计算 m 的阶乘
    for (i = 1; i <= m; i++)
    {
        _m *= i;
    }

    // 计算 n 的阶乘
    for (i = 1; i <= n; i++)
    {
        _n *= i;
    }

    // 计算 m-n 的阶乘
    for (i = 1; i <= (m - n); i++)
    {
        _mn *= i;
    }

    return (_m / (_n * _mn));   // 通过公式求出 P,将其返回
}

main()   /* 主函数 */
{
    void NONO();
    printf("P=%f\n", fun(12, 8));
    NONO();
    getchar();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
    FILE* fp, * wf;
    int i, m, n;
    float s;

    fp = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++) {
        fscanf(fp, "%d,%d", &m, &n);
        s = fun(m, n);
        fprintf(wf, "%f\n", s);
    }
    fclose(fp);
    fclose(wf);
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

5. 后记

本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。

posted @ 2024-11-11 12:39  main工作室  阅读(12)  评论(0编辑  收藏  举报