1. 前言

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

2. 程序填空题

2.1 题目要求

2.2 提供的代码

#include <stdio.h>

double fun(int n) {
int i;
double s, t;
/**********found**********/
s = __1__;
/**********found**********/
for (i = 1; i <= __2__; i++) {
t = 2.0 * i;
/**********found**********/
s = s + (2.0 * i - 1) * (2.0 * i + 1) / __3__;
}
return s;
} main() {
int n = -1;
while (n < 0) {
printf("Please input(n>0): ");
scanf("%d", &n);
}
printf("\nThe result is: %f\n", fun(n));
getchar();
}

2.3 解题思路

这道题就是典型的纸老虎题,它作为编程的第一题定会在考场上压力你一下,在题目上做做文章,搞得这道题好像很难的样子,其实主要的代码都写完了,而且也给出了式子的规律,那么我们只需略微出手,便可拿下此题。

(1) 处填空:

此处是给变量 s 赋值,可以看到在 fun() 函数的末尾是 return s; 将其作为函数返回值返回,由此可以得出 s 是保存前 n 项和的变量,所以这里我们给它赋值为 0,做一个变量初始化,防止程序开始运行时 s 存储的是垃圾值

s = 0;  // 初始化为 0

(2) 处填空:

这里缺一个循环的条件,在题目所给的式子中是从 1 计算到 n 的,循环中 i 做的就是这件事情,所以 i小于等于形参 n 时符合条件,此处填 n

for (i = 1; i <= n; i++) {  // 1 ~ n

(3) 处填空:

我们单独看这个式子 (2.0 * i - 1) * (2.0 * i + 1) / __3__,此处可以和题目最后的式子规律一一对应,空缺的第 3 处对应着式子的分母部分 (2*n)²。变量 t 在循环开始时通过 t = 2.0 * i; 已经完成了分母括号里的计算,我们只需使用 t * t 计算平方即可。

s = s + (2.0 * i - 1) * (2.0 * i + 1) / (t * t);  // 计算 t 乘 t,即 t 的平方

当然计算平方也可以使用 C 语言标准库里的函数——pow 函数,它可以用于计算幂次,定义在 math.h 头文件中,使用需要包含头文件。

// C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 x ^ y
#include <math.h> // 使用 pow 函数时需要包含 math.h 头文件 s = s + (2.0 * i - 1) * (2.0 * i + 1) / pow(t, 2); // 计算 t 的 2 次幂,即 t 的平方

题目要求不要改动其他函数,不得增行或删行,所以这里我继续使用 t * t 计算平方,平时编程时可以直接用 pow 函数。

2.4 代码实现

填写完整的代码:

#include <stdio.h>

double fun(int n) {
int i;
double s, t;
/**********found**********/
s = 0; // 初始化为 0
/**********found**********/
for (i = 1; i <= n; i++) { // 1 ~ n
t = 2.0 * i;
/**********found**********/
s = s + (2.0 * i - 1) * (2.0 * i + 1) / (t * t); // 计算 t 乘 t,即 t 的平方
}
return s;
} int main() {
int n = -1;
while (n < 0) {
printf("Please input(n>0): ");
scanf("%d", &n);
}
printf("\nThe result is: %f\n", fun(n));
getchar();
}

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

3. 程序修改题

3.1 题目要求

3.2 提供的代码

#include <stdio.h>
#pragma warning(disable : 4996) int my_isalpha(char c) {
if (c >= 'A' && c <= 'Z')
return 1;
else if (c >= 'a' && c <= 'z')
return -1;
else
return 0;
} void a() {
char ch;
int sort;
printf("本程序判断你从键盘上键入字符的种类,请输入字符(串):\n");
do {
ch = getchar();
if (ch != '\n') {
sort = my_isalpha(ch);
/**********************found***********************/
switch (-1 <= sort && sort <= 1) {
case 1:
printf("%c", '*');
break;
/**********************found***********************/
case -1:
printf("%c", '#');
case 0:
printf("%c", '?');
}
}
/**********************found***********************/
} while (ch == '\n');
printf("%c", '\n');
} void main() {
a();
}

3.3 解题思路

这道题主要考察 switch 语句的用法。

(1) 处修改:

switch 括号中的表达式(即控制表达式)必须是整型或能转换为整型的类型。case 标签也必须是常量表达式,并且必须与 switch 的控制表达式类型兼容。

所以不需要那一堆的关系、逻辑运算,只需放入 sort 就好,它存储着 my_isalpha 函数的返回值。

