#include <stdio.h> int main() { int a, b, c; printf("请输入三个数:\n"); scanf("%d%d%d", &a, &b, &c); if (a < b) { a = a ^ b; b = b ^ a; a = a ^ b; } if (a < c) { a = a ^ c; c = a ^ c; a = a ^ c; } if (b < c) { b = b ^ c; c = c ^ b; b = b ^ c; } printf("%d %d %d", a, b, c); return 0; }
分支用到了if条件句,我用了异或的方法进行两个数的值得互换,‘^’异或,将两个数按二进制位异或,同为0,异为1。进阶的利用循环结构的一组数据的大小排列以下:程序员
#include <stdio.h> int main() { int a[10] = {0}; int i = 0; int c = 0; int j = 0; printf("请输入10个数:\n"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 0; i < 10; i++) { for (j = i+1; j < 10; j++) { if (a[i] < a[j]) { c = a[i]; a[i] = a[j]; a[j] = c; } } } for (i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }
利用循环语句进行填充数组,循环语句进行大小的排列,也称为冒泡法,用第三个值进行两个数字的值的交换,用循环语句进行顺序打印数组
#include <stdio.h> int main() { int i = 0; for (i = 0; i < 100; i++) { if (i % 3 == 0) { printf("%d ", i); } } return 0; }
继续使用循环语句打印多个数字,a%b表示a除以b以后取余数,余数为0即为3的倍数架构
#include <stdio.h> int main() { int n = 18; int m = 24; int r = 0; scanf("%d%d", &m, &n); while (r = m % n) { //r = m % n; m = n; n = r; } printf("%d\n", n); return 0; }
展转相除:为了获得两个数的最大公约数,以除数和余数反复作除法运算,当余数为 0 时,取当前算式除数为最大公约数。代码中“//r = m % n”这个部分是能够优化放在循环条件的地方,就能提升执行效率,当余数为零时,while(0)下面的循环再也不执行,逻辑成立。框架
#include <stdio.h> int main() { int year = 0; int count = 0; printf("1000到2000年间的闰年为:\n"); for (year = 1000; year <= 2000; year++) { //if (year % 4 == 0 && year % 100 != 0) //{ // printf("%d ", year); // count++; //} //else if (year % 400 == 0) //{ // printf("%d ", year); // count++; //} if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { printf("%d ", year); count++; } } printf("\n%d\n", count); return 0; }
闰年的判断方法为,一个年份能被四整除且不能被100整除,或者能被四百整除,注释起来的地方为将两个判断句分开,将带这个判断条件整合成一个条件,放在if语句中,更优。ide
#include <stdio.h> //1.试除法 #include <math.h> //2.将试除的上限值改成sqrt(i) int main() //3.将偶数去掉,再次减小计算量 { int i = 0; int j = 0; int k = 0; for (i = 101; i <= 200; i+=2) { for (j = 2; j <sqrt(i); j++) { if (i % j == 0) { break; } } if (j > sqrt(i)) { k++; printf("%d ", i); } } printf("\n素数有%d个\n", k); return 0; }
都是用到了试除法,第一次是将内部循环中的限制条件改成sqrt(),求算术平方根,减小计算量,第二次优化是将外循环中的偶数跳过,再次减小了计算量。函数
#include <stdio.h> int main() { double n = 0, i = 0; double s1 = 0, s2 = 0; double s = 0; for (n = 1; n < 100; n += 2) { s1 = 1 / n + s1; } for (i = 2; i <= 100; i += 2) { s2 = s2 - 1 / i; } printf("%lf\n", s = s1 + s2); return 0; }
第一次想到的方法是把正的负的分开来算,须要定义的变量较多。优化
#include <stdio.h> int main() { double n = 0; double s = 0; int flag = 1; for (n = 1; n <= 100; n++) { s =flag* 1 / n + s; flag = -flag; } printf("%lf\n", s ); return 0; }
利用一个flag变量,每次循环乘以-1,实现正负相加的循环,最终求得答案。指针
#include <stdio.h> int main() { int i = 1, j = 1; int x = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { x = i * j; printf("%d * %d = %d ", j, i, x); if (i <= j) { printf("\n"); break; //一开始使用的continue 致使没法正确跳出循环而只是跳过该次循环 } } } return 0; }
第一次想了比较久,也想到了须要两层循环,也想到了内层循环须要限制,但是前面就是没有想到须要使用的是break跳出循环,而不是continue跳过该次循环,到后来看完答案,上厕所的时候才忽然想到,应该用break,就不会继续打印出一列乘法求和了,有兴趣的能够看看把break换成continue是什么样子。如下是老师给出的代码:code
#include <stdio.h> int main() { int i = 1, j = 1; int x = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) //i表明行数,而每行的打印个数等于改行行数,因此内循环的上限为i { x = i * j; printf("%d*%d =%-2d ", j, i, x); //一点细节为 %数字d 数字表示左缩进(-)或者右缩进(+)位数由数字决定 } printf("\n"); } return 0; }
这个是我今天花了最长时间的一个代码了,一部分缘由是对于函数使用的不熟练,一部分缘由是由于接纳这种代码的逻辑关系确实须要一点时间,源代码以下,有兴趣的话能够玩着试试,游戏
#include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("##############################################\n"); printf("********* 1.play * * 0.exit *********\n"); printf("##############################################\n"); } void game() { int g = 0; int ret = 0; ret = rand() % 100 + 1; while (1) { scanf("%d", &g); if (g > ret) { printf("大了\n"); } else if (g < ret) { printf("小了\n"); } else { printf("恭喜你 猜对了 \a \n"); break; } } } int main() { int input = 0; menu(); srand((unsigned int)time(NULL)); do { printf("请选择是否要开始游戏:1/0\n"); scanf("%d", &input); switch (input) { case 1: { printf("请猜数字:\n"); game(); break; } case 0: { printf("退出游戏\n\a"); break; } default: { printf("请输入0/1\n"); break; } } } while (input); return 0; }
核心为:
1.电脑会生成一个随机数
2.猜数字
3.能够连续玩
其中的细节包括:
1.利用do while在主函数内作一个至少会循环一次的循环语句,在里面进行是否进入游戏的判断。
2.利用函数建立一个简单的菜单栏,无返回值函数viod。
3.在主函数循环以外写一个生成随机数的函数rand(),再循环内,则每次猜就会生成一个新的数字。 所需头文件为 <stdlib.h>。
4.随机数生成须要srand函数从新定义,不然每一次都会生成一组相同的随机数。
5.srand函数也须要随机数,才能让rand每一次在不一样的起点生成随机数。
6.因此用时间戳做为srand函数的参数,变量类型强制转换为(unsigned int)time。所需头文件为<time.h>。
7.时间戳生成函数的参数的类型为指针,NULL为空指针,咱们无需一个具体的指针,因此用空指针生成时间戳供srand使用就够了。
8.而且游戏函数内部能进行对于数字的判断,进行相应的提示,大了或者小了。
9.首先是要理解架构,搭建框架,再填充其中细节,虽然我也是个程序小白,可是我以为这么理解是没有错的。
#include <stdio.h> #include <stdlib.h> //system 的头文件 #include <string.h> //strcmp 的头文件 int main() { char input[20] = { 0 }; //system() 用来执行系统命令的 system("shutdown -s -t 60"); again: printf(" 电脑要关机了 请输入:我最帅 \n"); scanf("%s", input); if (strcmp(input, "我最帅") == 0) { system("shutdown -a"); } else { printf("\a"); goto again; } return 0; }
goto语句的使用一直有所争议,其实程序之中没有goto语句也不会有什么影响,并且goto语句的频繁使用会使得逻辑混乱,可能会致使程序员本人也读不懂。以上的关机程序就能体现goto最有用的地方,跳出多层循环,当一个代码之中有多层循环嵌套,须要直接从最里层跳出,goto语句的方便之处方能体现,again就是一个标点,goto again,就是直接跳到again的地方继续执行语句,而break只能跳出一层。system("shutdown -s -t 60")为系统函数,须要<stdlib.h>的头文件,shutdown -s 为执行关机,后面的 -t60 为六十秒后执行,shutdown -a为取消关机,字符'\a'为提示音。(固然本人夹带私货,自恋了一波【doge】)明天开始函数