目录
三大结构
- 顺序结构,按照代码顺序从前向后依次执行;
- 选择结构,也称分支结构,即代码会根据条件选择性执行;
- 循环结构,会重复执行指定代码,直到条件不满足时才停止,执行后面的代码;
语句:
- C语言中由分号(;)隔开的就是一条语句;
- 只有一个分号,为空语句;
一,选择语句
if 语句
if...
if... else...
if... else if... else...
int main()
{
int input = 0;
printf("是否每天学习(0/1)?");
scanf("%d", &input);
if (1 == input) //判断相等时建议将值写在前面,避免写成单个=而报错
printf("真棒!"); //单个语句可不加{}
else
printf("需加油了!");
return 0;
}
int main()
{
int a = 0;
int b = 2;
if (1 == a)
if (2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
//输出:haha?
//其实结果并非haha
//正确形式为以下形式,是因为else是与其最近的if匹配的
//书写代码时,应匹配像上方的形式,避免七一
int main()
{
int a = 0;
int b = 2;
if (1 == a)
if (2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
switch 语句
- 常用于多分支, 而if else 处理不太方便时使用;
- 注:switch无continue关键字;
int main()
{
//switch后括号内的表达式与case后表达式确定入口
switch (exp) //exp 整数表达式
{
case exp1: //exp1整数常量表达式
break; //跳出switch,不执行后面的语句了(break可不加)
case exp2:
break;
...
default: //所有case均不匹配时,执行此语句,只可出现一条此语句
break;
}
return 0;
}
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一 ");
break;
case 2:
printf("周二 ");
break;
case 3:
printf("周三 ");
break;
case 4:
printf("周四 ");
break;
case 5:
printf("周五 ");
break;
case 6:
printf("周六 ");
break;
case 7:
printf("周日 ");
break;
default:
printf("输入错误\n");
break;
}
}
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一 ");
break;
case 2:
printf("周二 ");
//break;
case 3:
printf("周三 ");
//break;
case 4:
printf("周四 ");
//break;
case 5:
printf("周五 ");
//break;
case 6:
printf("周六 ");
//break;
case 7:
printf("周日 ");
//break;
default:
printf("输入错误\n");
break;
}
}
//如输入2
//结果为:周二 周三 周四 周五 周六 周日 输入错误
二,循环语句
while
do...while
for
while 循环
- 循环{ }内语句,直到条件不满足为止;
- continue 直接终止当前循环,执行下次循环;
- break 直接终止整个本层的循环,如有嵌套循环不影响上层循环;
int main()
{
int i = 0;
while (i < 10)
{
printf("%d\n", i);
i++;
}
return 0;
}
//结果:0 1 2 3 4 5 6 7 8 9
int main()
{
int ch = 0;
char password[6] = {0}; //字符串(或字符数组)
printf("请输入密码:");
//注:字符串password前无需加&,因为password本身即表示指针;
//因%s表示要将一字符串存入到password内,存入时直到存入'\0'才会结束;
//如输入123456,将123456存入password后,未遇到'\0'还未结束,但在存入字符就会溢出;
//所以这里不要输入超过5个字符,如12345(实际上输入的是12345\n);
scanf("%s", password); //将123450存入password(5后面没有字符默认直接存'0'结束);
ch = getchar(); //获取输入流中的字符(一次获取一个),putchar输出字符
if ('\n' == ch)
printf("确实还有个'\\n'");
else
printf("无'\\n'");
return 0;
}
int main()
{
int ch = 0;
char password[6] = {0};
printf("请输入密码:");
scanf("%s", password);
//清除输入流中剩下的字符
while ('\n' != getchar())
{
;
}
printf("请确认(Y/N)");
ch = getchar();
if ("Y" == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
int main()
{
int i = 0;
while (i < 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
//结果:0 1 2 3 4
int main()
{
int i = 0;
while (i < 10)
{
if (5 == i)
continue;
printf("%d ", i);
i++;
}
return 0;
}
//结果:0 1 2 3 4 _ 死循环了,因为到5后,i就无法执行i++语句了;
do ... while 循环
- 循环至少执行一次,因为是先执行语句,在判断条件;
int main()
{
int i = 0;
do
{
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
//结果:0 1 2 3 4 5 6 7 8 9
for 循环
- for(表达式1;表达式2;表达式3) 循环语句;
- 表达式1,循环变量初始化部分,用于初始化循环变量;
- 表达式2,循环变量条件判断部分,用于判断循环终止;
- 表达式3,循环变量调整部分,用于循环条件调整;
注:
- 不可在for循环体内修改变量,防止失去控制;
- 循环判断控制变量的取值建议采用“前闭后开”区间写法;
int main()
{
int i = 0;
for (i; i < 10; i++)
{
printf("%d ", i);
}
return 0;
}
//结果:0 1 2 3 4 5 6 7 8 9
int main()
{
int i = 0;
for (i; i < 10; i++)
{
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}
//结果:0 1 2 3 4
int main()
{
int i = 0;
for (i; i < 10; i++)
{
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
//结果:0 1 2 3 4 6 7 8 9
三,goto语句
- goto + 标记跳转符号,可跳转到指定位置执行;
- 理论上,此语句没有必要,可很容易使用其他替代;
- 常见用法就是终止程序在某些深度嵌套结构的处理过程,如一次跳出两层或多层循环,在这种情况下break是达不到的,它只可退出到上层循环;
- 缺点是容易打乱执行流程;
- 只能在一个函数内跳转,不可跨函数使用;
int main()
{
printf("hello1 ");
goto tag;
printf("hello2 ");
tag:
printf("hello3 ");
return 0;
}
//结果:hello1 hello3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 600");
again:
printf("请注意10分钟后关机!如不想关机请输入:NO!\n");
scanf("%s", input);
if (0 == strcmp(input, "NO"))
system("shutdown -a");
else
goto again;
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 randnum = rand() % 100 + 1;//生成1-100数字
int input = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &input);
if (input > randnum)
printf("猜大了!\n");
else if (input < randnum)
printf("猜小了!\n");
else
{
printf("猜对了!\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请猜数字:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("推出游戏!");
break;
case 1:
game();
break;
default:
printf("输入错误!");
break;
}
} while (input);
return 0;
}
练习
1,计算n的阶乘,即n!;
int main()
{
int ret = 1;
for (int i = 1; i <= 10; i++)
{
ret*=i;
}
printf("10!=%d\n", ret);
return 0;
}
2,计算1!+ 2!+ 3!+ ... + 5!;
int main()
{
int sum = 0;
int ret = 1;
for (int i = 1; i <= 5; i++)
{
ret*=i;
sum += ret;
}
printf("5!sum=%d\n", sum);
return 0;
}
3,查找有序数组内指定元素的下标;
//折半查找/二分查找
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof arr / sizeof arr[0];
int k = 7;
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
left = mid + 1;
else if (arr[mid] > k)
right = mid - 1;
else
{
printf("%d\n", mid);
break;
}
}
if (left > right)
printf("未找到\n");
return 0;
}
4,字符从两端向中间显现汇聚;
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "welcome to C!!!";
char arr2[] = "###############";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //睡眠1秒
system("cls"); //清空屏幕
left++;
right--;
}
return 0;
}
5,模拟用户登录,只能登录三次(允许输入三次,均错误退出程序);
int main()
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password, "123456") == 0)
{
printf("登录成功!\n");
break;
}
else
printf("密码错误!\n");
}
if(i==3)
printf("登录失败!");
return 0;
}
6,输出九九乘法表;
int main()
{
int i = 1;
int j = 1;
for (i = 1; i < 10; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%-2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}