C语言|判断和循环相关题目

  1. 下面代码执行的结果是:( )
c 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 0; i<10; i++)
	{
		if (i = 5)
			printf("%d ", i);
	}
	return 0;
}
  • A.1 2 3 4 5 6 7 8 9 10
  • B.5 5 5 5 5 5 5 5 5 5
  • C.死循环的打印5
  • D.0 1 2 3 4 5 6 7 8 9

解析:

上述代码本来的想法应该是:循环10次,每次循环时如果i==5则打印i的结果。

但if语句中表达式的==写成了赋值,相当于每次循环尽量都是将i的值设置成了5,5为真,因此每次都会打印5

i每次修改成5打印后,i的值永远不会等于10,因此造成死循环

故:死循环的打印5

因此:选择C

  1. 关于if语句说法正确是:( )
  • A.if语句后面只能跟一条语句
  • B.if语句中0表示假,1表示真
  • C.if语句是一种分支语句,可以实现单分支,也可以实现多分支
  • D.else语句总是和它的对齐的if语句匹配

解析:

答案解析:

A:错误,if之后可以跟多条语句,跟多条语句时需要使用{}括起来

B:错误,0表示假,非零表示真

D:不一定,要看具体的代码,如果代码不规范,可能没有对齐比如:

c 复制代码
	if()
		 if()
	else
	;

上述else虽然是和外层if对齐,但是会和内部if进行匹配。

因此,选C

  1. func(1) = ( )
c 复制代码
int func(int a)
{
    int b;
    switch (a)
    {
        case 1: b = 30;
        case 2: b = 20;
        case 3: b = 16;
        default: b = 0;
    }
    return b;
}
  • A.30
  • B.20
  • C.16
  • D.0

解析:

switch的每个case之后如果没有加break语句,当前case执行结束后,会继续执行紧跟case中的语句。

func(1)可知,在调用func时形参a的值为1,switch(a)<==>switch(1),case 1被命中,因为该switch语句中所有分支下都没有增加break语句,因此会从上往下顺序执行,最后执行default中语句返回。

因此:选择D

  1. switch©语句中,c不可以是什么类型( )
  • A.int
  • B.long
  • C.char
  • D.float

解析:

switch语句中表达式的类型只能是:整形和枚举类型

D选项为浮点类型,不是整形和枚举类型

因此:选择D

  1. 下面代码的执行结果是什么( )
c 复制代码
#include <stdio.h>
int main() {
	int x = 3;
	int y = 3;
	switch (x % 2) {
	case 1:
		switch (y)
		{
		case 0:
			printf("first");
		case 1:
			printf("second");
			break;
		default: printf("hello");
		}
	case 2:
		printf("third");
	}
	return 0;
}
  • A.secondthird
  • B.hello
  • C.firstsecond
  • D.hellothird

解析:

switch语句时多分支的选择语句,switch中表达式结果命中那个case,就执行该case子项,如果case子项后没有跟break语句,则继续往下执行。

c 复制代码
  #include <stdio.h>
  int main() {
  	int x = 3;
  	int y = 3;
  	switch (x % 2) {  // x%2的结果为1,因此执行case1
  	case 1:
  		switch (y)   // y是3,因此会执行case3,而case3不存在,那只能执行default
  		{
  		case 0:
  			printf("first");
  		case 1:
  			printf("second");
  			break;
  		default: printf("hello"); // 打印hello,打印完之后,内部switch结束,此时外部case1结束
  		}             // 因为外部case1之后没有添加break语句,所以继续执行case2
  	case 2:             // 打印third
  		printf("third");      // 外部switch结束
  	}
  	return 0;
  }

即:先在内部switch的default位置打印hello,紧接着在外部case2中打印third

因此:选择D

  1. 关于switch说法不正确的是:( )
  • A.switch语句中的default子句可以放在任意位置
  • B.switch语句中case后的表达式只能是整形常量表达式
  • C.switch语句中case子句必须在default子句之前
  • D.switch语句中case表达式不要求顺序

解析:

A:正确,可以放在任意位置,但是一般建议最好还是放在最后

B:正确,case语句后一般放整形结果的常量表达式或者枚举类型,枚举类型也可以看成是一个特殊的常量

C:错误,没有规定case必须在default之前,一般case最好放在default之前

D:正确,但一般还是按照次序来

因此:选择C

  1. 关于关系操作符说法错误的是?
  • A.C语言的关系操作符就是用来比较大小关系的
  • B.关系操作符中判断是否相等使用==
  • C.==操作符可以用来比较2个字符串是否相等
  • D.关系操作符参与的关系表达式,通常返回0或1,表示真假

解析:

两个字符串是否相等不能使用==,应该使用strcmp函数

  1. 【编程题】打印3的倍数的数
    写一个代码打印1-100之间所有3的倍数的数字
c 复制代码
/*
解题思路:
9. 3的倍数一定能够被3整除,因此i%3==0表达式成立时,则i一定是3的倍数
10. 要输出1~100之间的3的倍数,那只需要从1~100循环100次即可,每次拿到i之后,用i%3==0检测
   如果成立:i是3的倍数,输出
   如果不成立:i不是3的倍数
*/
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=100; i++)
    {
        if(i%3==0)
        {
            printf("%d ", i);
        }
    }
    return 0;
}
  1. 代码:从大到小输出
    写代码将三个整数数按从大到小输出。
    例如:
    输入:2 3 1
    输出:3 2 1
