目录
五、选择控制结构
1.算法中的概念及描述方法
2.关系运算符和逻辑表达式
3.条件运算符和条件表达式
4.两种多分支if
5.switch语句
6.逻辑运算符和逻辑表达式
六、循环控制结构
1.控制循环的方式
2.控制非法输入
3.选择三种循环的一般原则
4.猜数游戏
5.嵌套循环
6.流程的转移控制
7.goto语句
七、函数
1.函数的参数传递
2.函数定义和函数声明的区别
3.防御性程序的设计
4.断言(Assert)
5.函数设计基本原则
6.嵌套调用
7.递归函数
8.变量的存储类型
9.模块化设计猜数游戏
八、数组
1.二维数组的存储结构
2.最大值算法
3.排序算法
(1)冒泡排序
(2)选择排序
4.查找算法
(1)顺序查找
(2)折半查找
五、选择控制结构
1.算法中的概念及描述方法
2.关系运算符和逻辑表达式
3.条件运算符和条件表达式
4.两种多分支if
如三角形的判断
main()
{……if (a+b>c && b+c>a && a+c>b) /*三角形的基本条件*/{if (a==b && b==c && c==a){printf("等边");flag = 0;}else if (a==b || b==c || c==a){printf("等腰");flag = 0;}if (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){printf("直角");flag = 0;}if (flag)printf("一般");printf("三角形\n");}elseprintf("不是三角形\n");
}
5.switch语句
没有break就会一直往下执行,记得写break
计算器程序:
main()
{int data1, data2; /*定义两个操作符*/char op; /*定义运算符*/printf("Please enter the expression:");scanf("%d%c%d", &data1, &op, &data2); /*输入运算表达式*/switch (op) {case '+': /*处理加法*/printf("%d + %d = %d\n", data1, data2, data1 + data2); break;case '-': /*处理减法*/printf("%d - %d = %d\n", data1, data2, data1 - data2);break;case '*': /*处理乘法*/printf("%d * %d = %d\n", data1, data2, data1 * data2); break;case '/': /*处理除法*/if (0 == data2)printf("Division by zero!\n");else printf("%d/%d = %d\n", data1, data2, data1/data2); break;default: printf("Invalid operator! \n");}
}
其中为什么不用if (data2 == 0)?
答:在一些编程规范和老派的编程习惯中,推荐将常量写在比较表达式的左边,像 if (0 == data2)
这样的写法。这样做的好处是,如果不小心写成了 if (0 = data2)
(将比较写成了赋值),编译器会直接报错,因为在 C 语言中,常量是不能被赋值的,所以这样的写法能帮助程序员尽早发现这种低级但容易疏忽的错误。而如果写成 if (data2 == 0)
,当误写成 if (data2 = 0)
时,编译器通常不会报错,只是会把赋值操作的结果(也就是 0)作为条件判断的值,往往会导致程序逻辑出现意外情况且不容易被察觉。
6.逻辑运算符和逻辑表达式
六、循环控制结构
1.控制循环的方式
2.控制非法输入
3.选择三种循环的一般原则
4.猜数游戏
直到猜对为止
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main()
{ int magic; int guess; int counter; /*记录人猜次数的计数器变量*/srand(time(NULL));magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/do{printf("Please guess a magic number:");scanf("%d", &guess); counter ++; /*计数器变量count加1*/if (guess > magic) printf("Wrong! Too high!\n");else if (guess < magic) printf("Wrong! Too low!\n");elseprintf("Right!\n");}while (guess != magic); printf("counter = %d \n", counter);
}
最多猜十次
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main()
{ int magic; int guess; int counter; /*记录人猜次数的计数器变量*/srand(time(NULL)); magic = rand() % 100 + 1;counter = 0; /*计数器变量count初始化为0*/do{printf("Please guess a magic number:");scanf("%d", &guess); counter ++; /*计数器变量count加1*/if (guess > magic) printf("Wrong! Too high!\n");else if (guess < magic) printf("Wrong! Too low!\n");elseprintf("Right!\n");}while (guess != magic && counter < 10); printf("counter = %d \n", counter);
}
猜多个数10次,猜不对就猜下一个数,直到用户选择结束为止
do{magic = rand() % 100 + 1; counter = 0; do{printf("Please guess a magic number:");scanf("%d", &guess); counter ++; if (guess > magic) printf("Wrong!Too high!\n");else if (guess < magic) printf("Wrong!Too low!\n");elseprintf("Right!\n");}while (guess != magic && counter < 10);printf("counter = %d\n", counter); printf("Do you want to continue(Y/N or y/n)?");scanf(" %c", &reply);}while ((reply == 'Y') || (reply == 'y'));
防止非法字符输入
5.嵌套循环
6.流程的转移控制
break和continue语句
break退出一层循环
continue中断此次循环,开启下一次
7.goto语句
韩信点兵
#include <stdio.h>
main()
{int x;for (x=1; ;x++) {if (x%5==1 && x%6==5 && x%7==4 && x%11==10){printf("x = %d\n", x); goto END; } }END: ;
}
#include <stdio.h>
main()
{int x;for (x=1; ;x++) {if (x%5==1 && x%6==5 && x%7==4 && x%11==10){printf("x = %d\n", x); break; } }
}
#include <stdio.h>
#include <stdlib.h>
main()
{int x;for (x=1; ;x++) {if (x%5==1 && x%6==5 && x%7==4 && x%11==10){printf("x = %d\n", x); exit(0); } }
}
#include <stdio.h>
main()
{int x; int find = 0; /*置找到标志为假*/for (x=1; !find ;x++) {if (x%5==1 && x%6==5 && x%7==4 && x%11==10){printf("x = %d\n", x); find = 1; /*置找到标志为真*/ } }
}
七、函数
1.函数的参数传递
2.函数定义和函数声明的区别
3.防御性程序的设计
注意标红部分,声明为无符号类型,会产生报错,可以用下面的解决方法
4.断言(Assert)
5.函数设计基本原则
6.嵌套调用
7.递归函数
8.变量的存储类型
auto和static
寄存器变量
9.模块化设计猜数游戏
八、数组
1.二维数组的存储结构
数组名的数组的首地址