石龙镇网站建设,电子商务有什么职业,东莞整合网站建设推广,wordpress 点踩题目#xff1a;函数将str字符串中的5个数字字符串转换为整数#xff0c;并保存在二维数组m的最后一行#xff0c;各元素为3、-4、16、18、6。并经函数move处理后#xff0c;运行结果如下#xff1a;
18 6 3 -4 16
16 18 6 3 -4
-4 16 …题目函数将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步即抽取出来的整数是放在最后一行。针对最后一行我们发现其他各行是下一行向右循环移动一个元素得出的结果。 如果这样分析就能理解编程的思路如果没有仔细分析题目仅看到题目中二维数组各元素的排列那么有可能认为二维数组中的元素是按下图所示方法产生的。如果是这样想的那就无法正确修改题目中的错误。 有了正确的编程思路再看程序就很容易改正错误了。程序如下 #includestdio.h
#define ROW 4
#define COL 5
void abstract(char str[],int m[]){int i,j,k,sign1;for(kji0;str[i];i) {if(isdigit(str[i])) {if(str[i-1]-)sign-1;kk*10str[i]-0;}
/***********FOUND***********/if(isdigit(str[i])str[i1]!0){m[j]k*sign;sign1;k0; }}
}
void move(int m[][COL]){int i,j;for(iROW-2;i0;i--)for(j0;jCOL;j)
/***********FOUND***********/m[i][j]m[i1][j1];
}
int main()
{char str[]digit3posi-4plus16zero18six6 ;int m[ROW][COL];int i,j;
/***********FOUND***********/abstract(str,m[0]);move(m);for(i0;iROW;i){for(j0;jCOL;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[i1])){
如果将第11行改为
else if(isdigit(str[i-1])) {
是否可行
请参看文章
https://mp.weixin.qq.com/s/cRLhnYH7X3IRUkBqi2y7tw
这个答案是错的。