给定程序BLANK1.C中函数fun的功能是:将整数n的值进行逆序转换,其结果通过函数值返回。
例:输入: 123,则输出:321
输入: -810,则输出:-18
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
int fun(int n)
{
int m, y;
y = 0;
if (n >= 0)//他这里把n为正数和负数作两种处理了
m = n;
else
m = -n;//若为负数先转为正数进行倒序处理
while (m != 0) {//m为0时跳出循环
/**********found**********/
y = ____(1)____ + m % 10;//倒序处理,也就是取余先得到的数后面在循环进位
/**********found**********/
m = ____(2)____//每次循环去掉被取余的数
}
y = (n >= 0) ? y : -y;//对于前面的还原处理
/**********found**********/
____(3)____//把经过倒序处理的数返回main函数
}
int main()
{
int m1, m2;
scanf("%d %d", &m1, &m2);
printf("%d的逆向是%d\t", m1, fun(m1));
printf("%d的逆向是%d\n", m2, fun(m2));
return 0;
}
解题思路:
简单的对整数进行倒序处理的程序,如果数过大,这段代码就不适用了,就要用字符数组存储数据
答案:
#include <stdio.h>
int fun(int n)
{
int m, y;
y = 0;
if (n >= 0)
m = n;
else
m = -n;
while (m != 0) {
/**********found**********/
y = y*10 + m % 10;
/**********found**********/
m = m/10;
}
y = (n >= 0) ? y : -y;
/**********found**********/
return y;
}
int main()
{
int m1, m2;
scanf("%d %d", &m1, &m2);
printf("%d的逆向是%d\t", m1, fun(m1));
printf("%d的逆向是%d\n", m2, fun(m2));
return 0;
}
测试:
输入:
123 -810
输出:
123的逆向是321 -810的逆向是-18
函数fun的功能是:计算
直到
。若x=2.5,函数值为: 1.917915。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#include <math.h>
#pragma warning (disable:4996)
double fun(double x)
{ double f, t; int n;
f = 1.0 + x;//f就是最后要得出的函数值,这里初始已经加上了第0项和第1项
/**********found**********/
t = ___1___;//t是每一项
n = 1;//n就是题目中公式的n
do {
n++;
/**********found**********/
t *= (-1.0)*x/___2___;//这个空你看下面的解题思路的图,应该就懂了
f += t;
}
/**********found**********/
while (___3___ >= 1e-6);//t是double类型的要用fabs()
return f;
}
main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
解题思路:
要注意在do-while循环的限制条件,也就是第三个空,题目要求的是绝对值的项与10-6比较
讲一下绝对值函数:
int abs(int t) //对int类型的做绝对值处理
long labs(long int t) //对长整型的
double fabs(double t) //对浮点类型的,float也是这个
在题目的公式中可以看出
这个图中的变化就是代码中do-while循环中的 t 的变化
看这个图应该就能理解代码中的do-while循环了
答案:
#include <stdio.h>
#include <math.h>
#pragma warning (disable:4996)
double fun(double x)
{ double f, t; int n;
f = 1.0 + x;
/**********found**********/
t = x;
n = 1;
do {
n++;
/**********found**********/
t *= (-1.0)*x/n;
f += t;
}
/**********found**********/
while (fabs(t) >= 1e-6);
return f;
}
main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
测试:
输出:
The result is :
x=2.500000 y=1.917915
给定程序中,N名学生的数据已存入类型为STU的结构体数组,函数fun的作用是:计算出
N名学生的平均成绩,将高于平均分的学生的学号存入p所指的存储单元中,高于平均分的人数由函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构!
BLANK1. C:
#include <stdio.h>
#include <string.h>
#define N 6
typedef struct
{ char num[5];
double s;
} STU;
int fun(STU x[N], char p[][5])
{
int n=0,i;
double ave=0.0;
for(i=0; i<N; i++)
/**********found**********/
ave+= ____(1)____;//累加所有学生成绩
ave/=N;//除以学生数得平均成绩
for(i=0; i<N; i++)
/**********found**********/
if(x[i].s ____(2)____) //筛出大于平均分的学生
{
strcpy(p[n],x[i].num);//字符串复制
/**********found**********/
____(3)____;//数组p后移
}
return(n);
}
main()
{ int i,k;
STU a[N]={ "z100",78,"z101",92,"z102",77,"z103",87,"z104",66,"z105",85};
char b[N][5];
k=fun(a,b);
for(i=0; i<k;i++)
puts(b[i]);
}
解题思路:
还好,没什么难点ヾ(?ω?`)o
strcpy(x,y) :记住是字符串y复制给x就好了
答案:
#include <stdio.h>
#include <string.h>
#define N 6
typedef struct
{ char num[5];
double s;
} STU;
int fun(STU x[N], char p[][5])
{
int n=0,i;
double ave=0.0;
for(i=0; i<N; i++)
/**********found**********/
ave+= x[i].s;
ave/=N;
for(i=0; i<N; i++)
/**********found**********/
if(x[i].s >ave)
{
strcpy(p[n],x[i].num);
/**********found**********/
n++;
}
return(n);
}
main()
{ int i,k;
STU a[N]={ "z100",78,"z101",92,"z102",77,"z103",87,"z104",66,"z105",85};
char b[N][5];
k=fun(a,b);
for(i=0; i<k;i++)
puts(b[i]);
}
测试:
输出:
z101
z103
z105
给定程序BLANK1. C中主函数的功能是:输入一个实数a,根据迭代公式x1= (x0+a/x0)/2,计算并输出其平方根。要求误差不超过1e-6 (即0. 000001)。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
BLANK1. C:
#include <stdio.h>
main( )
{
double a,x0,x1;
printf("输入一个实数, 本程序计算并输出其平方根\n");
do
/**********************found***********************/
____(1)____//这里应该一眼就看得出是接收输入的
while(a<=0);//当输入的a大于0时跳出循环
x1=a/2.0;
do
{
/**********************found***********************/
____(2)____//更新猜测值x0
x1=(x0+a/x0)/2.0;
/**********************found***********************/
}while((x1-x0)>1e-6 ____(3)____ );//误差不超过1e-6,应该是|x1-x0|>1e-6,这里先给出了正的差值,还有个负的差值留了个空
printf("%f 的平方根是 %f\n",a,x1);
}
解题思路:
题目给的代码中使用了牛顿迭代法,
其实求解平方根可以这么想,我们希望找到一个数 x,使得 x * x = a。牛顿迭代法的思想是通过不断改进猜测值x来逼近真实的平方根。
初始猜测值x一般设置为输入的数a的一半,因为对于大多数的数,它们的平方根通常接近于它们的一半,我们要改进猜测值,就需要基于初始猜测值的另一个猜测值x=a/x,
从x到a/x就是一个区间,真实的平方根就在区间内(包括两端),当x等于a/x也就是真实的平方根,
那么改进猜测值就是对猜测值x和猜测值a/x取平均值。通过取平均值,可以得到更接近真实平方根的新的猜测值x1
答案:
#include <stdio.h>
main( )
{
double a,x0,x1;
printf("输入一个实数, 本程序计算并输出其平方根\n");
do
/**********************found***********************/
{scanf("%lf",&a);}
while(a<=0);
x1=a/2.0;
do
{
/**********************found***********************/
x0=x1;
x1=(x0+a/x0)/2.0;
/**********************found***********************/
}while((x1-x0)>1e-6 ||(x0-x1)>1e-6 );//这里是或就行,只要有一个符合,也可以写||x1-x0<-1e-6
printf("%f 的平方根是 %f\n",a,x1);
}
测试:
输入:
166
输出:
输入一个实数, 本程序计算并输出其平方根
166.000000 的平方根是 12.884099
给定程序中,函数fun的功能是:在任意给定的9个正整数中找出按升序排列时处于中间的数,将原数据序列中比该中间数小的数用该中间数替换,位置不变,在主函数中输出处理后的数据序列,并将中间数作为函数值返回。
例如,有9个正整数: 1 5 7 23 87 5 8 21 45,按升序排列时的中间数为:8,处理后主函数中输出的数列为:8 8 8 23 87 8 8 21 45
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#define N 9
int fun(int x[])
{ int i,j,k,t,mid,b[N];
for(i=0;i<N;i++) b[i]=x[i];
for(i=0;i<=N/2;i++)
{ k=i;
for(j=i+1;j<N;j++) if(b[k]>b[j]) k=j;//选择排序
if(k != i )
{
/**********found**********/
t=b[i]; b[i]=___1___; b[k]=t;//交换赋值
}
}
/**********found**********/
mid=b[___2___];//把按照升序排序的中间的数赋给mid
for(i=0; i<N; i++)
/**********found**********/
if(x[i] ___3___ mid) x[i]=mid;//把小于中间数mid的数组x的元素,赋mid
return mid;
}
main()
{ int i, x[N]={1,5,7,23,87,5,8,21,45};
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\nThe mid data is: %d\n",fun(x));
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\n");
getchar();
}
解题思路:
注意他这里并没有对原数组作排序,原数组仍旧是原来的顺序,不要理解错了
答案:
#include <stdio.h>
#define N 9
int fun(int x[])
{ int i,j,k,t,mid,b[N];
for(i=0;i<N;i++) b[i]=x[i];
for(i=0;i<=N/2;i++)
{ k=i;
for(j=i+1;j<N;j++) if(b[k]>b[j]) k=j;
if(k != i )
{
/**********found**********/
t=b[i]; b[i]=b[k]; b[k]=t;
}
}
/**********found**********/
mid=b[N/2];
for(i=0; i<N; i++)
/**********found**********/
if(x[i] < mid) x[i]=mid;
return mid;
}
main()
{ int i, x[N]={1,5,7,23,87,5,8,21,45};
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\nThe mid data is: %d\n",fun(x));
for(i=0; i<N; i++) printf("%d ",x[i]);
printf("\n");
getchar();
}
测试:
输出:
1 5 7 23 87 5 8 21 45
The mid data is: 8
8 8 8 23 87 8 8 21 45
给定程序中,函数fun的功能是:找出形参s所指字符串中出现频率最高的字母(不区分大小写),并统计出其出现的次数。
例如,形参s所指的字符串为: abcAbsmaxless,程序执行后的输出结果为:
letter 'a’: 3 times
letter 's’: 3 times
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void fun(char *s)
{ int k[26]={0},n,i,max=0; char ch;
while(*s)
{ if( isalpha(*s) ) {
/**********found**********/
ch=tolower(__1__);//这个函数看不懂没事,看数组k应该知道存储的是26字母出现频率,下面的n也就是数组序号,字符ch减去字符'a'得出字符ch的字母序,在对应序号的元素加1,题目说不区分大小写,所以这里这个函数是转化为小写字母
n=ch-'a';
/**********found**********/
k[n]+= __2__ ;//在对应序号的元素加1
}
s++;
/**********found**********/
if(max<k[n]) max= __3__ ;//筛出出现频率最大值
}
printf("\nAfter count :\n");
for(i=0; i<26;i++)
if (k[i]==max) printf("\nletter \'%c\' : %d times\n",i+'a',k[i]);
}
main()
{ char s[81];
printf("\nEnter a string:\n\n"); gets(s);
fun(s);
getchar();
}
解题思路:
int tolower(char c) //把给定的字母转化为小写字母,如果 c 有相对应的小写字母,则该函数返回 c 的小写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。
这个函数不知道没关系,猜也猜得出来,注释有推断
既然有这个函数,那应该也有转化为大写字母:
int toupper(char c) //把给定得字母转化为大写字母,如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。
答案:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void fun(char *s)
{ int k[26]={0},n,i,max=0; char ch;
while(*s)
{ if( isalpha(*s) ) {
/**********found**********/
ch=tolower(*s);
n=ch-'a';
/**********found**********/
k[n]+= 1 ;
}
s++;
/**********found**********/
if(max<k[n]) max= k[n] ;
}
printf("\nAfter count :\n");
for(i=0; i<26;i++)
if (k[i]==max) printf("\nletter \'%c\' : %d times\n",i+'a',k[i]);
}
main()
{ char s[81];
printf("\nEnter a string:\n\n"); gets(s);
fun(s);
getchar();
}
测试:
输入:
abcAbsmaxless
输出:
Enter a string:
After count :
letter 'a' : 3 times
letter 's' : 3 times
给定程序中,函数fun的功能是:判断形参s所指字符串是否是"回文"(Palindrome) ,若是,函数返回值为1;不是,函数返回值为0。"回文"是正读和反读都一样的字符串(不区分大小写字母)。
例如,LEVEL和Level是"回文",而LEVLEV不是"回文"。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int fun(char *s)
{ char *lp,*rp;
/**********found**********/
lp= __1__ ;//指向字符串开头,下面简称头指针
rp=s+strlen(s)-1;//指向字符串末尾,下面简称尾指针
while((toupper(*lp)==toupper(*rp)) && (lp<rp) ) {//将头指针和尾指针指向字符都转化为大写字母,相同且头指针地址小于尾指针进入循环
/**********found**********/
lp++; rp __2__ ; }//头指针后移,尾指针前移
/**********found**********/
if(lp<rp) __3__ ;//若尾指针地址大于头指针,则不是回文数,反之是
else return 1;
}
main()
{ char s[81];
printf("Enter a string: "); scanf("%s",s);
if(fun(s)) printf("\n\"%s\" is a Palindrome.\n\n",s);
else printf("\n\"%s\" isn't a Palindrome.\n\n",s);
getchar();
}
解题思路:
这段代码用得是检测回文字符串的双指针法
int toupper(char c) //将字母转换为大写字母,如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。
答案:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int fun(char *s)
{ char *lp,*rp;
/**********found**********/
lp= s ;
rp=s+strlen(s)-1;
while((toupper(*lp)==toupper(*rp)) && (lp<rp) ) {
/**********found**********/
lp++; rp -- ; }
/**********found**********/
if(lp<rp) return 0 ;
else return 1;
}
main()
{ char s[81];
printf("Enter a string: "); scanf("%s",s);
if(fun(s)) printf("\n\"%s\" is a Palindrome.\n\n",s);
else printf("\n\"%s\" isn't a Palindrome.\n\n",s);
getchar();
}
测试:
输入:
LEVEL
输出:
Enter a string:
"LEVEL" is a Palindrome.
围绕山顶一圈有N个山洞,编号为0、1、2、3、……、N-1,有一只狐狸和一只兔子在洞中居住。狐狸总想找到兔子并吃掉它,它的寻找方法是先到第一个洞(即编号为0的洞)中找;再隔1个洞,即到编号为2的个洞中找;再隔2个洞,即到编号为5的洞中找;下次再隔3个洞;即到编号为9的洞中找;限定狐狸只找一圈,请为兔子指出所有不安全的洞号。例如n的值为30时,不安全的洞号是0、2、5、9、14、20、27。程序中用a数组元素模拟山洞,数组元素的下标即为洞号,数组元素中的值为0时,表示该洞安全,为1时表示该洞不安全。函数中变量t存放当前所隔洞数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#define N 100
void fun( int *a , int n )
{ int i, t;
for( i=0; i<n; i++ )
/**********found**********/
a[i]=__(1)__;//这里main函数数组a未初始化,从下面的while循环中a[i]=1,可看出这里初始化全部赋0
i=0;
/**********found**********/
t=__(2)__;//t 就是不安全洞号的变化,
while( i<n )//这个循环是筛出所有不安全洞号,赋为1
{ a[i]= 1;//一开始 i 为0,是不安全洞号,赋为1,然后在循环中加上t,给后面的不安全洞号赋为
t++;
/**********found**********/
i=__(3)__;
}
}
main()
{ int a[N], i, n=30;//有n个山洞
fun( a, n);
for(i=0; i<n; i++)
if( a[i]==1 ) printf("不安全的洞号是 : %d\n",i );
getchar();
}
解题思路:
这题主要是找出不安全洞号变化的规律,也没有什么坑,比较好做
答案:
#include <stdio.h>
#define N 100
void fun( int *a , int n )
{ int i, t;
for( i=0; i<n; i++ )
/**********found**********/
a[i]=0;
i=0;
/**********found**********/
t=1;
while( i<n )
{ a[i]= 1;
t++;
/**********found**********/
i=i+t;
}
}
main()
{ int a[N], i, n=30;
fun( a, n);
for(i=0; i<n; i++)
if( a[i]==1 ) printf("不安全的洞号是 : %d\n",i );
getchar();
}
测试:
输出:
不安全的洞号是 : 0
不安全的洞号是 : 2
不安全的洞号是 : 5
不安全的洞号是 : 9
不安全的洞号是 : 14
不安全的洞号是 : 20
不安全的洞号是 : 27
给定程序的主函数中,已给出由结构体构成的链表结点a、b、c,各结点的数据域中
均存入字符,函数fun()的作用是:将a、b、c三个结点链接成一个单向链表,并输出链表结点中的数据。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中
不得增行或删行,也不得更改程序的结构
BLANK1.C:
#include <stdio.h>
typedef struct list
{ char data;
struct list *next;
} Q;
void fun( Q *pa, Q *pb, Q *pc)//以三个指针参数收取传过来的值
{ Q *p;
/**********found**********/
pa->next=___1___;//结合下一句话,可以知道是要把这三个节点连起来,所以这里应该是把pb的地址存入pa的指针域
pb->next=pc;
p=pa;//上面三个节点连起来后也就成了链表,把头节点地址给p
while( p )//遍历链表
{
/**********found**********/
printf(" %c",____2_____);//输出链表节点数据,
/**********found**********/
p=____3____;//指针p后移
}
printf("\n");
}
main()
{ Q a, b, c;//定义三个结构体变量,
a.data='E'; b.data='F'; c.data='G'; c.next=NULL;//定义了a,b,c的数据域的值,c的指针域为空
fun( &a, &b, &c );
getchar();
}
解题思路:
主要是考链表的建立,还有定义,节点和结构体指针在输出成员时是一样的
答案:
#include <stdio.h>
typedef struct list
{ char data;
struct list *next;
} Q;
void fun( Q *pa, Q *pb, Q *pc)
{ Q *p;
/**********found**********/
pa->next=pb;
pb->next=pc;
p=pa;
while( p )
{
/**********found**********/
printf(" %c",p->data);
/**********found**********/
p=p->next;
}
printf("\n");
}
main()
{ Q a, b, c;
a.data='E'; b.data='F'; c.data='G'; c.next=NULL;
fun( &a, &b, &c );
getchar();
}
测试:
输出:
E F G
给定程序BLANK1.C中,函数fun的功能是:根据形参c中存储的整数序列,分别统计偶数
元素和奇数元素的个数,将统计结果以结构变量返回主函数,结构变量的类型由程序中定义的struct pair给出,它包含两个整数变量成员,依次对应偶数个数、奇数个数。形参d中存储的是序列的长度。
例如:若c中存储的数值依次为3,5, 14, 27, 12,d为5,则函数返回的结构变量中,第一个成员的值为2,第二个成员的值为3。主函数输出n1=2, n2=3。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
struct pair {
int n1, n2;
};
struct pair fun(int* c, int d) {//函数的返回值是结构体类型的
int i;
/**********************found***********************/
___(1)____;//总的看这个的函数的内容,你会发现缺少了定义结构体变量p
p.n1 = p.n2 = 0;//结构体成员赋初值
/**********************found***********************/
for (i=0; i<d; ____(2)____) {//for循环的表达式,嘛,在循环遍历中,i自增后移
if (c[i] % 2 == 0)
p.n1++;//计数偶数元素
else
/**********************found***********************/
____(3)____//计数奇数元素
}
return p;
}
int main( ) {
int i, c[100], d;
struct pair p;
printf("请输入数值的个数:");
scanf("%d", &d);
printf("请输入%d个数值:", d);
for (i = 0; i < d; i++)
scanf("%d", &(c[i]));//不必在意这里c[i]多打了括号,这样也是可以,我们一般写的都是没打括号的
p = fun(c, d);
printf("n1=%d,n2=%d", p.n1, p.n2);
return 0;
}
解题思路:
主要考查结构体变量定义,结构体成员的调用,没什么具有迷惑性的地方
答案:
#include <stdio.h>
struct pair {
int n1, n2;
};
struct pair fun(int* c, int d) {
int i;
/**********************found***********************/
struct pair p;
p.n1 = p.n2 = 0;
/**********************found***********************/
for (i=0; i<d; i++) {
if (c[i] % 2 == 0)
p.n1++;
else
/**********************found***********************/
p.n2++;
}
return p;
}
int main( ) {
int i, c[100], d;
struct pair p;
printf("请输入数值的个数:");
scanf("%d", &d);
printf("请输入%d个数值:", d);
for (i = 0; i < d; i++)
scanf("%d", &(c[i]));
p = fun(c, d);
printf("n1=%d,n2=%d", p.n1, p.n2);
return 0;
}
测试:
输入:
5
3 5 14 27 12
输出:
请输入数值的个数:请输入5个数值:n1=2,n2=3