分支语句和循环语句
- C语言是一门结构化程序设计语言,C语言中有三种结构,分别为顺序结构,选择结构,循环结构
分支语句
- if
- switch
循环语句
- while
- for
- do…while
语句
-
C语言中用一个分号隔开的,就是语句
-
分支语句是一种选择结构
#include<stdio.h>
int main()
{
int age = 0;
(void)scanf("%d", &age);
if (age < 18)
printf("未成年\n");
return 0;
}
#include<stdio.h>
int main()
{
int age = 0;
(void)scanf("%d", &age);
if (age < 18)
printf("未成年\n");
else
printf("成年\n");
return 0;
}
- C语言中规定0为假,非0为真
- 悬挂else,指的是else总是和离其最近的未配对的if来进行一个配对的操作
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
//这段代码什么都不会打印 第二个else会在编译器中主动和第二个if靠近
//所以代码什么都不会打印,没有符合的条件。
//赋值&判断是否相等的运算符
#include<stdio.h>
int main()
{
int age = 10;
if (age == 5)
printf("age==5\n");
return 0;
}
//屏幕上什么都不会打印,因为age!=5;
#include<stdio.h>
int main()
{
int age = 10;
if (age = 5)
printf("age==5\n");
return 0;
}
//频幕上会打印age==5,因为把5赋值给了age,所以if后面的括号里面的值是真的,所以会打印相应的内容
- 为了避免上面第一个代码中的错误情况,写代码的时候可以把常量放在左边,这样就比较容易看的出来错误,也是一种比较好的代码风格,常量放在左边的时候,如果代码里面有错误,就会比较明显的显示出来
判断一个数是奇数还是偶数
#include<stdio.h>
int main()
{
int i = 0;
(void)scanf("%d", &i);
if (i % 2 == 0)
printf("i为偶数\n");
if (i % 2 == 1)
printf("i为奇数\n");
return 0;
}
输出1-100之间的奇数
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
}
switch语句
- switch适用于多分支语句
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("选择错误\n");
break;
}
}
- 需要强调的是,switch后面的必须是整形表达式,浮点型就会出错;case后面只能放常量表达式,必须是整形,也必须是常量。
#include<stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1: n++;
case 2:m++;n++; break;
}
case 4:m++;break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
system("pause");
return 0;
}
//结果是m=5,n=3;
循环语句
break和continue
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
return 0;
}
//打印结果为1,2,3,4
//break永久的跳出循环,停止后期的所有循环
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
//打印结果是1,2,3,4,4,4,4,4...死循环,continue只是跳过当前这层循环,后续
//会继续判断循环条件是否满足,如果满足的话,就会继续进行循环
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
//打印结果为2 3 4 6 7 8 9 10 11;
//continue作用:continue用来终止本次的循环,当次continue之后的语句不再执行
getchar()
- getchar(),这里注意这个函数的返回值是int类型
- getchar输入字符,在输入缓冲区检查有无字符,没有字符,在键盘上输入字符,getchar从缓冲区中取一个字符A,while循环判断,不等于EOF输出;此时缓冲区中还有 \n ,getchar取出,判断,换行,等待输入
- putchar输出字符,读取成功返回字符的ASCII码值;读取失败返回EOF
#include<stdio.h>
int main()
{
int ch = getchar();
putchar(ch);
return 0;
}
//输入什么字符就会输出相应的字符
int main()
{
char ch = 0;
/*scanf("%c", &ch);
printf("%c", ch);*/
//scanf和printf用于各种类型,如:整型、字符、浮点型……
//getchar putchar只用于字符
ch = getchar();
putchar(ch);
return 0;
}
//EOF为end of file
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//用ctrl+z来停下来。
- 这里为什么错误呢?scanf遇到 \n 甚至是空格 就不拿走了,剩下的\n只能到下面的getchar中,而\ n 不是 Y 就进入else,确认失败。既然这样的话,我加入一个 getchar 拿走 \n 是不是就可以了?但是只输入一个\n也有弊端,所以最好的修改方法就是直接变成循环的方式会更好一些
int main()
{
char password[20] = { 0 };
int ch = 0;
printf("请输入密码:_");
scanf("%s", password);
//这里的password是数组,数组名本来就是地址,因此不需要使用取地址符
while(getchar()!='\n')
{
;
}
//清除缓冲区
printf("请确认密码(Y/N)");
ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
输出100-200之间的素数
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
break;
}
if (j == i)
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
}
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int j = 2;
while(j<=sqrt(i))
{
if (i % j == 0)
break;
j++;
}
if (j >sqrt(i))
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
}
输出乘法口诀表
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
for (a = 1; a <= 9; a++)
{
for (b = 1; b <= a; b++)
{
printf("%d*%d=%2d ", a, b, a * b);
}
printf("\n");
}
return 0;
}
计算闰年
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1000; i <= 2000; i++)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
{
printf("%d ", i);
count++;
}
}
printf("\n");
printf("%d", count);
return 0;
}
交换两个变量的值
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int temp = 0;
(void)scanf("%d %d", &a, &b);
temp = a;
a = b;
b = temp;
printf("%d %d", a, b);
return 0;
}
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
(void)scanf("%d %d", &a, &b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
//按二进制位,异或:相同为0,相异为1;
//异或不能解决除了整形以外类型的运算
//但是这种算法不存在有溢出的问题
//这段代码的可读性也比较差,一开始是看不懂的
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
(void)scanf("%d %d", &a, &b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d", a, b);
return 0;
}
//但是这种方法存在有溢出的问题,如果a和b特别大的话,把a+b的值放在a里面就会溢出了
//这样就得不到想要的结果了
求10个数中的最大值
//求十个整数中的最大值
#include<stdio.h>
int main()
{
int arr[10] = { 12,34,675,32,75,24,86,23,88,16 };
int max = arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 1; i < sz; i++)
{
if (arr[i] >max)
{
max = arr[i];
}
}
printf("%d", max);
return 0;
}
将三个数从大到小输出
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
(void)scanf("%d %d %d", &a, &b, &c);
if (a > b && b > c)
printf("%d %d %d", a, b, c);
if (a > c && c > b)
printf("%d %d %d", a, c, b);
if (b > a && a > c)
printf("%d %d %d", b, a, c);
if (b > c && c > a)
printf("%d %d %d", b, c, a);
if (c > b && b > a)
printf("%d %d %d", c, b, a);
if (c > a && a > b)
printf("%d %d %d", c, a, b);
return 0;
}
求两个数的最大公约数
- 辗转相除法
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
(void)scanf("%d %d", &a, &b);
while (c = a % b)
{
a = b;
b = c;
}
printf("%d", b);
return 0;
}
//两个数的乘积除以最大公约数的值就是最小公倍数
最小公倍数
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int m = 0;
int n = 0;
int c = 0;
int z ;
(void)scanf("%d %d", &a, &b);
m = a;
n = b;
while (c = a % b)
{
a = b;
b = c;
}
z = (m * n) / b;
printf("%d\n", b);
printf("%d\n", z);
return 0;
}
while循环语句
#include<stdio.h>
int main()
{
int i = 1; //初始化
while (i <= 10) //判断
{
printf("%d ", i);
i++; //调整
}
return 0;
}
//while循环从形式上说是不够好的,因为3个部分是分开的,就可能会导致死循环
//如果希望三个部分在一起的话,可以考虑使用for循环
for循环
- 初始化,条件判断,调整
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
//打印结果为1,2,3,4
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
//打印结果为1,2,3,4,6,7,8,9,10
for语句的循环控制变量
- 一些建议:
1.不可在for循环内修改循环变量,防止for循环失去控制
2.建议for语句的控制变量的值采用前闭后开区间的写法(也只是建议)
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", i);
i = 5;
}
return 0;
}
//第一个打印的数字为0,之后为6的死循环
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", i);
i += 5;
}
return 0;
}
//循环两次就结束了,打印的结果为0,6
循环体内部改变循环变量
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
//代码的打印结果是hehe的死循环
区间的问题
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
//这个代码没有达到实际的预期,这个代码循环了11次
//本身希望代码只循环10次。
//但是有些时候也可可以写成前闭后闭得形式,控制好条件就可以了
#include<stdio.h>
int main()
{
int i = 0;
for (; i < 10; i++)
{
printf("%d ", i);
}
return 0;
}
//打印结果为0-9
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
}
}
return 0;
}
//这段代码得打印结果只有10个hehe
//并且10个hehe是从i=0-- i=9一口气打印出来的
//当i=0时,j从一直到9,打印了10个hehe之后,j的条件就不再满足了
//所以一共只会打印10个hehe
#include<stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, ++y)
{
printf("hehe\n");
}
return 0;
}
//打印结果为2个hehe
//&&操作符只要一边为假,另一边就不用看了。
- 逗号表达式
#include<stdio.h>
int main()
{
int x = 0 ;
int y = 0 ;
for (x = 0, y = 0; x < 2 , y < 5; ++x, ++y)
{
printf("hehe\n");
}
return 0;
}
//打印结果为5个hehe,利用了逗号表达式,x=2的情况被忽略了,只看y<5,所以打印5个hehe
- 一道笔试题,问这个代码循环了几次?
#include<stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
- 这个循环一次都没有进行,条件判断为把0赋值给k,表达式恒为假,所以一次循环也不会进行,主要是要看清楚是循环还是赋值。
do…while循环
- do…while循环体至少会执行一次
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
//打印结果为1-10
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
//打印的结果只有1,2,3,4
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
//打印结果为1,2,3,4 d的死循环
计算n的阶乘
#include<stdio.h>
int main()
{
int n = 0;
int i = 1;
int sum = 1;
(void)scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum * i;
}
printf("%d", sum);
return 0;
}
求1!+…+10!
#include<stdio.h>
int main()
{
int n = 0;
int i = 1;
int ret = 1;
int sum = 0;
(void)scanf("%d", &n);
for (n = 1; n <= 10; n++)
{
//ret = 1;
//i = 1;
while (i <= n)
{
ret = ret * i;
i++;
}
sum = sum + ret;
}
printf("%d", sum);
return 0;
}
二分查找
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int key = 7;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < key)
{
left = mid + 1;
}
else if (arr[mid] > key)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d", mid);
break;
}
}
if (left > right)
printf("找不到\n");
return 0;
}
#include<stdio.h>
int BinarySearch(int arr[], int sz)
{
int key = 7;
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < key)
{
left = mid + 1;
}
else if (arr[mid] > key)
{
right = mid - 1;
}
else
return mid;
}
return -1;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = BinarySearch(arr, sz);
if (ret == -1)
{
printf("找不到\n");
}
else
printf("找到了,下标为:%d", ret);
return 0;
}
#include<stdio.h>
#include<windows.h>
int main()
{
char arr1[] = "###########";
char arr2[] = "Hello World";
int sz = sizeof(arr1) / sizeof(arr1[0]);
int left = 0;
int right = sz - 2;
while (left <= right)
{
arr1[left] = arr2[left];
arr1[right] = arr2[right];
printf("%s\n", arr1);
Sleep(1000);
left++;
right--;
}
printf("%s", arr1);
return 0;
}
模拟登录程序
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
if (0 == strcmp(password, "123456"))
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误,请重新输入!\n");
}
}
if (i == 3)
printf("三次密码均错误,退出程序!\n");
return 0;
}
猜数字游戏的实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***** 欢迎来到猜数字游戏!*****\n");
printf("***** 1. play *****\n");
printf("***** 0. exit *****\n");
printf("***** 欢迎来到猜数字游戏!*****\n");
}
void game()
{
int ret = 0;
int guess = 0;
ret = rand() % 100 + 1;
while (1)
{
printf("请输入数字:>");
(void)scanf("%d", &guess);
if (guess > ret)
printf("猜大了\n");
else if (guess < ret)
printf("猜小了\n");
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>\n");
(void)scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
//时间戳是自1970年1月1日(08:00:00GMT)至
//当前时间的总秒数。
//它也被称为Unix时间戳(UnixTimestamp)。
//Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),
//是一种时间表示方式,
//定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数。
//Unix时间戳不仅被使用在Unix系统、类Unix系统中(比如Linux系统),
//也在许多其他操作系统中被广泛采用。
goto语句
关机程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char input[] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
printf("输入错误,请重新输入!\n");
goto again;
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char input[] = { 0 };
system("shutdown -s -t 60");
//这是Windows系统下的一个关机命令
while (1)
{
printf("你的电脑将在一分钟后关机,如果输入我是猪,就会取消关机!\n请输入:");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");//取消关机命令
break;
}
}
return 0;
}