1.考虑到多重循环对程序效率的影响,以下哪种实现效率较高?为什么?
(a)循环次数大的放在外层,循环次数小的放在内层;
(b)循环次数小的放在外层,循环次数大的放在内层;
答案:(a)。
解析:缓存利用率更高。由于内层循环的迭代次数少,它更有可能在CPU的缓存中完全执行,减少了内存访问延迟。
2.请简述以下两个 for 循环的优缺点。
(1)、
for(i=0; i<N; i++)
{
if(condition)
DoSomething();
else
DoOtherthing();
}
(2)、
if(condition)
{
for(i=0; i<N; i++)
DoSomething();
}
else
{
for(i=0; i<N; i++)
DoOtherthing();
}
答案:(2)。
解析:将if语句放在循环内需要进行多次判断,而将if语句放在循环外只需要进行一次判断。
3.do-while语句的循环体( )
A. 可能一次都不执行 B. 至少执行一次
C. 由循环条件决定次数 D. BC均正确
答案:D。
4.求1~100的和,写作for(int s=0,i=1;i<=100;++i) s += i;
5.程序如下,运行结果为:
#include <stdio.h>
#define N 4
void main()
{
int i;
int x1=1,x2=2;
printf("\n");
for(i=1;i<=N;i++)
{
printf("%4d%4d",x1,x2);
if(i%2==0)
printf("\n");
x1=x1+x2; //3 8 21
x2=x2+x1; //5 13 34
}
}
答案: 1 2 3 5
8 13 21 34
6.有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是()
A. 一次也不执行 B. 执行1次
B. 有语法错,不能执行 D. 无限次
答案:D。
解析:因为每次执行循环时,都将k重新赋值为1;导致死循环,而不是k==1。
7.语句while(!E)中表达式!E等价于( )
A.E == 1 B. E != 0 C. E != 1 D. E==0
答案:D。
解析:当E==0时,!E != 0,循坏才可执行。
8.goto语句有什么作用?
答案:跳转。可实现循环。
9.语句for( ;1 ;) 有问题吗?它是什么作用?
答案:语法格式书写没有问题,但是在for循环中的表达式2为判断条件,而判断条件为1会一直执行死循环。
10.下面代码是否有错,如果有,错在哪里?
int main()
{
float a=3;
switch(a)
{
case 3:
printf("a");
}
return 0;
}
答案:有错误,switch语句的判断条件只能是int类型或者char类型,float类型是无法识别的。
11.break 语句的正确的用法是 ( )
A. 无论在任何情况下,都中断程序的执行,退出到系统下一层
B. 在多重循环中,只能退出最靠近的那一层循环语句
C. 跳出多重循环
D. 只能修改控制变量
答案:B。
12.若输入 B,则以下程序运行后的输出结果是 ( )
int main(void)
{
char grade;
scanf("%c", &grade);
switch (grade)
{
case 'A':
printf(">=85");
case 'B':
case 'C':
printf(">=60") :
case 'D':
printf("<60");
default:
printf("error.");
}
}
A. error. B. >=60 C. >=85 D. >=60<60error.
答案:D。
解析:题中的switch语句中没有在对应的成绩等级输出后添加break语句,所以当输入B的时候,会选择B为入口,并一直贯穿输出到default后。
13.下列各个错误中,哪一个不属于编译错误 ( )
A. 改变x 原值 3 为 5 ,写作“ x==5 ;”
B. 花括号不配对
C. 复合语句中的最后一条语句后未加分号
D. 变量有引用、无定义
答案:A。其他三个选项在编译的时候都会直接报错。
14.下面代码的功能是输出以下形式的金字塔图案是:
*
***
*****
*******
int i, j;
for(i = 1; i<= 4; i++)
{
for(j = 1; j<= 4 - i; j++)
{
printf(" ");
}
for(j = 1; j <= _______; j++)
{
printf("*");
}
printf("\n");
}
在下划线处应填入的是:( )
A. i B. 2 * i - 1 C. 2 * i + 1 D. i + 2
答案:B。
15.请实现如下功能:
输入一排n个数,第一个数为后面所有的数的个数。统计这后面所有数中,正数、零和负数的个数。
输入:
XXX
输出:
正数个数:XXX
零个数:XXX
负数个数:XXX
示例:
输入 7 -2 0 6 5 -3.2 0 2.5
程序输出 正数个数:3
零个数:2
负数个数:2
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) { int n,count1=0,count2=0,count3=0;//设置输入第一个数字并初始化。并添加正数负数0的计数次数变量。 float x; printf("请输入您要输入的一排数字,用空格隔开\n"); scanf("%d",&n); while(n!=0){ n--;//每执行一次输入数字后,后续能输入的数字个数就少一个,当n=0了,循环结束。 scanf("%f",&x); if(x>0){ count1++; }else if(x<0){ count2++; }else{ count3++; } } printf("正数数量为:%d\n",count1);//正数数量计数 printf("负数数量为:%d\n",count2);//负数数量计数 printf("0的数量为:%d\n",count3);//0的数量计数 return 0; }
整数的输入。可以用空格,也可以用回车表示结束。
执行结果展示:
16.请实现一下功能:
输入任意两个数,输出两数之间(包括这两个数)偶数之和。
输入:
XXX XXX
输出:
XXX 到XXX偶数之和为:XXX
示例:
输入 1 10
程序输出 1到10偶数之和为:30
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) { int a,b,sum=0,MAX,MIN;//定义输入a,b变量以及a,b之间的最大值和最小值变量。 printf("请输入两个数;\n"); scanf("%d %d", &a, &b);//输入变量。 if(a<0||b<0){ printf("请输入两个正数;\n"); return 0;//输入负数报错并跳出程序。 }else{ if(a>b){//判断a,b之间的大小。 MAX = a; MIN = b; }else{ MAX = b; MIN = a; } for(int i=MIN;i>=MIN&&i<=MAX;i++){ if(i%2==0){//若能被2整除,就是偶数。 sum += i;//进行偶数求和。 } } } printf("%d到%d之间的偶数和为:%d\n",MIN,MAX,sum);//输出偶数和。 return 0; }
执行结果展示:
17.编程求 2000 以内的所有“完数”。所“完”是指一个数恰好等于它的因子值之和,例如:6是完数,因为 6=1+2+3。
代码展示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
sum=0;
printf("1到2000之间的完数有:");
for(int i=1;i<=2000;i++){//从一到2000中循环执行数字输出。
for(int j=1;j<i;j++){//注意i不能等于j,除去自身的因数。
if(i%j==0){
sum+=j;//对除自身的所有因数1求和。
}
}
if(sum==i){
printf("%d ",i);//输出完数。
}
sum = 0;
}
printf("\n");
return 0;
}
执行结果展示:
18.完成一个 32 位整数型数按 10 进制倒置的程序;当越界后返回值为 0。
例如: 输入 1234;输出为 4321
输入-1234;输出为-4321
输入为 1023456789,输出为 0
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h>//添加头文件,添加库文件的常量INT_MIN和INT_MAX使用。 int main(int argc, const char *argv[]) { int num,sum=0,ys=0; printf("请输入一个数:\n"); scanf("%d",&num); if(num<INT_MIN||num>INT_MAX/10){//超过阈值提示越界 printf("越界\n"); return 0; }while(num!=0){//每次去除num的一位尾数,直至num为0数也取完了。 ys = num%10;//取num每次的尾数。 sum = sum*10+ys;//求逆序的数。 num = num/10; } printf("逆序输出为%d\n",sum);//输出逆序数。 return 0; }
执行结果展示: