Ⅹ—6.计算机二级综合题15---18套

第15套

【填空题】

题目要求:给定程序中,函数fun的功能是:把形参s所指字符串中最右边的n个字符复制到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个字符串复制到形参t所指字符数组中。例如,形参s所指的字符串为: abcdefgh,n的值为5,程序执行后t所指字符数组中的字符串应为: defgh。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>

#include  <string.h>

#define   N   80

void fun(char  *s, int  n, char  *t)

{ int len,i,j=0;

  len=strlen(s);

/**********found**********/

  if(n>=len) strcpy(t,s);

  else {

/**********found**********/

     for(i=len-n; i<=len-1; i++)  t[j++]= s[i];

/**********found**********/

     t[j]= \0;

  }

}

main()

{ char  s[N],t[N];    int  n;

  printf("Enter a string:  ");gets(s);

  printf( "Enter n:");  scanf("%d",&n);

  fun(s,n,t);

  printf("The string t :  ");  puts(t);

  getchar();

}

解析:

2. 第一个 foundstrcpy(t, s);

  • 作用:当 n >= len 时,直接将整个 s 复制到 t(因为 “最右边 n 个字符” 就是整个字符串 )。

  • 函数知识strcpy 是字符串复制函数,语法为 strcpy(目标字符串, 源字符串) 。此处目标是 t,源是 s,故填 strcpy(t, s) 。

3. 第二个 foundt[j++] = s[i];

  • 逻辑分析
    当 n < len 时,需提取 s 最右边的 n 个字符:

    • 起始索引:len - n(例如 s = "abcdefgh"len=8n=5 → 起始索引 8-5=3,对应字符 'd' )。

    • 结束索引:len - 1(字符串最后一个字符的索引 )。
      循环 for(i=len-n; i<=len-1; i++) 遍历这 n 个字符,将 s[i] 逐个赋值到 t 中(t[j++] 表示 t 的当前位置 j 赋值后,j 自增 )。

  • 为什么填 s[i]
    需从 s 中提取字符,故用 s[i] 表示当前遍历到的字符,赋值给 t 的对应位置。

4. 第三个 foundt[j] = '\0';

  • 作用:在复制完 n 个字符后,给 t 末尾添加字符串结束符 '\0' ,确保 t 是合法的 C 字符串(否则 t 会包含垃圾数据,导致输出异常 )。


【修改题】

题目要求:给定程序MODI1. C中函数fun的功能是:从低位开始依次取长整型变量s中奇数位上的数,构成一个新数放在t中(注意:位置从0开始计算)。

例如:输入: 12345678, 则输出: 1357

输入: 123456789, 则输出: 2468

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

#pragma warning (disable:4996)

void fun (long s, long *t)

{   long sl = 10;

    s /= 10;

/**********found**********/

    *t = s / 10; *t = s % 10;

    while(s > 0) {

        s = s / 100;

/**********found**********/

        t = s % 10 * sl + t;*t = s % 10 * sl + *t;

/**********found**********/

        sl /= 10;sl *= 10;

    }

}

main()

{   long s, t;

    printf("\nPlease enter long number:");

    scanf("%ld", &s); fun(s, &t);

    printf("The result is: %ld\n", t);

}

解析:

错误解析与修正逻辑

1. 第一个错误:*t = s / 10; → *t = s % 10;

  • 错误原因
    初始时 s 已通过 s /= 10 去掉个位(偶数位),此时需提取 当前 s 的个位数字(对应原数的奇数位,如位 1)。s / 10 会去掉个位,导致取数错误;s % 10 才是取个位的正确方式。

  • 修正作用
    正确提取第一个奇数位(如位 1)的数字,作为新数的初始值。

