一、分支语句
分支语句(条件判断语句):if语句;switch语句
(一)if语句
//例子1
if (条件1)
语句1;
//例子2
if (条件1)
语句1;
else
语句2;
//例子3
if (条件1)
语句1;
else if (条件2)
语句2;
else
语句3;
- 条件0表示假,非0表示真(注意条件是赋值还是比较)。
- 一般为了清晰,加上代码块{}。
- 悬空else:else之和离它最近的if匹配,不能看对齐。
(二)switch语句
- swich后跟的是整形表达式。
- case后跟的是整形常量表达式。
switch (整形表达式)
{
//多个case
case 整形常量表达式:
语句1;
break;
default:
语句n;
break;
}
- 加上break才能表示分支,不加break,case代码会依次顺序执行,没有continue。
- case的顺序不影响代码执行。
- default语句用来处理没有case匹配的问题,可以出现在{}里的任何位置。
二、循环执行语句
循环执行语句:while语句;do while语句;for语句
(一)while语句
while (循环条件)
循环语句;
- break是永久跳出循环。
- continue是跳出本次循环,再进行下一次循环判断。
(二)do while语句
do
循环语句;
while (循环条件)
- do while循环至少执行一次。
(三)for语句
for(初始化;条件判断;调整)
循环语句;
- 不建议在循环体内修改循环变量。
- 采取**“前闭后开”**的写法。
for(i = 0; i < 10; i++)
{}
for(;;)
恒为真。- 双循环注意初始化。
- 当把for循环中的条件判断写成赋值,则会判断为真。
三、goto语句
goto error;
error: 语句;
- 不能跨函数跳转。
- 一般用来跳出多层循环。
四、经典代码
(一)只打印数字字符,跳过其他字符
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
{
continue;
}
putchar(ch);
}
return 0;
}
- getchar()返回ASCII码值,用int接收。碰到文件末尾或接收错误返回EOF。
- ch < ‘0’ || ch > '9’在比较0和9的ASCII码值。
- scanf不是直接从键盘上接收数据,是从缓存区接收,一般敲完回车(\n)会保存在缓存区,可以用getch()清空。
while ((ch = getchar()) != '\n')
{
;
}
(二)字母移动
#include <stdio.h>
#include <windows.h>
int main()
{
char arr1[] = "I love you";
char arr2[] = "**********";
printf("%s\n", arr2);
int right = sizeof(arr1)-2;
int left = 0;
while (left <= right)
{
Sleep(1000);
system("cls");
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
- 使用替换,将字母聚拢显现。
- system(“cls”)用来清空屏幕,Sleep(1000)延时1000ms,要用到<windows.h>。
- sizeof()算字符串数组会算上"\0",strlen()不会算上。
(三)利用对半查找有序数组中的目标位置
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0])-1;
int mid = 0;
int key = 10;
while (left <= right)
{
mid = (left + right) / 2;
if (arr1[mid] < key)
{
left = ++mid;
}
else if (arr1[mid] > key)
{
right = --mid;
}
else
{
break;
}
}
if (left <= right)
{
printf("%d", mid);
}
else
{
printf("没找到");
}
return 0;
}
- 计算数组中元素个数sizeof(arr1) / sizeof(arr1[0])。
- 注意判断条件,以及前++和后++。
(四)猜数字游戏
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("开始请按->1\n");
printf("结束请按->0\n");
}
void game()
{
int num = 0, random_num = rand()%10 + 1;
while (1)
{
printf("请输出猜的数字-> ");
scanf("%d", &num);
if (num > random_num)
{
printf("猜大了\n");
}
else if (num < random_num)
{
printf("猜小了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand(time(NULL));
do
{
menu();
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("请重新输入\n");
break;
}
} while (input);
}
- 利用do…while和swich来做初始循环界面。
- #define _CRT_SECURE_NO_WARNINGS用来消除scanf的警告。
- srand()生成随机种子,rand()生成随机数,time()返回时间戳。