试卷编号:9575
所属科目:C语言
试卷方案:C语言程序设计练习_2020版
试卷总分:100分
共有题型:3种
一、程序填空 共2题 (共计30分)
第1题 (15.0分) 题号:448 难度:难 第2章
/*-------------------------------------------------------
【程序填空】
---------------------------------------------------------
功能:已知X、Y、Z分别表示0~9中不同的数字,编程求出使算式
XXXX+YYYY+ZZZZ=YXXXZ成立时X、Y、Z的值,并要求打印该
算式。
-------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
main()
{
int x,y,z;
/***********SPACE***********/
for(x=0;【x<10】;x++)
for(y=0;y<10;y++)
{
if(y==x) continue;//这是为了防止有相同的数
for(z=0;z<10;z++)
{
/***********SPACE***********/
if(z==x【||】z==y) continue;
/***********SPACE***********/
if(1111*(x+y+z)==【10000*y】+1110*x+z)
{
printf("x=%d,y=%d,z=%d\n",x,y,z);
/***********SPACE***********/
printf("%d+%d+%d=%d\n",1111*x,1111*y,1111*z,【10000*y+1110*x+z】);
exit(0);
}
}
}
}
答案:
=======(答案1)=======
x<10
=========或=========
10>x
=======(答案2)=======
||
=======(答案3)=======
10000*y
=========或=========
y*10000
=======(答案4)=======
10000*y+1110*x+z
=========或=========
10000 * y + 1110 * x + z
第2题 (15.0分) 题号:468 难度:难 第2章
/*-------------------------------------------------------
【程序填空】
---------------------------------------------------------
功能: 对一数组进行逐步累加求和,prefix代表从前向后累加值,
suffix代表从后向前累加值,问在此过程中prefix与suffix
有几次值相同?
该题的程序利用的特点是无论从前向后向加还是从后向前相加,最后其总和都是一样的,且这个总和一定比这组数中的每一个数都要大,利用头尾每次向两边累加后的数进行比较而使数组中的每一个数都能够被累加到(因为总和一定比数组中的数大),从而产生循环,其中数组的累加的技巧用的也很巧妙,值得借鉴
-------------------------------------------------------*/
#include <stdio.h>//x[]={ 3, 6, 2, 1, 4, 5, 2},n=7
int head_tail(int x[], int n)
{
int prefix = 0, suffix = 0;//prefix代表从前向后累加值,suffix代表从后向前累加值
int prefix_idx = 0, suffix_idx = n-1;
int count = 0;
while (suffix_idx >= 0 && prefix_idx <= n-1)
/***********SPACE***********/
if ( prefix < suffix)
prefix += x[prefix_idx++];
else if (prefix > suffix)
/***********SPACE***********/
suffix += x[suffix_idx--];
else
{
/***********SPACE***********/
count++;
prefix += x[prefix_idx++]; //这里值得借鉴,即如何累加数组的值
suffix += x[suffix_idx--]; //这里值得借鉴,即如何累加数组的值
}
return count;
}
#include <stdio.h>
void main(void)
{
int x[] = { 3, 6, 2, 1, 4, 5, 2};
int n = sizeof(x)/sizeof(int);//sizeof()用于计算括号中的字符,数字,数组或者类型所占的字节数,如sizeof(int)=4;int x=4------>sizeof(x)=4等等
int i;
printf("\nHead Sum == Tail Sum Counting Program");
printf("\n=====================================\n");
printf("\nGiven Array :");
for (i = 0; i < n; i++)
printf("%5d", x[i]);//%x就是要求输出宽度为x的十进制整型
printf("\n\nThere are %d equal Prefix-Suffix sum pairs.",head_tail(x, n));
}
答案:
=======(答案1)=======
prefix < suffix
=========或=========
suffix>prefix
=======(答案2)=======
suffix_idx--
=========或=========
suffix_idx= suffix_idx -1
=========或=========
--suffix_idx
=======(答案3)=======
count++
=========或=========
count=count+1
二、程序改错 共2题 (共计30分)
第1题 (15.0分) 题号:387 难度:中 第2章
/*------------------------------------------------------
【程序改错】
--------------------------------------------------------
功能:判断字符ch是否与str所指串中的某个字符相同; 若相同,
什么也不做,若不同,则将其插在串的最后。
------------------------------------------------------*/
#include <conio.h>//conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
#include <stdio.h>
#include <string.h>
/**********FOUND**********/
=======(答案1)=======
void fun(char *str, char ch )
void fun(char str, char ch )//fun(s, c)---》s是输入的字符串,是一个字符数组,c是要搜索的字符
{
while ( *str && *str != ch )//无法理解这里,但去掉*str&&后无论输入什么要搜索的字符到后面得出的字符串都没有改变,但以我现在的理解来看,应该删去较好,不删去的的话,作用就可能是标明这个是一个指针变量,然后才可以使用,可是前面char *str不是已经表明了,这里为什么还要再表明一次,真是奇怪
str++;//在《c语言程序设计》p137图8.8
/**********FOUND**********/
=======(答案2)=======
if ( *str == '\0' )
if ( *str == ch )
{
str [ 0 ] = ch;
/**********FOUND**********/
=======(答案3)=======
str[1] = '\0';
str[1] = '0';
}
}
main( )
{
char s[81], c ;
printf( "\nPlease enter a string:\n" );
gets ( s );
printf ("\n Please enter the character to search : " );
c = getchar();
fun(s, c) ;
printf( "\nThe result is %s\n", s);//%s是用来输出一个字符串的
}
答案:
=======(答案1)=======
void fun(char *str, char ch )
=======(答案2)=======
if ( *str == '\0' )
=======(答案3)=======
str[1] = '\0';
第2题 (15.0分) 题号:438 难度:中 第2章
/*------------------------------------------------
【程序改错】
--------------------------------------------------
功能:编写函数fun,求两个整数的最小公倍数,然后用主
函数main()调用这个函数并输出结果,两个整数由
键盘输入。
------------------------------------------------*/
#include <stdio.h>
int fun(int m,int n)
{
int i;
/**********FOUND**********/
=======(答案1)=======
if (m<n)
if (m=n)
{
i=m;//这里就是把n和m的值互换
m=n;
n=i;
}
for(i=m;i<=m*n;i+=m)
/**********FOUND**********/
=======(答案2)=======
if(i%n==0)
if(i%n==1)//求余运算,相当于求i除以n的余数;;
return(i);//这里的设计非常的巧妙,要看的话得要从后面往前看,我们得先分析两个整数的最小公倍数这个东西,要么是这两个数相乘得出的数,要么就是两个数相除且能够除的尽,那么大的那个就是他们的最小公倍数,利用这两点就可以设计出程序了。
先来分析两个数相除且能够除的尽,那么大的那个就是他们的最小公倍数这一点,那就非常简单了,不就是拿大的那个数除以小的那个数,看看得出的余数是否为零,如果为零那就是除的尽,那就可以直接输出大的那个数,如果不为零,那公倍数就是他们两个相乘的结果,上面程序其实是比较麻烦的,但也比较巧妙,主要是那个for循环那里巧妙,那里是针对除不尽时设计的,当两个数除不尽时,会有一个i+=m的累加,这个就相当与自己加自己,加完之后再次去求余,如果还是不为0,那就在加,直到能够求余的结果为为止,那么为什么一直自己加自己到后面肯定能够使求余的结果为0呢?怎么说呢,就拿3和5来举例,因为5是比较大的那一个,那就是要他自己加自己,第0次时是5+0,相当于5*1,第一次时是5+5,相当于5*2,第二次时是10+5,相当于5*3,那么我们会发现,这时已经*3了,而这个3就是我们拿3和5来举例中的那个3,不止是3和5,反正只要大的那个一直自己累加,到最后其累加的次数肯定是小的那个数+1.
我说麻烦,我觉得可以不用那个for循环,因为如果不能整除,那就只能相乘了,那就直接相乘就行了,可以不用那个循环,如下:
if (m<n)
{
i=m;//这里就是把n和m的值互换
m=n;
n=i;
}
if(m%n==0)//求余运算,相当于求i除以n的余数;;
{
return(m);
}
else
{
a=m*n;
return(a);
}
return 0;
return 0;
}
main()
{
unsigned int m,n,q;//unsigned的英文意思为无符号的,与之相反的是signed,signed通常放在类型的前面,通常是省略的。因为signed需要留下高位来表示符号,所以其取值范围为负二的三十一次方到二的三十一次方,也就是-2 147 483 648到+2 147 483 647之间。而unsigned因为不需要用高位来表示符号(因为他本来就不需要符号),所以高位还是可以用来存储,所以其取值范围是零到二的三十二次方。即0到4 294 967 295,比signed多了一位
printf("m,n=");
scanf("%d,%d",&m,&n);
/**********FOUND**********/
=======(答案3)=======
q=fun(m,n);
q==fun(m,n);
printf("p(%d,%d)=%d",m,n,q);//为什么这里不用%u而是用%d,m,n,q再定义之初不都是unsigned类型的吗?
}
答案:
=======(答案1)=======
if (m<n)
=======(答案2)=======
if(i%n==0)
=======(答案3)=======
q=fun(m,n);
//总结:无论是填空还是改错还是设计题,都要自己把题目分析先,都当成设计题来分析思路
三、程序设计 共2题 (共计40分)
第1题 (20.0分) 题号:379 难度:中 第2章
/*------------------------------------------------
【程序设计】
--------------------------------------------------
功能:给定n个数据, 求最大值出现的位置(如果最大值出
现多次,求出第一次出现的位置即可)。
------------------------------------------------*/
#include<stdio.h>
int station(int s[],int n)//n是要输入几个数,s[]是用于存储输入的那几个数的
{
/**********Program**********/
int i,k;
k=0;
for(i=1;i<=n;i++)
if(s[i]>s[k])
k=i;
return(k+1);//这里原理挺简单的,就是不停的用后一个和前一个作比较,后一个大那就把后一个的序号赋给前一个,然后再继续比较,不过一开始我就忘了可以设两个变量在数组里,用以代替前后用于比较的数组,这是个好方法
/********** End **********/
}
main()
{
int a[100],n,i,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
t=station(a,n);
printf("the max_value position is:%d\n",t);
wwjt();
}
答案:----------------------
int i,k;
k=0;
for(i=1;i<=n;i++)
if(s[i]>s[k]) k=i;
return(k+1);
----------------------
第2题 (20.0分) 题号:407 难度:难 第2章
/*------------------------------------------------
【程序设计】
--------------------------------------------------
功能:编写函数fun求sum=d+dd+ddd+……+dd...d(n个d),
其中d为1-9的数字。
例如:3+33+333+3333+33333(此时d=3,n=5),d和n在主函
数中输入。
------------------------------------------------*/
#include <stdio.h>
long int fun(int d,int n)
{
/**********Program**********/
long int s=0,t=0;
int i;
for(i=1;i<=n;i++)
{ t=t+d;
s=s+t;
d=d*10;
}
return s;//这题真挺简单的,就是先创造出数,然后再累加,不过要从前往后创造,即先得出d,再*10+d得出dd,再累加,然后又*10+d得出ddd,如此循环往复,就可以了,怎么怎么难度还是难?
/********** End **********/
}
main()
{
int d,n;
long sum,fun();
printf("d=");
scanf("%d",&d);
printf("n=");
scanf("%d",&n);
sum=fun(d,n);
printf("sum=%ld\n",sum);
wwjt();
}