c语言学习回顾2--- 分支循环回顾

1、下面代码的执行结果是__________

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

2、关于if语句,说法正确的是________

A、if语句后面只能跟一条语句
B、if语句中0表示假,1表示真
C、if语句是一种分支语句,可以实现单分支,也可以实现多分支
D、else总是和它的对齐的if语句匹配

3、关于switch语句的说法不正确的是______

A、switch语句中的default子句可以放在任何位置
B、switch语句中的case后的表达式只能是整型常量表达式
C、switch语句中case语句必须在default子句之前
D、switch语句中的case语句表达式不要求顺序

4、根据下面代码,看一下func(1)=_________

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;
}
//加上下面代码验证func(1)的值
int main()
{
	printf("%d\n", func(1));
	return 0;
}

A、30 B、20 C、16 D、0

5、switch(c)语句中,c不可以是什么类型的?

A、int
B、long
C、char
D、float

6、根据下面代码,想想程序的执行结果是什么?

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

7、写代码将三个整数从大到小输出,比如输入的是 2 3 1 ,输出的是 3 2 1

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	//输入三个数
	scanf("%d%d%d",&a,&b,&c);
	//输出从大到小,这时候就需要调整顺序,a里面放的是最大的,c里面放的是最小的
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}//这使得a放的是较大的值,b放的是较小的值
	if (a < c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}
	if (b < c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	printf("%d %d %d",a,b,c);
	return 0;
}

运行结果如下:(给它运行了三次进行测试)

2 3 1
3 2 1
1 2 3
3 2 1
3 2 1
3 2 1

编写该代码的思路就是两两进行比较,在两两进行比较的过程中,放入一个中间量,先将两者中的较小值赋给中间量,再将较大值赋给字母排序靠前的量,然后再将中间量的值赋值给字母排序靠后的变量,这样操作三次,就可以从大到小排列啦。
但是仔细观察这个代码,可以发现,三次比较的过程可以说是一模一样的,那么如果定义一个函数来实现这个比较的过程的话,就不用每次再敲这么大一段代码,而是直接调用函数就可以啦。后面回顾了函数的知识的时候再进行一下代码的改进,使得代码更高效。
自己还写了一段代码,跟这个思路差不多,只是定义了max、mid、min变量,最后结果运行是对的,但是将代码搞得很复杂,还是要多练习和模仿,之后才会有自己的写代码特色和风格,并且高效率。

8、打印3的倍数(写一个代码打印1-100之间所有3的倍数的数字)

int main()
{
	int i = 0;
	for (i = 1; i <=100; i++)
	{
		if (i % 3 == 0)
			printf("%d ",i);
	}
	return 0;
}

或者:

int main()
{
	int i = 0;
	for (i = 3; i <= 100; i+=3)
	{
			printf("%d ", i);
	}
	return 0;
}

运行结果为:

3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99

9、求解最大公约数(给定两个数,求这两个数的最大公约数,例如:24 18)

有个思路:哪个数字能同时整除18和24,找出这些数字中的最大的那就是最大公约数了 注意:最大公约数不会超过两个数中的较小值 比如这两个数中的较小值是18,看18能否被这两个数整除,如果能那最大公约数就是18, 不能的话18-1=17,判断17是否是二者都能整除的数字.... 第一次找到能同时被二者整除的数字一定是二者的最大公约数,因为是从最大的数字开始找的
有了上述思路之后,代码的编写就很简单啦。

int main()
{
	int a = 0;
	int b = 0;
	int tmp = 0;//定义tmp作为最大公约数
	scanf("%d %d",&a,&b);// 24 18
	int min = 0;
	min = a > b ? b : a;
	//利用了三目运算符
	//printf("min=%d\n",min);
	for (tmp = min; tmp >= 1; tmp--)
	{
		if ((a % tmp == 0) && (b % tmp == 0))
		{
			printf("tmp=%d", tmp);
			break;
		}
	}
	return 0;
}

运行结果如下:

24 18
//min=18
tmp=6

用while循环再写一下:

int main()
{
	int m = 0;
	int n = 0;
	int max = 0;//定义最大公约数是max
	scanf("%d %d",&m,&n);// 24 18
	//假设最大公约数是m和n的较小值
	if (m > n)
		max = n;
	else
		max = m;

	while (1)
	{
		if (m % max == 0 && n % max == 0)
		{
			printf("最大公约数是:%d\n", max);
			break;
		}
		max--;
	}
	return 0;
}
20 40
最大公约数是:20

还有一种方法是:辗转相除法
相对来说,辗转相除法的速度会更快,效率也更高。
c语言学习回顾2--- 分支循环回顾_第1张图片
代码如下:

int main()
{
	int m = 0;
	int n = 0;
	int t = 0;
	scanf("%d%d",&m,&n);
	while ( t = m % n )
	{
		
		m = n;
		n = t;
	}
	printf("最大公约数是:%d\n", n);
	return 0;
}

运行结果如下:

40 20
最大公约数是:20

