一、单项选择题 在每小题列出的四个备选项中只有一个是符合题目要求的。 7. 若x、y均是int型变量,则执行以下语句后的结果是
for(x=1;x<5;x+=2)
for(y=1;y<5;y++)
{printf("%2d",x*y);
if(y==4)printf("\n");
}
- A.1 2 3 4
3 6 9 12 - B.2 3 4 5
3 4 5 6 - C.1 2 3 4 5 6 9
- D.2 3 4
3 6 9
6 9 12
A B C D
A
[解析] 此题为一个简单的for循环嵌套。外层步进值为2,循环中断条什是x<5;内层步进值为1,循环中断条件是y<5。语句"if(y==4)printf("\n"):"的用意是当y=4时回车换行。
11. 现有下列程序语句,执行后的结果是
#include<stdio.h>
void main()
{char s1[100]="123",s2[100]="qwer";
puts(s1);puts(s2);
printf("%s%s",s1,s2);
}
- A.123 qwer
123 qwer - B.123
qwer
123qwer - C.123qwerl23qwer
- D.123qwer
123qwer
A B C D
B
[解析] puts()函数的作用是输出字符数组中存放的字符串,并在输出完成后回车换行。
二、填空题1. 从计算机的角度来讲,______是计算机程序中解决问题的方法步骤。
2. 函数strcmp()和函数strcat()包含在头文件______中。
4. 下面程序的输出是______。
#include<stdio.h>
main()
{char x=0.40;
printf("%d\n",x=x<<1);}
5. 现在程序的输出是______。
#include<stdio.h>
main()
{int arr[10],j,k=0;
for(j=0;j<10;j++)
arr[j]=j;
for(j=1;j<4;j++)
k+=arr[j]+j;
printf("%d\n",k);
}
12
[解析]
#include<stdio.h>
main()
{int arr[10],j,k=0;
for(j=0;j<10;j++)
arr[j]=j;j*数组以下标的值为初始值被初始化*/
for(j=1;j<4;j++)/*循环起始条件是j=1*/
k+=arr[j]+j;/*k=arr[j]+j+k*/
printf("%d\n",k);
6. 阅读下列程序:
#include<stdio.h>
#define MAXCOUT 4
void fun()
main()
{int cout;
for(cout=1;tout<=MAXCOUT;cout++)
fun();
}
void fun()
{int j=0;
j+=2;printf("%d",j);
}
2468
[解析]
#include<stdio.h>
#define MAXCOUT 4/*宏定义,在程序编译时见到MAXCOUT即换成4*/
void fun()
main()
{int eout;
for(cout=1;cout<=MAXCOUT;cout++)/*循环上限为cout<=4*/
fun();
}
void fun()
{int j=0;
j+=2;printf("%d",j);
}
7. 设有int x=11;表达式(x++*1/3)的值是______。
4
[解析] "++"运算优先级高于"*"(乘法)故可有(x+1)×1÷3=4。
8. 设有如下程序段:
int j=0,sum=1;
do{
sum+=j++;}
while(j<6);
printf("%d\n",sum);
上述程序段的输出结果是______。
16
[解析]
int j=0,sum=1;
do{
sum+=j++;)/*"++"后置,采用先使用对象,后进行运算的规则*/
while(j<6);/*循环上限为j<6*/
printf("%d\n",sum);
9. 以下循环体的执行次数是______。
#include<stdio.h>
main()
{int j,k;
for(j=0,k=1;j<=k+1;j+=2,k--)
printf("%d\n",j);)
1
[解析]
#include<stdio.h>
main()
{int j,k;
for(j=0,k=1;j<=k+1;j+=2,k--)/*变量j的步进值是2,变量k的步值是-1。当第二次进入循环时,j=2而k=0已不能满足继续执行循环体的条件j<=k+1*/
printf("%d\n",j);}
10. 下面程序段的输出结果是______。
#include<stdio.h>
int b=1:
int func(int *a)
{*a+=b;return(*a);)
main()
{int a=2,res=1;
res+=func(&a);
printf("%d%d\n",a,res);}
3 4
[解析]
#include<stdio.h>
int b=1;
int func(int *a)/*参数传递采用地址传递的方式,函数本身可改变函数体外的变量的值*/
{*a+=b;return(*a);}
main()
{int a=2,res=1;
res+=func(&a);/*根据函数"func()"的定义,实参必须是变量的地址*/
printf("%d%d\n",a,res);}/*"main()"函数内的变量a的值被改变*/
三、程序分析题1. #include<stdio.h>
main()
{int a[]={2,4,6,8,10};
int y=1,x,*P;
p=&a[1];
for(x=0;x<3;X++)
y+=*(p+x);
printf("%d\n",y);
}
19
[解析]
#include<stdio.h>
main()
{int a[]={2,4,6,8,10};
int y=1,x,*P;
p==&a[1];
for(x=0;x<3;x++)/*循环的步进值是1,执行循环体需满足x<3*/
y+=*(p+x);/*与y一起参与运算的是存储于以"&a[1]"为首地址。偏移量为"x"的内存单元内,它属于数组"im a[]"的int型数据*/
printf("%d\n",y);
}
2. #include<stdio.h>
main()
{char *p[]={"BOOL","OPK","H","ASD");
int;
for(i=3;i>=0;i--,i--)
printf("%s",*(p+i));
printf("\n");
}
ASDOPK
[解析]
#include<stdio.h>
main()
{char *p[]={"BOOL","OPK","H","ASD"};
int i;
for(i=3;i>=0;i--,i--)/*循环的步进值是2,因i做了两次自减1的运算*/
printf("%s",*(p+i));/*打印地址为p偏移量为i的字符型数组的内存单元的字符串*/
printf("\n");
}
3. #include<stdio.h>
int d=1:
int fun(int p)
{d+=P++;
printf("%d",d);
}
main()
{int a=3;
fun(a);
d+=a++;
printf("%d\n",d);
}
4 7
[解析]
#include<stdio.h>
int d=1;/*变量d为令局变量,任意一个关于d的操作都会影响到d的值*/
int fun(int p)
{d+=p++;
printf("%d",d);
}
main()
{int a=3;
fun(a):
d+=a++:
primf("%d\n",d);
}
4. #include<stdio.h>
main()
{int i,j,row,col,max;
int a[3][4]={{1,2,3,4,},{10,4,20,6,},{0,-1,-3,-5,}};
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{max=a[i][j];row=i;col=j;)
printf("max=%d,row=%d,col=%d\n",max,row,col);
}
max=20,row=1,col=2
[解析]
#include<stdio.h>
main()
{int i,j,row,col,max;
int a[3][4]={{1,2,3,4,},{10,4,20,6,},{0,-1,-3,-5,}};/*初始化数组a[3][4],没有初始化的元素默认为"0"*/
max=a[0][0];
for(i=0;i<3;i++)
for(j-0;j<4;j++)
if(a[i][j]>max)
{max=a[i][j];row=i;col=j;}/*用每个元素和max对比,比max大的将其值赋于max并记录其横、纵两个下标的值*/
printf("max=%d,row=%d,col=%d\n",max,row,col);
}
四、程序填充题1. 完善下面程序段,以使其完成以下数学函数的计算。
#include<stdio.h>
#include<math.h>
main()
{float x,y,f1,fun();
scanf("%f%f",&x,&y);
f1=x*x/fun(______);/*第一空*/
printf("A=%f\n",f1);
}
float fun(float f)
{float f2;
f2=f*f+sqrt(1+_____/*第二空*/+______);/*第三空*/
return(f2);
}
exp(x-y)/*第一空。由语句"f1=x*x/fum(______);"知此处为函数A(x,y)的表达式。且函数fun()是函数表达式A(x,y)的分母,应由x、y两个变量组成。而此参数应满足语句"f2=f*f+sqrt(1+______+______);"和"return(f2);(函数A(x,y)的分母)";故空应为变"f"的表达式,再结合数学函数A(x,y)的原形可得到此空应为exp(x-y)*/
2*f/*第二空。由语句"f2=f*f+sqrt(1+______+______);"和数学函数A(x,y)的原形可知,此空应为关于f的表达式且为"2*f"*/
3*f*f/*第三空。解析同上*/
2. 以下程序能将字符串Program!反向打印出来,请填空。
#include<stdio.h>
void out(char *str)
{char *s=______;/*第一空*/
if(*s==NULL)return:
while(______)s++;/*第二空*/
s--;
printf("%c\n",*s);
______=NULL;/*第三空*/
out(str);
}
main()
{char c[]="Program!";
out(c);}
[解析] 本题是采用的递归算法。
str/*第一空。指针变量s获得传递而来的初值c*/
*s/*第二空a第一次循环负责找到字符串的结尾,第二次及以后循环负责找到字符串中的空字符*/
*s/*第三空。输出该字符后将其置空,以标记本次输出的位置为下次输出做准备*/
3. 下面程序把从终端读入的文本(用"@"作为文本结束的标志)复制到一个名为bi.dat的新文件中,请填空。
#include<stdio.h>
FILE *fp;
main()
{char ch;
if((fp=______)==NULL)/*第一空*/
exit(0);
while((______)!='@')/*第二空*/
fputc(ch,fp);
______;/*第三空*/
}
fopen("bi.dat","W")/*第一空。语句"if((fp=______)==NULL)"的用意是测定打开文件是否成功,fp所获得的值是文件bi.dat的首地址。*/
ch=getchar()/*第二空。语句"while((______)!='@')"是为了测试文本是否结束,变量ch获得的是从终端设备获得的字符*/
fclose(fp)/*第三空。处理完成后关闭该文件*/
五、程序设计题1. 从键盘上输入一个3*5的矩阵,将其转置后形成5*3的矩阵输出。
#include<stdio.h>
main()
{int a[3][5],b[5][3],i,j;
for(i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d,&ar[i][j]);/*输入3*5矩阵*/
for(i=0;i<5;i++)
for(j=0;j<3;j++)
b[i][j]=a[j][i];/*进行矩阵转置*/
for(i=0;i<5;i++)
{for(j=0;j<3;j++)
printf("%d\t",b[i][j]);
printf("\n");
}/*输出转置后的矩阵*/
}
2. 输入30个学生的学号和3门课程的成绩(整数),统计并输出3门课程总分最高的学生的学号和总分。
#include<stdio.h>
main()
{int s[30][5].i.max,max_i;
for(i=0;i<30;i++)
{printf("Please input student NO.and 3 score:\n");
scanf("%d,%d,%d,%d",&s[i][0],&s[j][1],&s[i][2],&s[i][3]);
s[i][4]=s[i][1]+s[i][2]+s[i][3];
},/*分别输入30个个学生的学号和3科成绩,并计箅这30个学生每人的总成绩*/
max=s[0][4];max_i=0;
for(i=0;i<30;i++)
if(max<s[i][4])max=s[i][4],max_i=i;/*求出总成绩的最高者并记录其位置*/
printf("StudentNO.=%d,total=%d\n",s[max_i][0]。s[max_i][4]);/*输出总成绩最高者的学号和总成绩*/