您的当前位置:首页全国计算机三级数据库技术上机试题1道

全国计算机三级数据库技术上机试题1道

来源:爱问旅游网
1.【考点分析】 本题考查对4位整数的排序。考查的知识点主要包括:数组元素的排序算法,if判断语句和逻辑表达式,以及求余算术运算。

【解题思路】 此题属于4位数排序问题。本题需主要解决3个问题:问题1如何取4位数的后3位进行比较;问题2如何按照题目要求的条件(按照每个数的后3位的大小进行降序排列,如果后3位相等,则按照原始4位数的大小进行升序排列)排序;问题3如何将排完序的前10个数存到数组bb中去。

本题的解题思路为:使用双循环对数组按条件进行排序,然后将排完序的前10个数存到数组bb中。对于问题1可以通过算术运算的取余运算实现(aa[i]%1000);问题2通过包含if判断语句的起泡排序法就可以实现。

【参考答案】 void jsSort() {

int i,j; /*定义循环控制变量*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<199;i++) /*用选择法对数组进行排序*/ for(j=i+1;j<200;j++) {

if(aa[i]%1000temp=aa[i]; aa[i]=aa[j]; aa[j]=temp; }

else if(aa[i]%1000==aa[j]%1000) /*如果后3位数相等*/

if(aa[i]>aa[j]) /*则要按原4位数的值进行升序排序*/ {

temp=aa[i]; aa[i]=aa[j]; aa[j]=temp; } }

for(i=0;i<10;i++) /*将排序后的前10个数存入数组b中*/ bb[i]=aa[i]; }

【易错提示】 取4位数后三位的算法,if判断语句中逻辑表达式的比较运算符。

2.【考点分析】 本题主要考查的知识点包括:C语言循环结构,if判断语句和逻辑表达式,以及分解多位整数的算术运算。

【解题思路】 分析题干,本题除给出条件\"SIX+SIX+SIX = NINE+NINE\"之外,还可得出2个隐含的条件:条件1:SIX和NINE分别是3位和4位的正整数;条件2:SIX的十位数字等于NINE的百位数字,NINE的千位数字和十位数字相等。

本题解题思路:通过嵌套的循环结构可以遍历到所有的3位和4位数,对于每一个3位数及4位数的组合进行题设条件(SIX+SIX+SIX = NINE+NINE)的判断,满足条件的对其分解得到各数位的数字,再进一步判断各位数字是否满足本题隐含的条件(条件1及条件2),如果满足则个数加1,并将该3位数及4位数添加到和值中。

【参考答案】 void countValue() {

int i,j; int s2;

int n2,n3,n4;

for(i=100;i<1000;i++) {

for(j=1000;j<10000;j++) {

if(i*3==j*2) {

s2=i%100/10; n4=j/1000;

n3=j%1000/100; n2=j%100/10;

if(s2==n3&&n2==n4) {

cnt++; sum+=i+j; } } } } }

【易错提示】 隐含条件未被分析出或分析错误,整数数位分解的算术方法使用错误。 3.【考点分析】 本题考查的知识点包括:C语言中文件读函数,if条件判断结构,对多个整数求平均值和方差的算法等。

【解题思路】 此题属于数学类问题。分析题干要求,得出解本题主要需解决3个问题:问题1如何实现从已打开的文件中依次读取数据到数组的操作,问题2如何分离并统计出奇数和偶数的个数及和值,并计算平均值;问题3如何计算奇数的方差。

本题的解题思路为:首先使用C语言的库函数fscanf()将文件中的数依次读入数组xx中,然后通过循环判断得出需要的数据(奇数个数、偶数个数、奇数及偶数的和);最后根据题目中已给出的公式和之前保存的数据计算出奇数的方差。

【参考答案】 int ReadDat(void) {

FILE *fp;

int i,j; /*计数器变量*/ if((fp=fopen(\"IN.DAT\

for(i=0;i<100;i++) /*依次读取整型数据放入数组xx中*/ {

for(j=0;j<10;j++)

fscanf(fp,\"%d,\ fscanf(fp,\"\\n\"); if(feof(fp))

break; /*文件读取结束,则退出*/ }

fclose(fp); return 0; }

void Compute(void) {

int i; /*定义循环控制变量*/ int tt[MAX]; /*定义数组保存奇数*/ for(i=0;i<1000;i++) if(xx[i]%2!=0) {

odd++; /*计算出xx中奇数的个数odd*/ ave1+=xx[i]; /*求奇数的和*/

tt[odd-1]=xx[i]; /*将奇数存入数组tt中*/ } else {

even++; /*计算出xx中偶数的个数even*/ ave2+=xx[i]; /*求偶数的和*/ }

ave1/=odd; /*求奇数的平均值*/ ave2/=even; /*求偶数的平均值*/ for(i=0;itotfc+=(tt[i]-ave1)*(tt[i]-ave1)/odd; /*求所有奇数的方差*/ }

【易错提示】 文件操作函数fscanf()和feof()的用法,if判断语句中逻辑表达式,对方差计算公式运用错误。

4. 【考点分析】 本题考查对一定范围内整数的筛选。考查的知识点主要包括:多位整数的分解算法,完全平方数判断方法,if判断语句和逻辑表达式。

【解题思路】 此题属于数学类问题。分析题干,本题需注意2个关键点:关键点1判断该数是否是完全平方数;关键点2判断该数是否有两位数数字相同。

本题的解题思路为:通过循环控制,依次判断100至999数是否满足关键点1(是否为完全平方数)。如果是,则将该数分解出各位数数字,并判断是否有两位数数字相同,如果存在,则个数加1,并将该数存入数组中。

【参考答案】

int jsValue(int bb[]) {

int i,j; /*定义循环控制变量*/ int cnt=0; /*定义计数器变量*/

int a3,a2,a1; /*定义变量存储三位数每位的数字*/ for(i=100;i<=999;i++) /*在该范围中找符合条件的数*/ for(j=10;j<=sqrt(i);j++)

if(i==j*j) /*如果该数是完全平方数*/ {

a3=i/100; /*求该数的百位数字*/ a2=i%100/10; /*求该数的十位数字*/ a1=i%10; /*求该数的个位数字*/

if(a3==a2 || a3==a1 || a2==a1) /*有两位数字相同*/ {

bb[cnt]=i; /*则把该数存入数组bb中*/ cnt++;

} /*统计满足条件的数的个数*/ }

return cnt; /*返回满足该条件的整数的个数*/ }

【易错提示】 完全平方数的判断方法错误,分解整数各个数位的方法错误,if判断语句中表达式。

5. 【考点分析】 本题考查对一定范围内整数的筛选。考查的知识点主要包括:多位整数的分解算法,素数的判断算法,if判断语句和逻辑表达式。

【解题思路】 此题属于数学类问题。分析题干要求,归纳出本题的2个关键点:关键点1判断该数是否为素数;关键点2判断是否满足条件:个位数字和十位数字之和被10除所得余数等于百位数字。

本题思路为:通过循环语句,依次求出所有3位数的各位数数字,并判断是否满足关键点2(个位数字和十位数字之和被10除所得余数等于百位数字),如果满足则判断该数是否为素数,如果是则个数加1,并将该数加到和值中。判断的方法为:依次取从2到该数1/2的数去除这个数,如果有一个可被整除,则不是素数,如果循环后的数大于该数的一半就可以判定该数是一个素数。

【参考答案】 void countValue() {

int i,j; /*定义循环控制变量*/ int half;

int a3,a2,a1; /*定义变量存储3位数每位的数字*/ for(i=101;i<1000;i++) /*在该范围内寻找符合条件的数*/ {

a3=i/100; /*求百位数字*/ a2=i%100/10; /*求十位数字*/ a1=i%10; /*求个位数字*/

if(a3==(a2+a1)%10) /*如果个位数字与十位数字之和被10除所得余数恰是百位数字*/ {

half=i/2;

for(j=2;j<=half;j++) /*进一步判断该数是否为素数*/

if(i%j==0) break; /*如果不是素数,则跳出循环,接着判断下一个数*/

if(j>half) /*如果是素数*/ {

cnt++; /*计算这些素数的个数cnt*/ sum+=i; /*计算这些素数值的和sum*/ } } } }

【易错提示】 素数的判断算法使用错误,分解整数各个数位的方法错误,if判断语句中逻辑表达式错误。

6. 【考点分析】 本题考查结构体数组的排序。考查的知识点主要包括:结构体成员运算,字符串比较符,数组排序。

【解题思路】 此题属于销售记录排序类题型。此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1如何按产品名称从小到大排序;关键点2如果产品名称相同;关键点3如何按金额从小到大排列。

数组排序可以用起泡法实现,起泡法的思路是:将较小的值像空气泡一样逐渐\"上浮\"到数组的顶部,而较大的数值逐渐\"下沉\"到数组的底部。具体为第1趟用第1个记录和第2个记录进行比较,如果不符合要求,就进行交换,第2个记录和第3个记录比较,直到倒数第2个记录和最后1个记录比较完成;第2趟用第2个记录和第3个记录比较,然后第3个和第4个比较,依此类推。

本题在双循环中进行每次记录比较时,首先用字符串比较函数strcmp比较两个产品的名称,如果返回的值大于0,则这两个产品进行数据交换;如果返回值等于0,再比较两个产品的金额,如果前一个产品的金额大于后一个产品的金额,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if(strcmp(sell[i].mc,sell[j].mc)>0) /*按产品名称从小到大进行排列*/ {

temp=sell[i];

sell [i]=sell[j]; sell[j]=temp; }

else if(strcmp(sell[i].mc,sell[j].mc)==0) /*若产品名称相同*/

if(sell[i].je>sell[j].je) /*则按金额从小到大进行排列*/ {

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

模板一 销售记录排序

【模板速记】

记忆口诀:一定义二循环三比较。定义指定义变量,循环指循环语句,比较是比较记录成员大小及交换,详见模板一。做题时,需灵活应用模板,切勿死记硬背。

【易错提示】 结构型数据对成员的访问用\".\"成员运算符;两个字符串的比较用字符串比较函数strcmp。

7. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题,并且需求出各位数数字,再筛选排序。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为千位数字加个位数字等于百位数字加十位数字)筛选出满足条件的数;问题3如何对数组中的数进行排序。

解此类题的一般思路为:先求出每个数的各位数字,再根据各位数数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和整除可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现。问题3排序可以通过循环嵌套的起泡法来完成。

在求各位数数字时,先将每个数进行取整运算求出千位数,将该数取余再除100取整得出百位数,将该数取余再除10取整得出十位数,最后将该数取余得出个位数。

【参考答案】 voidjsValue() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if(a4+a1==a3+a2) /*如果千位数加个位数等于百位数加十位数*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数cnt*/ } }

for(i=0;ifor(j=i+1;j}

if(b[i]>b[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp; }

【模板速记】

记忆口诀:一定义二筛选三排序。定义指定义相关变量,筛选是筛选出满足条件的数,排序则是按照要求对数组排序。详见模板二。做题时,需灵活应用本模板,切勿死记硬背。

【易错提示】 分解4位数时算术运算符的使用,4位数条件判断时if语句中的条件表达式,起泡法排序时的条件。

模板二 4位数筛选(1)-根据各位数数字排序

8. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的2位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(本题为千位数字与十位数字),以及cd(本题为个位数字与百位数字);问题3如何通过判断条件(ab-cd>=0,ab-cd<=10,ab和cd都为奇数,ab和cd都不为0)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行从小到大的排序。

解此类题的一般思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。本类题和前一类题的不同之处在于筛选的判断条件不同。问题2由加法和乘法得出的各位数字组成新的2位数(本题为:ab=10*a4+a2,cd=10*a1+a3);问题3的条件可以由逻辑表达式实现(本题为:(ab-cd)>=0&&(ab-cd)<=10&&ab%2==1&&cd%2==1&&a4!=0&&a1!=0))。

【参考答案】 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;itemp=b[i]; b[i]=b[j]; b[j]=temp; }

【模板速记】

记忆口诀:一定义二筛选三排序。定义指定义相关变量,筛选是筛选出满足条件的数,排序则是按照要求对数组排序,详见模板三。做题时,需灵活应用本模板,切勿死记硬背。

模板三 4位数筛选(2)-组成2位数再筛选排序

【易错提示】 分解4位数时算术运算符的使用,if判断语句中逻辑表达式,起泡法排序时的条件。

9. 【考点分析】 本题考查对多个整数的筛选以及求平均值。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,平均值的计算方法。

【解题思路】 此题属于4位数的筛选题型,并且涉及统计及平均值问题。解题时,需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过判断条件(本题为千位数上的数加百位数上的数等于十位数上的数加个位数上的数)对目标进行筛选,再分别统计出满足和不满足条件的数的和以及数目;问题3分别求出两类数的平均值。

本题与上题解题思想相同,不同之处在于问题2的判断条件改为:千位数上的数加百位数上的数等于十位数上的数加个位数上的数(a4+a3=a2+a1)。

【参考答案】

int i,n=0; /*定义循环变量和计数器变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if(a4+a3==a2+a1) /*如果千位数加百位数等于十位数加个位数*/ {

cnt++; /*统计满足条件的数的个数*/ pjz1+=a[i]; /*将满足条件的数求和*/ } else {

n++; /*否则统计不满足条件的数的个数*/ pjz2+=a[i]; /*将不满足条件的数求和*/ } }

pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ }

【模板速记】

记忆口诀:一定义二统计三求值。定义指定义相关变量,统计是统计满足条件的数的个数及求出和值,求值是分别求出满足和不满足条件的数的平均值,详见模板四。做题时,需灵活应用本模板,切勿死记硬背。

模板四 4位数筛选(3)-统计及求平均值

【易错提示】 分解4位数时算术运算符的使用;if判断语句中逻辑表达式。

10. 【考点分析】 本题考查对整数的筛选以及数组排序。考查的知识点主要包括:C语言循环结构,逻辑表达式,数组排序。

【解题思路】 此题属于4位数的筛选题型。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何通过判断条件(该4位数连续小于该4位数以后的5个数且该数是偶数)筛选出满足条件的数,同时统计其个数;问题2如何将这些数按照从小到大的顺序排列。

通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现;问题2排序可以通过循环嵌套的起泡法实现。

【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/

int temp; /*定义数据交换是的暂存变量*/ for(i=0;iif(a[i]/*如果当前数是偶数且小于后面连续5个数*/

{

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*并统计满足条件的数的个数*/

}

for(i=0;i}

for(j=i+1;jb[j])

{

temp=b[i]; b[i]=b[j]; b[j]=temp;

}

模板五 4位数的筛选(4)-4位数之间的比较

【模板速记】

记忆口诀:一定义二筛选三排序。定义指定义相关变量,筛选指选出满足条件的数并存入数组,排序指按照要求排序,详见模板五。做题时,需灵活应用本模板,切勿死记硬背。

【易错提示】 循环嵌套的循环控制条件,if判断语句中表达式,数组排列的顺序。 11. 【考点分析】 本题考查对字符数组中的字符进行计算以及替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的位运算,if判断结构以及逻辑表达式。

【解题思路】 首先通读题目,得知此题属于字符计算问题;其次分析题干要求,本题要求实现StrCharJL()函数的功能,分析后可以归纳出3个关键点:关键点1如何对字符数组的元素逐一访问;关键点2如何对字符的ASCII码做左移的位运算;关键点3如何根据条件(移位后的ASCII值小于等于32或大于100)对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

接着分析每一步的解决方法,关键点1通过字符串处理函数strlen获取字符串的长度,再通过获得的长度使用下标法对字符数组的元素逐一访问;关键点2可以直接对字符的ASCII码进行位运算;关键点3通过if判断结构和逻辑表达式即可实现功能。

【参考答案】

void StrCharJL(void)

{ int i,j; /*定义循环控制变量*/

int str; char ch;

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]<<4; if(ch<=32 || ch>100)

continue; /*如果左移4位后字符的ASCII值小于等于32或大于100,

则原字符保持不变*/

else

xx[i][j]+=4; /*否则就把左移后的字符ASCII值加上原字符的ASCII*/ } }

}