自己写代码的时候,首先对m和n的大小进行了一次判断,看看谁大谁小,将大的赋值给m,小的赋值给n。其实是没有这个必要的,因为当程序执行的时候,输入18 24.照样能得到最大公约数是6.来捋一下这个过程。
18%24=18,就将24赋值给m,n赋值为18了;此时在第二步就变成了24%18=6;m赋值为18,n赋值为6,18%6等于0,程序结束,得到最大公约数是6.

10、打印闰年(打印1000-2000年之间的闰年)

int main()
{
	int year = 0;
	int count = 0;//计算一下闰年的个数
	for (year = 1000; year <= 2000; year++)
	{
		//判断年份是不是闰年
		//条件一:被4整除,但是不能被100整除是闰年
		//条件二:能被400整除是闰年
		if (year % 4 == 0)
		{
			if (year % 100 != 0)
			{
				printf("%d ", year);
				count++;
			}
		}
		if (year % 400 == 0)
		{
			printf("%d ", year);
			count++;
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

或者运用一下操作符来计算一下:

int main()
{
	int year = 0;
	int count = 0;//计算一下闰年的个数
	for (year = 1000; year <= 2000; year++)
	{
		//判断年份是不是闰年
		//条件一:被4整除,但是不能被100整除是闰年
		//条件二:能被400整除是闰年
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			printf("%d ", year);
			count++;

		}

	}
	printf("\ncount=%d\n", count);
	return 0;
}
在这里插入代码片

运行结果如下:

1004 1008 1012 1016 1020 1024 1028 1032 1036 1040 1044 1048 1052 1056 1060 1064 1068 1072 1076 1080 1084 1088 1092 1096 1104 1108 1112 1116 1120 1124 1128 1132 1136 1140 1144 1148 1152 1156 1160 1164 1168 1172 1176 1180 1184 1188 1192 1196 1200 1204 1208 1212 1216 1220 1224 1228 1232 1236 1240 1244 1248 1252 1256 1260 1264 1268 1272 1276 1280 1284 1288 1292 1296 1304 1308 1312 1316 1320 1324 1328 1332 1336 1340 1344 1348 1352 1356 1360 1364 1368 1372 1376 1380 1384 1388 1392 1396 1404 1408 1412 1416 1420 1424 1428 1432 1436 1440 1444 1448 1452 1456 1460 1464 1468 1472 1476 1480 1484 1488 1492 1496 1504 1508 1512 1516 1520 1524 1528 1532 1536 1540 1544 1548 1552 1556 1560 1564 1568 1572 1576 1580 1584 1588 1592 1596 1600 1604 1608 1612 1616 1620 1624 1628 1632 1636 1640 1644 1648 1652 1656 1660 1664 1668 1672 1676 1680 1684 1688 1692 1696 1704 1708 1712 1716 1720 1724 1728 1732 1736 1740 1744 1748 1752 1756 1760 1764 1768 1772 1776 1780 1784 1788 1792 1796 1804 1808 1812 1816 1820 1824 1828 1832 1836 1840 1844 1848 1852 1856 1860 1864 1868 1872 1876 1880 1884 1888 1892 1896 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000
count=243

11、打印素数(打印100-200之间的素数)

int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//用2到i-1之间的数字去试着除i,看看能不能整除
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				break;
				//意思是但凡有一个j满足可以被整除的条件,就跳出循环,证明i已经不是素数了
			}
		}
		if (i == j)
		{
			printf("%d ",i);
			//当进行完上面的for循环,发现都没有它的因数,此时i=j时,就证明它只有1和它本身两个因数
			//它就是素数
		}
	}
	return 0;
}

运行结果如下:

101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

另一种方法:判断flag是否为1,用标记来判断

int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;//假设素数的标志flag为1
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;//证明不是素数将flag给它置零
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\ncount=%d\n",count);
	return 0;
}
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
count=21

代码优化:

//上面这段代码是否还可以进行优化呢?是可以的
//一般来说,如果有m=a*b
//a和b中一定至少有一个数字是 <= 开平方m的 
// 这样的话对j的判断就不用是从2到i-1了,从2到sqrt(i)就可以了
//16 = 2 * 8 = 4 * 4
//sqrt是开平方的函数,它需要包含math.h
#include 
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;//假设素数的标志flag为1
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;//证明不是素数将flag给它置零
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}
//代码还可以优化嘛?可以的,我们能想到偶数一定不是素数
//直接将“for (i = 100; i <= 200; i++)”改为“for (i = 100; i <= 200; i+=2)”
//这样的话,遍历的数据就少了一半

答案:(1-6)

1、会死循环打印5,选C
c语言学习回顾2--- 分支循环回顾_第2张图片
2、选C
A、可以使用{}来跟多条语句
B、说法片面,非0就是真,比一定非得是1
D、是就近匹配,不是跟对齐的匹配
3、选C
4、D
因为每一条语句后面都没有break,所以b先被赋值为30,再是20,再是16,最后变为0
5、D
ABC都属于是整型
6、D
switch(1)—》case 1 :—》switch (3)—》走default,打印hello—》没有break,接着打印case 2 的third

你可能感兴趣的:(c语言,c语言)