switch (sort) {

(2) 处修改:

switch 语句中,break 语句用于终止当前 case 分支的执行,并跳出 switch 语句,避免程序继续执行后续的 case 分支。

在改好第一处后,运行程序输入一个小写字母,返回的是 #?,这是因为此处的 case -1: 的分支没有加 break 语句,导致不能跳出 switch 语句,在执行完 case -1: 分支后又执行了 case -1: 分支,显然我们程序没有按照我们的想法运行。

这时我们需要将两个分支分别加上 break 语句即可。

我们在后续的程序开发中可以再加上 default 分支,用来执行不在条件内的操作,从而增强程序的健壮性。

case -1:
printf("%c", '#');
break;
case 0:
printf("%c", '?');
break;

(3) 处修改:

do while 语句会先执行一遍循环中的程序,再判断循环条件是否为真,真则继续循环,否则执行循环后面的程序。

ch 存储的是键盘输入的单个字符,'\n' 是一个转义序列,用于表示换行符,对应键盘上的回车键(Enter)。

这里我没找出什么错误,提供的代码是 while (ch == '\n');,改的话只能改成 while (ch != '\n');,这两个代码我分别提交后都可以得满分。

分别运行这两个程序,如果按照要求先输入字符再敲回车这两个程序是没有任何区别的。

但是没有先输入字符直接敲回车,那么区别就来了:while (ch == '\n'); 不论你敲多少次回车,这个循环都不停止,因为符合ch == '\n'这个条件,它会一直循环到你输入不是回车的字符。

do {
ch = getchar();
if (ch != '\n') {
// ……
}
/**********************found***********************/
} while (ch == '\n');

while (ch != '\n');呢?如果你第一次敲回车此时ch存储的是回车的转义字符'\n',循环条件是ch != '\n',由于循环条件不符合,所以不会进行下一次循环,而是执行while下面的语句了。

do {
ch = getchar();
if (ch != '\n') {
// ……
}
/**********************found***********************/
} while (ch != '\n');

这就是它俩的区别所在,大家以后编程时需要注意循环/判断的条件哦。

3.4 代码实现

修改后的代码:

#include <stdio.h>
#pragma warning(disable : 4996)
int my_isalpha(char c) {
if (c >= 'A' && c <= 'Z')
return 1;
else if (c >= 'a' && c <= 'z')
return -1;
else
return 0;
}
void a() {
char ch;
int sort;
printf("本程序判断你从键盘上键入字符的种类,请输入字符(串):\n");
do {
ch = getchar();
if (ch != '\n') {
sort = my_isalpha(ch);
/**********************found***********************/
switch (sort) {
case 1:
printf("%c", '*');
break;
/**********************found***********************/
case -1:
printf("%c", '#');
break;
case 0:
printf("%c", '?');
break;
}
}
/**********************found***********************/
} while (ch != '\n');
printf("%c", '\n');
}
void main() {
a();
}

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

4. 程序设计题

4.1 题目要求

4.2 提供的代码

#include <stdio.h>
#pragma warning(disable : 4996)
double fun(int n) {
}
main() {
int n;
double s;
void NONO();
printf("Input n: ");
scanf("%d", &n);
getchar();
s = fun(n);
printf("s=%f\n", s);
NONO();
getchar();
}
void NONO() { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE * rf, *wf;
int n, i;
double s;
rf = fopen("in.dat", "r");
wf = fopen("out.dat", "w");
for (i = 0; i < 10; i++) {
fscanf(rf, "%d", &n);
s = fun(n);
fprintf(wf, "%lf\n", s);
}
fclose(rf);
fclose(wf);
}

4.3 解题思路

题目要求计算多项式的值,给定多项式的第一项为 1,第二项到第 n 项是计算阶乘倒数的和。

我们可以用Sn作为存储累加和的变量,之后通过循环累乘得到阶乘的值,最后计算每一项阶乘的倒数并累加至Sn

在提交时出现了一点小问题,程序可以正常运行,但提交时判为 0 分。经过测试只要把 main 函数里的NONO();语句注释再提交就好了。

4.4 代码实现

填写完整的代码:

#include <stdio.h>
#pragma warning(disable : 4996)
double fun(int n) {
int i = 0;
double Sn = 1.0; // 存储累加和,多项式的第一项为 1
unsigned long factorial = 1; for (i = 1; i <= n; i++) { // 遍历 1~n,注意 i 从 1 开始
factorial *= i; // 分别计算从 1~n 的阶乘
Sn += 1.0 / factorial; // 计算阶乘的倒数,并加到累加和变量中
} return Sn;
}
main() {
int n;
double s;
void NONO();
printf("Input n: ");
scanf("%d", &n);
getchar();
s = fun(n);
printf("s=%f\n", s);
NONO(); // 如果评分没过,把这句注释了再提交就可以了
getchar();
}
void NONO() { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE * rf, *wf;
int n, i;
double s;
rf = fopen("in.dat", "r");
wf = fopen("out.dat", "w");
for (i = 0; i < 10; i++) {
fscanf(rf, "%d", &n);
s = fun(n);
fprintf(wf, "%lf\n", s);
}
fclose(rf);
fclose(wf);
}

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

5. 后记

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

2个月搞定计算机二级C语言——真题(5)解析的更多相关文章

  1. 二级C语言真题笔记

    二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() {     short i ...

  2. 计算机二级-C语言-程序修改题-190108记录-字符串处理

    //程序修改题:给定程序MODI1.C中函数fun的功能是:先将字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面.例如:当s中的字符串为:“ABCDE”时,则t中的字符串应为 ...

  3. 计算机二级-C语言-程序修改题-190113记录-对指定字符串的大小写变换处理。

    //给定程序中fun函数的功能是:将p所指的字符串中每个单词的最后一个字母改成大写.(这里的“单词”是指由空格隔开的字符串) //重难点:指针对数组的遍历.大小写转换的方法.第一种使用加减32 得到, ...

  4. 计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。

    //程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回 ...

  5. 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用

    //程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...

  6. 计算机二级-C语言-程序修改题-190123记录-对整数进行取余和除以操作。

    //函数fun功能:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中.高位仍在高位,低位仍在低位. //重难点:思路:因为不是字符串,所以可以把问题变成整数的操作,采用取余和除的操作.对整 ...

  7. 计算机二级-C语言-程序设计题-190119记录-求出一个二维数组每一列的最小值。

    //编写一个函数:tt指向一个M行N列的二维数组,求出二维数组每列中最小的元素,并依次放入pp所指的一维数组中.二维数组中的数在主函数中赋予. //重难点:求出的是每一列的最小值,这里要注意,学会简化 ...

  8. 计算机二级-C语言-程序设计题-190118记录-通过数组和指针两种方式对字符串进行处理。

    //编写一个函数fun,比较两个字符串的长度,(不使用C语言提供的求字符串长度的函数),函数返回较长的字符串.若两个字符长度相同,则返回第一个字符串. //重难点:通过数组处理和通过指针进行处理的不同 ...

  9. 计算机二级-C语言-程序修改题-190116记录-对数组进行排序的两种方法。

    //函数fun的功能是:将n个无序整数从小到大排序. //冒泡排序法:小数往下浮,大数往上浮.把数都存到一个数组,然后两两比较,大数往后交换.双层递减循环. //第二种方法:都放入一个数组中,然后记录 ...

  10. 计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。

    //给定程序中fun函数的功能是:从低位开始取出长整形变量s中奇数位上的数,依次构成一个新的数放在t中.高位仍在高位,低位仍在低位.例如:当s中的数为7654321时,t中的数为7531. //重难点 ...

随机推荐

  1. CSS2基础(part-1)

    CSS2基础 基础 简介 [全称]Cascading Style Sheets,又名层叠样式表 层叠:一层一层涂上去 表:列表 样式:如文字大小,颜色,元素宽高等. CSS 描述了在屏幕.纸质.音频等 ...

  2. 华为交换机S5700-52C-SI配置vlan

    环境准备:通过超级终端Hyper Terminal和console串口线链接华为交换机,用9600波特率链接 添加vlan <Quidway>system-view #由用户视图进入系统视 ...

  3. cubeide汉化包地址

    http://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site 具体步骤看洋桃物联网入门30步的视频

  4. 免费、开源、详细完整的unity游戏、游戏源码、教程:人工智能分析和处理对话的美好三维世界(定期更新)

    这份unity游戏.游戏源码.教程:完全免费,完全开源,完整详细,通俗易懂,适合初学者入门,定期更新. 我不想和任何人说话,任何人不要跟我说话,不要打扰我,我要安安静静的写.我解释一下原因: 俗话说& ...

  5. vmware虚拟机历史版本下载

    如果你要15.0的版本,点选Open Source吧,里面有多个版本,需要登陆账号,至于账号注册用临时邮箱 https://my.vmware.com/en/web/vmware/info/slug/ ...

  6. ZXING 修复预览页面变形问题

    ZXING之前都用的好好的,结果在一个Android11的设备上翻了车 (基于全屏预览的情况下) 扫码页面预览效果变形, 在网上找了一些代码,修改后发现无效,不适用我这边的设备, 最后想着,预览结果变 ...

  7. Go runtime 调度器精讲(三):main goroutine 创建

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 回顾下 上一讲 的内容.主线程 m0 蓄势待发,准备干活.g0 为 m0 提供了执行环境,P 和 m0 绑定,为 m0 提供活,也就是 goro ...

  8. CSS & JS Effect – Section Design Waves

    介绍 Section Waves 长这样       左边是没有 waves, 右边是加了 waves. 它的作用就是点缀. 让画面有一点 "Design" 的感觉. 参考 You ...

  9. SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索

    最近AI搜索很火爆,有Perplexity.秘塔AI.MindSearch.Perplexica.memfree.khoj等等. 在使用大语言模型的过程中,或许你也遇到了这种局限,就是无法获取网上最新 ...

  10. QT6跨平台开发

    QT6跨平台开发 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技术 ...