2008全国计算机等级考试三级网络技术操作题题库第24题,高手才能明白的问题!!!

先看一下全国计算机等级考试三级网络技术上机题库第24的题目要求:

【答案】
void jsVal()
{
int i,j; /*定义循环控制变量*/
int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/
int temp; /*定义数据交换时的暂存变量*/
int ab,cd; /*存储重新组合成的十位数*/
for(i=0;i<200;i++) /*逐个取每一个4位数*/
{
a4=a[i]/1000; /*求4位数的千位数字*/
a3=a[i]%1000/100; /*求4位数的百位数字*/
a2=a[i]%100/10; /*求4位数的十位数字*/
a1=a[i]%10; /*求4位数的个位数字*/
ab=10*a4+a2; /*把千位数字和十位数字重新组成一个新的十位数ab*/
cd=10*a1+a3; /*把个位数字和百位数字组成另一个新的十位数cd*/
if ((ab-cd)>=0 && (ab-cd)<=10 && ab%2==1 && cd%2==1 && a4!=0 && a1!=0) /*如果ab-cd>=0且ab-

cd<=10且两个数均是奇数同时两个新十位数的十
位上的数字均不为零*/
{
b[cnt]=a[i]; /*则把满足条件的数存入数组b中*/
cnt++; /*统计满足条件的数的个数*/
}
}
for(i=0;i<cnt-1;i++) /*将数组b中的数按从大到小的顺序排列*/
for(j=i+1;j<cnt;j++)
if(b[i]<b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
【解析】根据题意可知,函数jsVal()要实现两个功能:一是找出满足条件的那些数,并存放在数组b中;二是对数组b中

的数进行从大到小的排序。
首先要找出满足条件的数,其关键在于对新组成的两个十位数的判断,通过一个if语句来判断是否满足"ab-cd>=0且ab

-cd<=10且两个数均是奇数同时两个新十位数的十位上的数字均不为零"的条件。
其次,将满足条件的数存入数组b中,并用变量cnt来统计数组b中元素的个数。
最后,将所有满足条件的数取出后利用选择法对其进行排序,即用当前元素依次和它后面的元素进行比较,发现有大于

该数的数,就进行交换。

【【【问题出来了:】】】
答案是这样定义接收各位上的数的整形变量的 int a1,b1,c1,d1;
而我是这样定义的 int a,b,c,d;
只是把程序中对应的a1,b1,c1,d1换成了a,b,c,d,结果编译老是有一个错误。经过我两个小时的查找,结果发现原来是

不能单独定义 int a,b 这两个整形变量的,其它单个的字母都行,只有a,b这两个不行,这是什么原因?请教高手!!!



【【【附出错原因:】】】
--------------------Configuration: PROG - Win32 Debug--------------------
Compiling...
PROG.C
D:\WEXAM\00000000\PROG.C(24) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(24) : error C2106: '=' : left operand must be l-value
D:\WEXAM\00000000\PROG.C(30) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(30) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(32) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(33) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(33) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(33) : error C2106: '=' : left operand must be l-value
D:\WEXAM\00000000\PROG.C(34) : error C2109: subscript requires array or pointer type
D:\WEXAM\00000000\PROG.C(34) : error C2106: '=' : left operand must be l-value
执行 cl.exe 时出错.

PROG.exe - 1 error(s), 0 warning(s)
编译环境:微软VC++6.0

这是类似的原题吧:?

已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab-cd>=0且ab-cd<=10且两个数均是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。

#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;

void jsVal(){}

void readDat()
{
int i ;
FILE *fp ;
fp = fopen("in.dat", "r") ;
for(i = 0 ; i < MAX ; i++) fscanf(fp, "%d", &a[i]) ;
fclose(fp) ;
}

void main()
{
int i ;
readDat() ;
jsVal() ;
printf("满足条件的数=%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++) printf("%d ", b[i]) ;
printf("\n") ;
writeDat() ;
}

writeDat()
{
FILE *fp ;
int i ;
fp = fopen("out.dat", "w") ;
fprintf(fp, "%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++) fprintf(fp, "%d\n", b[i]) ;
fclose(fp) ;
}

你看代码的第三行,也就是int a[MAX], b[MAX], cnt = 0;这里已经定义了数组a和数组b,而且在这里定义的是全局变量,就是说一直到程序运行结束,全局变量a,b始终存在;而你在void jsVal(){}函数里定义的只是局部变量,不能与全局变量重名。
建议一下,既然是定义个十百千位,最好用data,ten,hun,thou之类的英文,这样既不会冲突,自己写起来也不会到最后弄混了。还有希望再有问题的话最好把原题先贴出来哦~~~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-08-05
可以单独定义字母 a b 为整形的。你把你错误程序写出来可以吗,这样对着错误提示才能看明白,只有错误提示怎么知道你错在哪里了
第2个回答  2008-08-12
你已经定义了int a[],b[]
如果再定义 int a,b.
会冲突。
第3个回答  2008-08-05
回答
第4个回答  2008-08-09
我调试的结果是32个错误!!!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网