1、考虑到多重循环对程序效率的影响,以下哪种实现效率较高?为什么?
(a)循环次数大的放在外层,循环次数小的放在内层;
(b)循环次数小的放在外层,循环次数大的放在内层;
解析:(b)的实现效率高。因为正常情况下,次数多的循环放在内层,会减少cache(高速缓冲区)更新数据的次数,当离开内层循环的时候会恢复外层的计数器,外层循环次数越少,恢复计数器的次数越少,效率越高。
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();
}
解析:
第一个代码量少,但需要进行多次判断运行效率低
第二个代码量多,但只需要判断一次,运行效率高
3、do-while语句的循环体( D )
A. 可能一次都不执行 B. 至少执行一次
C. 由循环条件决定次数 D. BC均正确
4、求1~100的和,写作for(int s=0,i=1;________;++i) ________;
for(int s=0,i=1; i<=100; ++i)
s=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
}
}
运行结果:
6、有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( D )
A. 一次也不执行 B. 执行1次
B. 有语法错,不能执行 D. 无限次
解析: k=1是赋值语句,所以k始终等于1,一直循环满足条件
7、语句while(!E)中表达式!E等价于( D )
A.E == 1 B. E != 0 C. E != 1 D. E==0
8、goto语句有什么作用?
goto语句可以随意跳转,通过和if语句的有效组合也可以实现循环结构。但过多使用goto语句,很容易造成程序结构混乱。
9、语句for( ;1 ;) 有问题吗?它是什么作用?
有问题,可以省略表达式1和表达式3,但表达式2为1时,执行死循环。
10、下面代码是否有错,如果有,错在哪里?
int main()
{
float a=3;
switch(a)
{
case 3:
printf("a");
}
return 0;
}
有错,由于 switch后面的表达式必须是整形或字符型,但switch(a),的常量a是一个浮点型。
11、break 语句的正确的用法是 ( B )
A. 无论在任何情况下,都中断程序的执行,退出到系统下一层
B. 在多重循环中,只能退出最靠近的那一层循环语句
C. 跳出多重循环
D. 只能修改控制变量
12、若输入 B,则以下程序运行后的输出结果是 ( D )
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.
解析:由于没有break语句,从case 'B'一直执行到default结束,输出>=60<60error.
13、下列各个错误中,哪一个不属于编译错误 ( A )
A. 改变x 原值 3 为 5 ,写作“ x==5 ;”
B. 花括号不配对
C. 复合语句中的最后一条语句后未加分号
D. 变量有引用、无定义
解析:B:花括号必须是配对的
C:在C语言中语句结束后加分号
D:变量应该引用和定义
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”);
}
在下划线处应填入的是:( B )
A. i B. 2 * i - 1 C. 2 * i + 1 D. i + 2
解析:可以看出第一行有1个*,第二行有3个*,第二行有5个*,第二行有7个*
每行递增两个*,此时for循环的控制条件应该是2 * i - 1
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;
float num;
printf("请输入一行数:");
scanf("%d",&n); //输入n个数
int count1=0 ,count2= 0 ,count3=0;
for(int i=0;i<n;i++)
{
scanf("%f",&num);
if(num>0)
//统计正数个数
count1++;
else if(num==0.0)
//统计0的个数
count2++;
else
//统计负数个数
count3++;
}
printf("正数个数为:%d\n",count1);
printf("零的个数为:%d\n",count2);
printf("负数个数为:%d\n",count3);
return 0;
}
16、请实现一下功能:
输入任意两个数,输出两数之间(包括这两个数)偶数之和。
输入:XXX XXX
输出:c
示例:输入 1 10
程序输出 1到10偶数之和为:30
#include <stdio.h>
int main()
{
int start; //起始数
int end; //结束数
int sum=0;
scanf("%d %d",&start,&end);
for(int i=start;i<=end;i++) //起始数与结束数两者之间的数
{
if(i%2==0) //判断是否偶数值
sum=sum+i; //求和
}
printf("sum=%d\n",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[])
{
int i ,sum=0;
for(i=1;i<=2000;i++) //输出1到2000以内的所有数
{
int j;
for(j=1;j<i;j++) //统计i的真因子之和
{
if(i%j==0)
{
sum=sum+j;
}
}
if(sum==i) //判断真因子之和是本身,在输出
{
printf("%d是完数\n",i);
}
sum=0;
}
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 main(int argc, const char *argv[])
{
int n,sum=0;
printf("请输入一个数:");
scanf("%d",&n);
if(n<INT_MIN||n>INT_MAX/10) //超过int的取值范围
{
printf("0\n"); //输出0
return 0;
}
while(n!=0)
{
int ys=n%10; //计算余数
n=n/10%10; //取十位
sum =sum*10+ys; //sum求和
}
printf("逆序数字是%d\n",sum);
return 0;
}