2. 第二个错误:t = s % 10 * s1 + t; → *t = s % 10 * s1 + *t;

  • 错误原因
    t 是指针,直接操作 t 会修改指针地址,而非它指向的变量值。必须通过 解引用 *t 来修改目标变量(主函数中 t 指向的内存)。

  • 修正作用
    正确将新提取的奇数位数字(如位 3、位 5、位 7)按高位到低位的顺序拼接(通过 s1 控制位数,如 s1=10 时新数占十位,s1=100 时占百位等)。

3. 第三个错误:s1 /= 10; → s1 *= 10;

  • 错误原因
    s1 用于控制新数的位数权重(初始为 10,对应十位;后续需扩大为 100、1000 等,对应百位、千位)。s1 /= 10 会使权重缩小,导致位数拼接错误;s1 *= 10 才能正确提升权重。

  • 修正作用
    每次将 s1 乘以 10,确保后续提取的奇数位数字能放在正确的高位(如位 3 的数字占百位,位 5 的数字占千位等)。

修正后核心逻辑(以输入 12345678 为例)

  1. 提取奇数位:从低位开始,依次提取位 1(7)、位 3(5)、位 5(3)、位 7(1)。

  2. 构建新数:通过 s1 控制位数,将提取的数字按 高位到低位 拼接(1→千位,3→百位,5→十位,7→个位),最终得到 1357


【设计题】

题目要求:请编写函数fun,其功能是:求n (n<10000) 以内的所有四叶玫瑰数并逐个存放到result所指的数组中,四叶玫瑰数的个数作为函数值返回。如果一个4位正整数等于其各个数字的4次方之和,则称该数为四叶玫瑰数。

例如:1634=1*1*1*1+6*6*6*6+3*3*3*3+4*4*4*4,

因此1634就是一个四叶玫瑰数。

注意:部分源程序存在文件PROG1. C中。

请勿更改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include<stdio.h>

#pragma warning (disable:4996)

int fun(int n, int result[])

int i,j,k=0,s;

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

{s=0;j=i;

     while(j>0)

{s+=(j%10)*(j%10)*(j%10)*(j%10);

     j=j/10;}

 if (s==i) result[k++]=i;

 }

  return k;

}

main( )

{

int result[10], n, i;

void NONO(int result[], int n);

n = fun(9999, result);

for(i=0; i<n; i++) printf("%d\n", result[i]);

NONO(result, n);

}

解析:

1. 准备 “工具”(变量的作用)

  • 拿 i 当 “跑腿的”,负责从 1000 开始,逐个检查所有 4 位数字(因为四叶玫瑰数是 4 位数)。

  • 拿 j 当 “拆解工”,专门拆 i 的每一位数字(比如 i=1634j 就负责拆出 4361 )。

  • 拿 s 当 “小账本”,记着当前数字 i 的各位数字 4 次方加起来的总和。

  • 拿 k 当 “计数器”,既记找到多少个四叶玫瑰数,又管着这些数该存在结果数组的哪个位置(一开始是 0 )。

2. 逐个检查 4 位数字(遍历过程)

  • 让 i 从 1000 开始跑(最小的 4 位数),一直跑到 n-1 为止(比如 n=9999,就跑到 9998 )。

  • 每个 i 都要接受 “考验”:它是不是四叶玫瑰数?

3. 拆数字、算总和(核心检查步骤)

对每个 i,做这几步:

  • 先把 s 清空(s=0),准备重新算总和;

  • 把 i 的值 “复制” 给 jj=i),让 j 去拆,免得拆坏了 i 本身;

  • 开始拆 j 的每一位:

    • 用 j%10 揪出 j 的最后一位(比如 j=1634j%10=4 );

    • 算这一位的 4 次方(4×4×4×4=256),加到 s 里(s 现在是 256);

    • 再把 j 除以 10j=1634÷10=163),去掉最后一位,继续拆下一位;

    • 重复上面三步,直到 j 拆完(j=0 为止)。

4. 判定是否合格(是不是四叶玫瑰数)

  • 拆完后,看 s(各位 4 次方总和)和 i(原来的数)是不是相等。

    • 比如 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

航Hang*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值