问答题
已知数据文件IN1.DAT和IN2.DAT中分别存有100个2位十进制数,并且已调用读函数readDat(),把这两个文件中的数存入数组a和b中,请考生编写函数jsVal(),其功能是:依次将数组a和b中的数按条件重新组成一个新数,并存入数组c中,再对数组c中的数按从小到大的顺序进行排序,最后调用写函数writeDat(),把结果c输出到文件OUT.DAT中。
组成新数的条件:如果数组a和b中相同下标位置的数,一个是偶数,另一个是奇数,则将数组a中的数按二进制数左移八位后再加上数组b对应位置上的数,把这样组成的新数依次存入数组c中。
例如,a:12 33 24 15 21
b:32 35 17 15 18
c:6161 5394
排序后c.5394 6161
程序中已定义数组a[100]、b[100]和C[100]。请勿改动数据文件IN1.DAT和IN2.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
[试题程序]
#include<stdio.h>
#define MAX 100
unsigned int a[MAX], b[MAX], c[MAX];
int cnt=0; //存放符合条件的数的个数
void writeDat();
void jsVal()
{
}
void readDat()
{
int i;
FILE*fp;
fp=fopen("IN1.DAT", "r");
for(i=0; i<MAX; i++)
fscanf(fp, "%d", &a[i]);
fclose(fp);
fp=fopen("IN2.DAT", "r");
for(i=0; i<MAX; i++)
fscanf(fp, "%d", &b[i]);
fclose(fp);
}
void main()
{
int i;
for(i=0; i<MAX; i++)
c[i]=0;
readDat();
jsVal();
for(i=0; i<MAX; i++)
if(c[i]>0)
printf("%d\n", c[i]);
writeDat();
}
void writeDat()
{
FILE*fp;
int i;
fp=fopen("OUT.DAT", "w");
for(i=0; i<MAX; i++)
if(c[i]>0)
fprintf(fp, "%d\n", c[i]);
fclose(fp);
}
【正确答案】
【答案解析】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;
}
}
[考点] 本题考查对整数的筛选及数组排序。考查的知识点主要包括:C语言循环结构,逻辑表达式等。
此题属于2位数的筛选题。分析题干要求,本题要求实现jsVal()函数的功能,归纳可以得出2个问题:问题1如何根据判断条件(数组a和b中相同下标位置的数必须符合一个是偶数,另一个是奇数)筛选出满足条件的数,同时统计其个数,问题2如何将这些数按从小到大的书序排列。通过问题分析,得出解此题的思路为:先根据题目中的条件筛选出满足条件的数并存入新的数组中,再对新数组进行排序。对于问题1通过if条件判断语句和逻辑表达式可以实现。问题2排序可以通过循环嵌套的起泡法实现。