C语言笔记: 2.分支与循环语句
前言
提示:C语言笔记用作对自己学习的总结以及以后方便查阅遗忘知识。
以后也会查缺补漏。
什么是语句?
在C语言中由一个分号(;)隔开的就是一条语句。
1.分支语句
1.1、分支语句(选择结构)
格式:
(1)没有else部分:
if(表达式) 语句1;
(2)有else部分:
if(表达式)
语句1;
else
语句2;
(3)else嵌套多个if:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
else
语句4;
表达式结果为真,则语句执行。
(0表示假,非0表示真)
注:通常情况下else是与距离自身最近的else匹配。
if 1
if 2
else
此时else是与if2匹配
如果是
if 1
{
if 2
}
else
此时else是与if2匹配
例子
if(condition)
{
return x;
}
returny;
条件成立则返回x,否则返回y
1.2、多分支语句(switch语句)
格式:
switch(整型表达式)
{
case 表达式结果1:
语句1;
break;
case 表达式结果2:
语句2;
break;
case 表达式结果3:
语句3;
break;
case 表达式结果4:
语句4;
break;
default:
语句5;
break;
}
注意:
(1).switch()中()里面的表达式必须是整形的,不能为小数或者其他类型的。
(2).break是指跳出{}包含的语句,且break以后的语句不会执行。
比如
switch()
{
case 1:
case 2:
break;
}
此时如果从case 1开始执行的话,同时会执行case 2,
然后才会执行break,跳出这个switch语句。
(3). default表示除了case语句中有的选项之外的所有选项。
(4).case和default是没有顺序之分的,也可以放在上面,
建议放在最下面。
2、循环语句
有
- while语句
- for语句
- do while语句
2.1 while语句
格式:
while(表达式)
{
语句;
}
continue作用:
比如while语句里面,在continue后面的语句不会执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断.
注意:在while里面使用continue可能会导致死循环
2.2 for语句
格式:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1:初始化部分
表达式2:条件判断部分
表达式3:调整部分
for循环建议:
- 不可以在for循环体内修改循环变量,防止for循环失去控制
- 建议for语句的循环控制变量的取值采用前闭后开区间的写法,例如for(i=0;i<10;)。
(建议但不是必须)
for( ; ; )
在这个for语句中,不加任何表达式,执行的是一个死循环
for(k=0;k=0;k++)
当表达式2为0时,即判断为假,直接结束,循环0次
2.3 do while语句
格式:
do
循环语句;
while(表达式);
while表达式为真就循环,为假就结束循环了。
2.4 goto语句
是一种可以随意跳转的语句,类似于瞬移
不能够随意使用,以免破坏代码原本的逻辑性
常用用法:
终止程序在某些深度嵌套的结构的处理过程,比如一次跳出两层或者多层循环。
例子:
for()
{
for()
{
for()
{
if(disaster)
goto error;
}
}
}
error:
if(disaster)
......
意思是在多个for循环中如果有一个错误需要解决,
连续用break比较麻烦,可以直接用goto语句出来
处理这个问题。
实际应用
1.折半查找算法(二分查找算法)
说明:找中间元素,去掉一半
需求:在1~9中找到7,若找到返回下标,否则返回-1
int binary_search(int* arr, int k)
{
int sz = sizeof(arr) / sizeof(arr[0]);
int i=0;
int right = 0;
int left = sz - 1;
while (right >= left)
{
i=(right + left) / 2;
if (k == arr[i])
{
return i;
break;
}
if (k > arr[i])
right++;
if (k < arr[i])
left--;
}
return -1;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 0;
int ret;
scanf("%d", &k);
ret = binary_search(arr, k);
printf("%d", ret);
return 0;
}
2.辗转相除法
说明:
求m与n的最大公约数
若m>n
m%n=r -->r为m除以n的模
(1)m n r
(1)n r m%n
反复执行(2)直到r为0,则此时n就是m和n的最大公约数
int main()
{
int m = 0;
int n = 0;
int r = 0;
scanf("%d%d", &m, &n);
while (m%n)
{
r = m%n;
m = n;
n = r;
}
printf("%d\n", n);
return 0;
}
3.计算闰年
闰年:
(1)能被4整除不能被100整除的年份
(2)能被400整除的年份
需求:找出1900—2020年之间的闰年,并计算一共有多少个闰年
#include<stdio.h>
int main()
{
int count = 0;
int n = 0;
for (n = 1900; n <= 2020; n++)
{
if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
printf("%d\n", n);
count++;
}
printf("一共有%d个闰年\n", count);
return 0;
}
4.素数的判断方法
素数:只能被1和自身整除的自然数。(1不是素数)
需求:找出1—100里面的素数
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 100; i++)
{
for (j =2; j < i; j++)
{
if (i%j == 0)
break;
if (j = i)
{
printf("%d\n", i);
}
}
}
return 0;
}
5.九九乘法表
1 * 1=1
1 * 2=2 2 * 2=4
1 * 3=3 2 * 3=6 3 * 3=9
…
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int sum = 0;
while (n<9)
{
n++;
for (i = 1; i <= n; i++)
{
sum = i*n;
printf("%d*%d=%-2d", i, n, sum);
printf(" ");
}
printf("\n");
}
return 0;
}
注:%2d表示两位右对齐
%-2d表示两位左对齐
额外知识
(1).getchar() 表示输入
puchar() 表示输出
例如:
int ch=getchar();
putchar(ch);
printf("%c\n",ch);
return 0;
(2).在scanf("%d",&x)里面如果输入1234 ABCD的话,输出结果为1234,不会有ABCD,即scanf只会读取空格前面的值。
(3).关机程序
在Windows里面的关机命令为shutdown - s -t 60
意思是60s后关机
shutdown -a 意思是取消关机
在C语言里面要想执行windows命令,需要用到system()函数,该函数要引用库函数stlib.h
比较两个字符串不能用“==”,要用strcmp()函数,该函数要引用库函数string.h