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. 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试

    playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了. 怎么用 既然是 ...

  2. 利用Linux系统提供的和调度器相关的接口让进程或线程对某个处理器进行绑定

    目录 设置进程与CPU的亲和性 设置线程与CPU的亲和性 设置进程与CPU的亲和性 taskset命令允许你查看或设置运行中的进程的CPU亲和性(即该进程可以在哪些CPU上运行). 要将一个已经运行的 ...

  3. 通过内存映射的方式向lcd屏幕输出几个圆

    /************************************************* * * file name:color.c * author :momolyl@126.com * ...

  4. 实体类如何"不费力气"的转为Map

    初衷: db返回了一个实体类,想封装成一个Map留着按需获取属性,所以就有了下面的Utils import java.lang.reflect.InvocationTargetException; i ...

  5. [学习笔记] MST(最小生成树) - 图论

    [学习笔记] MST(最小生成树) - 图论 MST,最小生成树,一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.--百度百科 对于 ...

  6. Orleans初体验

    Orleans: 是一个跨平台框架,用于构建可靠且可缩放的分散式应用. 分布式应用定义为跨多个进程的应用,通常使用对等通信来超越硬件边界. 从单个本地服务器扩展到了云中数千个分布式.高度可用的应用. ...

  7. 如何用python做一个简单的小游戏 Pygame

    当然可以!下面是一个简单的Python游戏开发教程,帮助你入门: 安装Pygame库 Pygame是一个Python游戏开发库,可以帮助你创建游戏窗口.绘制图形.处理用户输入等.你可以使用以下命令在命 ...

  8. 优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策

    Web层缓存对于提高应用性能至关重要,它通过减少重复的数据处理和数据库查询来加快响应时间.例如,如果一个用户请求的数据已经缓存,服务器可以直接从缓存中返回结果,避免了每次请求都进行复杂的计算或数据库查 ...

  9. Camera | 8.让rk3568支持前后置摄像头

    一.目标 本文主要目标是,支持前置摄像头0v5648.后置摄像头ov13850,以及移植过程遇到的一些小问题的解决. 1. 摄像头连接图 参考上图,摄像头详细信息如下: 2个摄像头均连接在I2C通道4 ...

  10. Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

    前面3篇我们讲解了camera的基础概念,MIPI协议,CSI2,常用命令等,本文带领大家入门,如何用c语言编写应用程序来操作摄像头. Linux下摄像头驱动都是基于v4l2架构,要基于该架构编写摄像 ...