下列给定程序中,对于函数void fun(int *dt, int n),传递给形参dt整型数组名、传递给形参n该数组的数据个数,函数的功能是在数组中找出值最小的元素并将其与第1个元素交换。
如原数组数据为30,20,15,64,85,28,
则经函数处理后为15,20,30, 64,85,28。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构。
BLANK1. C:
#include<stdio.h>
#pragma warning (disable:4996)
void fun(int *dt,int n)
{
int i,m,t;
/**********************found***********************/
____(1)____ ;//从下面交换赋值可以看出,t不用再初始化了,i在for循环中,也不用,那只会是m
for(i=1;i<n;i++)//注意要看仔细些,这个for只对下一行生效
/**********************found***********************/
if(____(2)____) //只有这个if分支在循环中,这个if分支作用是找出最小值,看下面的m=i就说明是第m项与第i项的比较,而i是从1开始的,那m就得从0开始,第一个空就出来了
m=i;
t=dt[0];
/**********************found***********************/
____(3)____//交换赋值嘛,想必已经很熟悉了
dt[m]=t;
}
main()
{
int a[10]={ 30,20,15,64,85,28 };
int i,n=6;
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
fun(a,n);
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
解题思路:
有些坑,粗略的看的话,很容易下意识把交换赋值看作是for循环内了,我就有些粗心的毛病
(;′⌒`)
答案:
#include<stdio.h>
#pragma warning (disable:4996)
void fun(int *dt,int n)
{
int i,m,t;
/**********************found***********************/
m=0;
for(i=1;i<n;i++)
/**********************found***********************/
if(dt[m]>dt[i])
m=i;
t=dt[0];
/**********************found***********************/
dt[0]=dt[m];
dt[m]=t;
}
main()
{
int a[10]={ 30,20,15,64,85,28 };
int i,n=6;
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
fun(a,n);
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
测试:
输出:
30 20 15 64 85 28
15 20 30 64 85 28
下列给定程序中,函数fun的功能是:根据形参ch中指定的大写英文字母,
按顺序打印出3个相邻的字母,指定的字母位于中间。
若指定的字母为Z,则打印YZA;若指定的字母为A,则打印ZAB。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构。
BLANK1. C:
#include <stdio.h>
#include <ctype.h>
#pragma warning (disable:4996)
void fun(char ch)
{ char t[3];
int i;
t[1]=ch;//main函数传来的字符放在数组中间
/**********************found***********************/
if (ch=='Z'){ t[2]='A'; t[0]= ____(1)____ ; }//字母顺序输出
/**********************found***********************/
else if (ch=='A') {t[2]='B'; t[0]= ____(2)____; }
/**********************found***********************/
else { t[0]=ch-1; t[2]= ____(3)____;}
for(i=0;i<3; i++) putchar(t[i]);
putchar('\n');
}
main( )
{ char c;
do
{ printf(" enter a upper letter:");
c=getchar(); getchar();
}
while(!isupper(c));//c获取到大写字母时跳出,然后传到fun函数
fun(c);
}
解题思路:
getchar():每次只获取一个字符,无论是空格还是换行符都会被收取
isupper(): 判断是否为大写字母
do-while循环:必定会执行一次,也就是上面代码中的c一定会获取一个字符
putchar(): 一次输出一个字符
答案:
#include <stdio.h>
#include <ctype.h>
#pragma warning (disable:4996)
void fun(char ch)
{ char t[3];
int i;
t[1]=ch;
/**********************found***********************/
if (ch=='Z'){ t[2]='A'; t[0]= 'Y' ; }
/**********************found***********************/
else if (ch=='A') {t[2]='B'; t[0]= 'Z'; }
/**********************found***********************/
else { t[0]=ch-1; t[2]= ch+1;}
for(i=0;i<3; i++) putchar(t[i]);
putchar('\n');
}
main( )
{ char c;
do
{ printf(" enter a upper letter:");
c=getchar(); getchar();
}
while(!isupper(c));
fun(c);
}
测试:
输入:
A
输出:
enter a upper letter:ZAB
给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。
例如,当形参n的值为10时,函数返回:9.612558。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
double fun(int n)
{ int i; double s, t;
/**********found**********/
s=__1__;//i的初始时从1开始的,也就是累加从第一项,那么这里s初值就是0
/**********found**********/
for(i=1; i<=__2__; i++)//要从第1项累加到第n项
{ t=2.0*i;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/__3__;//看题目中的公式应该很好推断出
}
return s;
}
main()
{ int n=-1;
while(n<0)//n初始值小于0,必定会进入一次循环
{ printf("Please input(n>0): "); scanf("%d",&n); }
printf("\nThe result is: %f\n",fun(n));
getchar();
}
解题思路:
s=s+(2.0i-1)(2.0i+1)/3;,他这句话感觉就是为了误导人,显得更复杂些,2.0i明明可以直接用 t 替换掉的,
还有main函数那个while循环是经典的迷惑操作了( ̄_, ̄ )
答案:
#include <stdio.h>
double fun(int n)
{ int i; double s, t;
/**********found**********/
s=0;
/**********found**********/
for(i=1; i<=n; i++)
{ t=2.0*i;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/(t*t);
}
return s;
}
main()
{ int n=-1;
while(n<0)
{ printf("Please input(n>0): "); scanf("%d",&n); }
printf("\nThe result is: %f\n",fun(n));
getchar();
}
测试:
输入:
10
输出:
Please input(n>0):
The result is: 9.612558
给定程序blank1.c中,函数fun的功能是将一个由字符0和1组成的表示二进制数的字符
串,转换成相应的十进制整数值返回。该串长度最大不超过15。
例如:若表示二进制数的字符串为:”10011”,
则运行结果应为: 10011–>19
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构。
BLANK1.C:
#include <stdio.h>
#pragma warning (disable:4996)
#define N 16
/**********************found***********************/
int fun( char ____(1)____) //那边main函数传过来的是数组,但没给数组长度,那这里就只能用指针
{ int i, n = 0;
/**********************found***********************/
for (i=0; ____(2)____ ; ++i)//这个空填的是跳出循环的条件的,数组元素为空时就停了
/**********************found***********************/
n = n*2 + (s[i] -____(3)____) ; //要将数字字符转换为数
return n;
}
main( )
{ char num[] = "10011"; int n;
n = fun(num);
printf( "%s-->%d\n", num, n );
}
解题思路:
考查了下ASCII码,
数字字符转化为数,以ASCII码的形式减去字符 ‘0’,得到的即为数,字符 '0’的ASCII码为48
答案:
#include <stdio.h>
#pragma warning (disable:4996)
#define N 16
/**********************found***********************/
int fun( char *s)
{ int i, n = 0;
/**********************found***********************/
for (i=0; s[i]!='\0' ; ++i)
/**********************found***********************/
n = n*2 + (s[i] -'0') ; //这里字符'0'也可以换成48
return n;
}
main( )
{ char num[] = "10011"; int n;
n = fun(num);
printf( "%s-->%d\n", num, n );
}
测试:
输出:
10011-->19
给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。
例如,当形参n的值为10时,函数返回:-0.204491。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
double fun(int n)
{ int i, k; double s, t;
s=0;
/**********found**********/
k=__1__;//s=0,还没有增加项,所以是从第一项起,k就从1开始
for(i=1; i<=n; i++) {
/**********found**********/
t=__2__;//根据题目公式结合代码可以看出i就是公式中的n,
s=s+k*(2*i-1)*(2*i+1)/(t*t);//k是判断正负的,奇数项为正,偶数项为负
/**********found**********/
k=k*__3__;
}
return s;
}
main()
{ int n=-1;
while(n<0)//经典迷惑循环
{ printf("Please input(n>0): "); scanf("%d",&n); }
printf("\nThe result is: %f\n",fun(n));
getchar();
}
解题思路:
这题前面有很多类似的了,套路比较重复( ̄︶ ̄)↗
答案:
#include <stdio.h>
double fun(int n)
{ int i, k; double s, t;
s=0;
/**********found**********/
k=1;
for(i=1; i<=n; i++) {
/**********found**********/
t=2*i;
s=s+k*(2*i-1)*(2*i+1)/(t*t);
/**********found**********/
k=k*(-1);
}
return s;
}
main()
{ int n=-1;
while(n<0)
{ printf("Please input(n>0): "); scanf("%d",&n); }
printf("\nThe result is: %f\n",fun(n));
getchar();
}
测试:
输入:
10
输出:
Please input(n>0):
The result is: -0.204491
下列给定程序中,函数fun根据所给n名学生的成绩,计算出所有学生的平均成绩,
把高于平均成绩的学生成绩求平均值并返回。
例如:若有成绩为: 50, 60, 70, 80, 90, 100, 55, 65, 75, 85, 95, 99,
则运行结果应为: 91. 5。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在文件BLANK1.C中,不得增行或删行,也不得更改程序的结构。
BLANK1.C:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(double x[], int n)
{ int i, k=0;
double avg=0.0, sum=0.0;
for (i=0; i<n; i++)
avg += x[i];//先累加所有学生的成绩
/**********************found***********************/
avg /= ____(1)____;//除以学生数量,即为平均成绩
for (i=0; i<n; i++)
if (x[i] > avg)//筛选出了高于平均成绩的学生成绩
{
/**********************found***********************/
____(2)____ += x[i];//累加高于平均成绩的学生成绩
k++;//高于平均成绩的学生数量
}
/**********************found***********************/
return ____(3)____;//要返回高于平均成绩的学生成绩的平均值
}
main( )
{ double score[12] ={50,60,70,80,90,100,55,65,75,85,95,99};
double aa;
aa= fun(score,12);
printf("%f\n",aa);
}
解题思路:
这题也不难,看题要细心,
注意最后fun函数要返回的是高于平均成绩的学生成绩的平均值
答案:
#include <stdio.h>
#pragma warning (disable:4996)
double fun(double x[], int n)
{ int i, k=0;
double avg=0.0, sum=0.0;
for (i=0; i<n; i++)
avg += x[i];
/**********************found***********************/
avg /= n;
for (i=0; i<n; i++)
if (x[i] > avg)
{
/**********************found***********************/
sum += x[i];
k++;
}
/**********************found***********************/
return sum/k;
}
main( )
{ double score[12] ={50,60,70,80,90,100,55,65,75,85,95,99};
double aa;
aa= fun(score,12);
printf("%f\n",aa);
}
测试:
输出:
91.500000
给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据依次移至数组的前部,大于等于平均值的数据依次移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。
例如,有10个正数:41 1734 0 19 24 28 8 12 14,平均值为:19.700000
移动后的输出为: 17 0 19 8 12 14 41 34 24 28
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double *x)
{ int i, j; double av, y[N];
av=0;
/**********found**********/
for(i=0; i<N; i++) av +=__1__;//这里要直接得出平均数,不用担心数据类型的问题,数组都是浮点类型
for(i=j=0; i<N; i++)
if( x[i]<av ){//先筛出小于平均值的,存入数组y,
/**********found**********/
y[j]=x[i]; x[i]=-1; __2__;}//被筛出小于平均值数组x中元素被赋-1,是方便用于下面筛出大于等于平均值的元素,这里i自增变化了,j还没变化
i=0;
while(i<N)//筛出大于等于平均值的元素
{ if( x[i]!= -1 ) y[j++]=x[i];//接着存入数组大于等于平均值的元素
/**********found**********/
__3__;//i自增后移
}
for(i=0; i<N; i++)x[i] = y[i];//得到的数组y再赋给数组x
return av;
}
main()
{ int i; double x[N];
for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}//rand()随机数函数
printf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
getchar();
}
解题思路:
rand() :
rand()%(n-m+1) + m; //产生m到n的随机数
比如题目中的rand()%50 就是产生0到49的随机数
答案:
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double *x)
{ int i, j; double av, y[N];
av=0;
/**********found**********/
for(i=0; i<N; i++) av +=x[i]/N;
for(i=j=0; i<N; i++)
if( x[i]<av ){
/**********found**********/
y[j]=x[i]; x[i]=-1; j++;}
i=0;
while(i<N)
{ if( x[i]!= -1 ) y[j++]=x[i];
/**********found**********/
i++;
}
for(i=0; i<N; i++)x[i] = y[i];
return av;
}
main()
{ int i; double x[N];
for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}
printf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
getchar();
}
测试:
输出:
33 36 27 15 43 35 36 42 49 21
The average is: 33.700000
The result :
33 27 15 21 36 43 35 36 42 49
给定程序中,函数fun的功能是建立一个NXN的矩阵。矩阵元素的构成规律是:最外层元素的值全部为1,从外向内第2层元素的值全部为2;第3层元素的值全部为3,…依次类推例如,若N=5,生成的矩阵为:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#define N 7
/**********found**********/
void fun(int (*a) __1__)//二维数组以指针形式传递的
{ int i,j,k,m;
if(N%2==0) m=N/2 ;//得出的m也就是确定有几层
else m=N/2+1;
for(i=0; i<m; i++) {
/**********found**********/
for(j= __2__ ; j<N-i; j++)//这里是求出矩阵一层元素的上下边
a[i][j]=a[N-i-1][j]=i+1;//一层元素上边a[i][j],下边a[N-i-1][j],i+1就是层数
for(k=i+1; k<N-i; k++)
/**********found**********/
a[k][i]=a[k][N-i-1]= __3__;//求出矩阵一层元素的左右边,左边为a[k][i],右边为a[k][N-i-1],元素值为层数
}
}
main()
{ int x[N][N]={0},i,j;
fun(x);
printf("\nThe result is:\n");
for(i=0; i<N; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
getchar();
}
解题思路:
这题代码的思路相当不错了,感觉不给代码让我编写一个符合题目要求的程序,我估计是没他写的好了,
先求出共有多少层,然后由外到内一层一层得出结果,先求一层的上下边,再求一层的左右边
答案:
#include <stdio.h>
#define N 7
/**********found**********/
void fun(int (*a) [N])
{ int i,j,k,m;
if(N%2==0) m=N/2 ;
else m=N/2+1;
for(i=0; i<m; i++) {
/**********found**********/
for(j= i ; j<N-i; j++)
a[i][j]=a[N-i-1][j]=i+1;
for(k=i+1; k<N-i; k++)
/**********found**********/
a[k][i]=a[k][N-i-1]= i+1;
}
}
main()
{ int x[N][N]={0},i,j;
fun(x);
printf("\nThe result is:\n");
for(i=0; i<N; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
getchar();
}
测试:
输出:
The result is:
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1
给定程序中,函数fun的功能是:将a所指3×5矩阵中第k列的元素左移到第0列,第k列以后的每列元素行依次左移,原来左边的各列依次绕到右边。
例如,有下列矩阵:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
若k为2,程序执行结果为
3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
/**********found**********/
for(p=1; p<= __1__; p++)//p是循环移动次数
for(i=0; i<M; i++)
{ temp=a[i][0];//在内层循环中,首先将当前行的第一个元素保存到临时变量temp中
/**********found**********/
for(j=0; j< __2__ ; j++) a[i][j]=a[i][j+1];//遍历当前行的每个元素(除了最后一个元素),将当前元素的值更新为下一个元素的值
/**********found**********/
a[i][N-1]= __3__;//将临时变量temp的值赋给当前行的最后一个元素
}
}
main( )
{ int x[M][N]={ {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} },i,j;
printf("The array before moving:\n\n");
for(i=0; i<M; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
fun(x,2);
printf("The array after moving:\n\n");
for(i=0; i<M; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
getchar();
}
解题思路:
下面这个图就是题目的思路,
代码分析:
1.在fun函数中,使用了两个嵌套的for循环,最外层循环控制移动次数,移动次数即为第k列移到第0列所需次数,内层两个for循环遍历每一行
2.在内层循环中,首先将当前行的第一个元素保存到临时变量temp中
3.然后使用一个内层循环遍历当前行的每个元素(除了最后一个元素),将当前元素的值更新为下一个元素的值
4.最后,将临时变量temp的值赋给当前行的最后一个元素
答案:
#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
/**********found**********/
for(p=1; p<= k; p++)
for(i=0; i<M; i++)
{ temp=a[i][0];
/**********found**********/
for(j=0; j< N-1 ; j++) a[i][j]=a[i][j+1];//这个空原来可以看作j+1<N,空留在那边所以是j<N-1
/**********found**********/
a[i][N-1]= temp;
}
}
main( )
{ int x[M][N]={ {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} },i,j;
printf("The array before moving:\n\n");
for(i=0; i<M; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
fun(x,2);
printf("The array after moving:\n\n");
for(i=0; i<M; i++)
{ for(j=0; j<N; j++) printf("%3d",x[i][j]);
printf("\n");
}
getchar();
}
测试:
输出:
The array before moving:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
The array after moving:
3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
给定程序中,函数fun的功能是:调用随机函数产生20个互不相同的整数放在形参a所指数组中(此数组在主函数中己置0)。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意: 源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
BLANK1.C:
#include <stdlib.h>
#include <stdio.h>
#define N 20
void fun( int *a)
{ int i, x, n=0;
x=rand()%20;
/**********found**********/
while (n<__1__)//n就是已经产生的不同随机数的元素个数
{ for(i=0; i<n; i++ )//遍历已经存入数组的元素与现在产生的随机数进行比较
/**********found**********/
if( x==a[i] ) __2__;//若有相同的进入if分支
/**********found**********/
if( i==__3__){ a[n]=x; n++; }//存入该随机数
x=rand()%20;
}
}
main()
{ int x[N]={0} ,i;
fun( x );
printf("The result : \n");
for( i=0; i<N; i++ )
{ printf("%4d",x[i]);
if((i+1)%5==0)printf("\n");
}
printf("\n\n");
getchar();
}
解题思路:
第一个空好理解,一共要存入N个随机数,当n==N就要跳出循环了
第二个空要结合第三个空看,那先看第三个空,要存入随机数必然是与已经存入的数比较没有相等的才能存入,全部比较完后i该等于n,才会执行存入操作
那第二个空就该是break,跳出循环i不再递增,当前随机数已经不符合,也就没必要往后比较了
还是说下rand()这个随机数函数吧,
rand()%(n-m+1)+m //m到n的随机数
题目中的rand()%20,也就是0到19的随机数了
答案:
#include <stdlib.h>
#include <stdio.h>
#define N 20
void fun( int *a)
{ int i, x, n=0;
x=rand()%20;
/**********found**********/
while (n<N)
{ for(i=0; i<n; i++ )
/**********found**********/
if( x==a[i] ) break;
/**********found**********/
if( i==n){ a[n]=x; n++; }
x=rand()%20;
}
}
main()
{ int x[N]={0} ,i;
fun( x );
printf("The result : \n");
for( i=0; i<N; i++ )
{ printf("%4d",x[i]);
if((i+1)%5==0)printf("\n");
}
printf("\n\n");
getchar();
}
测试:
输出:
The result :
3 6 17 15 13
12 9 1 2 7
10 19 0 16 11
8 18 4 5 14