c 复制代码
*
思路:
该题比较简单,参考代码
*/
#include <stdio.h>
int main()
{
    int a = 2;
    int b = 3;
    int c = 1;
    scanf("%d%d%d",&a, &b,&c);
    if(a<b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }
    if(a<c)
    {
        int tmp = a;
        a = c;
        c = tmp;
    }
    if(b<c)
    {
        int tmp = b;
        b = c;
        c = tmp;
    }
    printf("a=%d b=%d c=%d\n", a, b, c);
    return 0;
}
  1. 【编程题】三角形判断
    描述
    KiKi想知道已经给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
    输入描述:
    题目有多组输入数据,每一行输入三个a,b,c(0<a,b,c<1000),作为三角形的三个边,用空格分隔。
    输出描述:
    针对每组输入数据,输出占一行,如果能构成三角形,等边三角形则输出"Equilateral triangle!",等腰三角形则输出"Isosceles triangle!",其余的三角形则输出"Ordinary triangle!",反之输出"Not a triangle!"。

示例1

输入: 2 3 2

3 3 3

输出: Isosceles triangle!

Equilateral triangle!

c 复制代码
#include <stdio.h>


int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    while(~scanf("%d %d %d", &a, &b, &c))
    {
        if((a+b>c) && (a+c>b) && (b+c>a))
        {
            //三角形
            if(a==b && b==c)//等边三角形
            {
                printf("Equilateral triangle!\n");
            }
            else if(((a==b)&&(b!=c)) || ((a==c)&&(c!=b)) || ((b==c)&&(c!=a)))//等腰
            {
                printf("Isosceles triangle!\n");
            }
            else
            {
                printf("Ordinary triangle!\n");
            }
        }
        else
        {
            //不是三角形
            printf("Not a triangle!\n");
        }
    }
    return 0;
}
  1. 【编程题】分数求和
    计算1/1-1/2+1/3-1/4+1/5 ...... + 1/99 - 1/100 的值,打印出结果
c 复制代码
/*
思路:
1. 从上述表达式可以分析出
   a. 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
    然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
    然后将所有的项相加即可
*/

#include <stdio.h>

int  main()
{
	int i = 0;
	double sum = 0.0;
	int flag = 1;
	for(i=1; i<=100; i++)
	{
		sum += flag*1.0/i;
		flag = -flag;
	}
	printf("%lf\n", sum);
	return 0;
}
  1. 【编程题】数9的个数
    编写程序数一下 1到 100 的所有整数中出现多少个数字9
c 复制代码
/*
思路:
1. 给一个循环从1遍历到100,拿到每个数据后进行一下操作
2.  a. 通过%的方式取当前数据的个位,检测个位数据是否为9
         如果是,给计数器加1
    b. 通过/的方式取当前数据的十位,检测十位数据是否是9,
          如果是,给计数器加1
  循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中。
*/
#include <stdio.h>


int main()
{
	int i = 0;
	int count = 0;
	for(i=1; i<=100; i++)
	{
		if(i%10==9)
			count++;
		if(i/10==9)
			count++;
	}
	printf("%d\n", count);
	return 0;
}
  1. 【编程题】打印闰年
    打印1000年到2000年之间的闰年
c 复制代码
/*
思路:
要求1000年到2000年之间的闰年,只需要知道求解闰年的方法即可。
闰年的条件:如果N能够被4整除,并且不能被100整除,则是闰年
           或者:N能被400整除,也是闰年
     即:4年一润并且百年不润,每400年再润一次
*/


#include <stdio.h>
int main()
{
	int year = 0;
	for(year=1000; year<=2000; year++)
	{
		//判断year是否为闰年
		if(year%4==0)  // 如果year能够被4整除,year可能为闰年
		{
			if(year%100!=0) // 如果year不能内100整除,则一定是闰年
			{
				printf("%d ", year);
			}
		}
		if(year%400 == 0)  // 每400年再润一次
		{
			printf("%d ", year);
		}
	}

	return 0;
}


//
//介绍一下这种的简单写法
//
int main()
{
	int year = 0;
	for(year=1000; year<=2000; year++)
	{
		if(((year%4==0)&&(year%100!=0))||(year%400==0))
		{
			printf("%d ", year);
		}
	}

	return 0;
}
  1. 【编程题】求最大值
    求10 个整数中最大值
c 复制代码
/*
思路:
1. 采用循环的方式输入一个数组
2. 使用max标记数组中的最大值,采用循环的方式依次获取数组中的每个元素,与max进行比较,如果arr[i]大于    max,更新max标记的最大值,数组遍历结束后,max中保存的即为数组中的最大值。
*/
int main()
{
	int arr[10] = {0};
	int i = 0;
	int max = 0;

	for(i=0; i<10; i++)
	{
		scanf("%d", &arr[i]);
	}
	//
	max = arr[0];
	for(i=1; i<10; i++)
	{
		if(arr[i]>max)
			max = arr[i];
	}
	printf("max = %d\n", max);
	return 0;
}
相关推荐
Dream_Snowar1 小时前
速通Python 第三节
开发语言·python
XH华1 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_2 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
高山我梦口香糖2 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
落魄君子2 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡2 小时前
滑动窗口 + 算法复习
数据结构·算法
信号处理学渣2 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客2 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin2 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin