当前位置: 首页 > news >正文

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目:函数将str字符串中的5个数字字符串转换为整数,并保存在二维数组m的最后一行,各元素为3、-4、16、18、6。并经函数move处理后,运行结果如下:

18     6     3    -4    16

16    18     6     3    -4

-4    16    18     6     3

 3    -4    16    18     6

注意:不得增行或删行,也不得更改程序的结构。

分析:

第1步:先从字符串中把5个数字字符串抽取出来,存放在二维数组m的最后一行。对于这一步,从字符串中抽取5个数字字符串转换为整数比较容易,但将转换后的整数放在数组的最后一行,对于中职生来说有点难度,因为这项工作是通过abstract函数来实现的,这个函数的声明为:

void abstract(char str[],int m[]);

该函数的第一个形参char str[]表示要处理的字符串,第二个形参int m[]是一个一维数组,这与题目中所说的二维数组是不相同的,但在学习二维数组时,教课书中对二维数组介绍时写道:可以将二维数组看作是一维数组的一维数组,即可以将一个二维数组看成是一个特殊的一维数组,这个一维数组的元素又是一个一维数组,即二维数组是由嵌套的一维数组组成。因此,我们仅需把二维数组m的最后一行传递给第二个形参即可。

第2步,执行函数move对二维数组m进行处理,在这步分析时,一定要联想到第1步,即,抽取出来的整数是放在最后一行。针对最后一行我们发现其他各行是下一行向右循环移动一个元素得出的结果。

图片

如果这样分析,就能理解编程的思路,如果没有仔细分析题目,仅看到题目中二维数组各元素的排列,那么,有可能认为二维数组中的元素是按下图所示方法产生的。如果是这样想的,那就无法正确修改题目中的错误。

图片

有了正确的编程思路,再看程序就很容易改正错误了。程序如下:


#include<stdio.h>
#define ROW 4
#define COL 5
void abstract(char str[],int m[]){int i,j,k,sign=1;for(k=j=i=0;str[i];i++) {if(isdigit(str[i])) {if(str[i-1]=='-')sign=-1;k=k*10+str[i]-'0';}
/***********FOUND***********/if(isdigit(str[i])&&str[i+1]!=0){m[j++]=k*sign;sign=1;k=0;                }}
}
void move(int m[][COL]){int i,j;for(i=ROW-2;i>=0;i--)for(j=0;j<COL;j++)
/***********FOUND***********/m[i][j]=m[i+1][j+1];       
}
int main()
{char str[]="digit3posi-4plus16zero18six6 ";int m[ROW][COL];int i,j;
/***********FOUND***********/abstract(str,m[0]);move(m);for(i=0;i<ROW;i++){for(j=0;j<COL;j++)printf("%4d",m[i][j]);printf("\n");}return 0;
}

先来看主函数main,它所做的工作就是调用abstract函数将字符串中的数字字符串抽取出来转换为整数存放到m的最后一行,然后,调用move对数组m进行处理,最后输出结果。

在main中有个错误点,就是调用abstract,其中的两个实参,一个是str,一个是m[0],其中实参str对应的形参为char str[],符合调用规则。实参m[0]对应的形参为int m[], 也符合调用规则,因为m[0]的类型式int []与形参的类型int []匹配,但题目要求将str中的整数存放在二维数组m的最后一行,因此,需要修改其为m[ROW-1],即将二维数组的最后一行传递给形参m[]。

分析函数abstract。6到11行是从字符串中抽取整数,当遇到数字时要判断该数字的上一个字符是否为'-',如果是,说明这个数是负数,改变sign变量,使其记录正在处理的数的正负号。13到17行的功能是判断如果下一个字符不是数字,当前处理的数结束,并为处理下一个数初始化变量。按此思路,就知道第11行错在哪了,修改第11行为:

if(isdigit(str[i])&& !isdigit(str[i+1])){

如果将第11行改为:

else if(isdigit(str[i-1])) {

是否可行?

请参看文章:C程序训练:程序改错题目分析(2019)

这个答案是错的。

相关文章:

  • Spring是怎么解决循环依赖的
  • U盘显示空间小于实际U盘空间的解决方案
  • chisel之scala 语法
  • pip安装tf-gpu=2.4的bug解决方案
  • Vue代理模式和Nginx反向代理(Vue代理部署不生效)
  • 第3节、电机定速转动【51单片机+L298N步进电机系列教程】
  • 第一章 RocketMQ 概述
  • Java实现数据可视化的智慧河南大屏 JAVA+Vue+SpringBoot+MySQL
  • 如何使用postman进行接口调试
  • 蓝桥杯Web应用开发-CSS3 新特性【练习一:属性有效性验证】
  • 算法之美_2024
  • 【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏
  • 《Docker极简教程》--Docker基础--基础知识(四)
  • 网络安全产品之认识准入控制系统
  • Java Map 集合的几种常用遍历方式
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《剑指offer》分解让复杂问题更简单
  • CentOS6 编译安装 redis-3.2.3
  • const let
  • extract-text-webpack-plugin用法
  • github指令
  • interface和setter,getter
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA SE 6 GC调优笔记
  • java概述
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Linux中的硬链接与软链接
  • MySQL的数据类型
  • PHP变量
  • Python连接Oracle
  • Service Worker
  • 计算机常识 - 收藏集 - 掘金
  • 讲清楚之javascript作用域
  • 手写一个CommonJS打包工具(一)
  • 鱼骨图 - 如何绘制?
  • 中文输入法与React文本输入框的问题与解决方案
  • ionic异常记录
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​低代码平台的核心价值与优势
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $jQuery 重写Alert样式方法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (笔试题)分解质因式
  • (差分)胡桃爱原石
  • (转)setTimeout 和 setInterval 的区别
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core使用ef 6
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net网站发布-允许更新此预编译站点
  • .NET中两种OCR方式对比