第3章 基本流程控制结构
1-1
- 题干:if(a=5) 是允许的。
- 选项:T F
- 答案:T
1-2
- 题干:循环体如包括有一个以上的语句,则必须用一对大括号{}括起来,组成复合语句,复合语句在语法上被认为是一条语句。
- 选项:T F
- 答案:T
1-3
- 题干:在switch语句中,每一个的case常量表达式的值可以相同。
- 选项:T F
- 答案:F
1-4
- 题干:在switch语句中,可以根据需要使用或不使用break语句。
- 选项:T F
- 答案:T
1-5
- 题干:在switch语句中必须使用default。
- 选项:T F
- 答案:F
1-6
- 题干:在if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。
- 选项:T F
- 答案:T
1-7
- 题干:执行以下程序段,将输出10。
int i = 10; while (i < 10){ printf("%d\n", i); } - 选项:T F
- 答案:F
1-8
- 题干:以下程序段计算级数
s= 1+1/3+1/5+...的前若干项之和,1/101这项没有被加入。item = 1.0; denominator = 1; sum = 0.0; while( item > 0.01) { item = 1.0/denominator; sum += item; denominator += 2; } - 选项:T F
- 答案:F
1-9
- 题干:下面这段程序,若scanf输入
k的值为50,则程序将循环有限次,在打印输出有限行之后,程序将正常结束。#include <stdio.h> int main(){ int k; scanf("%d", &k); int i=100; while(i > k){ printf("%d ", i); i++; } return 0; } - 选项:T F
- 答案:F
1-10
- 题干:for循环的三个表达式都必须要明确的写出来。
- 选项:T F
- 答案:F
1-11
- 题干:若变量已正确定义,执行以下while语句循环10次。i = 1;while (i <= 10) ;i++;
- 选项:T F
- 答案:F
1-12
- 题干:在C语言的嵌套循环结构中,任何一层循环中的break语句都可以结束整个嵌套循环的执行。
- 选项:T F
- 答案:F
第1题
题干:若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是
for (i = 5; i; i--)
for (j = 0; j < 4; j++) {...}
选项:
- A. 20
- B. 25
- C. 24
- D. 30
答案:A
解析:C语言中“非0即真”,外循环for(i=5; i; i--)的i取值为5、4、3、2、1(共5次,i=0时循环终止);内循环for(j=0; j<4; j++)的j取值为0、1、2、3(共4次)。内循环体总执行次数=外循环次数×内循环次数=5×4=20。
第2题
题干:下列程序段的输出结果是()。
int main(void){
int x=100, a = 10, b=20, ok1=5, ok2 =0;
if(a<b)
if(b!=15)
if(! ok1)
x= 1;
else if(ok2)
x=10;
x=-1;
printf("%d\n", x);
return 0;
}
选项:
- A. -1
- B. 0
- C. 1
- D. 不确定的值
答案:A
解析:C语言中if无大括号时,仅控制紧跟的下一条语句。1. a=10 < b=20为真,进入第一层if;2. b=20 !=15为真,进入第二层if;3. !ok1 = !5为假(5非0,取反后为0),不执行x=1;4. else if(ok2) = else if(0)为假,不执行x=10;5. 最终执行独立语句x=-1,输出x的值为-1。
第3题
题干:在C语言语句中,用作选择结构的条件的表达式是__________。
选项:
- A. 可用任意表达式
- B. 只能用逻辑或关系表达式
- C. 只能用逻辑表达式
- D. 只能用关系表达式
答案:A
解析:C语言选择结构(if/switch)的条件可使用任意表达式,核心判断规则为“表达式值非0为真,0为假”。例如if(5)(5非0为真)、if(a=3)(赋值后a=3非0为真)均合法,无需局限于逻辑或关系表达式,故B、C、D错误。
第4题
题干:执行以下代码,输出的结果是:
#include <stdio.h>
int main(){
int choice = 2;
int score = 70;
switch(choice){
case 0:
score--;
case 1:
score += 2;
case 2:
score -= 2;
case 3:
score++;
}
printf("%d\n", score);
return 0;
}
选项:
- A. 68
- B. 69
- C. 71
- D. 72
答案:B
解析:switch语句无break时,会从匹配的case开始“贯穿执行所有后续case”。1. choice=2匹配case 2,score=70-2=68;2. 无break,继续执行case 3,score=68+1=69;3. 循环结束,输出score的值为69。
第5题
题干:下列程序段的输出结果是:
#include <stdio.h>
void main(void){
int x=1,a=0,b=0;
switch(x){
case 0: b++;
case 1: a++;
case 2:a++;b++;
}
printf("a=%d,b=%d\n",a,b);
}
选项:
- A. a=2,b=1
- B. a=1,b=1
- C. a=1,b=0
- D. a=2,b=2
答案:A
解析:switch无break时触发“贯穿特性”。1. x=1匹配case 1,执行a++(a=1);2. 贯穿执行case 2,a++(a=2)、b++(b=1);3. 输出a=2,b=1。
第6题
题干:以下程序的功能是计算s=1+1/2+1/3+…+1/10,但运行后输出结果错误,导致错误结果的程序行是:
int main(){
int n;
float s;
s=1.0;
for(n=10;n>1;n--)
s=s+1/n;
printf("%6.4f\n",s);
return 0;
}
选项:
- A. int n;float s;
- B. for(n=10;n>1;n–);
- C. s=s+1/n;
- D. s=1.0;
答案:C
解析:程序错误源于“整数除法”。n为int类型,1和n均为整数时,1/n会触发整数除法(如1/10=0、1/2=0),导致累加结果始终为1.0。正确写法应为s=s+1.0/n(浮点数除法),故错误行是s=s+1/n;。
第7题
题干:设有变量声明“char c;”,执行“for (; c=(getchar()!=‘\n’) ; )printf(“%c”, c); ”时,从键盘上输入“ABCDEFG↙”之后,输出的结果是________。
选项:
- A. ABCDEFG
- B. AABBCCDDEEFFGG
- C. 非字母数字字符
- D. 语句不能执行
答案:C
解析:C语言中!=优先级高于=,循环条件c=(getchar()!='\n')的执行逻辑为:1. getchar()读取输入字符(如A),先判断“字符是否≠’\n’”,结果为1(真,非0即真);2. 将1赋值给c(c=1);3. printf("%c",c)输出1对应的ASCII字符(控制字符,非字母数字)。
第8题
题干:在C语言语句中,用作选择结构的条件的表达式是__________。
选项:
- A. 可用任意表达式
- B. 只能用逻辑或关系表达式
- C. 只能用逻辑表达式
- D. 只能用关系表达式
答案:A
解析:与第3题考点一致,C语言选择结构的条件可使用任意表达式(算术、赋值、逻辑等),判断规则为“非0为真,0为假”,无需局限于逻辑或关系表达式,故B、C、D错误。
第9题
题干:以下程序的运行结果为
int main(){
int x = 10;
int y = 5;
if(y=x){
printf("%d",x);
}else{
printf("%d",y);
}
printf("%d",y);
return 0;
}
选项:
- A. 105
- B. 1010
- C. 55
- D. 510
答案:B
解析:C语言中“赋值表达式的值等于赋值后变量的值”。1. if(y=x)中,x=10赋值给y,y=10(非0为真),执行printf("%d",x)(输出10);2. 后续执行printf("%d",y)(输出10);3. 总输出结果为1010。
第10题
题干:有if结构程序如下:
#include <stdio.h>
int main()
{
float x,y;
scanf("%f",&x);
if(x<0.0) y=0.0;
else if((x<5.0)&&(x!=2.0))
y=1.0/(x+2.0);
else if (x<10.0) y=1.0/x;
else y=10.0;
printf("%f\n",y);
return 0;
}
若运行时从键盘上输入2.0 (回车),则上面程序的输出结果是( )
选项:
- A. 0.000000
- B. 0.250000
- C. 0.500000
- D. 1.00000
答案:C
解析:输入x=2.0后逐步匹配条件:1. x<0.0为假,跳过;2. (x<5.0)&&(x!=2.0)中x!=2.0为假,整体为假,跳过;3. x<10.0为真,执行y=1.0/2.0=0.5;4. 输出y=0.500000。
第11题
题干:有如下程序段:
int x=2;
while (x=0) {printf("%d",x);x--;}
则下列描述中,正确的是
选项:
- A. while 循环执行2次
- B. 循环是无限循环
- C. 循环体一次也不执行
- D. 循环体语句执行一次
答案:C
解析:while(x=0)是赋值表达式,而非判断“x是否等于0”。赋值后x=0(0为假),循环条件不满足,循环体一次也不执行。
第12题
题干:以下程序段的循环次数是
for (i=2; i==0; ) printf("%d",i--)
选项:
- A. 无限次
- B. 1次
- C. 0次
- D. 2次
答案:C
解析:for循环执行逻辑为“表达式1→表达式2(条件)→循环体→表达式3”。1. 表达式1:i=2;2. 表达式2:i==0(2==0为假),循环直接终止,循环次数为0。
第13题
题干:在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是。
int main(void){
int a,b,s,t;
scanf("%d,%d",&a,&b);
s = 1; t = 1;
if(a > 0) s = s + 1;
if(a > b) t = s + t;
else if(a == b) t = 5;
else t = 2 * s;
printf("t=%d\n",t);
return 0;
}
选项:
- A. a>b
- B. a<b<0
- C. 0<a<b
- D. 0>a>b
答案:C
解析:目标输出t=4,初始s=1、t=1,推导条件:1. 若0<a<b,则a>0为真,s=1+1=2;2. a<b为真,t=2×s=2×2=4,符合要求。其他选项:A(t=3或2)、B(t=2)、D(t=2)均不满足。
第14题
题干:下列叙述中正确的是()。
选项:
- A. do-while语句构成的循环不能用其他语句构成的循环来代替
- B. do-while语句构成的循环只能用break语句退出
- C. 用do-while语句构成的循环,在while后的表达式为非零时结束循环
- D. 用do-while语句构成的循环,在while后的表达式为零时结束循环
答案:D
解析:逐一排除错误选项:A错(do-while可被while替代);B错(do-while可通过条件为假、return等退出);C错(while表达式非零时继续循环);D对(while表达式为零时结束循环)。
第15题
题干:执行以下代码
#include <stdio.h>
int main(){
for(int i=1; i<10; i++){
if(i%3 == 0) continue;
if(i%7 == 0) break;
printf("%d", i);
}
return 0;
}
打印输出的内容是:
选项:
- A. 123456
- B. 1245
- C. 123456789
- D. 12
- E. 12345678910
- F. 12457810
- G. 124578
答案:B
解析:i从1到9的循环逻辑:1. i=1(无continue/break,打印1);2. i=2(打印2);3. i=3(3%3==0,continue,不打印);4. i=4(打印4);5. i=5(打印5);6. i=6(6%3==0,continue,不打印);7. i=7(7%7==0,break,循环终止);8. 最终打印内容为1245。
第16题
题干:对于语句“int s=0,i=1; while(i=1) s+=i;”,说法正确的是( )
选项:
- A. while循环执行0次
- B. while循环执行1次
- C. while循环执行无限次
- D. 以上说法都错
答案:C
解析:while(i=1)是赋值表达式,每次循环均将i赋值为1(非0为真),循环体s+=i持续执行,无终止条件,导致无限循环。
第17题
题干:在“for(表达式1; 表达式2; 表达式3) 循环体” 循环中,控制循环结束的是( )
选项:
- A. 初始化表达式(表达式1)
- B. 条件表达式(表达式2)
- C. 迭代表达式(表达式3)
- D. 循环体
答案:B
解析:for循环三大表达式功能:表达式1(初始化,仅执行1次)、表达式2(条件判断,每次循环前执行,值为0则终止循环,是控制结束的核心)、表达式3(迭代,每次循环后执行)。
第18题
题干:在switch语句中,关于default,说法正确的是( )
选项:
- A. switch语句须有default
- B. default用于处理未与任何case标号匹配的情况
- C. 每个switch语句中可以有多个default
- D. default须放在在switch语句的最后
答案:B
解析:逐一排除错误选项:A错(default非必需);B对(default的核心作用是处理“无case匹配”的情况);C错(一个switch仅能有一个default);D错(default可放在任意位置,不强制在最后)。
第19题
题干:要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,下列正确的程序段是:
选项:
- A. while ((ch=getchar())!=‘N’) printf(“%c”,ch);
- B. while (ch=getchar()!=‘N’) printf(“%c”,ch);
- C. while (ch=getchar()==‘N’) printf(“%c”,ch);
- D. while ((ch=getchar())==‘N’) printf(“%c”,ch);
答案:A
解析:核心是正确处理“赋值”与“判断”的优先级(!=优先级高于=):1. 需用括号确保ch先接收字符(ch=getchar()),再判断是否≠'N';2. 选项A逻辑正确(读入非N字符时打印,遇N终止);3. B(ch接收0/1,打印控制字符)、C/D(仅读入N时循环,与需求相反)均错误。
5-01 构成三角形的逻辑表达式
题干
已知在一个三角形中,任意两边之和大于第三边。若变量a、b、c代表三角形的三条边,请写出表示a、b、c能构成一个三角形的C表达式。
答案
(a > 0 && b > 0 && c > 0) && (a + b > c && a + c > b && b + c > a)
解析
构成三角形需满足两个核心条件:
- 三边均为正数(排除非正数边长的无效情况),即
a > 0 && b > 0 && c > 0; - 任意两边之和大于第三边(三角形基本性质),即
a + b > c && a + c > b && b + c > a;
两者需同时成立,故用&&连接两个条件表达式。
5-02 找出3个数中最大的数
题干
输入3个整数,输出其中最大的数。补全以下C语言代码:
#include <stdio.h>
int main()
{
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
max = 0;
if ( a > b ) {
if ( a > c ) {
// 空1
} else {
max = c;
}
} else {
if (// 空2) {
max = b;
} else {
// 空3
}
}
printf("%d\n", max);
return 0;
}
答案
#include <stdio.h>
int main()
{
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
max = 0;
if ( a > b ) {
if ( a > c ) {
max = a; // 空1
} else {
max = c;
}
} else {
if (b > c) { // 空2
max = b;
} else {
max = c; // 空3
}
}
printf("%d\n", max);
return 0;
}
解析
- 空1逻辑:当
a > b且a > c时,a是三个数中的最大值,需将a赋值给max; - 空2逻辑:当
a ≤ b时,需比较b和c的大小,若b > c,则b是最大值,故条件为b > c; - 空3逻辑:当
a ≤ b且b ≤ c时,c是最大值,需将c赋值给max。
5-03 判断三角形类型
题干
从键盘上输入3个整数(用空格分隔),判断这3个数是否可以构成一个三角形(条件:三条边均大于0且任意两边之和均大于第三边);若可以,进一步判断是等边、等腰还是一般三角形(等边输出"1",等腰输出"2",一般输出"3");若无法构成三角形,输出"-1"。补全以下C语言代码:
#include <stdio.h>
int main(void)
{int x,y,z;
// 空1
if(// 空2)//能构成三角形
{if(// 空3) //等边三角形
printf("1\n");
else
if(// 空4)//等腰三角形
printf("2\n");
else
printf("3\n");//一般三角形
}
else//不能构成三角形
// 空5
return 0;
}
答案
#include <stdio.h>
int main(void)
{int x,y,z;
scanf("%d %d %d", &x, &y, &z); // 空1
if((x > 0 && y > 0 && z > 0) && (x + y > z && x + z > y && y + z > x))//能构成三角形 // 空2
{if(x == y && y == z) //等边三角形 // 空3
printf("1\n");
else
if(x == y || x == z || y == z)//等腰三角形 // 空4
printf("2\n");
else
printf("3\n");//一般三角形
}
else//不能构成三角形
printf("-1\n"); // 空5
return 0;
}
解析
- 空1(输入语句):需读取3个整数,故用
scanf("%d %d %d", &x, &y, &z); - 空2(三角形判断):需同时满足“三边为正”和“任意两边之和大于第三边”,两个条件用
&&连接; - 空3(等边判断):等边三角形需三边完全相等,故条件为
x == y && y == z; - 空4(等腰判断):等腰三角形需至少两边相等,故条件为
x == y || x == z || y == z; - 空5(无法构成三角形输出):题目要求输出"-1",故用
printf("-1\n")。
5-04 体型判断
题干
体指数t = 体重w /(身高h * 身高h)(w单位:千克,h单位:米),判断体重类型:
t < 18:低体重;18 ≤ t < 25:正常体重;25 ≤ t < 27:超重体重;t ≥ 27:肥胖。
从键盘输入身高h和体重w,补全代码计算体指数并判断体重类型:
#include <stdio.h>
int main()
{
float h, w, t;
scanf("%f,%f", &h,&w);
// 空1
if(t<18)
printf("t=%f,低体重!",t);
else if(t<25)
printf("t=%f,正常体重!",t);
else if(// 空2)
printf("t=%f,超重体重!",t);
// 空3
printf("t=%f,肥胖!",t);
return 0;
}
答案
#include <stdio.h>
int main()
{
float h, w, t;
scanf("%f,%f", &h,&w);
t = w / (h * h); // 空1
if(t<18)
printf("t=%f,低体重!",t);
else if(t<25)
printf("t=%f,正常体重!",t);
else if(t < 27) // 空2
printf("t=%f,超重体重!",t);
else // 空3
printf("t=%f,肥胖!",t);
return 0;
}
解析
- 空1(体指数计算):根据公式
t = w/(h*h),需明确计算t的值; - 空2(超重条件):前序条件
t < 25已排除“低体重”和“正常体重”,故超重条件简化为t < 27(即25 ≤ t < 27); - 空3(肥胖分支):排除前三种情况后,剩余
t ≥ 27,故用else引导肥胖分支。
5-05 求方程的根
题干
从键盘输入a、b、c三个双精度实数,求二次方程ax² + bx + c = 0的根并输出:
- 若判别式
d ≥ 0:输出两个实根(保留2位小数); - 若判别式
d < 0:输出两个共轭复根(保留2位小数,格式如x1=a+bi、x2=a-bi)。
补全以下C语言代码:
#include <stdio.h>
#include <math.h>
int main(void)
{int i;for(i=1;i<=3;i++){ //自动阅卷循环,忽略
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=// 空1;
if(d>=0)//两个实根
{x1=// 空2;
x2=// 空3;
printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
}
else//输出两个共轭复根
{printf(// 空4);//输出x1=a+bi并换行
printf(// 空5);//输出x2=a-bi并换行
}
} //循环结束,忽略
return 0;
}
答案
#include <stdio.h>
#include <math.h>
int main(void)
{int i;for(i=1;i<=3;i++){ //自动阅卷循环,忽略
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d= b*b - 4*a*c; // 空1
if(d>=0)//两个实根
{x1= (-b + sqrt(d))/(2*a); // 空2
x2= (-b - sqrt(d))/(2*a); // 空3
printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
}
else//输出两个共轭复根
{printf("x1=%.2lf+%.2lfi\n", -b/(2*a), sqrt(-d)/(2*a)); // 空4
printf("x2=%.2lf-%.2lfi\n", -b/(2*a), sqrt(-d)/(2*a)); // 空5
}
} //循环结束,忽略
return 0;
}
解析
- 空1(判别式计算):二次方程判别式公式为
d = b² - 4ac,需准确实现; - 空2/空3(实根计算):实根公式为
x = [-b ± √d]/(2a),sqrt(d)需调用math.h中的平方根函数; - 空4/空5(复根输出):复根实部为
-b/(2a),虚部为√(-d)/(2a)(因d < 0,-d为正),输出格式需匹配x1=a+bi和x2=a-bi。
5-06 显示扑克牌
题干
用数字1~13代表一组扑克牌,输入数字输出对应牌面:
- 2~10:直接显示数字;
- 1:显示"Ace";
- 11:显示"Jack";
- 12:显示"Queen";
- 13:显示"King";
- 输入不在1~13范围内:显示"Error"。
补全以下C语言代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
if(n >= 1 && n <= 13){
switch (// 空1 ){
case 1: // 空2
case 11: printf("Jack\n"); break;
case 12: printf("Queen\n"); break;
case 13: printf("King\n"); break;
default: // 空3
}
}else{
printf("Error\n");
}
return 0;
}
答案
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
if(n >= 1 && n <= 13){
switch (n) { // 空1
case 1: printf("Ace\n"); break; // 空2
case 11: printf("Jack\n"); break;
case 12: printf("Queen\n"); break;
case 13: printf("King\n"); break;
default: printf("%d\n", n); // 空3
}
}else{
printf("Error\n");
}
return 0;
}
解析
- 空1(switch表达式):需根据输入的数字
n判断,故表达式为n; - 空2(case 1处理):数字1对应"Ace",需输出"Ace\n",且必须加
break(否则会穿透到后续case); - 空3(default处理):default对应2~10的情况,需直接输出数字
n,故用printf("%d\n", n)。
5-07 判断回文数
题干
回文数是指正读和反读都一样的数(如12321、67876)。编写程序:
- 从键盘读取一个5位正整数;
- 先输出该整数,再输出是否为回文数(是输出"Yes",否输出"No"),中间用空格分隔。
补全以下C语言代码(n:输入的5位整数,g:个位,s:十位,q:千位,w:万位):
#include <stdio.h>
int main(void)
{int i;for(i=1;i<=2;i++){ //自动阅卷循环,忽略
int n,g,s,q,w;
scanf("%d",&n);
g=// 空1;
s=// 空2;
q=// 空3;
w=// 空4;
if(// 空5)
printf("%d Yes\n",n);
else
printf("%d No\n",n);
} //循环结束,忽略
return 0;
}
答案
#include <stdio.h>
int main(void)
{int i;for(i=1;i<=2;i++){ //自动阅卷循环,忽略
int n,g,s,q,w;
scanf("%d",&n);
g= n % 10; // 空1
s= n / 10 % 10; // 空2
q= n / 1000 % 10; // 空3
w= n / 10000; // 空4
if(w == g && s == q) // 空5
printf("%d Yes\n",n);
else
printf("%d No\n",n);
} //循环结束,忽略
return 0;
}
解析
- 空1(个位提取):整数对10取余得个位,故
g = n % 10; - 空2(十位提取):先除以10去掉个位(整数除法),再对10取余得十位,故
s = n / 10 % 10; - 空3(千位提取):先除以1000去掉后三位,再对10取余得千位,故
q = n / 1000 % 10; - 空4(万位提取):5位整数除以10000(整数除法)得万位,故
w = n / 10000; - 空5(回文判断):5位回文数需满足“万位=个位”且“十位=千位”,故条件为
w == g && s == q。
5-08 switch改写成if-else
题干
已知以下switch语句,写出与其等价的else-if语句:
switch (ch){
case '-':
minus++;
case '+':
plus++; break;
case '0' : case '1' : case '2' : case '3' : case '4' :
case '5' : case '6' : case '7' : case '8' : case '9' :
digit ++;break;
default:
other ++; break;
}
补全以下else-if语句:
if (ch=='-'){
// 空1
}else if (// 空2){
plus ++;
}else if (// 空3){
digit ++;
}else{
// 空4
}
答案
if (ch=='-'){
minus++; plus++; // 空1
}else if (ch == '+'){ // 空2
plus ++;
}else if (ch >= '0' && ch <= '9'){ // 空3
digit ++;
}else{
other ++; // 空4
}
解析
- 空1(case '-'处理):原switch中
case '-'无break,会穿透到case '+',故需同时执行minus++和plus++; - 空2(case '+'处理):对应原switch的
case '+',条件为ch == '+'; - 空3(数字字符处理):原switch中
case '0'~'9'对应数字字符,条件可简化为ch >= '0' && ch <= '9'; - 空4(default处理):原switch的
default对应“其他字符”,故执行other ++。
5-10 统计数字字符和空格
题干
编写程序:
- 输入15个字符;
- 统计并输出“空格或回车”“数字字符”“其他字符”的个数;
- 要求使用switch语句;
- 输入15个字符后回车表示结束,该回车不统计。
补全以下C语言代码:
# include <stdio.h>
int main()
{
int blank, digit, i, other;
char ch;
blank = digit = other = 0;
for (i = 1; i <= 15; i++){
ch = getchar();
switch (// 空1 ) {
// 空2
}
}
printf("blank = %d, digit = %d, other = %d\n", blank, digit, other);
return 0;
}
答案
# include <stdio.h>
int main()
{
int blank, digit, i, other;
char ch;
blank = digit = other = 0;
for (i = 1; i <= 15; i++){
ch = getchar();
switch (ch) { // 空1
case ' ':
case '\n':
blank++;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
digit++;
break;
default:
other++;
break;
} // 空2
}
printf("blank = %d, digit = %d, other = %d\n", blank, digit, other);
return 0;
}
解析
- 空1(switch表达式):需根据读取的字符
ch分类,故表达式为ch; - 空2(switch分支):
- 空格(
' ')和回车('\n')属于同一类,用无break的case穿透,执行blank++; - 数字字符(
'0'~'9')用多个case并列,执行digit++; - 其他字符用
default处理,执行other++; - 所有分支需加
break,避免穿透。
- 空格(
5-12 每位数字之和
题干
编写程序:
- 从键盘输入一个无符号整数;
- 输出它的各位数字之和(格式如输入1476,输出
6+7+4+1=18)。
补全以下C语言代码:
#include<stdio.h>
int main()
{
unsigned a;
int sum=0;
scanf("%u",&a);
while(a)
{
int x;
// 空1;
sum+=x;
// 空2;
if(a!=0)
printf("%d+",x);
else
printf("%d",x);
}
printf("=%d\n",sum);
return 0;
}
答案
#include<stdio.h>
int main()
{
unsigned a;
int sum=0;
scanf("%u",&a);
while(a)
{
int x;
x = a % 10; // 空1
sum+=x;
a = a / 10; // 空2
if(a!=0)
printf("%d+",x);
else
printf("%d",x);
}
printf("=%d\n",sum);
return 0;
}
解析
- 核心逻辑:用
while(a)循环提取各位数字(a为0时循环结束),每次提取个位、累加后去掉个位; - 空1(提取个位):用
a % 10获取当前个位数字,赋值给x; - 空2(去掉个位):用整数除法
a = a / 10去掉已处理的个位(如1476 → 147); - 输出逻辑:若
a != 0(还有未处理的数字),输出x+;若a == 0(最后一位数字),输出x,避免末尾多一个+。
5-13 计算阶乘倒数之和
题干
计算s = 1/1! + 1/2! + 1/3! + … + 1/n!的值(n!表示n的阶乘),补全以下C语言代码:
#include <stdio.h>
int main()
{
int i,n;
double f=1;
double s=0;
scanf("%d",&n);
for (i=1; // 空1 ;i++)
{
f=// 空2;
s=s+// 空3;
}
printf("sum = %.5lf\n", s);
return 0;
}
答案
#include <stdio.h>
int main()
{
int i,n;
double f=1;
double s=0;
scanf("%d",&n);
for (i=1; i <= n ;i++) // 空1
{
f= f * i; // 空2
s=s+ 1.0 / f; // 空3
}
printf("sum = %.5lf\n", s);
return 0;
}
解析
- 空1(循环条件):需计算1到
n的阶乘倒数之和,故循环条件为i <= n; - 空2(阶乘计算):
f初始值为1! = 1,每次循环更新为i! = (i-1)! * i,故f = f * i; - 空3(累加阶乘倒数):需累加
1/i!,用1.0 / f确保浮点数除法(避免整数除法结果为0),故s = s + 1.0 / f。
5-14 输出每个月的天数
题干
编写程序:
- 输入年份;
- 输出该年每个月的天数(格式:12个天数用空格分隔);
- 天数规则:
- 1、3、5、7、8、10、12月:31天;
- 4、6、9、11月:30天;
- 2月:平年28天,闰年29天(闰年条件:能被4整除但不能被100整除,或能被400整除)。
补全以下C语言代码:
#include <stdio.h>
int main()
{
int day, month, year;
scanf("%d", &year);
for(month = 1; month <= 12; month++){
switch (// 空1 ){
case 2:
if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0 ) {
day = 29;
}else{
day = 28;
}
break;
// 空2:
day = 31; break;
// 空3:
day = 30; break;
}
printf("%d ", day) ;
}
return 0;
}
答案
#include <stdio.h>
int main()
{
int day, month, year;
scanf("%d", &year);
for(month = 1; month <= 12; month++){
switch (month) { // 空1
case 2:
if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0 ) {
day = 29;
}else{
day = 28;
}
break;
case 1: case 3: case 5: case 7: case 8: case 10: case 12: // 空2
day = 31; break;
case 4: case 6: case 9: case 11: // 空3
day = 30; break;
}
printf("%d ", day) ;
}
return 0;
}
解析
- 空1(switch表达式):需根据月份
month判断天数,故表达式为month; - 空2(31天月份):1、3、5、7、8、10、12月共7个月份,用多个case并列,执行
day = 31; - 空3(30天月份):4、6、9、11月共4个月份,用多个case并列,执行
day = 30; - 2月处理:原代码已实现闰年判断,无需修改,只需确保
break避免穿透。
5-15 打印等腰三角形图案
题干
编写程序:
- 输入正整数
n(1 ≤ n ≤ 9); - 打印高度为
n的“*”等腰三角形(如n=3时输出):
*
***
*****
补全以下C语言代码:
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++){
for (// 空1) {
printf (" ");
}
for (// 空2) {
printf ("*");
}
// 空3;
}
答案
#include <stdio.h> // 补充头文件(原代码缺失)
int main() { // 补充main函数框架(原代码缺失)
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++){
for (j = 1; j <= n - i; j++) { // 空1
printf (" ");
}
for (j = 1; j <= 2 * i - 1; j++) { // 空2
printf ("*");
}
printf("\n"); // 空3
}
return 0;
}
7-1 应缴电费
春节前后,电费大增。查询之后得知收费标准如下:
月用电量在230千瓦时及以下部分按每千瓦时0.4983元收费;
月用电量在231~420千瓦时的部分按每千瓦时0.5483元收费;
月用电量在421千瓦时及以上部分按每千瓦时0.7983元收费。
请根据月用电量(单位:千瓦时),按收费标准计算应缴的电费(单位:元)。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试,输入一个整数n(0≤n≤10000),表示月用电量。
输出格式:
对于每组测试,输出一行,包含一个实数,表示应缴的电费。结果保留2位小数。
输入样例:
2
270
416
输出样例:
136.54
216.59
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int t,n;double m;
scanf("%d",&t)!=1;
while(t--){
scanf("%d",&n)!=1;
if (n<=230){
m=n*0.4983;
}else if(n<=420){
m=230*0.4983+(n-230)*0.5483;
}else{
m=230*0.4983+190*0.5483+(n-420)*0.7983;
}
printf("%.2f\n",m);
}
return 0;
}
7-2 输入今天判断后天为星期几
本题目要求输入今天星期数,进而判断后天为星期几。如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日,给定某一天,请你输出那天的“后天”是星期几。如果输入数据不符合要求,输出“Invalid Input!”。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
输入样例:
1
输出样例:
3
输入样例:
-1
输出样例:
Invalid Input!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
int main(){
int d;
scanf("%d",&d);
if(d<1||d>7)printf("Invalid Input!");
else printf("%d",(d+1)%7+1);
return 0;
}
7-3 直角三角形(左下)
请编写程序,显示直角三角形。
输入格式
n s
说明:n 为正整数,是直角三角形的高度和底边宽度。s 为符号,是组成图形的字符。
输出格式
n 行由 s 组成的直角三角形(参见输出样例)。
输入样例
5 *
输出样例
*****
****
***
**
*
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int n;
char s;
scanf("%d %c",&n,&s);
for (int i=0;i<n;i++){
for (int j=0;j<i;j++)
printf(" ");
for (int k=0;k<n-i;k++)
printf("%c",s);
printf("\n");}
return 0;
}
7-4 最大公约数
求两个正整数m,n的最大公约数(Greatest Common Divisor,简称GCD)。要求定义一个函数求最大公约数。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入2个整数m,n(0<m,n<10
9
)。
输出格式:
对于每组测试,输出m,n的最大公约数。
输入样例:
2
63 36
20 15
输出样例:
9
5
提示:
为避免超时,宜用高效的算法,例如欧几里德算法(辗转相除法)。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int g(int a,int b){
while(b){
int t=a%b;
a=b;
b=t;
}
return a;
}
int main(){
int t,m,n;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
printf("%d\n",g(m,n));
}
return 0;
}
7-5 输出正整数[a,b]间符合条件的数
编写程序,输入正整数a和b,输出[a,b]区间中能被3或7整除的数,不限a和b的大小关系。
输入格式:
在一行内输入a,b值。
输出格式:
在一行内连续输出符合条件的数,每个数后跟一个空格以示间隔。
输入样例1:
10 20
输出样例1:
12 14 15 18
输入样例2:
20 10
输出样例2:
12 14 15 18
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int a,b,t,s,e,i;
scanf("%d%d",&a,&b);
if(a>b){
t=a;
a=b;
b=t;
}
s=a;
e=b;
for(i=s;i<=e;i++)
if(i%3==0||i%7==0)
printf("%d ",i);
return 0;
}
7-6 7-1 输入一行字符,加密后输出(凯撒加密)
编程实现对键盘输入的一行英文句子进行加密。用加密方法为,当内容为英文字母时其在26字母中的其后第三个字母代替该字母,字母x,y,z分别以a,b,c代替,字母X,Y,Z分别以A,B,C代替。若为其它字符则不变。
若为其它字符则不变。
输入格式:
输入一行英文句子
输出格式:
输出加密后的句子
输入样例1:
在这里给出一组输入。例如:
This is a test string.
输出样例1:
在这里给出相应的输出。例如:
Wklv lv d whvw vwulqj.
输入样例2:
在这里给出一组输入。例如:
ABCabc xyzXYZ&123
输出样例2:
在这里给出相应的输出。例如:
DEFdef abcABC&123
代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int c;
while((c=getchar())!='\n'){
if (c>='a'&&c<='z')
c=(c-'a'+3)%26+'a';
else if (c>='A'&&c<='Z')
c=(c-'A'+3)%26+'A';
putchar(c);
}
return 0;
}
7-7 C程序设计教程与实训-循环结构-求π的近似值。
用下面的公式求π的近似值。

