问答题
已知数据文件IN.DAT中存有200个4位数,并已调用读函数readDat(),把这些数存入数组a中,请编写函数jsVal(),其功能是:把数组a中1个4位数的千位数字和十位数字重新组成一个新的2位数ab(新2位数的十位数字是原4位数的千位数字,新2位数的个位数字是原4位数的十位数字);把个位数字和百位数字组成新的2位数cd(新2位数的十位数字是原4位数的个位数字,新2位数的个位数字是原4位数的百位数字);新组成的两个2位数满足:ab-cd>=0且ab-cd<=10目这两个数均是奇数,同时这两个数的十位数字均不为零。将满足此条件的4位数按从大到小的顺序存入数组b中,并计算满足上述条件的4位数的个数cnt,最后调用写函数writeDat(),把结果cnt及数组b中符合条件的4位数输出到OUT.DAT文件中。
程序中已定义数组a[200],b[200],已定义变量cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
[试题程序]
#include<stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt=0;
void writeDat();
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():
}
void 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);
}
【正确答案】
【答案解析】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;
}
}
[考点] 本题考查对多个整数的筛选以及排序。考查的知识点主要包括:多位整数的分解算法,逻辑表达式,数组排序算法。此题属于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))。