【易错提示】 根据字符ASCII码的位计算;if判断语句中的逻辑表达式。

12. 【考点分析】 本题考查对字符数组中的字符计算。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 首先通读题目,得知此题属于字符计算问题;其次分析题干要求,本题要求实现ChA(void)函数的功能,分析后可以归纳出3个关键点:关键点1如何对字符数组的元素逐一访问;关键点2按照要求取每个位置的字符和其下一个字符相加,并将结果作为该位置上的新字符,需要注意的是,末尾位置的新字符是该位原字符和第1个原字符相加的结果;关键点3最后要将所得的结果逆序保存。

接着分析每一步的解决方法,对于关键点1通过字符串处理函数strlen获取字符串的长度,再通过获得的长度用下标法对字符数组的字符元素逐一访问;关键点2在遍历访问字符时,可以直接取下一个位置的字符进行运算,在进行计算之前需要首先保存第1个位置的字符,以作为计算最后位置新字符的条件;关键点3可以通过for循环对数组从首尾同时遍历的算法实现。

【参考答案】 void ChA(void) {

int i,j,k; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch,temp; /*定义字符暂存变量*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ ch=xx[i][0]; /*将第一个字符暂存入ch*/ for(j=0;j/*将该字符的ASCII值赋值为下一个字符的ASCII值加1,得到新的字符*/ xx[i][j]+=xx[i][j+1];

xx[i][str-1]+=ch;

/*将最后一个字符的ASCII值与第一个字符的ASCII值相加,得到最后一个新的字符*/

for(j=0,k=str-1;j组xx中*/ {

temp=xx[i][j];

xx[i][j]=xx[i][k]; xx[i][k]=temp; } } }

【易错提示】 最后一个字符的计算,逆序存储算法的选择。

13. 【考点分析】 本题考查对字符串的查找和统计。考查的知识点包括:指针对字符串的访问方法,C语言循环嵌套结构。

【解题思路】 首先通读题目,得知此题属于字符串处理问题;其次分析题干要求,本题要求实现findStr(char *str, char *sunstr)函数,该函数需要实现在一个字符串中查找另一个字符串,并统计出现次数的功能,分析后可以归纳出实现功能的3个关键点;关键点1如何实现对字符串中字符的遍历;关键点2如何实现对子字符串的查找功能;关键点3如何统计子串其出现的次数。

接着分析每一步的解决方法。对于关键点1使用循环和指针的方式可以实现对字符串的访问;关键点2通过嵌套的循环可以实现查找功能,具体方法是,外层循环控制对主串的遍历,内层是对子串的遍历,当主串中当前字符和子串第1个字符相同时,继续判断其后的字符是否和子串的下一个字符相同,依次类推,则每次内层循环遍历过子串就表示找到一次;关键点3每找到一次子串的同时,累加一个记数器,作为出现次数的统计结果。

【参考答案】

int findStr(char *str,char *substr) {

int n=0; /*定义计数器变量,统计出现次数*/ char *p,*r; /*定义指针变量来分别指向两个字符串*/ while(*str) /*如果字符串没有结束,则一直循环下去*/ {

p=str; /*指针p指向字符串首地址*/ r=substr; /*指针r指向子字符串首地址*/

while(*r) /*若子字符串没有结束,则循环继续*/

if(*r==*p) /*如果子字符串的第一个字符等于字符串中的该字符,则继续比较下一个字符*/ {

r++; p++; } else

break; /*否则退出循环*/

if(*r=='\\0') /*如果子字符串在字符串中出现了一次*/ n++; /*则n加1,进行统计*/

str++; /*指向字符串中的下一个字符*/ }

return n; /*返回统计结果n*/

}

【易错提示】 遍历字符串时指针的使用;查找子串的算法使用。

14. 【考点分析】 本题考查对字符数组中字符排序。考查的知识点包括:字符串数组的访问,数组排序算法。

【解题思路】 首先通读题目,得知此题属于字符排序问题;其次分析题干要求,本题要求实现SortCharD()函数,该函数需要实现将字符数组中的元素排序的算法。分析后可以归纳出实现该功能的关键点是:如何按照字符从大到小的顺序对数组中的字符进行排序。这可以通过循环嵌套的起泡法来实现。

【参考答案】 void SortCharD() {

int i,j,k; /*定义循环控制变量*/ int str; /*存储字符串的长度*/

char temp; /*定义数据交换时的暂存变量*/ for (i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/

for(j=0;jtemp=xx[i][j];

xx[i][j]=xx[i][k]; xx[i][k]=temp; } } }

【易错提示】 排序时if结构中的逻辑表达式。

15. 【考点分析】 本题考查选票的统计。考查的知识点主要包括:C语言循环结构,if条件判断结构和逻辑表达式,二维数组操作。

【解题思路】 首先通读题目,得知此题属于选票的统计题型;其次分析题干要求,本题要求实现CountRs(void)函数的功能,该函数需要统计出100条选票数据,并将统计结果保存入数组yy中;接着归纳出本题有2个关键点:关键点1如何统计每张选票的选择情况;关键点2根据题目给出的条件\"一张选票选中人数小于等于5个人时则被认为无效\"判断选票是否有效。

首先,对数组yy元素初始化为0;接着通过一个循环嵌套结构依次判断每张选票数据的十个选举标志,同时每张选票的投票数量,对于不满足条件的选票数据直接跳过,并统计有效选票的投票情况到数组 yy中。

【参考答案】 void CountRs(void) {

int i,j; /*定义循环控制变量*/

int cnt; /*用来存储每张选票中选中人数,以判断选票是否有效*/

}

for(i=0;i<10;i++) /*初始化数组yy*/ yy[i]=0;

for(i=0;i<100;i++) /*依次取每张选票进行统计*/ {

cnt=0; /*初始化计数器变量*/

for(j=0;j<10;j++) /*统计每张选票的选中人数cnt*/ if(xx[i][j]=='1') cnt++;

if(cnt>5) /*当cnt值大于5时为有效选票*/ {

for(j=0;j<10;j++) /*统计有效选票*/ if(xx[i][j]=='1') yy[j]++; } }

模板七 选票问题

【模板速记】

记忆口诀:一定义二初始化三统计。定义指定义相关变量,初始化指初始化数组,统计是统计每个人选票的数量,详见模板七。做题时,需灵活应用本模板,切勿死记硬背。

【易错提示】 数组yy未初始化,判断选票是否有效的逻辑表达式错误

16. 【考点分析】 本题考查的知识点主要包括:结构体成员的访问,元素的排序, if判断结构和逻辑表达式。

【解题思路】此题属于结构体的筛选排序问题。分析题干要求,可以归纳出3个关键点:关键点1通过条件\"每组数据中第2个数大于第1个数和第3个数之和\"对每组数据进行判断;关键点2保存满足条件的数到新数组中并统计其数量;关键点3对新数组中的数再按照第2个数和第3个数之和的大小进行降序排列;关键点4函数的返回值为之前统计的满足的数据的组数。

接着分析具体的解决方法,首先通过if判断结构和逻辑表达式实现对所有结构的筛选,保存并统计个数,然后通过起泡法完成排序,最后函数返回组数。

【参考答案】 int jsSort()

{ int i,j; /*定义循环控制变量*/

int cnt=0; /*定义计数器变量*/

Data temp; /*定义数据交换时的暂存变量,这里是一个Data类

型的结构体变量*/

for(i=0;i<200;i++)

if(aa[i].x2>aa[i].x1+aa[i].x3) /*如果第二个数大于第一个数加第三个数之

和*/

{

bb[cnt]=aa[i]; /*则把该组数据存入结构数组bb中*/ cnt++; /*同时统计满足条件的数据的个数*/ }

for(i=0;i第三个数之和的大小进行降序排列*/

for(j=i+1;jif(bb[i].x2+bb[i].x3{

temp=bb[i]; bb[i]=bb[j]; bb[j]=temp;

}

return cnt; /*返回满足条件数据的组数*/

}

【易错提示】 第i个人是否报数到m;用表达式(S1+m-1)% i判断。

17. 【考点分析】 本题考查对多个整数的右移、统计以及求平均值。考查的知识点主要包括:位移算法,逻辑表达式,求平均值的算法。

【解题思路】 本题是数学类题。本题的解题思路是:首先利用一个for循环来依次从数组中取得各数,由于题目要求数组中正整数的个数,如果取得的数大于零,这时就给变量totNum(正整数的个数)累加1,然后把该正整数右移一位后的结果临时保存在变量data中,再判断产生的新数是否是偶数。如果是,就给变量totCnt(符合判断条件的正整数个数)累加1,并把原数的值累加到变量totPjz中,当所有符合判断条件的数都被找出后,再对totPjz求平均值。

【参考答案】 void CalValue(void)

{ int i; /*定义循环控制变量*/

int data; /*用于保存处理后产生的新数*/ for(i=0;i<200;i++) /*逐个取数组xx中的数进行统计*/ if(xx[i]>0) /*判断是否正整数*/ {

totNum++; /*统计正整数的个数*/

data=xx[i]>>1; /*将数右移一位*/

if(data%2==0) /*如果产生的新数是偶数*/ {

totCnt++; /*统计这些数的个数*/ totPjz+=xx[i]; /*并将满足条件的原数求和*/ } }

totPjz/=totCnt; /*求满足条件的这些数(右移前的值)的算术平均值*/ }

【易错提示】 位移运算表达式的使用。

18. 【考点分析】 本题考查对多个整数的筛选、统计以及计算平均值,考查的知识点只要包括:多位整数的数位分解算法,逻辑表达式,计算平均值的算法。

【解题思路】 首先通读题目,得知此题属于4位数的筛选题型;其次分析题干要求,本题要求补充main中空白部分,进一步分析,可以归纳出3个关键点:关键点1如何找出数组中最大数的值并统计其个数;关键点2如何通过条件\"可以被7或3整除\"在数组中筛选出满足条件的数;关键点3如何计算平均值。

接着分析每一步的解决方法,对于关键点1通过循环使用起泡法找出其中最大的数,同时统计其个数;关键点2通过if判断结构和逻辑表达式可以实现;关键点3通过之前找到满足条件的数的和及其个数计算出平均值。

【参考答案】 void main() {

int i,k,cnt,xx[N],max; float pj; FILE *fw; long j=0;

system(\"CLS\");

fw=fopen(\"out.dat\ read_dat(xx); max=xx[0];

for(i=1,k=0;iif(xx[i]>max)

max=xx[i]; /*求出数组xx中最大数max*/ if(xx[i]%3==0 ||xx[i]%7==0) {

j+=xx[i]; /*求出数组xx中值能被3整除或能被7整除的数的总和*/ k++; }

}

for(i=0,cnt=0;icnt++; /*求出数组xx中最大数max的个数*/

pj=(float)(j*100/k)/100; /*求出数组xx中值能被3整除或能被7整除的数的平均值*/

printf(\"\\n\\nmax=%d,cnt=%d,pj=%6.2f\\n\ fprintf(fw,\"%d\\n%d\\n%6.2f\\n\ fclose(fw); }

【易错提示】 对数进行筛选时的逻辑表达式。

19. 【考点分析】 本题考查对字符数组中字符计算和替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符计算问题。分析题干要求,可以归纳出3个关键点:关键点1如何对字符数组的元素逐个访问;关键点2如何根据给出的函数替代关系\"f(p)=p*11mod256\"对字符进行计算;关键点3根据条件(本题为\"小于等于32或对应的字符是大写字母\")对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

解此类题的一般思路为:首先通过字符串处理函数strlen获取字符串的长度,根据获得的长度使用下标法逐一对字符数组的元素进行访问;然后按照题目给出的函数关系式直接对字符进行算术运算;最后通过if判断结构和逻辑表达式判断计算结果是否满足条件,分别对两种情况进行处理。

【参考答案】 void encryChar() {

int i,j; /*定义循环控制变量*/ int str; char ch;

/*存储字符串的长度*/ /*存储当前取得的字符*/

/*以行为单位获取字符*/ /*求得当前行的字符串长度*/

for(i=0;i{ ch=xx[i][j] *11%256; /*依次取各行的所有字符*/

if(ch<=32 || (ch>='A' && ch<='Z'))

/*如果计算的值小于等于32或对应的字符是大写字母*/ continue; else

xx[i][j]=ch; /*否则用新字符取代原有字符*/ }

/*则不作改变*/

} }

【模板速记】

记忆口诀:一定义二替换。定义指定义相关变量,替换指按题目要求及替代关系对字符替换。详见模板六。做题时,需灵活应用本模板,切勿死记硬背。

模板六 字符操作类(1)-字符串替代

【易错提示】 根据函数替代关系对字符进行运算;if判断结构中的逻辑表达式。

20. 【考点分析】 本题考查对字符串中字符的替换。考查的知识点主要包括:字符串数组的访问,字符之间的比较和替换,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符替换题型,分析题干要求,可以归纳出2个关键点:关键点1如何实现对字符数组的元素逐一访问;关键点2如何根据条件\"把所有的小写字母改写成该字母的下一个字母\"对字符进行替换。

接着分析具体的解决方法,首先通过字符串处理函数strlen获取字符串的长度,根据获得的长度使用下标法对字符数组的元素逐一访问,判断每个字符是否小写字符,直接将字符替换为其下一个字符,其中对于小写字母\"z\",要将其替换成小写字母\"a\",这些可以通过if判断结构和逻辑表达式来完成。

【参考答案】

void ConvertCharA(void) {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串的长度*/ for(j=0;jif(xx[i][j]>='a' && xx[i][j]<='z') /*如果是小写字母*/ if(xx[i][j]=='z')

xx[i][j]='a'; /*如果是小写字母z,则改写成字母a*/ else

xx[i][j]+=1; /*其他的小写字母则改写为该字母的下一个字母*/ } }

【易错提示】 对字符数组进行逐元素访问;if判断语句中逻辑表达式。

21. 【考点分析】 本题考查对整数的筛选及数组排序。考查的知识点主要包括:C语言循环结构,逻辑表达式等。

【解题思路】 此题属于2位数的筛选题。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何根据判断条件(数组a和b中相同下标位置的数必须符合一个是偶数,另一个是奇数)筛选出满足条件的数,同时统计其个数,问题2如何将这些数按从小到大的书序排列。

通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入

新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现。问题2排序可以通过循环嵌套的起泡法实现。

【参考答案】 void jsVal() {

int i,j; /*定义循环变量*/

int temp; /*用于存储排序中的中间变量*/

for (i = 0;i <= MAX - 1;i++) /*循环查找符合条件的元素*/

if (((a[i] % 2 == 0) && (b[i] % 2 != 0)) || ((a[i] % 2 != 0) && (b[i] % 2 == 0)))

{ /*判断数组a和b中相同下标位置的数是否符合一个是偶数,另一个是奇数*/

c[i] = (a[i]<<8) + b[i]; /*a[i]按二进制左移8位再加上b[i]*/

cnt++; /*记录c中个数*/ }

for (i = 0;i < MAX - 1;i++) /*将C中的元素按从小到大顺序排列*/

for (j = 0;j < MAX - i - 1; j++) if (c[j] > c[j+1]){ temp = c[j]; c[j] = c[j + 1]; c[j+1] = temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。 22. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题型。解此题需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(千位数字减百位数字减十位数字减个位数字大于零)筛选出满足条件的数;问题3如何按照要求(本题为从小到大的顺序)对数组中的数进行排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各数位数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和除法可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现;问题3排序可以通过循环嵌套的起泡法来完成。

【参考答案】 void jsValue() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if(a4-a3-a2-a1>0) /*如果千位数减百位数减十位数减个位数大于零*/ {

b[cnt]=a[i]; /*则把该数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;ib[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

23. 【考点分析】 本题考查对多个整数的筛选以及统计。考查的知识点主要包括:多位整数的分解算法,逻辑表达式。

【解题思路】 此题属于4位数的筛选类题型。解此题需主要解决2个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(千位数字与百位数字之和等于个位数字与十位数字之差的10倍)筛选出满足条件的数并计算个数及和值;

分析题意\"5000以下的自然数\",\"该数存在千位数字\"可知:本题的查找范围为\"1000<= i < 5000\"。通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各数位数字筛选出满足条件的数,对满足条件的数进行统计个数和累加和的运算。对于问题1通过算术运算取余和除法可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现。

【参考答案】 void countValue() {

int i; /*循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ for(i=5000;i>=1000;i--) /*依次取每一个数进行判断*/ {

a4=i/1000; /*求4位数的千位数字*/ a3=i%1000/100; /*求4位数的百位数字*/ a2=i%100/10; /*求4位数的十位数字*/ a1=i%10; /*求4位数的个位数字*/ if(a4+a3==a2+a1 && a4+a3==(a1-a4)*10)

{ /*千位数与百位数之和等于十位数与个位数之和,且千位数与百位数之和等于个位数与千位数之差的10倍*/

}

cnt++; /*则统计满足条件的数的个数*/ sum+=i; /*将满足条件的数求和*/ } }

【易错提示】 隐含条件\"自然数查找范围\"的分析,分解4位数算法的使用, 对4位数筛选和排

24. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数ab(本题为个位数字与千位数字),以及组成cd(本题为百位数字与十位数字);问题3如何通过判断条件(本题为新组成的两个2位数均是奇数并且两个2位数中至少有一个数能被5整除,同时两个新十位数字均不为零)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行从大到小的排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。问题2由加法和乘法得出的各位数字组成新的2位数(本题为ab=10*a4+a1,cd=10*a3+a2);问题3的条件可以由逻辑表达式实现(本题为 \"ab%2==1 && cd%2==1 && (ab%5==0 || cd%5==0)&& a4!=0 && a3!=0\")。

【参考答案】 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+a1; /*把千位数字和个位数字重新组成一个新的十位数*/ cd=10*a3+a2; /*把百位数字和十位数字组成另一个新的十位数*/ if (ab%2==1 && cd%2==1 && (ab%5==0 || cd%5==0)&& a4!=0 && a3!=0)

{ /*如果这两个十位数均是奇数并且两个十位数中至少有一个数能被5整除,同时两个新十位数的十位上的数字均不为零*/

b[cnt]=a[i]; /*则把满足条件的数存入数组b中*/ cnt++; } }

for(i=0;iif(b[i]temp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

25. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(本题为千位数字与十位数字),以及组成cd(本题为个位数字与百位数字);问题3如何通过判断条件(本题为新组成的两个2位数ab-cd≥10且ab-cd≤20且两个数均为偶数,同时两个新十位数字均不为零)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行从大到小的排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序;问题2由加法和乘法得出的各位数字组成新的2位数(本题为ab=10*a4+a2, cd=10*a1+a3);问题3的条件可以由逻辑表达式实现(本题为 \"(ab-cd>=10)&&(ab-cd<=20)&&(ab%2==0)&&(cd%2==0)&&a4!=0&&a1!=0\")。

【参考答案】 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的十位数字是原4位数的千位数字,个位数字是原4位数的十位数字*/

cd=10*a1+a3; /*cd的十位数字是原4位数的个位数字,个位数字是原4位数的百位数字*/

if((ab-cd>=10)&&(ab-cd<=20)&&(ab%2==0)&&(cd%2==0)&&a4!=0&&a1!=0) /*如果ab-cd≥10且ab-cd≤20且两个数均为偶数,同时两个新十位数的十位上的数字均不为零*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/

} }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

26. 【考点分析】 本题考查对结构体数组的排序,可以用起泡法来实现。考查的知识点包括:结构体成员运算,字符串比较符,数组排序。

【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品名称从大到小排序;关键点2本题为如果产品名称相同;关键点3本题为按金额从大到小排列。

本题在每次记录比较时,首先用字符串比较函数strcmp比较两个产品的名称,如果返回的值小于0,则这两个产品进行数据交换;如果返回值等于0,再比较两个产品的金额,如果前一个产品的金额小于后一个产品的金额,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/ PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if (strcmp(sell[i].mc,sell[j].mc)<0) /*按产品名称从大到小进行排列*/ {

temp=sell[i];

sell [i]=sell[j]; sell[j]=temp; } else if(strcmp(sell[i].mc,sell[j].mc)==0) /*若产品名称相同,则按金额从大到小进行排列*/

if(sell[i].jetemp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

【易错提示】 结构型数据对成员的访问用\".\"成员运算符;两个字符串的比较用字符串

比较函数strcmp();if结构中的逻辑表达式。

27. 【考点分析】 本题考查对结构体数组的排序,可以用起泡法来实现。考查的知识点包括:结构体成员运算,字符串比较符,数组排序。

【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品代码从小到大排序;关键点2本题为如果产品代码相同;关键点3本题为按金额从小到大排列。

本题在每次记录比较时,首先用字符串比较函数strcmp比较两个产品的代码,如果返回的值大于0,则这两个产品进行数据交换;如果返回值等于0,再比较两个产品的金额,如果前一个产品的金额大于后一个产品的金额,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if (strcmp(sell[i].dm,sell[j].dm)>0) /*按产品代码从小到大进行排列*/ {

temp=sell[i];

sell [i]=sell[j]; sell[j]=temp; } else if(strcmp(sell[i].dm,sell[j].dm)==0) /*若产品代码相同,则按金额从小到大进行排列*/

if(sell[i].je>sell[j].je) {

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

【易错提示】 结构型数据对成员的访问用\".\"成员运算符;两个字符串的比较用字符串比较函数strcmp();if结构中的逻辑表达式。

28. 【考点分析】 本题考查对结构体数组的排序,可以用起泡法来实现。考查的知识点包括:结构体成员运算,字符串比较符,数组排序。

【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品金额从大到小排序;关键点2本题为如果产品金额相同;关键点3本题为按产品代码从大到小排列。

本题在每次记录比较时,首先比较两个产品的金额,如果前一个产品的金额小于后一个产品的金额,则这两个产品进行数据交换;若产品的金额相等,则用字符串比较函数strcmp比较两个产品的代码,如果返回的值小于0,则这两个产品进行数据交换。

【参考答案】 void SortDat()

{

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if(sell[i].jetemp=sell[i]; sell[i]=sell[j]; sell[j]=temp; }

else if (sell[i].je==sell[j].je) /*若金额相同*/

if (strcmp(sell[i].dm,sell[j].dm)<0) /*则按产品代码从大到小进行排列*/

{

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

【易错提示】 结构型数据对成员的访问用\".\"成员运算符;两个字符串的比较用字符串比较函数strcmp();if结构中的逻辑表达式。

29. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(各位上的数字均是奇数)筛选出满足条件的数;问题3如何按照要求(本题为从大到小的顺序)对数组中的数进行排序。

通过问题分析,得出解此类题的一般思路为:先求出每个数的各位数字,再根据各数位数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和取模可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现。问题3排序可以通过循环嵌套的起泡法来完成。

【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/ if(a4%2!=0 && a3%2!=0 && a2%2!=0 && a1%2!=0) /*如果4位数各位上的数字均是奇数*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。 30. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题型。需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(千位数字加百位数字等于十位数字加个位数字)筛选出满足条件的数;问题3如何按照要求(本题为从大到小的顺序)对数组中的数进行排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和除法可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现;问题3排序可以通过循环嵌套的起泡法来完成。

【参考答案】 void jsValue() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if (a4+a3==a2+a1) /*如果千位数加百位数等于十位数加个位数*/ {

b[cnt]=a[i]; /*把满足条件的4位数依次存入数组b中*/ cnt++; /*计算满足条件的数的个数*/

} }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

31. 【考点分析】 本题考查对4位数的排序。考查的知识点主要包括:数组元素的排序算法,if判断语句和逻辑表达式,以及求余算术运算。

【解题思路】 此题属于4位数排序问题。分析题干要求,本题要求实现jsSort()函数的功能,分析后可以归纳出3个关键点:关键点1如何取4位数的后3位进行比较;关键点2按照每个数的后3位的大小进行升序排列;关键点3如果后3位相等,则按照原始4位数的大小进行降序排列。

接着分析每一步的解决方法,对于关键点1可以通过算术运算的取余运算实现;第2、3点可通过包含if判断语句的起泡排序算法完成。

【参考答案】 void jsSort() {

int i,j; /*定义循环控制变量*/

int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<199;i++) /*选择法对数组进行排序*/ for(j=i+1;j<200;j++) {

if(aa[i]%1000>aa[j]%1000) /*按照每个数的后3位的大小进行升序排列*/ {

temp=aa[i]; aa[i]=aa[j]; aa[j]=temp; }

else if(aa[i]%1000==aa[j]%1000) /*如果后3位数值相等*/

if(aa[i]temp=aa[i]; aa[i]=aa[j]; aa[j]=temp; } }

for(i=0;i<10;i++) /*将排好序的前十个数存入数组bb中*/ bb[i]=aa[i];

}

【易错提示】 取4位数后三位的算法,if判断语句中逻辑表达式。

32. 【考点分析】 本题考查对结构体的筛选和排序。考查的知识点主要包括:字符串数组访问,字符ASCII吗的算术运算,if判断结构和逻辑表达式。

【解题思路】 本题属于字符串操作类题。要求对二维数组中的字符元素按行来处理。 首先用strlen()函数得到当前行所包含的字符个数。

然后再利用一个循环来依次访问该行中的所有字符。对于每一个字符,先按照题目中的函数替代关系\"f(p)=p*13 mod 256\"计算出相应的fp值,再用一条if语句判断该值是否符合本题给定的条件:计算后的值小于等于32或其ASCII值是偶数。如果符合条件,则该字符不变,否则用f(p)所对应的字符对其进行替代。

【参考答案】 void encryChar()

{ int i,j; /*定义循环控制变量*/

int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*13%256;

if((ch<=32) || (ch%2==0)) /*如果计算后的值小于等于32或其ASCII值是偶

数*/

continue; /*则该字符不变,去取下一个字符*/ else

xx[i][j]=ch; /*否则将新字符替代原字符*/ } }

}

【易错提示】 取4位数后三位的算法,if判断语句中逻辑表达式。

33. 【考点分析】 本题考查数学计算问题。考查的知识点主要包括:C语言循环结构,迭代算法,if判断结构和逻辑表达式,浮点型数据的相等比较。

【解题思路】 此题属于数学计算题型。题目要求实现函数countValue()的功能。本题的解题思路是:首先通过一个无条件循环结构作为程序的主体,在该循环体中实现迭代运

算,且当条件\"x0-x1的绝对值小于0.000001\"满足时,退出循环,停止计算,此时x1就是要计算的结果,最后函数返回该结果。

【参考答案】 Float countValue( ) {

float x0,x1=0.0; /*定义两个浮点型变量进行迭代*/ while(1) /*无条件循环*/ {

x0=x1; /*将x1赋值给x0*/ x1=cos(x0); /*求出新的x1*/ if(fabs(x0-x1)<1e-6) break; /*若x0-x1的绝对值小于0.000001,则结束循环*/ }

return x1; /*返回 x1的值*/ }

【易错提示】 迭代算法的应用,循环终止条件的判断。

34. 【考点分析】 本题考查数学计算问题。考查的知识点主要包括:C语言循环结构,迭代算法,if判断结构和逻辑表达式。

【解题思路】 此题属于数学计算题型。本题要实现函数jaValue的功能:找出Fibonacci数列中大于t的最小的一个数。本题解题思路是:首先通过一个循环结构作为程序的主体,在其该循环体中实现迭代运算,逐个计算数列的每一项,同时判断本题的条件\"大于t的最小的一个数\",即第1个被计算出的大于t的Fibonacci数;所以当条件满足时,退出循环并停止计算,此时算出的的Fibonacci项就是想要的结果,最后函数返回该结果。

【参考答案】 int jsValue(int t) {

int f1=0,f2=1,fn; /*定义变量存储Fibonacci数,初始化数列的前两项*/ fn=f1+f2; /*计算下一个Fibonacci数*/

while(fn<=t) /*如果当前的Fibonacci数不大于t,则继续计算下一个Fibonacci数*/ {

f1=f2; f2=fn; fn=f1+f2; }

return fn; /*返回Fibonacci数列中大于t的最小的一个数*/ }

【易错提示】 迭代算法的应用,循环终止条件的判断。

35. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法,子函数的调用方法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(本题为千位数字与十位数字),以及组成cd(本题为个位数字与百位数字);问题3如何通过判断条件(本题为新组成的两个2位数均为素数且新十位数字均不为零)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行

从大到小的排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。问题2由加法和乘法得出的各位数字组成新的2位数(本题为ab=10*a4+a2, cd=10*a1+a3);问题3的条件可以由逻辑表达式(本题为 \"isprime(ab)&&isprime(cd)&&a4!=0&&a1!=0\")实现。

【参考答案】 void jsVal() {

int i;

for(i=2;i<=m/2;i++) if(m%i==0) return 0; return 1; }

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; /*把千位数字和十位数字重新组合成一个新的十位数*/ cd=10*a1+a3; /*把个位数和百位数组成另一个新的十位数*/ if(isprime(ab)&&isprime(cd)&&a4!=0&&a1!=0)

/*如果新组成的两个十位数均为素数且新十位数的十位上的数字均不为零*/ {

b[cnt]=a[i]; /*把满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

36. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法,子函数的调用方法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(本题为千位数字与十位数字),以及组成cd(本题为个位数字与百位数字);问题3如何通过判断条件(本题为新组成的两个2位数均为素数且新十位数字均不为零)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行从大到小的排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。问题2由加法和乘法得出的各位数字组成新的2位数(本题为ab=10*a4+a2, cd=10*a1+a3);问题3的条件可以由逻辑表达式(本题为 \"isprime(ab)&&isprime(cd)&&a4!=0&&a1!=0\")实现。

【参考答案】 void jsVal() {

int i;

for(i=2;i<=m/2;i++) if(m%i==0) return 0; return 1; }

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; /*把千位数字和十位数字重新组合成一个新的十位数*/ cd=10*a1+a3; /*把个位数和百位数组成另一个新的十位数*/ if(isprime(ab)&&isprime(cd)&&a4!=0&&a1!=0)

/*如果新组成的两个十位数均为素数且新十位数的十位上的数字均不为零*/ {

b[cnt]=a[i]; /*把满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;i{

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

37. 【考点分析】 本题考查对多个整数的筛选以及求平均值。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,平均值的计算方法。

【解题思路】 此题属于4位数的筛选题型,并且涉及统计及平均值问题。解题时,需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过判断条件(本题为个位数减千位数减百位数减十位数的值大于0)对目标进行筛选,再分别统计出满足和不满足条件的数的和以及数目;问题3分别求出两类数的平均值。

解此题的思路为:先求出各位数字的值,根据各位数字的属性判断并统计满足和不满足条件的数的个数及和值,最后用和除以个数得出相应的平均值。与前面类型的题不同的是,在问题2筛选时,不需要将符合要求的数存入新的数组,只需用条件判断语句分别统计符合条件的数的数目(cnt)及不符合条件的个数(n),以及对应的和值(pjz1、pjz2)。问题3用和值除以对应个数即可(pjz1/cnt,pjz2/n)。

【参考答案】 void jsValue() {

int i,thou,hun,ten,data,n=0; for(i=0;i<300;i++) {

thou=a[i]/1000; /*求四位数的千位数字*/ hun=a[i]%1000/100; /*求四位数的百位数字*/ ten=a[i]%100/10; /*求四位数的十位数字*/ data=a[i]%10; /*求四位数的个位数字*/

if(data-thou-hun-ten>0) /*如果个位数减千位数减百位数减十位数大于0*/ {

cnt++; /*统计满足条件的数的个数*/ pjz1+=a[i]; /*将满足条件的数求和*/ } else {

n++; /*否则统计不满足条件的数的个数*/ pjz2+=a[i]; /*将不满足条件的数求和*/ } }

pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ }

【易错提示】 分解4位数时算法,if判断结构中的逻辑表达式。

38. 【考点分析】 本题考查对多个整数的筛选以及求平均值。考查的知识点主要包括:

多位整数的分解算法,逻辑表达式,求平均值算法。

【解题思路】 本题属于字符串操作类题,主要考查数组的访问及排序问题。

本题解题思路:通过双重循环结构逐行获取字符进行处理,首先使用字符串处理函数strlen()来求出每一行的字符串长度。然后运用起泡法逐行对字符按照从小到大的顺序进行排序。

【参考答案】 void SortCharA()

{ int i,j,k; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char temp; /*数据交换时的暂存变量*/ for (i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/

for(j=0;jxx[i][k]) {

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; }

}

【易错提示】 分解4位数时算法,if判断结构中的逻辑表达式。

39. 【考点分析】 本题考查对整数的筛选以及数组排序。考查的知识点主要包括:循环嵌套,数组排序。

【解题思路】 本题属于字符串操作类题;考查对二维字符数组的处理。

本题解题思路:需要首先求得各行字符串的长度(利用求字符串长度的strlen()函数),然后借助循环结构逐个访问各行中的每一个字符。

在本题中,应先确定各行中字符串的中间位置,之后用起泡法先对中间位置以前的字符进行降序排序。接着把中间位置前的一个位置定为初始位置,字符串中的最后一个位置也视为初始位置,使两个位置所对应的字符进行交换,交换过后,这两个位置值(也就是下标值)分别前移,再进行对应位置字符的交换。

【参考答案】 void jsSort()

}

{ int i,j,k; /*定义计数器变量*/

int str,half; /*定义存储字符串长度的变量*/ char temp; /*定义数据交换时的暂存变量*/ for(i=0;i<20;i++) /*逐行对数据进行处理*/ {

str=strlen(xx[i]); /*求字符串的长度*/

half=str/2; /*通过half将字符串分为左右两部分*/ for(j=0;j排序*/

换*/

{

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; } }

for(k=j+1;k{

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp;

}

for(j=half-1,k=str-1;j>=0;j--,k--) /*将左边部分和右边部分的对应字符交

}

【易错提示】 循环控制语句,if判断结构中逻辑表达式。

40. 【考点分析】 本题考查对整数的筛选以及数组排序。考查的知识点主要包括:C语言循环结构,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选题型。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何通过判断条件(该4位数连续大于该4位数以前的5个数且该数是偶数)筛选出满足条件的数,同时统计其个数;问题2如何将这些数按照从大到小的顺序排列。

通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现;问题2排序可以通过循环嵌套的起泡法实现。 【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/

int temp; /*定义数据交换是的暂存变量*/ for(i=5;ifor(j=i-5;j<=i-1;j++) /*取该数前面的5个数进行比较*/ {

if(a[i]break; /*如果当前数不满足比前面5个数都大的条件,则跳出循环*/

else if(j==i-1) /*如果当前数比前面的5个数都大*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*并统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 循环控制语句,if判断结构中逻辑表达式。

41. 【考点分析】 本题考查对数的筛选。考查的知识点主要包括:if条件判断结构,逻辑表达式,位运算,平均值计算方法。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何通过条件\"将数右移一位后产生的新数是奇数\"实现对数的筛选;关键点2如何计算其平均值。

本题的解题思路为:使用一个循环控制对所有数遍历访问,统计其中正整数的个数,再通过if判断结构和逻辑表达式实现对数的筛选判断,累加出所有满足条件的数的总和,最后根据其求出算术平均值。

【参考答案】 void CalValue(void) {

int i; /*定义循环控制变量*/

int data; /*用于保存处理后产生的新数*/ for(i=0;i<200;i++) /*逐个取数组xx中的数进行统计*/

if(xx[i]>0) /*判断是否正整数*/ {

totNum++; /*统计正整数的个数*/ data=xx[i]>>1; /*将数右移一位*/

if(data%2==1) /*如果产生的新数是奇数*/ {

totCnt++; totPjz+=xx[i]; }

} /*统计这些数的个数,并将满足条件的原数求和*/ totPjz/=totCnt; /*求满足条件的这些数(右移前的值)的算术平均值*/ }

【易错提示】 if结构中的逻辑表达式;平均值的计算。

42. 【考点分析】 本题考查对指定范围内数的筛选和计算。考查的知识点主要包括:if条件判断结构,逻辑表达式,平均值计算方法。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何判断一个数是奇数还是偶数;关键点2如何计算所有下标为偶数的元素的平均值。

本题的解题思路为:使用循环控制逐个访问数组中的每个数据,通过if else结构判断该数的奇偶性,并分别统计个数,同时累加所有下标为偶数的元素的和值,最后由和值计算出平均值。

通过一个数被2除的结果可以判断该数的奇偶性,如果可以整除则表示该数是偶数,反之为奇数。 【参考答案】 void main() {

int cnt1,cnt2,xx[N]; float pj; FILE *fw; int i,k=0; long j;

system(\"CLS\");

fw=fopen(\"out.dat\ read_dat(xx);

for(i=0,j=0,cnt1=0,cnt2=0;iif(xx[i]%2!=0) /*如果是奇数*/

cnt1++; /*统计数组xx中奇数的个数cnt1*/ else /*如果是偶数*/

cnt2++; /*统计偶数的个数cnt2*/ if(i%2==0) /*如果下标是偶数*/ {

j+=xx[i]; /*求数组xx下标为偶数的元素值的总和*/

k++; /*统计下标为偶数的元素的个数,以进一步求平均值*/

} }

pj=(float)(j*100/k)/100; /*求数组xx下标为偶数的元素值的算术平均值pj*/ printf(\"\\n\\ncnt1=%d,cnt2=%d,pj=%6.2f\\n\ fprintf(fw,\"%d\\n%d\\n%6.2f\\n\ fclose(fw); }

【易错提示】 if结构中的逻辑表达式; 平均值的计算方法。

43. 【考点分析】 本题考查对指定范围内数的筛选和计算。考查的知识点主要包括:if条件判断结构,逻辑表达式,平均值计算方法。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何判断一个数是奇数还是偶数;关键点2如何计算所有下标为奇数元素的平均值。

本题的解题思路为:使用循环控制逐个访问数组中的每个数据,通过if else结构判断该数的奇偶性,并分别统计个数,同时累加所有下标为奇数元素的和值,最后由其计算出平均值。

【参考答案】 void main() {

int cnt1,cnt2,xx[N]; float pj; FILE *fw; int i,k=0; long j=0; cnt1=0; cnt2=0; pj=0.0;

system(\"CLS\");

fw=fopen(\"out.dat\ read_dat(xx); for(i=0;iif(xx[i]%2)

cnt1++; /*求出数组xx中奇数的个数cnt1*/ else

cnt2++; /*求出数组xx中偶数的个数cnt2*/ if(i%2==1) {

j+=xx[i]; /*求数组xx下标为奇数的元素值的总和*/ k++; } }

pj=(float)(j*100/k)/100; /*求数组xx下标为奇数的元素值的算术平均值pj*/ printf(\"\\n\\ncnt1=%d,cnt2=%d,pj=%6.2f\\n\ fprintf(fw,\"%d\\n%d\\n%6.2f\\n\

fclose(fw); }

【易错提示】 if结构中的逻辑表达式;平均值的计算方法。

44. 【考点分析】 本题考查对指定范围内数计算。考查的知识点主要包括:强制转化类型运算,平均值的计算方法。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个问题:问题1如何分解得到一个数的整数部分和小数部分;问题2如何计算N个数的平均值。

本题的解题思路为:使用循环控制逐个访问数组中的数据,实数取整运算所得结果就是该数的整数部分,再用该实数减去其整数部分,结果就是小数部分的数值。分别对这两部分以及实数累加求和。最后由实数的总和计算出平均值。 【参考答案】 void CalValue( ) {

int i; /*定义循环控制变量*/ double sum=0.0; /*定义存储所有数的和值的变量*/ for(i=0;isumint+=(int)xx[i]; /*求整数部分之和*/ sumdec+=(xx[i]-(int)xx[i]); /*求小数部分之和*/ sum=sum+xx[i]; /*求N个数之和*/ }

aver=sum/N; /*求N个数的平均数*/ }

【易错提示】强制类型转化; 平均值的计算方法。

45. 【考点分析】 本题考查对多个整数的筛选以及求平均值的。考查的知识点主要包括:函数的调用方法,逻辑表达式,平均值的计算方法。

【解题思路】 此题属于4位数的筛选题型,并且涉及统计及平均值计算问题。解题时,需主要解决2个问题:问题1如何通过判断条件(本题为该4位数为素数)对目标进行筛选,再分别统计出满足和不满足条件的数的和以及数目;问题2分别求出两类数的平均值。

解此题的思路为:首先通过循环和if判断结构筛选素数,本题中已经提供判断素数的函数,只需调用即可;然后分别统计满足和不满足条件的数的个数及计算和值,最后用和除以个数得出相应的平均值。 【参考答案】 void jsValue() {

int i,n=0; /*定义循环控制变量和计数器变量*/ for(i=0;i<300;i++) /*逐个取4位数*/ if(isP(a[i])) /*如果该数为素数*/ {

pjz1+=a[i]; /*将满足条件的数求和*/

cnt++; /*统计满足条件的数的个数*/ }

else {

pjz2+=a[i]; /*将不满足条件的数求和*/

n++; /*统计不满足条件的数的个数*/ }

pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/ }

【易错提示】 函数的调用方法。

46. 【考点分析】 本题考查的知识点包括:C语言中文件读函数,if条件判断结构,对多个整数求平均值和方差的算法等。

【解题思路】 此题属于4位数排序问题。分析题干要求,本题要求完成ReadDat(void) 函数并实现Compute()函数的功能,分析后可以归纳出3个关键点:关键点1如何实现从已打开的文件中依次读取数据到数组的操作;关键点2如何分离并统计出奇数偶数的个数和所有数的和值,并计算平均值;关键点3如何计算方差。

接着分析每一步的解决方法,对于关键点1可以使用C语言的库函数fscanf();关键点2通过包含if判断语句和逻辑表达式可以实现;关键点3根据题目中已给出的公式和之前保存的数据可以计算出偶数的方差。

【参考答案】 int ReadDat(void) {

FILE *fp;

int i,j; /*计数器变量*/ if((fp=fopen(\"IN.DAT\ return 1;

for(i=0;i<100;i++) /*依次读取整型数据放入数组xx中*/ {

for(j=0;j<10;j++)

fscanf(fp,\"%d,\ fscanf(fp,\"\\n\");

if(feof(fp)) break; /*文件读取结束,则退出*/ }

fclose(fp); return 0; }

void Compute(void) {

int i; /*循环控制变量*/ for(i=0;i<1000;i++) /*依次取每个数*/ {

if(xx[i]%2!=0)

odd++; /*求出xx中奇数的个数odd*/ else

even++; /*求出xx中偶数的个数even*/ aver+=xx[i]; /*求出xx中元素的总和*/ }

aver/=MAX; /*求出xx中元素的平均值*/ for(i=0;i<1000;i++)

totfc+=(xx[i]-aver)*(xx[i]-aver)/MAX; }

【易错提示】 文件操作函数fscanf()和feof()的用法;if判断语句中逻辑表达式;对方差计算公式运用错误。

47. 【考点分析】 本题考查对一定范围内整数的筛选。考查的知识点主要包括:if判断语句和逻辑表达式,指针对存储单元的访问。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1判断条件\"能被7或11整除但不能同时被7和11整除\";关键点2统计满足条件的数的数量。 本题的解题思路为:通过循环控制,依次判断1至1000内的数是否满足关键点1中的条件。如果满足,则将数据保存到数组中,并统计其数量。

【参考答案】

void countValue(int *a,int *n)

{ int i; /*定义循环控制变量*/ *n=0 ; /*初始化计数器变量*/

for(i=1;i<=1000;i++) /*在这个范围内寻找符合条件的数*/ if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))

/*如果当前的数可以被7整除而不可以被11整除,或者可以被11整除而不可以被7整除*/ {

*a=i; /*保存符合条件的数*/ *n=*n+1; /*统计个数*/ a++; }

}

【易错提示】 if判断语句中表达式; 指针对存储单元的访问。

48. 【考点分析】 本题考查对一定范围内整数的筛选和计算。考查的知识点主要包括:C语言循环结构,if判断结构,逻辑表达式,库函数的调用。

【解题思路】 本题属于字符串类题。首先用strlen()函数得到当前行所包含的字符个数。 然后再利用for循环来依次访问该行中的所有字符。对于每一个字符,先按照题目中的函数替代关系\"f(p)=p*11 mod 256\"计算出相应的fp值,再用一条if语句判断该值是否符合本题给定的条件:\"原字符是数字字符0至9或计算后的值小于等于32\"。如果符合条件,则该字符不变,否则用f(p)所对应的字符对其进行替代。

【参考答案】 void encryChar()

{ int i,j; /*定义循环控制变量*/

int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if((xx[i][j]>='0' && xx[i][j]<='9') || ch<=32)

/*如果原字符是数字字符0至9或计算后的值小于等于32*/ continue; /*则不做改变,指向下一个字符*/ else

xx[i][j]=ch; /*否则用新字符取代原有字符*/ } }

}

【易错提示】 if判断结构中的逻辑表达式;求平方根函数的调用。

49. 【考点分析】 本题考查对指定范围内数的筛选和计算。考查的知识点主要包括:判断素数的算法,if条件判断结构,逻辑表达式。判断素数的算法,if条件判断结构,逻辑表达式。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何找出题设范围内的素数;关键点2如何计算满足条件的数的间隔加、减之和。

本题的解题思路为:通过循环控制,依次判断大于等于500小于800范围内的自然数是否是素数,将满足条件的数保存到数组中。最后对其计算间隔加减之和。这里可以通过\"乘以一个变量\"来控制其加减符号,具体方法是设置变量的初始值为\"1\每次循环都使该变量乘以\"-1\"就可实现。 【参考答案】 void countValue()

{ int i,j; /*定义循环控制变量*/ int half; /*判断素数时所需值的存储变量*/ int xx[100]; /*定义整型数组,用来保存素数*/

for(i=800;i>500;i--) /*在这个范围内进行挑选*/ {

half=i/2;

for(j=2;j<=half;j++) /*判断是否素数*/

if(i%j==0) break; /*如果该数不是素数,则退出此层循环*/ if(j>half) /*如果该数是素数,则将该数存入数组xx中*/ {

xx[cnt]=i;

cnt++; /*统计素数的个数*/ } }

for(i=0,j=-1;ij*=-1; /*用j来控制间隔的加减号*/ sum+=j*xx[i]; }

}

【易错提示】 判断素数的算法; 间隔加减的实现方法。

50. 【考点分析】 本题考查对素数的筛选。考查的知识点主要包括:判断素数的算法,C语言循环结构,if条件判断结构,逻辑表达式。

【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何分析本题中数的筛选范围;关键点2如何找出指定个数的素数。

本题的解题思路为:用一个无条件循环作为程序主体,在循环体中由一个if判断结构和break语句控制指定的筛选素数个数;利用一个内部循环体来实现数的筛选功能,逐个保存满足条件的数(素数),直到筛选出指定个数的素数,退出循环。 【参考答案】

void num(int m,int k,int xx[]) {

int i,half,cnt=0; /*定义变量cnt来统计已经取得的素数个数*/ int data=m+1; /*从大于整数m的数开始找*/

while(1) /*循环条件始终为真,所以是无条件循环*/ {

half=data/2; /*求出当前数的一半,判断素数用*/

for(i=2;i<=half;i++) /*如果该数依次除以从2到一半的整数,余数都不是0,则该数是素数*/

if(data%i==0) /*如果余数为0*/

break; /*则退出循环,取下一个数判断*/ if(i>half) {

xx[cnt]=data;

cnt++; /*判断该数为素数后,将该数存入数组xx中,并累计素数的个数*/ }

if(cnt>=k) break; /*如果累计素数的个数超过了要求的个数,则退出循环*/ data++; /*如果累计素数的个数小于要求的个数,则继续取下一个数*/ } }

【易错提示】 判断素数的算法;控制筛选指定个数素数的程序逻辑。

51. 【考点分析】 本题考查对字符串处理。考查的知识点主要包括:字符串元素的遍历访问, if判断结构,逻辑表达式。

【解题思路】 本题的解题思路是,首先确定该行字符串的长度;然后使用循环结构依次对字符进行处理;先找到字符\"o\将\"o\"右侧的字符依次向左移,这个操作同时能够删除字符\"o\"。记录下最后一个\"o\"所在的位置,在这个\"o\"右侧的所有字符都要移到已处理字符串的左边,这个过程也是使用循环来完成的。 【参考答案】 void StrOR(void)

{ int i,j,k; /*定义循环控制变量*/ int index,str; /*定义变量*/ char temp; /*暂存变量*/

for(i=0;istr=strlen(xx[i]); /*求各行的长度*/ index=str;

for(j=0;jif(xx[i][j]=='o')

{

for(k=j;kxx[i][str-1]=' ';

index=j; /*记录下最后一个o所在的位置*/ j = 0;

}

for(j=str-1;j>=index;j--) /*最后一个o右侧的所有字符都移到已处理字符串的左边*/

{

temp=xx[i][str-1]; for(k=str-1;k>0;k--) xx[i][k]=xx[i][k-1]; xx[i][0]=temp; } }

}

【易错提示】 对字符数组进行逐元素访问;if判断结构中的逻辑表达式。

52. 【考点分析】 本题考查对字符串处理。考查的知识点主要包括:字符串元素的遍历访问,if判断结构,逻辑表达式。

【解题思路】 分析题干要求,可以归纳出2个关键点:关键点1如何在字符串中提取出以空格或标点符号为分隔的单词;关键点2如何将提取出的单词倒序排列。

本题的解题思路是:先让两个字符指针都指向每一行字符的串尾,然后使其中一指针(p1)往前移动,当出现pl指向的不是字母时则表示在p1+1与p2之间是一个单词,将该单词存入字符数组t1中,最后将t1连接到新字符串t中;接着再往前找第2个单词,依次类推直到p1越过字符串的起始位置。

【参考答案】 void StrOL(void) {

int i,j,k; /*定义数组下标变量*/ char t[80],t1[80]; /*定义数组暂存取得的单词*/ for(i=0;ij=k=strlen(xx[i])-1; /*将每行末尾字符的下标保存在j和k中*/ t[0]=t1[0]='\\0'; /*初始化两个字符数组*/

while(1) /*无条件循环,循环体内有结束循环的语句*/ {

while(isalpha(xx[i][j])==0&&j>=0) /*若以j为下标的字符不是字母并且还在数组xx之内*/ k=--j;

while(isalpha(xx[i][j])&&j>=0) /*若以j为下标的字符是字母并且还在数组xx之内*/

j--; /*当退出这个循环时,xx[i][j+1]和xx[i][k]分别是同一个单词的第一个和最后一个字母*/

memcpy(t1,&xx[i][j+1],k-j); /*将该单词保存到字符数组t1*/ t1[k-j]='\\0'; /*为t1中的单词添加字符串结束标志*/ strcat(t,t1); /*将单词保存到数组t中*/ strcat(t,\" \"); /*单词之间用空格分隔*/

if(j<0) /*如果以j为下标的字符不在数组xx中*/ break; /*则退出外层while循环*/ }

strcpy(xx[i],t); /*按行将处理完了字符串重新保存到数组xx中*/ } }

【易错提示】 对英文单词的提取算法;处理结束条件的判断。

53. 【考点分析】 本题考查对字符的排序。考查的知识点主要包括:字符串元素的遍历访问,逻辑表达式,数组排序算法。

【解题思路】 此题属于字符排序题型。分析题干要求,可以归纳2个问题:问题1如何找出字符串中以奇数为下标的字符;问题2如何按照要求对这些字符进行排序(本题为按ASCII值从小到大的顺序)。

接着分析具体的解决方法,首先用字符串处理函数strlen获得字符串的长度,使用循环对字符串进行间隔访问(只访问其中下标为奇数的元素),同时通过起泡法对其进行从小到大的排列。

【参考答案】 void jsSort() {

int i,j,k; /*定义循环控制变量*/

int str; /*定义存储字符串长度的变量*/ char temp; /*定义数据交换时的暂存变量*/ for(i=0;i<20;i++) /*逐行对数据进行处理*/ {

str=strlen(xx[i]); /*求各行字符串的长度*/

for(j=1;jfor(k=j+2;kxx[i][k]) {

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; } } }

【易错提示】 数组的下标法访问;排序算法中的逻辑表达式。

54. 【考点分析】 本题是对字符的排序问题。考查的知识点主要包括:字符串元素的遍历访问,逻辑表达式,数组排序算法。

【解题思路】 此题属于字符排序题型;分析题干要求需主要解决2个问题:问题1如何实现从字符串中间一分为二,并将左边部分按字符的ASCII值降序排序;问题2如何按照要求将字符串的右边部分按照升序排列。

接着分析具体的解决方法,首先用字符串处理函数strlen获得字符串的长度,进而求得该长度的二分之一,并由其实现对字符串左右两半部分元素的访问,排序可以使用起泡法实现。

【参考答案】 void jsSort() {

int i,j,k; /*定义循环控制变量*/

int str,half; /*定义存储字符串长度的变量*/ char temp; /*定义数据交换时的暂存变量*/ for(i=0;i<20;i++) /*逐行对数据进行处理*/ {

str=strlen(xx[i]); /*求各行字符串的总长度*/ half=str/2; /*求总长度的一半*/

for(j=0;jtemp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; }

if(str%2==1) /*如果原字符串长度为奇数,则跳过最中间的字符,使之不参加排序*/

half++;

for(j=half;jxx[i][k]) {

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; } } }

55. 【考点分析】 本题是选票的统计问题。考查的知识点主要包括:C语言循环结构,if条件判断结构和逻辑表达式,字符比较操作。

【解题思路】 首先通读题目,得知此题属于选票的统计题型;其次分析题干要求,本题要求实现CountRs(void)函数的功能,该函数需要统计出100条选票数据,并将统计结果保存入数组yy中;接着归纳出本题有2个关键点:关键点1如何统计每张选票的选择情况;

关键点2根据题目给出的条件\"全选或全不选的选票被认为无效\"判断选票是否有效。

首先,对数组yy元素初始化为0,接着通过一个循环嵌套结构依次判断每张选票数据的十个选举标志,以及每张选票的投票数量,对于不满足条件的选票数据直接跳过,并统计有效选票的投票情况到数组 yy中。

【参考答案】 void CountRs(void) {

int i,j; /*定义计数器变量*/

int count; /*存储每张选票的选中人数,以判断选票是否有效*/ for(i=0;i<10;i++) /*初始化数组yy*/ yy[i]=0;

for(i=0;i<100;i++) /*依次取每张选票进行统计*/ {

count=0;

for(j=0;j<10;j++) /*统计每张选票的选中人数count*/ if(xx[i][j]=='1') count++;

if(count!=0 && count!=10) /*如果既不是全选也不是空票,则为有效票*/ for(j=0;j<10;j++) if(xx[i][j]=='1') yy[j]++; } }

【易错提示】 数组yy未初始化,判断选票是否有效的逻辑表达式错误。

56. 【考点分析】 本题考查对字符数组中字符计算和替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符替代问题;分析题干要求,可以归纳出3个关键点:关键点1如何对字符数组的元素逐个访问;关键点2如何根据给出的函数替代关系\"f(p)=p*11 mod 256\"对字符进行计算;关键点3根据条件(本题为\"原字符的ASCII值是偶数或计算后f(p)的值小于等于32\")对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

通过问题分析,得出解此题的思路为:首先通过字符串处理函数strlen获取字符串的长度,根据获得的长度使用下标法逐一对字符数组的元素进行访问;然后按照题目给出的函数关系式直接对字符进行算术运算;最后通过if判断结构和逻辑表达式判断计算结果是否满足条件,分别对两种情况进行处理。

【参考答案】 void encryptChar() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;j{

ch=xx[i][j]*11%256;

if(xx[i][j]%2==0 || ch<=32)

continue; /*如果原字符的ASCII值是偶数或计算后的值小于等于32,则该字符不变*/ else

xx[i][j]=ch; /*否则将所对应的字符进行替代*/ } } }

【易错提示】 根据函数替代关系对字符进行运算,if判断结构中逻辑表达式。

57. 【考点分析】 本题考查对字符数组中字符计算和替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符替代问题;分析题干要求,可以归纳出3个关键点:关键点1如何对字符数组的元素逐个访问;关键点2如何根据给出的函数替代关系\"f(p)=p*11 mod 256\"对字符进行计算;关键点3根据条件(本题为\"计算后f(p)的值小于等于32或f(p)对应的字符是数字0至9\")对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

本题与上题解题思路相同,不同的是替代关系的条件不同,本题为计算的f(p)值不满足小于等于32或对应字符是数字0至9。

【参考答案】 void encryptChar() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if(ch<=32 || (ch>='0' && ch<='9') )

continue; /*如果计算后的值小于等于32或f(p)对应的字符是数字0至9,则该字符不变*/ else

xx[i][j]=ch; /*否则按给定的替代关系进行替代*/ } } }

【易错提示】 根据函数替代关系对字符进行运算,if判断结构中逻辑表达式。

58. 【考点分析】 本题考查对字符数组中字符计算和替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符替代问题。分析题干要求,可以归纳出3个关键点:关键点1如何对字符数组的元素逐个访问;关键点2如何根据给出的函数替代关系\"f(p)=p*11 mod

256\"对字符进行计算;关键点3根据条件(本题为\"计算后f(p)的值小于等于32或f(p)对应的字符是小写字母\")对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

本题与前两题思路相同,不同的是本题的替代条件为计算后的f(p)值不满足小于等于32或f(p)对应的字符不是小写字母。

【参考答案】

void encryptChar() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if ((ch>='a' && ch<='z') || ch<=32)

/*如果计算后的值小于等于32或对应的字符是小写字母*/ continue; else

xx[i][j]=ch; /*否则用新字符来替代这个字符*/ } } }

【易错提示】 根据函数替代关系对字符进行运算,if判断结构中逻辑表达式。

59. 【考点分析】 本题考查对字符串中字符的替换。考查的知识点主要包括:字符串数组的访问,字符之间的比较和替换,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符替换题型;分析题干要求,可以归纳出2个关键点:关键点1如何实现对字符数组的元素逐一访问;关键点2如何根据条件\"把所有的小写字母改写成该字母的上一个字母\"对字符进行替换。

接着分析具体的解决方法,首先通过字符串处理函数strlen获取字符串的长度,根据获得的长度使用下标法对字符数组的元素逐一访问,判断每个字符是否是小写字符,如果是则将字符替换为其上一个字符,其中对于小写字母\"a\",要将其替换成小写字母\"z\",这些可以通过if判断结构和逻辑表达式来完成。 【参考答案】

void CovertCharD() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ for(i=0;istr=strlen(xx[i]); /*求得各行的字符长度*/

for(j=0;jif(xx[i][j]>='a'&& xx[i][j]<='z') /*如果是小写字符,只对小写字符进行处

理*/ {

if(xx[i][j]=='a')

xx[i][j]='z'; /*如果是小写字母a,就改成字母z*/ else

xx[i][j]-=1; /*其余的改成该字母的上一个字母*/ } } }

【易错提示】 对字符数组进行逐元素访问;if判断结构中逻辑表达式。

60. 【考点分析】 本题考查对字符串中字符的替换。考查的知识点主要包括:指针对字符串元素的访问,C语言循环结构,if判断结构,逻辑表达式。

【解题思路】 此题属于字符替换题型;分析题干要求,可以归纳出2个关键点:关键点1用指针实现对字符串元素的逐一访问;关键点2根据要求\"把所有的小写字母改写成该字母的下一个字母\"对字符进行替换。

接着分析具体的解决方法,首先通过指针的移动来实现对字符串的遍历,当指针指向位置的数值不为空,通过if判断结构和逻辑表达式来实现对所有字母的替换操作;其中对于字母\"z\"和\"Z\",要分别将其替换成字母\"a\"和\"A\"。

【参考答案】 void chg(char *s) {

while(*s) /*若当前字符不是字符串结束符,则循环一直进行*/ if(*s=='z'||*s=='Z') /*将当前字母是'z'或者'Z'*/ {

*s-=25; /*则分别将其改成'a'或'A'*/ s++; /*取下一个字母*/ }

else if(*s>='a'&& *s<='y') /*若是小写字母,则改成该字母的下一个字母*/ {

*s+=1;

s++; /*取下一个字母*/ }

else if(*s>='A'&& *s<='Y') /*若是大写字母,则改成该字母的下一个字母*/ {

*s+=1;

s++; /*取下一个字母*/ }

else s++; /*取下一个字母*/ }

【易错提示】 对字符数组进行逐元素访问;if判断结构中的逻辑表达式。

61.

【解题思路】 本题是字符串操作类型题;本题考查用指针访问字符串的方法。 本题解题思路:首先,通过字符串处理函数(strlen())求出字符串的长度,保存第1

个字符。然后,利用一个for循环将字符串依次左移一位。最后,将保存的第1个字符移到最后。

【参考答案】 void chg(char *s)

{ int i,str; /*定义变量,保存字符串长度*/

char temp; /*定义暂存变量*/ str=strlen(s); /*求字符串的长度*/ temp=*s; /*将第一个字符暂赋给ch*/ for(i=0;i*(s+str-1)=temp; /*将第一个字符移到最后*/

}

【易错提示】 循环控制对数组元素的访问,if判断结构中的逻辑表达式。

62. 【考点分析】 本题考查对字符数组中字符计算和替换。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,if判断结构以及逻辑表达式。

【解题思路】 此题属于字符计算问题;分析题干要求,可以归纳出3个关键点:关键点1如何对字符数组的元素逐个访问,关键点2如何根据给出的函数替代关系\"f(p)=p*11 mod 256\"对字符进行计算;关键点3根据条件(本题为\"原字符是大写字母或计算后f(p)的值小于等于32\")对计算结果进行判断,并分别对满足与不满足条件的情况进行处理。

通过问题分析,得出解此题的思路为:首先通过字符串处理函数strlen获取字符串的长度,根据获得的长度使用下标法逐一对字符数组的元素进行访问;然后按照题目给出的函数关系式直接对字符进行算术运算;最后通过if判断结构和逻辑表达式判断计算结果是否满足条件,分别对两种情况进行处理。

【参考答案】 void encryChar() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if((xx[i][j]>= 'A'&& xx[i][j]<='Z')|| ch<=32)

/*如果原字符是大写字母或计算后的值小于等于32*/

continue; /*则此字符不变,取下一个字符*/ else

xx[i][j]=ch; /*如果不满足条件,则用新字符替代原字符*/ } } }

【易错提示】 根据函数替代关系对字符进行运算,if判断结构中的逻辑表达式。

63. 【考点分析】 本题考查对字符数组中的字符计算。考查的知识点主要包括:字符串数组的访问,字符ASCII码的算术运算,位运算,if判断结构以及逻辑表达式。

【解题思路】 首先通读题目,得知此题属于字符计算问题;其次分析题干要求,本题要求实现CharConvA (void)函数的功能。分析后可以归纳出2个关键点:关键点1如何对字符数组的元素逐一访问;关键点2按照要求取每个位置的字符右移4位后和其下一个字符相加,并将结果作为该位置上的新字符,以此类推;需要注意的是,末尾位置的新字符是该位原字符和第1个原字符相加的结果。

接着分析每一步的解决方法,对于第1点,通过字符串处理函数strlen获取字符串的长度,再通过获得的长度用下标法对字符数组的字符元素逐一访问;第2点,在遍历访问字符时,可以直接取下一个位置的字符进行运算,在进行计算的开始需要首先保存第1个位置的字符。以作为计算最后位置新字符的条件。

【参考答案】 void CharConvA(void) {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串长度*/ char ch; /*暂存最后一个字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ ch=xx[i][str-1]; /*将最后一个字符暂存入ch*/

for(j=str-1;j>0;j--) /*从最后一个字符开始,直到第二个字符*/ xx[i][j]=(xx[i][j]>>4)+xx[i][j-1];

/*当前字符ASCII值右移4位加前一个字符的ASCII值,得到新的当前字符*/

xx[i][0]+=ch; /*第一个字符的ASCII值加最后一个字符的ASCII值,得到第一个新的字符*/ } }

【易错提示】 最后一个字符的计算,逆序存储算法的选择。

64. 【考点分析】 本题考查对字符的排序。考查的知识点主要包括:字符串元素的遍历访问,逻辑表达式,数组排序算法。

【解题思路】 此题属于字符排序题型。分析题干要求,可以归纳出2个问题:问题1如何实现从字符串中间一分为二,并将左边部分按字符的ASCII值升序排序;问题2如何按照要求将字符串的左右两个部分对换。

接着分析具体的解决方法,首先用字符串处理函数strlen获得字符串的长度;既而求得

该长度的二分之一,并由其实现对字符串左半部分元素的访问,排序可以使用起泡法实现;然后同时从字符串的中间和末尾位置进行访问,使两个位置所对应的字符进行交换,交换过后,这两个位置值(也就是下标值)分别前移,再进行对应位置字符的交换。 【参考答案】 void jsSort() {

int i,j,k; /*定义计数器变量*/

int str,half; /*定义存储字符串长度的变量*/ char temp; /*定义数据交换时的暂存变量*/ for(i=0;i<20;i++) /*逐行对数据进行处理*/ {

str=strlen(xx[i]); /*求字符串的长度*/

half=str/2; /*确定各行中字符串的中间位置*/

for(j=0;jxx[i][k]) {

temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp; }

for(j=half-1,k=str-1;j>=0;j--,k--) /*将左边部分与右边部分对应的字符进行交换*/ {

temp=xx[i][j];

xx[i][j]=xx[i][k]; xx[i][k]=temp; } } }

【易错提示】 排序结构中的逻辑表达式。

65. 【考点分析】 本题考查选票的统计。考查的知识点主要包括:C语言循环结构,if条件判断结构和逻辑表达式,字符比较操作。

【解题思路】 首先通读题目,得知此题属于选票的统计题型;其次分析题干要求,本题要求实现CountRs(void)函数的功能,该函数需要统计出100条选票数据,并将统计结果保存入数组yy中;接着归纳出本题有2个关键点:关键点1如何统计每张选票的选择情况;关键点2根据题目给出的条件\"选中人数大于5个人时被认为无效\"判断选票是否有效。

首先,对数组yy元素初始化为0;接着通过一个循环嵌套结构依次判断每张选票数据的十个选举标志,同时每张选票的投票数量,对于不满足条件的选票数据直接跳过,并统计有效选票的投票情况到数组 yy中。

【参考答案】 void CountRs(void) {

int i,j; /*定义计数器变量*/

int count; /*存储每张选票的选中人数,以判断选票是否有效*/ for(i=0;i<10;i++) /*初始化数组yy*/ yy[i]=0;

for(i=0;i<100;i++) /*依次取每张选票进行统计*/ {

count=0;

for(j=0;j<10;j++) /*统计每张选票的选中人数count*/ if(xx[i][j]=='1') count++;

if(count<=5) /*当count值不大于,即小于等于5时为有效选票*/ for(j=0;j<10;j++) /*统计有效选票*/ if(xx[i][j]=='1') yy[j]++; } }

【易错提示】 数组yy未初始化,判断选票是否有效的逻辑表达式错误。

66. 【考点分析】 本题考查结构体数组的排序,可以用起泡法来实现。考查的知识点包括:结构体成员运算,字符串比较符,数组排序。

【解题思路】 此题属于销售记录类题型。解题时,应注意3个关键点:关键点1本题为按产品名称从大到小排序;关键点2本题为如果产品名称相同;关键点3本题为按产品金额从小到大排列。

本题在每次记录比较时,首先用字符串比较函数strcmp比较两个产品的名称,如果返回的值小于0,则这两个产品进行数据交换;如果返回值等于0,再比较两个产品的金额,如果前一个产品的金额大于后一个产品的金额,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法排序*/ for(j=i+1;j<100;j++)

if (strcmp(sell[i].mc,sell[j].mc)<0) /*按产品名称从大到小进行排列*/ {

temp=sell[i];

sell [i]=sell[j]; sell[j]=temp; } else if(strcmp(sell[i].mc,sell[j].mc)==0) /*若产品名称相同,则按金额从小到大排列*/

if(sell[i].je>sell[j].je) {

temp=sell[i]; sell[i]=sell[j];

sell[j]=temp; } }

【易错提示】 结构型数据对成员的访问用\".\"成员运算符;两个字符串的比较用字符串比较函数strcmp;if结构中的逻辑表达式。

67. 【考点分析】 本题考查对整数的筛选及数组排序。考查的知识点主要包括:C语言循环结构,逻辑表达式等。

【解题思路】 此题属于2位数的筛选题。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何根据判断条件(数组a和b中相同下标位置的数是否都是奇数)筛选出满足条件的数,同时统计其个数,问题2如何将这些数按从小到大的书序排列。

通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现。问题2排序可以通过循环嵌套的起泡法实现。

【参考答案】 void jsVal() {

int i,j; /*定义循环变量*/

int temp; /*用于存储排序中的中间变量*/

for (i = 0;i <= MAX - 1;i++) /*循环查找符合条件的元素*/ if ( (a[i] % 2 != 0) && (b[i] % 2 != 0))

{ /*判断数组a和b中相同下标位置的数是否符合都是奇数*/

c[i] = (a[i]/10)*1000 + (b[i]/10)*100 + (b[i]%10)*10 + (a[i]%10); /*数组a中十位数字为新数的千位数字,个位数字仍为新数的各位数字;数组b中的十位数字 为新数的百位数字,个位数字为新数的十位数字*/

cnt++; /*记录c中个数*/ }

for (i = 0;i < MAX - 1;i++) /*将C中的元素按从小到大顺序排列*/ for (j = 0;j < MAX - i - 1; j++) if (c[j] > c[j+1]){ temp = c[j]; c[j] = c[j + 1];

c[j+1] = temp; }

}

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

68. 【考点分析】 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。

【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的2位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(本题为千位数字与十位数字),以及组成cd(本题为个位数字与百位数字);问题3如何通过判断条件(本题为新组成的两个2位数ab通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。问题2由加法和乘法得出的各位数字组成新的2位数(本题为ab=10*a4+a2, cd=10*a1+a3),问题3的条件可以由逻辑表达式实现(本题为 \"(abint 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/*如果abb[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;i{

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 分解4位数算法的使用, 对4位数筛选和排序时if结构中的逻辑表达式。

69. 【考点分析】 本题考查对多个整数的筛选以及求平均值。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,平均值的计算方法。

【解题思路】 本题属于字符串类题。首先用strlen()函数得到当前行所包含的字符个数。

然后再利用一个循环来依次访问该行中的所有字符。对于每一个字符,先按照题目中的函数替代关系\"f(p)=p*11 mod 256\"计算出相应的fp值,再用一条if语句判断该值是否符合本题给定的条件:\"计算后的值小于等于32或为奇数\"。如果符合条件,则该字符不变,否则用f(p)所对应的字符对其进行替代。 【参考答案】 void encryChar() {

int i,j; /*定义循环控制变量*/

int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if(ch<=32 || ch%2!=0) /*如果计算后的值小于等于32或其ASCII值是奇数*/ continue; /*则不做改变,指向下一个字符*/ xx[i][j]=ch; /*否则用新字符取代原有字符*/ } }

}

【易错提示】 分解4位数时算术运算符的使用,if判断语句中的逻辑表达式。

70. 【考点分析】 本题考查对整数的筛选以及数组排序。考查的知识点主要包括:C

语言循环结构,逻辑表达式,求平均值算法。

【解题思路】 此题属于4位数的筛选题型。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何通过判断条件(该如果4位数连续大于该4位数以前的5个数且该数是奇数)筛选出满足条件的数,同时统计其个数,问题2如何将这些数按照从大到小的顺序排列。

通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现。问题2排序可以通过循环嵌套的起泡法实现。

【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/

int temp; /*定义数据交换是的暂存变量*/ for(i=5;iif(a[i]%2!=0 && a[i]%7==0) /*如果当前数是奇数且可以被7整除*/ for(j=i-5;j<=i-1;j++) /*取该数前面的5个数进行比较*/ {

if(a[i]break; /*如果当前数不满足比前面5个数都大的条件,则跳出循环*/

else if(j==i-1) /*如果当前数比前面的5个数都大*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*并统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

【易错提示】 循环控制语句,if判断结构中逻辑表达式。

71. 【解题思路】 本题属于数学类问题,主要考查的是奇偶数的判断和方差的求法。 解本题的思路为:用循环控制取每一个数进行判断,若一个数除以2取余得0,则该数是偶数,否则为奇数。分别统计奇数和偶数的个数、总和,并且保存所有满足条件的偶数。最后由方差公式可知,这是求一些连续的数的表达式的和,所以可以使用循环求得方差。

【参考答案】 void Compute(void) {

int i,tt[MAX]; /*定义数组tt计算总和*/

}

for(i=0;i<1000;i++)

if(xx[i]%2!=0) /*判断当前数的奇偶性*/ {

odd++; /*统计奇数的个数*/ ave1+=xx[i]; /*求奇数的总和*/ } else {

even++; /*统计偶数的个数*/ ave2+=xx[i]; /*求偶数的总和*/

tt[even-1]=xx[i]; /*将偶数存入数组tt中*/ }

ave1/=odd; /*求奇数的平均数*/ ave2/=even; /*求偶数的平均数*/ for(i=0;i72. 【解题思路】 本题属于数学类问题;要求判断在100以内,i,i+4,i+10都是素数的数的个数。因为i+10也必须在100以内,1不是素数,所以我们可以从2开始判断到89即可(90是偶数,明显不是素数)。本题已经给出了判断素数的函数,所以这里只需调用即可。通过一个if语句判断i,i+4以及i+10是否都是素数,对满足条件的数进行求和,同时用cnt统计其个数。

【参考答案】 void countValue() {

int i; /*定义循环控制变量*/ cnt=0;

sum=0; /*初始化变量*/

for(i=2;i<90;i++) /*找数的范围为100以内*/ if(isPrime(i) && isPrime(i+4)&&isPrime(i+10)) {

cnt++; /*统计满足条件的数的个数*/ sum+=i; /*将满足条件的数求和*/ } }

73. 【解题思路】 本题属于数学类题。根据题意可知,函数jsValue()要实现两个功能:一是找出为素数的数,并存放在数组b中;二是对数组b中的数进行从小到大的排序。

首先要找出满足条件的数,即素数,题目中已给出了判断素数的函数,因此只需调用即可。

其次,将这些素数存入数组b中,并用变量cnt来统计数组b中元素的个数。

最后,将所有满足条件的数取出后利用起泡法进行排序,即将当前元素依次同它后面的元素进行比较,发现有大于该数的数,就将这两个数进行交换。

【参考答案】 void jsValue()

{

int i,j; /*定义循环控制变量*/

int temp; /*定义数据交换是的暂存变量*/ for(i=0;i<300;i++) /*逐个取4位数*/

if(isP(a[i])) /*如果该数为素数,则将该数存入数组b中*/ {

b[cnt]=a[i];

cnt++; /*并统计满足条件的数的个数*/ }

for(i=0;ib[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

74. 【解题思路】 本题属于数学类题。本题思路为:首先利用一个for循环来依次从数组中取得满足条件的数,由于题目要求求数组中正整数的个数,只要某个整数大于零,则该数即是正整数,通过变量totNum来统计正整数的个数。

然后求出该数的每位数字,并判断是否满足条件\"各位数字之和是奇数\",用变量totCnt和totPjz分别计算出满足条件的数的个数和这些数的和sum。

最后求出这些数的平均值。 【参考答案】 void CalValue() {

int i; /*定义的循环控制变量*/ int a1,a2,a3,a4; /*用来存储正整数的每一位的数字*/ for(i=0;i<200;i++) /*逐个取数组中的数进行统计*/ if(xx[i]>0) /*判断是否正整数*/ {

totNum++; /*统计正整数的个数*/ a4=xx[i]/1000; /*求正整数的千位数*/ a3=xx[i]%1000/100; /*求正整数的百位数*/ a2=xx[i]%100/10; /*求正整数的十位数*/ a1=xx[i]%10; /*求正整数的个位数*/

if((a4+a3+a2+a1)%2==1) /*如果各位数字之和是奇数*/

{ /*计算满足条件的数的个数totCnt和这些数的总和sum*/ totCnt++;

totPjz+=xx[i]; } }

totPjz/=totCnt; /*求这些数的算术平均值totPjz*/

}

75. 【解题思路】 本题要求先实现CalValue()函数的功能,再进一步分析,可以归纳出3个关键点:关键点1如何取得4位数的各个数位数字;关键点2如何通过条件(各个数位数字的和是偶数)来筛选出满足条件的数;关键点3如何统计满足条件的数的个数,并计算其平均值。

关键点1通过算术运算取余和除法可以分解得到4位数各个数位的数字;关键点2通过if判断语句和逻辑表达式可以实现;关键点3先计算满足条件的数的总和,再除以它们的数目即可求得平均值。 【参考答案】 void CalValue()

{ int i; /*定义循环控制变量*/

int a4,a3,a2,a1; /*用来存储正整数的每一位的数字*/ for(i=0;i<200;i++) /*逐个取数组中的数进行统计*/ if(xx[i]>0) /*判断是否正整数*/ {

totNum++; /*统计正整数的个数*/ a4=xx[i]/1000; /*求正整数的千位数*/ a3=xx[i]%1000/100; /*求正整数的百位数*/ a2=xx[i]%100/10; /*求正整数的十位数*/ a1=xx[i]%10; /*求正整数的个位数*/ if((a4+a3+a2+a1)%2==0) /*如果各位数字之和是偶数*/

{ /*计算满足条件的数的个数totCnt和这些数的总和sum*/ totCnt++; totPjz+=xx[i]; } }

totPjz/=totCnt; /*求这些数的算术平均值totPjz*/ }

76. 【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品金额从大到小排序;关键点2本题为如果产品金额相同;关键点3本题为按产品名称从小到大排列。

本题在每次记录比较时,首先比较两个产品的金额,如果前一个产品的金额小于后一个产品的金额,则这两个产品进行数据交换;若产品的金额相等,则用字符串比较函数strcmp比较两个产品的名称,如果返回的值大于0,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if(sell[i].jetemp=sell[i];

sell[i]=sell[j]; sell[j]=temp; }

else if(sell[i].je==sell[j].je) /*若金额相同,则按产品名称从小到大进行排列*/

if(strcmp(sell[i].mc,sell[j].mc)>0) {

temp=sell[i];

sell[i]=sell[j]; sell[j]=temp; } }

77. 【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品代码从大到小排序;关键点2本题为如果产品代码相同;关键点3本题为按产品金额从大到小排列。

本题在每次记录比较时,首先用字符串比较函数strcmp比较两个产品的代码,如果返回的值小于0,则这两个产品进行数据交换;如果返回值等于0,再比较两个产品的金额,如果前一个产品的金额小于后一个产品的金额,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if(strcmp(sell[i].dm,sell[j].dm)<0) /*按产品代码从大到小进行排列*/ {

temp=sell[i]; sell[i]=sell[j];

sell[j]=temp; }

else if(strcmp(sell[i].dm,sell[j].dm)==0) /*若产品代码相同,则按金额从大到小进行排列*/

if(sell[i].jetemp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

78. 【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品金额从小到大排序;关键点2本题为如果产品金额相同;关键点3本题为按产品代码从大到小排列。

本题在每次记录比较时,首先比较两个产品的金额,如果前一个产品的金额大于后一个产品的金额,则这两个产品进行数据交换;若产品的金额相等,则用字符串比较函数strcmp比较两个产品的代码,如果返回的值小于0,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if (sell[i].je>sell[j].je) /*按金额从小到大进行排列*/ {

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; }

else if (sell[i].je==sell[j].je) /*若金额相同*/

if (strcmp(sell[i].dm,sell[j].dm)<0) /*则按产品代码从大到小进行排列*/

{

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

79. 【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品金额从小到大排序;关键点2本题为如果产品金额相同;关键点3本题为按产品代码从大到小排列。

本题在每次记录比较时,首先比较两个产品的金额,如果前一个产品的金额大于后一个

产品的金额,则这两个产品进行数据交换;若产品的金额相等,则用字符串比较函数strcmp比较两个产品的代码,如果返回的值小于0,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++) /*利用选择法进行排序*/ for(j=i+1;j<100;j++)

if (sell[i].je>sell[j].je) /*按金额从小到大进行排列*/ {

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; }

else if (sell[i].je==sell[j].je) /*若金额相同*/

if (strcmp(sell[i].dm,sell[j].dm)<0) /*则按产品代码从大到小进行排列*/

{

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; } }

80. 【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意3个关键点:关键点1本题为按产品金额从小到大排序;关键点2本题为如果产品金额相同;关键点3本题为按产品代码从小到大排列。

本题在每次记录比较时,首先比较两个产品的金额,如果前一个产品的金额大于后一个产品的金额,则这两个产品进行数据交换;若产品的金额相等,则用字符串比较函数strcmp比较两个产品的代码,如果返回的值大于0,则这两个产品进行数据交换。

【参考答案】 void SortDat() {

int i,j; /*定义循环控制变量*/

PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/

for(i=0;i<99;i++)

for(j=i+1;j<100;j++) {

if (sell[i].je>sell[j].je) /*按金额从小到大进行排列*/ {

temp=sell[i]; sell[i]=sell[j];

sell[j]=temp; }

else if (sell[i].je==sell[j].je) /*若金额相同*/

if (strcmp(sell[i].dm,sell[j].dm)>0) /*则按产品代码从小到大进行排列*/

{

temp=sell[i]; sell[i]=sell[j]; sell[j]=temp; }

} }

81. 【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为各位上的数字均是0、2、4、6、8)筛选出满足条件的数;问题3如何按照要求(本题为从大到小的顺序)对数组中的数进行排序。

通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各位数数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和除法可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现。问题3排序可以通过循环嵌套的起泡法来完成。

【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/ if(a4%2==0 && a3%2==0 && a2%2==0 && a1%2==0)

{ /*如果各位上的数字均是0或2或4或6或8*/ b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数cnt*/ } }

for(i=0;itemp=b[i]; b[i]=b[j];

b[j]=temp; } }

82. 【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为个位数减千位数减百位数减十位数大于零)筛选出满足条件的数;问题3如何按照要求(本题为从大到小的顺序)对数组中的数进行排序。

本题的解题思路和上一套相同,不同的是本套的筛选条件为个位数减千位数减百位数减十位数大于零(a1-a4-a3-a2>0)

【参考答案】 void jsValue() {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if(a1-a3-a2-a4>0) /*如果个位数减千位数减百位数减十位数大于零*/ {

b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

83. 【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为千位数上的值减百位数上的值再减十位数上的值减个位数上的值大于等于零且此4位数是奇数)筛选出满足条件的数;问题3如何按照要求(本题为从小到大的顺序)对数组中的数进行排序。

通过问题分析,得出解此类题的一般思路为:先求出每个数的各位数字,再根据各位数数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。对于问题1通过算术运算取余和取模可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻

辑表达式可以实现;问题3排序可以通过循环嵌套的起泡法来完成。

【参考答案】 void jsVal() {

int i,j; /*定义循环控制变量*/ int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/ if((a4-a3-a2-a1>=0) && a1%2!=0)

/*如果千位数减百位数再减十位数最后减个位数得出的值大于等于零且此4位数是奇数*/ {

b[cnt]=a[i]; /*则将该数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;ib[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

84【解题思路】 本题属于字符串操作类题,考查对二维字符数组元素的操作。

本题解题思路:首先可以利用双重循环按照先行后列的顺序逐个取得数组中的字符,外层循环用来控制行数,内层循环用来依次取得各行中的每一个字符。

之后对当前所取得的字符进行右移4位的运算(这里用到了\">>\"右移运算符),最后把移后得到的字符累加到原字符中去,这样原来字符就可以被新的字符所覆盖。 【参考答案】 void StrCharJR(void)

{

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jxx[i][j]+=xx[i][j]>>4; /*字符的ASCII值右移4位再加上原字符的ASCII值,得到新 }

85. 【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为4位数的千位数字上的值大于等于百位数字上的值,百位数字上的值大于等于十位数字上的值,以及十位数字上的值大于等于个位数字上的值,并且此4位数是奇数)筛选出满足条件的数;问题3如何按照要求(本题为从小到大的顺序)对数组中的数进行排序。

本套解题思路与前几套相同,不同的是本套在求各位数数字后的筛选条件为:千位数字大于等于百位数字,百位数字大于等于十位数字,十位数字大于等于个位数字,并且此数是奇数。

【参考答案】 void jsVal( ) {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/ if((a4>=a3)&&(a3>=a2)&&(a2>=a1)&&a1%2!=0)

{ /*如果千位数大于等于百位数,百位数大于等于十位数,十位数大于等于个位数,并且此数是奇数*/

b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;ib[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp;

} }

86. 【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为千位数值加个位数值等于百位数值加十位数值,且此4位数为奇数)筛选出满足条件的数;问题3如何对数组中的数进行排序。

本题与前几套的解题思路相同,不同的是求出各位数数字后的筛选条件为:千位数值加个位数值等于百位数值加十位数值,且此4位数为奇数。

【参考答案】 void jsVal( ) {

int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/

if ((a4+a1==a3+a2) && a1%2==1) /*如果千位数加个位数等于百位数加十位数,并且此数是奇数*/ {

b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;ib[j]) {

temp=b[i]; b[i]=b[j]; b[j]=temp; } }

87. 【解题思路】 此题属于4位数的筛选类题,并且需将各位数组成新的两位数,再筛选排序。解题时,需主要解决4个问题:问题1如何取得4位数的各个数位数字;问题2如何按照要求组成新的2位数字ab(原4位数的个位数字和千位数字),以及组成cd(原4位数的百位数字和十位数字);问题3如何通过判断条件(ab、cd至少一个能被9整除,ab和cd都为偶数,两个新2位数的十位数都不为0)筛选出满足条件的数,并统计出满足条件的数的个数;问题4如何对数组中的数进行从大到小的排序。

解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。

【参考答案】 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*a1+a4; /*把个位数和千位数重新组合成一个新的十位数ab*/ cd=10*a3+a2; /*把百位数和十位数组成另一个新的十位数cd*/ if((ab%9==0||cd%9==0)&&(ab%2!=1)&&(cd%2!=1)&&a1!=0&&a3!=0)

/*如果新组成的两个数均为偶数且两个十位数中至少有一个数能被9整除,同时两个新十位的十位上的数字均不为零*/ {

b[cnt]=a[i]; /*将满足条件的4位数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

88. 【解题思路】 本题和第82套题类似,不同的是问题3筛选的条件不同。

解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。

【参考答案】 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*a1+a4; /*把个位数和千位数组合成一个新的十位数ab*/ cd=10*a3+a2; /*把百位数和十位数组成另一个新的十位数cd*/

if((ab%17==0||cd%17==0)&&((ab%2==0 && cd%2==1)||(ab%2==1 && cd%2==0)) && a1!=0 && a3!=0)

{ /*如果新组成的两个十位数必须是一个奇数,另一个为偶数且两个十位数中至少有一个数能被17整除,同时两个新十位数的十位上的数字均不为0*/ b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

89. 【解题思路】 本题和第82、83套题类似,不同的是问题3筛选的条件不同。

解此题的思路为:先求出每个数的各位数字,再根据各位数数字组成2位数的条件筛选出满足要求的数存入新的数组中,最后对新数组进行排序。

【参考答案】 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) && (ab%2==0 && ab%5==0) && cd%2==1 && a4!=0 && a1!=0)

/*如果ab>cd,ab是偶数且能被5整除,cd是奇数,且两个数的十位上的数字均不为0*/

{

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;itemp=b[i]; b[i]=b[j]; b[j]=temp; } }

90. 【解题思路】 本题属于数据排序题型。本题考查对结构体数组中元素的各个成员的操作。

首先利用一个for循环来依次取得结构体数组中的各个元素,然后按照题目要求对当前元素的各个域进行条件判断,如果条件(第1个数大于第2个数加第3个数之和)成立,则将其存放到数组bb中去。

再按照\"每组数据中的第2个数加第3个数之和的大小\"进行从小到大的排序。 【参考答案】 int jsSort() {

int i,j; /*定义循环控制变量*/ int cnt=0; /*定义计数器变量*/

Data temp; /*数据交换时的暂存变量,这里是一个Data类型的结构体变量*/

for(i=0;i<200;i++)

if(aa[i].x1>aa[i].x2+aa[i].x3) /*如果每组数据中的第一个数大于第二个数加第三个数之和*/ {

bb[cnt]=aa[i]; /*把满足条件的数据存入结构数组bb中*/ cnt++; /*同时统计满足条件的数据的个数*/ }

for(i=0;iif(bb[i].x1+bb[i].x3>bb[j].x1+bb[j].x3) {

temp=bb[i]; bb[i]=bb[j]; bb[j]=temp; }

return cnt; /*返回满足条件的数据的组数*/

}

91. 【解题思路】 此题属于4位数的筛选题型,并且涉及统计及平均值计算问题。解题时,需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过判断条件(本题为千位数上的数加个位数上的数等于百位数上的数加十位数上的数)对目标进行筛选,再分别统计出满足和不满足条件的数的和以及数目;问题3分别求出两类数的平均值。 解此题的一般思路为:先求出各位数字的值,根据各位数字的属性判断并统计满足和不满足条件的数的个数及和值,最后用和除以个数得出相应的平均值。与前面类型的题不同的是,在问题2筛选时,不需要将符合要求的数存入新的数组,只需用条件判断语句分别统计符合条件的数的数目(cnt)及不符合条件的数的个数(n),以及对应的和值(pjz1、pjz2)。问题3用和值除以对应个数(pjz1/cnt,pjz2/n)即可。 【参考答案】 void jsValue()

{ int i,n=0; /*定义循环变量和计数器变量*/

数*/

{

cnt++; /*则统计满足条件的数的个数*/ pjz1+=a[i]; /*将满足条件的数求和*/ } else {

n++; /*否则统计不满足条件的数的个数*/ int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ for(i=0;i<300;i++) /*逐个取每一个4位数*/ {

a4=a[i]/1000; /*求4位数的千位数字*/ a3=a[i]%1000/100; /*求4位数的百位数字*/ a2=a[i]%100/10; /*求4位数的十位数字*/ a1=a[i]%10; /*求4位数的个位数字*/

if(a4+a1==a3+a2) /*如果千位数加个位数等于百位数加十位

}

pjz2+=a[i]; /*将不满足条件的数求和*/ } }

pjz1/=cnt; /*求满足条件的数的平均值*/ pjz2/=n; /*求不满足条件的数的平均值*/

92. 【解题思路】 此题属于排序问题。通过对问题的分析,得出解本题的思路为:利用嵌套的循环实现对二维数组每个元素的访问,对于每一行,将第1个数取出依次同后面的数进行比较,后面的数如果更小,则将后面的数取出,将这个数据左侧的数依次向右移动,然后将这个数放在最左侧。这样,扫描完一行后,比第1个数小的数就在第1个数的左侧,而比它大的数则在其右侧。 【参考答案】

void jsValue(int a[10][9])

{ int i,j,k; /*循环控制变量*/ int num,temp; /*定义暂存变量*/ for(i=0;i<10;i++) /*逐行取数进行处理*/ {

num=a[i][0]; /*暂存一行的第一个元素*/ for(j=0;j<9;j++) /*每行的所有元素*/

if(a[i][j]{

temp=a[i][j]; /*则把这个数取出,赋给num*/ for(k=j;k>0;k--) /*将这个数据左侧的数依次向右移动*/ a[i][k]=a[i][k-1];

a[i][0]=temp; /*再将这个数放在最左侧*/ }

}

93. 【解题思路】 此题属于4位数的筛选类题。解此类题目需主要解决3个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(本题为千位数字加十位数字的值恰好等于百位数字加上个位数字的值,并且此4位数是偶数)筛选出满足条件的数;问题3如何按照要求(本题为从小到大的顺序)对数组中的数进行排序。

}

本套解题思路与前两套相同,不同的是求出各位数数字后的筛选条件不同,本套条件为:千位数字加十位数字的值恰好等于百位数字加上个位数字的值,并且此4位数是偶数)筛选出满足条件的数。

【参考答案】 void jsVal( )

{ int i,j; /*定义循环控制变量*/

int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/ int temp; /*定义数据交换时的暂存变量*/ 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位数的个位数字*/ if((a4+a2==a3+a1) && a[i]%2!=1)

{ /*如果千位数加十位数等于百位数加上个位数,并且此数是偶数*/ b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/ cnt++; /*统计满足条件的数的个数*/ } }

for(i=0;ib[j])

{

temp=b[i]; b[i]=b[j]; b[j]=temp; }

94. 【解题思路】 此题属于4位数的筛选题型,并且涉及统计和平均值问题。解题时,需主要解决3个问题:问题1如何取得4位数的各个数位的数字;问题2如何通过判断条件(本

}

题为千位数减百位数减十位数减个位数的值大于0)对目标进行筛选,再分别统计出满足和不满足条件的数的和以及数目;问题3如何求出两类数的平均值。

解此类题的一般思路为:先求出各位数字的值,再根据各位数字的属性判断并统计满足和不满足条件的数的个数及和值,最后用和除以个数得出相应的平均值。与前面类型的题不同的是,在问题2筛选时,不需要将符合要求的数存入新的数组,只需用条件判断语句分别统计符合条件的数的数目(cnt)、不符合条件的个数(n)以及对应的和值(pjz1、pjz2)。问题3用和值除以对应个数即可(pjz1/cnt,pjz2/n)。 【参考答案】 void jsValue()

{ int i,n=0; /*

个位数字大于零*/

数*/

int a1,a2,a3,a4; /*for(i=0;i<300;i++) /*{

a4=a[i]/1000; /* a3=a[i]%1000/100; /* a2=a[i]%100/10; /* a1=a[i]%10; /* if(a4-a3-a2-a1>0) /* {

cnt++; /* pjz1+=a[i]; /* } else {

n++; /* pjz2+=a[i]; /* } }

pjz1/=cnt; /*pjz2/=n; /*定义循环变量和计数器变量*/ 定义变量保存4位数的每位数字*/ 逐个取每一个4位数*/ 求4位数的千位数字*/ 求4位数的百位数字*/ 求4位数的十位数字*/ 求4位数的个位数字*/

如果千位数字减百位数字减十位数字减

统计满足条件的数的个数*/

将满足条件的数求和*/ 统计不满足条件的数的个

将不满足条件的数求和*/ 求满足条件的数的平均值*/ 求不满足条件的数的平均值*/ }

95. 【解题思路】 此题属于4位数的筛选题型,并且需要比较相邻的5个数的大小。解题时,需主要解决2个问题:问题1如何根据判断条件(本题为该4位数连续大于该4位数以后的5个数且该数是奇数)对目标进行筛选,统计出满足条件的个数;问题2如何将这些数进行排序。

此类题的一般解法为:依次判断每个数是否满足条件,满足则个数加1,并存入新的数组,否则跳过并判断下一个数字,判断完后对数组进行排序。问题1可以用循环嵌套来实现,要筛选的数必须同时满足两个条件(一个条件是该4位数连续大于该4位数以后的5个数;另一个条件是该数为奇数),可以将第2个条件作为首要满足条件,再依次判断是否满足第1个条件,满足则个数cnt加1,并将该数存入新的数组,否则跳过并判断下一个数字。

【参考答案】 void jsVal()

{ int i,j; /*定义循环控制变量*/ int temp; /*定义数据交换是的暂存变量*/ for(i=0;iif(a[i]>a[i+1]&&a[i]>a[i+2]&&a[i]>a[i+3]&&a[i]>a[i+4]&&a[i]>a[i+5]&&a[i]%2!=0) /*如果当前数是奇数*/

/*如果当前数比后面的5个数都大*/ {

b[cnt]=a[i]; /*将满足条件的数存入数组b中*/ cnt++; /*并统计满足条件的数的个数*/ } }

for(i=0;ifor(j=i+1;jb[j])

{

temp=b[i]; b[i]=b[j];

b[j]=temp; }

96. 【解题思路】 本题属于数学类题。本题主要考查的是如何将整型变量转换成字符串以及如何判断字符串是否对称。

回文数是指其各位数字左右均对称的整数,因为给出的数的位数不确定,所以不采用将各位上的数字转变成单独的数再比较的方法。这里使用函数char * ltoa(long num,char *str,int radix),其功能是将长整数num转换成与其等价的字符串存入str指向的字符串中,输出串的进制由radix决定。将整数转变成字符串后,判断字符串是否左右对称。求得字符串长度后设置两个变量,一个从字符串的开头开始向后移动,一个从字符串的倒数第1个元素开始向前移动,直到移至数组的中间元素。若两者所决定的数组元素均相等,则字符串左右对称。

【参考答案】 int jsValue(long n) {

int i; /*定义循环控制变量*/ int str,half; /*存储字符串的长度*/

char ch[20]; /*字符数组,存储每个数的字符串形式*/

ltoa(n,ch,10); /*将长整数n转换成与其等价的字符串存入xy指向的字符串中,输出串为十进制*/

str=strlen(ch); /*求字符串的长度*/ half=str/2;

for(i=0;iif(ch[i]!=ch[--str]) /*判断字符串是否左右对称*/

break; /*不对称就跳出循环,判断下一个数*/ if(i>=half) /*如果字符串是回文*/ return 1; /*则返回1*/ else

return 0; /*否则返回0*/ }

97. 【解题分析】 首先要将每个人的编号存入数组。因为每次是从s1开始报数,若是直线队则下一个开始报数的人的编号是s1+m-1,但这里要建立一个环,即最后一个人报完数后第1个人接着报数,所以这时下一个开始报数的人的编号是(s1+m-1)%i,i是此时圈中的总人数。若所得的结果为0,则说明要开始报数的是最后一个人。在此人前面的那个人就是要出圈的人,使用循环将要出圈的人移至数组的最后。开始时,总人数为n,以后依次减1,直到最后一个人出圈。

【参考答案】 void Josegh(void)

{ int i,j; /*定义循环控制变量*/

int s1,w; /*存储开始报数的人编号*/ s1=s; /*第一个报数的人的编号*/

}

}

for(i=1;i<=n;i++) /*给n个人从1到n编号*/ p[i-1]=i;

for(i=n;i>=2;i--) /*当人数少于2时,停止报数*/ {

s1=(s1+m-1)%i; /*下一个开始报数的人的编号是(s1+m-1)%i*/ if(s1==0) /*若s1为0,则说明要开始报数的是最后一个人*/ s1=i;

w=p[s1-1]; /*将要出圈的人移至数组的最后*/ for(j=s1;j<=i-1;j++) p[j-1]=p[j]; p[i-1]=w; }

98. 【解题思路】 本题属于字符串类题。要求对二维数组中的字符元素按行处理。 首先用strlen()函数得到当前行所包含的字符个数。 然后再利用一个循环来依次访问该行中的所有字符。对于每一个字符,先按照题目中的函数替代关系\"f(p)=p*11 mod 256\"计算出相应的fp值,再用if语句判断该值是否符合本题给定的条件:\"计算后的值小于等于32或大于130\"。如果符合条件,则该字符不变,否则用f(p)所对应的字符对其进行替代。 【参考答案】 void encryptChar()

{ int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/

for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256; if(ch<=32 || ch>130)

continue; /*如果计算后的值小于等于32或大于130,则该字符不变*/ else

xx[i][j]=ch; /*否则将所对应的字符进行替代*/ } } }

99. 【解题思路】 本题同第92、93套,属于字符串类题。要求对二维数组中的字符元素按行处理。

首先用strlen()函数得到当前行所包含的字符个数。

然后再利用一个循环来依次访问该行中的所有字符。对于每一个字符,先按照题目中的函数替代关系\"f(p)=p*11 mod 256\"计算出相应的fp值,再用一条if语句判断该值是否符合本题给定的条件:\"原字符是小写字母或计算后的值小于等于32\"。如果符合条件,则该字符不变,否则用f(p)所对应的字符对其进行替代。

【参考答案】 void encryChar() {

int i,j; /*定义循环控制变量*/ int str; /*存储字符串的长度*/ char ch; /*存储当前取得的字符*/ for(i=0;istr=strlen(xx[i]); /*求得当前行的字符串长度*/ for(j=0;jch=xx[i][j]*11%256;

if((xx[i][j]>='a' && xx[i][j]<='z') || ch<=32) /*如果原字符是小写字母或计算后的值小于等于32*/

continue; /*则不做改变,指向下一个字符*/ else

xx[i][j]=ch; /*否则用新字符取代原有字符*/ } } }

100. 【解题思路】 此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何通过条件\"同时能被3与7整除\"筛选出指定范围内满足条件的数;关键点2对所有满足条件的数计算出总和的平方根。

本题的解题思路为:通过循环控制,依次判断小于等于n范围内的自然数是否满足关键点1中的条件。累加满足条件的数,并通过总和求出算术平方根,最后通过函数值返回。

【参考答案】

double countValue(int n)

{ int i; /*定义循环控制变量*/

double sum=0.0; /*存储满足条件的自然数之和,继而求出平方根*/ for(i=1;iif(i%3==0 && i%7==0) sum+=i;

sum=sqrt((double)sum); /*再对总和求平方根*/ return sum; }

因篇幅问题不能全部显示,请点此查看更多更全内容