输入格式:
输入一个整数n。
输出格式:
输出用公式求得的π的近似值,小数点后保留7位。
输入样例:
10000
输出样例:
3.1415141
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int n;
double p=1.0;
scanf("%d",&n);
for (int k=1;k<=n;k++){
p*=(2.0*k)*(2.0*k)/((2.0*k-1)*(2.0*k+1));
}
printf("%.7f",p*2);
return 0;
}
7-8 输出a行b列字符阵列图。
本题目要求读入a和b,然后输出a行b列字符阵列图。
输入格式:
在一行中给出整数a和b。
输出格式:
输出a行b列规律图案。
输入样例:
3 4
输出样例:
ABCD
BCDE
CDEF
输入样例:
4 5
输出样例:
ABCDE
BCDEF
CDEFG
DEFGH
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
int main(){
int a,b,i,j;
scanf("%d%d",&a,&b);
for (i=0;i<a;i++){
for (j=0;j<b;j++)
printf("%c",'A'+i+j);
printf("\n");
}
return 0;
}
7-9 反素数
反素数是指: 一个素数的逆序数也是素数,例如13是一个素数,13的逆序数31也是一个素数,则称13为反素数。若该素数是回文数(逆序数等于本身,例如11),则该素数不能称为反素数。现要求编程实现:输入两个正整数n,k,输出k个≥n的反素数。
输入格式:
在一行中输入两个不超过1000的正整数n和k。
输出格式:
分K行输出k个反素数。
输入样例:
11 5
输出样例:
13
17
31
37
71
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
#include<math.h>
int is_p(int x){
if(x<=1)return 0;
if(x==2)return 1;
if (x%2==0)return 0;
for (int i=3;i<=sqrt(x);i+=2)
if (x%i==0)return 0;
return 1;
}
int rev(int x){
int r=0;
while (x)r=r*10+x%10,x/=10;
return r;
}
int main(){
int n,k,c=0,i;
scanf("%d%d",&n,&k);
for (i=n;c<k;i++){
int r=rev(i);
if (is_p(i)&&is_p(r)&&i!=r){
printf("%d\n",i);
c++;
}
}
return 0;
}


被折叠的 条评论
为什么被折叠?



