1. 前言
今天双 11,正好轮到讲第 11 篇,直接来个三 11。
那么本篇我们讲解2个月搞定计算机二级C语言——真题11
2. 程序填空题
2.1 题目要求
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 题目要求
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 题目要求
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. 后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。