视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
计算机三级数据库上机答案
2025-09-29 22:23:02 责编:小OO
文档
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]%1000      {

        temp=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,",&xx[i*10+j]);

      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;i    totfc+=(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;i for(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;i for(j=i+1;j if(b[i]        {

          temp=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;i if(a[i]         /*如果当前数是偶数且小于后面连续5个数*/

          {

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

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

          }

for(i=0;i for(j=i+1;j if(b[i]>b[j])

        {

          temp=b[i];

          b[i]=b[j];

          b[j]=temp;

        }

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

【模板速记】 

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

【易错提示】 循环嵌套的循环控制条件,if判断语句中表达式,数组排列的顺序。

5讲。

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;i    {

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

for(j=0;j      {

ch=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;i    {

      str=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      {

        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;i    {

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

for(j=0;j for(k=j+1;k if(xx[i][j]          {

            temp=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;j if(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;i    {

if(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;i      if(xx[i]==max)

        cnt++;          /*求出数组xx中最大数max的个数*/

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

    printf("\\n\\nmax=%d,cnt=%d,pj=%6.2f\\n",max,cnt,pj);

    fprintf(fw,"%d\\n%d\\n%6.2f\\n",max,cnt,pj);

    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{   str=strlen(xx[i]);    /*求得当前行的字符串长度*/ 

for(j=0;j        {   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;i    {

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

for(j=0;j if(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;i for(j=i+1;j if(b[i]>b[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位数筛选和排序时if结构中的逻辑表达式。

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;i for(j=i+1;j if(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;i for(j=i+1;j if(b[i]       {

         temp=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].je          {

            temp=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].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;

          }

}

【易错提示】 结构型数据对成员的访问用"."成员运算符;两个字符串的比较用字符串比较函数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;i for(j=i+1;j if(b[i]    {

    temp=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;i for(j=i+1;j if(b[i]        {

             temp=b[i];

             b[i]=b[j];

             b[j]=temp;

        }

}

【易错提示】 分解4位数算法的使用, 对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;i      if(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;i for(j=i+1;j if(b[i]        {

          temp=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;i      totfc+=(tt[i]-ave2)*(tt[i]-ave2)/even;

}

72

【解题思路】 本题属于数学类问题;要求判断在100以内,i,i+4,i+10都是素数的数的个数。因为i+10也必须在100以内,1不是素数,所以我们可以从2开始判断到即可(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;i for(j=i+1;j if(b[i]>b[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].je        {

          temp=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].je        {

            temp=sell[i];

            sell[i]=sell[j];

            sell[j]=temp; 

         }

}

78

【解题思路】 此题属于销售记录类题型;此类题型主要考查对结构体数组的排序。解题时,应注意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          {

            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; 

          }

             }

}下载本文

显示全文
专题