选择语句分为:if、switch语句
循环语句分为:for、while、do...while、goto
语句分为:1.表达式语句2.函数调用语句3.控制语句4.复合语句5.空语句
这里的选择循环语句都是控制语句
什么是控制语句:用于控制程序的执行流程,以实现程序的各种结构方式(C语言是结构化的程序设计语言)
结构分为:顺序结构、选择结构、循环结构。
他们由特定的语句定义符组成有九种控制语,可以分为三类:
- 条件判断语句也叫分支语句:if语句,switch语句
- 循环执行语句:while语句 、for语句 、do while语句
- 转向语句:break语句、goto语句、continue语句、return语句
分支语句(选择结构)
if语句switch语句:
1.if(表达式)//如果表达式为真 非0语句就可以执行
语句
2.if(表达式)//表达式为真语句1运行,表达式不成立运行语句二
语句1;
else
语句2;
出错的原因:如果if后面想跟多条语句需用{}将其括起来
如下:
3.多分支
因为18<age为假0 0<28成立所以为真
c语言如何表示真假0表示假 1表示真
原因:else只能控制下面一条语句,如果想要输出多条语句则需要用大括号括起来
正解:
else悬空
else和离得最近的if进行匹配
- 变量的命名要有意义如firstname first_name FirstName比第一种更方便阅读
- 空格 空行 换行
满足返回1不成立返回0
变量不能赋值给常量if(5=num)
判断是否为奇数
输出1-100奇数
switch语句:
通常来说用于多分支情况 不适合表示一部分范围。
switch(整型表达式)//不能浮点型
{
语句项;(case表达式)
}
case 1://这里的1 是 整型常量表达式 也可以是字符因为字符存储时也是ASCII值 字符也是整型
- 输出七天
这样的原因:case只是入口但是并未说明从哪里出来。
因此需要运用break;语句进行退出
#include<stdio.h>
int main()
{
int day=0;
scanf("%d",&day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
}
要求:1-5weekday 6-7weekeded
default子句:用来没有这种情况后,但是仍然输入会怎么样
循环语句:
while for do...while
while:
If(条件)
语句
while(表达式)
循环语句
原因:先判断条件是否为真,此时为1为真,进入循环后运行语句 运行结束。跳出循环,继续进行判断。不断的循环而判断条件一直为真,因此一直输出hehe
循环语句break; continue;
break:终止循环.跳出循环
continue:直接跳过后面代码,返回判断,进行下一次循环的判断
原因:1到4时可以打印,当i=5时if(5==i)成立 break运行所以中止整个循环。
原因:1到4时正常打印,当i=5时 if(i==5)成立 continue运行,跳出本次循环后面代码,返回判断 因为i一直没有i++,所以i一直是5,因而一直无法往下运行。
getchar获取字符 putchar:打印
这里为什么用int来接收字符:返回的字符是ASCII值。当你出错时会返回EOF
EOF//END Of File
EOF是define中的-1
而这里也可以返回EOF 因此是int类型
如果想停止可以ctrl z
举一个例子:
读取到了换行结束
过滤字符 只打印数字
for循环
for(表达式1;表达式2;表达式3)
表达式1:初始化
表达式2:判断
表达式3:调整
- break跳出代码
- continue跳过代码
do..while
do
循环语句;
while(表达语句);
阶乘
1到3的阶乘和
在一个有序数组查到某个数字 :
for循环
二分法
#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k=7;
int sz=sizeof(arr)/sizeof(arr[0]);
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",mid);
break;
}
}
if(left>right)
printf("找不到\n");
}
字符逐渐向中间移动 :
优化后
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[]="abcdef";
char arr2[]="######";
int left=0;
int sz=strlen(arr1);//arr1 字符串元素有a b c d e f \0 strlen只数到\0之前因而此时strlen长度为6
//int sz=szieof(arr1)/sizeof(arr1[0]);
int right=sz-1;
while(left<=right)
{
arr2[left]=arr1[left];
arr2[right]=arr1[right];
printf("%s\n",arr2);
Sleep(1000);//单位微秒
system("cls");//清空屏幕
left++;
right--;
}
printf("%s",arr2);
}
模拟用户登录场景,用户只能登录三次:
猜数字 :
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*************\n");
printf(" 0退出 \n");
printf(" 1开始 \n");
printf("*************\n");
}
void game()
{
int ret=rand()%100+1;//如果只是%100只能取到1到99 生成随机数需先用srand
printf("%d\n",ret);
int guss=0;
while(1)
{
printf("请输入猜的数字:");
scanf("%d",&guss);
if(guss>ret)
{
printf("猜的数大了\n");
}
else if(guss<ret)
{
printf("猜的数小了\n");
}
else
{
printf("恭喜猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));//srand(随机数)才能生成随机数 因而选用了时间戳
//因为srand(unsigned int类型)所以括号内需要转换 time(指针)这里设置空指针
int input=0;
do
{
menu();
scanf("%d",&input);
switch(input)
{
case 1:
printf("开始游戏:\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
}
}
while(input);
return 0;
}
一分钟关闭电脑
1.goto:
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char input[]={0};
char arr[]="我是猪";
system("shutdown -s -t 60");
again:
printf("请输入我是猪,否则将在1分钟内关闭电脑。\n");
scanf("%s",input);
if(strcmp(input,arr)==0)
{
system("shutdown -a");
}
else
{
goto again;
}
}
2.while
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char input[]={0};
char arr[]="我是猪";
system("shutdown -s -t 60");
while(1)
{
printf("请输入我是猪,否则将在1分钟内关闭电脑。\n");
scanf("%s",input);
if(strcmp(input,arr)==0)
{
system("shutdown -a");
break;
}
}
}