第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. 第一个
found:strcpy(t, s);
作用:当
n >= len时,直接将整个s复制到t(因为 “最右边n个字符” 就是整个字符串 )。函数知识:
strcpy是字符串复制函数,语法为strcpy(目标字符串, 源字符串)。此处目标是t,源是s,故填strcpy(t, s)。3. 第二个
found:t[j++] = s[i];
逻辑分析:
当n < len时,需提取s最右边的n个字符:
起始索引:
len - n(例如s = "abcdefgh",len=8,n=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. 第三个
found:t[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(7)、位 3(5)、位 5(3)、位 7(1)。
构建新数:通过
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=1634,j就负责拆出4、3、6、1)。拿
s当 “小账本”,记着当前数字i的各位数字 4 次方加起来的总和。拿
k当 “计数器”,既记找到多少个四叶玫瑰数,又管着这些数该存在结果数组的哪个位置(一开始是0)。2. 逐个检查 4 位数字(遍历过程)
让
i从1000开始跑(最小的 4 位数),一直跑到n-1为止(比如n=9999,就跑到9998)。每个
i都要接受 “考验”:它是不是四叶玫瑰数?3. 拆数字、算总和(核心检查步骤)
对每个
i,做这几步:
先把
s清空(s=0),准备重新算总和;把
i的值 “复制” 给j(j=i),让j去拆,免得拆坏了i本身;开始拆
j的每一位:
用
j%10揪出j的最后一位(比如j=1634,j%10=4);算这一位的 4 次方(
4×4×4×4=256),加到s里(s现在是256);再把
j除以10(j=1634÷10=163),去掉最后一位,继续拆下一位;重复上面三步,直到
j拆完(j=0为止)。4. 判定是否合格(是不是四叶玫瑰数)
拆完后,看
s(各位 4 次方总和)和i(原来的数)是不是相等。
比如

最低0.47元/天 解锁文章
1030

被折叠的 条评论
为什么被折叠?



