1、
答案:C
解析:
(1)程序本来是想循环10次,当i==5时打印。
但是在C语言中,‘=’是赋值,‘==’才是相等。(建议当要比较一个变量和一个常量是否相等,将变量放在‘==’的右边)
(2)在循环体中要尤其注意循环变量的修改。
补充:建议不要再for循环体中修改循环变量,防止for循环失去控制。
2、
答案:C
解析:
(1)if语句后面只能控制一条语句,但不是只能跟一条语句----->也能跟多条语句,注:跟多条语句时 需要用{}括起来
(2)if语句中0表示假,非0表示真。
(3)if语句是一种分支语句,可以实现单分支,也可实现多分支
补充:多分支选择语句:有switch语句和if多分支语句
但如果分支较多,则if语句的层数多,程序冗长而且可读性降低。
所以多分支语句,我们常常用switch语句。
(4)else的配匹:else总是与它前面最近的一个尚未匹配的if相匹配。
3、
答案 :D
解析:
由func(1)可知,在调用函数func时形参a的值是1。
1、switch语句(也可叫开关语句)
(1)switch后的表达式必须为整形表达式(和枚举类型)
char类型虽然叫:字符类型
但是字符的存储是ASCII码值,是整形,所以char也是整形家族的!!!
(2)功能:先算出表达式的值,然后依次与case标签的值进行匹配,匹配成功(相等)就选择这个标签作为入口,执行该case字句后面的语句块,如果语句块没有加break,就会继续执行当前case之后的所有case子句直到程序结束。
注:break在switch语句中的作用:实现真正的分支
(3)当 switch 表达式的值并不匹配所有 case 标签的值时,这个时候结构的所有语句都被跳过,程序并不会终止,也不会报错。但是,如果你不想忽略不匹配所有标签的表达式的值,你可以在语句列表中加一条default子句。
default子句的作用:
当 switch 表达式的值并不匹配所有 case 标签的值时,则执行default子句后面的语句。所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。
(4)编程好习惯
①在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break 。
②虽然default子句可以凡在任意地方,但建议放在最后(习惯上我们前面处理正确的,后面处理异常的)
(5)switch语句中的关键字:break,case,default,(注:continue只在循环出现)
4、
倍数:一个数能被另一个整数整除(%==0),那么这个整数就是另一整数的倍数。
//代码1 #include<stdio.h> int main() { int i = 0; for (i = 1; i <= 100; i++) { if (i % 3 == 0) { printf("%d ", i); } } return 0; }
//代码2 #include<stdio.h> int main() { int i = 0; //3的倍数:3,6,9,12....我们发现每次都加3 for (i = 3; i <= 100; i+=3) { printf("%d ", i); } return 0; }
//代码3 #include<stdio.h> int main() { int i = 0; //3的倍数:3=3*1,6=3*2,9=3*3..... for (i = 1; 3 * i <= 100; i++) { printf("%d ", 3 * i); } return 0; }
代码有好坏,代码2、3比代码1的效率更好
5、
#include<stdio.h> int main() { //1、先定义三个整形变量 int a = 0; int b = 0; int c = 0; //2、输入 scanf("%d %d %d",&a,&b,&c); //3、调整 //最大值放a,最小值放c,其余放b if (a < b) { int t = a; a = b; b = t; }//互换 if (a < c) { int t = a; a = c; c = t; } if (b < c) { int t = b; b = c; c = t; } //输出 printf("%d %d %d\n", a, b, c); return 0; }
两个数互换:注:要一个中间变量,不能直接互换
就如生活中酱油和醋互换
6、
质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
//写一个代码:打印100~200之间的素数 //素数-只能被1和它本身整除的数 //n是否素数 不能被2-n-1整除 //代码1 #include<stdio.h> int main() { int i = 0; //先打印100-200的数 for (i = 100; i <= 200; i++) { //判断i是否为素数 //拿2-(i-1)之间的数试除 int flag = 1;//假如是素数 int j = 0; for (j = 2; j <= (i - 1); j++) { if (i % j == 0) { flag = 0; break; } } if (1 == flag) { printf("%d ", i); } } return 0; }
//代码2 #include<math.h>//math.h是sqrt库函数的头文件 #include<stdio.h> int main() { int i = 0; //先输出100-200的数,质数不可能是偶数 for (i = 101; i <= 200; i += 2) { //判断是否是素数 //i=a*b,a和b至少一个<=开平方i的 //拿2-开平方i之间的数试除 int j = 0; int flag = 1;//假如是素数 for (j = 2; j <= sqrt(i); j++)//sqrt是开平方的库函数 { if (i % j == 0) { flag = 0; break; } } if (1 == flag) { printf("%d ", i); } } return 0; }
代码2比代码1效率更好
注:偶数不可能是质数,(奇数=奇数+2)
sqrt是开平方的库函数
它的头文件:“math.h”
判断质数:试除法
n是否是质数:n是否能整除2到n-1
优化:m=a*b,a和b至少一个数字是<=开平方m的
n是否能整除2到开平方n
//代码3 #include<stdio.h> int main() { int i = 0; //外层循环用来获取100-200的数,100必不是素数 for (i = 101; i <= 200; i += 2) { //判断是否为素数 //第二大因数<=i/2 int j = 0; int flag = 1;//假如是素数 for (j = 2; j <= i / 2; j++) { if (i % j == 0) { flag = 0; break;//注:一个break只能跳出一层循环 } } //内层循环结束之后,若flag==1,说明[2,i/2]之间的数都不能被i整除,说明i为素数 if (1==flag) { printf("%d ", i); } } return 0; }
这只是提供了一些方法,也不是最优的
更优的:有兴趣可以去搜《素数求解的N种境界》
7、
闰年的条件:
1、如果N能够被4整除,并且不能被100整除,则是闰年
2、或者:N能被400整除,也是闰年
即:4年一润并且百年不润,每400年再润一次
//代码1 #include<stdio.h> int main() { int year = 0; //获取1000-2000的数 for (year = 1000; year <= 2000; year++) { //判断是否为闰年 //1、4年一润并且百年不润 if (year % 4 == 0) { if (year % 100 != 0) { printf("%d ", year); } } //2、每400年再润一次 if (year % 400 == 0) { printf("%d ", year); } } return 0; }
//代码2 #include<stdio.h> int main() { int year; //获取1000-2000闰年的数, for (year = 1000; year <= 2000; year++) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { printf("%d ", year); } } return 0; }
8、
最大公约数:最大能整除它两的数
最大公约数<=这两个数的较小值
//代码1 #include<stdio.h> int main() { int n = 0; int m = 0; //输入 scanf("%d %d", &n, &m);//18 24 //假设最大公约数就是m和n的较小值 int k = (n < m ? n : m); while (1) { if (n % k == 0 && m % k == 0) { break; } k--; } printf("%d ", k); return 0; }
//代码2 //辗转相除法求最大公约数 #include<stdio.h> int main() { int n = 0; int m = 0; //输入 scanf("%d %d", &n, &m);//18 24 int k = 0;// while (k = n % m) { n = m; m = k; } printf("%d ", m); return 0; }
辗转相除法(体现结果是以相除余数为0则得到)
算法步骤:
1、输入两个正整数n,m
2、计算n除以m的余数k
3、n=m,m=k
4、若k=0,则m和n的最大公约数等于m;否则转到第2步
5.输出最大公约数m
最小公倍数:
n和m的最小公倍数=n*m/最大公约数
//最小公倍数 #include<stdio.h> int main() { int n = 0; int m = 0; scanf("%d %d", &n, &m);//18 24 //求最大公约数 int c = n * m; int k = 0;//n%m=k while (k = n % m) { n = m; m = k; } //最小公倍数=c/m printf("%d\n", c / m); return 0; }