1.什么是语句
- 1. 表达式语句
- 2. 函数调用语句
- 3. 控制语句
- 4. 复合语句
- 5. 空语句
- 1. 条件判断语句也叫分支语句:if语句、switch语句;
- 2. 循环执行语句:do while语句、while语句、for语句;
- 3. 转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
2.1 IF语句
2.1.1语法结构
单分支
多分支
用else if 比只用if效率更高,前者满足第一个条件后,后面就不判断了,后者即使满足了后面也会判断,效率比较低。
if、else语句默认后面只控制一条语句,如果需要执行多条语句,应该使用代码块,即加上{ }。
2.1.2悬空else
![](https://i-blog.csdnimg.cn/blog_migrate/9f48b9627e81865c03801de43517d91c.png)
//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#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;
}
代码风格要好,该空行空行,该空格空格,该对齐对齐。
2.1.3 if书写形式的对比
代码1、代码2都是一样的,尽量写成代码2的形式。return之后后面就不执行了
//代码1
if (condition) {
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
判断两个值是否相等的时候(==)
a 两个都用数字
b 一字母一常量,常量写在左边。
int main()
{
int n = 5;
if (5 == n) //避免出现漏掉一个=的错误,如出现编译器会自动发现
printf("hehe\n");
return 0;
}
2.1.4练习
include<stdio.h>
int main
{
int n = 0;
scanf("%d", &a);
if (a%2==1)
{
printf("是奇数\n");
}
else
{
printf("不是奇数\n");
}
return 0;
}
2
int main()
{
int i = 1;
while (i <= 100)
{
//判断i是奇数的话,就打印i
if(i % 2 == 1)
printf("%d ", i);
++i;
}
return 0;
}
2.2 Switch语句
2.2.1 switch中的break
#include <stdio.h>
int main()
{
int day = 0; //const在c++是修饰常量,在c语言修饰变量
switch(day)//day是整形int
{
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;
}
return 0;
}
#include <stdio.h>
//switch代码演示
int main()
{
int day = 0;
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");//不符合情况的时候
//switch语句中的default没有顺序,default放哪一行都可以
}
return 0;
}
2.2.2 default语句
2.2.3 练习
3.循环语句
- while
- for
- do while
3.1 while
3.1.1 while中的break和continue
int main()
{
int n = 1;
while (n <= 10)
{
n++;
if (n == 5)
continue;//跳过本次循环continue后边的代码,直接去while循环的判断部分
printf("%d ", n);
}
return 0;
//输出结果:1 2 3 4;且一直在循环,代码一直在运行,进入死循环
3.1.2 while中的getchar、putchar【有点乱,视频1的末尾】
getchar:从键盘中获取字符,读取阿斯克码值,返回值类型是int
为什么getchar()读取的是一个字符而返回的却是整形呢,因为字符在存储时是以阿斯克码值存储的,返回整形是返回了他的阿斯克码值
当getchar()读取错误的时候会返回EOF,EOF的含义就是end of file,是文件的结束标志,是-1
C语言中getchar()函数的详解_getchar()的功能-CSDN博客
// //EOF - end of file 文件结束标志
// //#define EOF (-1)
// //在函数读取失败的时候返回了EOF
// //scanf 函数读取成功,返回的是读取到的数据的个数
// //读取失败返回EOF
// //getchar 读取成功返回字符的ASCII码值
// //读取失败返回EOF
// //ctrl+Z - 回让scanf 或者 getchar 返回EOF
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
3.2 for循环
for(初始化:表达式1;判断:表达式2;调整:表达式3)
printf()
for只执行下面的一个语句,如果需要执行多条,要用{语句组}
3.2.1 for中的break和continue
break
#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
//break终止了
#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
//没有死循环,调整语句在循环体外
3.2.2for语句的循环控制变量
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
i=5;
}
return 0;
}
//打印:6 6 6 6 6 6 ……(死循环)
3.2.4 for循环的变种
1.for(;;)
{}
初始化和调整部分省略就是啥都不做。
判断部分省略,意味着判断恒为正,无限循环。
2.打印几次“hehe”?——
int main()
{
int i = 0;
int j = 0;
//这里打印多少个hehe?
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
printf("hehe\n");
}
}
}
//打印16次hehe
省略初始化
int main()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<4; i++)
{
for(; j<4; j++)
{
printf("hehe\n");
}
}
}
//打印4次,i=0时执行后,j=4.后面的for不再执行
3.使用多余一个变量控制for循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
4一道笔试题目:赋值表达式中
a=b=4相当于a=(b=4),b=4中把4赋值给b后,这个表达式的值就是4,然后再赋值给a
//请问循环要循环多少次?
#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=0就是0,循环不会进去
3.3 do while ()循环
(变量的左值和右值,左值指的是空间,右值是空间的内容)
do(一上来先执行一次循环语句)while(再判断);不常用
#include <stdio.h>
//打印1-10
int main()
{
int i = 1;
do
{
//if (i==5)
// break/continue
//最后都是只打印 1 2 3 4 (continue变成死循环,不断判断)
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
3.4练习
2.1
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
//1!+2!+3! = 1 + 2 + 6 = 9
//1!
//2! = 1*2
//3! = 1*2*3
//4! = 1*2*3*4
for (n = 1; n <= 3; n++)
{
ret = 1;//这个很容易漏!
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
2.2简便一点
int main()
{
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret = ret * n;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
3
(1)
//在一个有序数组中查找具体的某个数字n
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序
int k = 17;
int i = 0;
for (i = 0; i < 10; i++)
{
if (arr[i] == k)
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == 10)
{
printf("找不到了\n");
}
return 0;
}
//但是这里浪费了有序这个条件
//所以要用折半(二分)查找算法
(2)折半查找算法[仅限于有序的数组]
1.确定被查找范围的左右下标left、right
2.根据left、right,确定中间元素的下标mid
3.根据mid锁定的元素,和查找的元素比较,确定新的查找范围,left、right。
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
//printf("%d\n", sizeof(arr));//计算的数组的总大小,单位是字节
//printf("%d\n", sizeof(arr[0]));//4
//printf("%d\n", sizeof(arr) / sizeof(arr[0]))
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int key = 7;
int mid = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
break;
}
if(arr[mid] == key)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
}
查找次数为 。10个数字,找4次。、
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序
//printf("%d\n", sizeof(arr));//计算的数组的总大小,单位是字节
//printf("%d\n", sizeof(arr[0]));//4
//printf("%d\n", sizeof(arr) / sizeof(arr[0]));
int k = 7;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//1
int left = 0;
int right = sz-1;
int flag = 0;//flag的作用是标志是否找到了
//2
while (left<=right)
{
int mid = (left + right) / 2;
if (arr[mid] == k)
{
printf("找到了,下标是:%d\n", mid);
flag = 1;
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
//1 2
if (flag == 0)
printf("没找到\n");
return 0;
}
4.
//编写代码,演示多个字符从两端移动,向中间汇聚
//welcome to bit!!!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//...
//welcome to bit!!!!!
//
//welcome to bit!!!!!
//###################
#include <string.h>
#include <windows.h>
//Sleep需要一个windows.h的头文件
int main()
{
char arr1[] = "welcome to bit!!!!!";
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);//单位是毫秒
system("cls");//system函数可以执行系统命令(cmd中),cls是清理屏幕
//加了这个实现的效果是只有一行,两端向中间汇聚
left++;
right--;
}
printf("%s\n", arr2);
return 0;
5.
//假设密码是:"123456"
//
int main()
{
int i = 0;
char password[20] = {0};
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
//判断密码是否正确
//两个字符串比较相等是不能使用==的,应该使用strcmp库函数
//strcmp返回0表示2个字符串相等
//strcmp返回>0的数字,表示第一个字符串大于第二个字符串
//strcmp返回<0的数字,表示第一个字符串小于第二个字符串
//比较对应位置的字符串
//abcd\0
//abq\0
//a,b都相等,q的阿斯克码值更大,所以第二个字符串更大
if (strcmp(password, "123456") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
//1 2
if (i == 3)
printf("退出程序\n");
return 0;
}
问题:scanf输入字符串到数组里面会放入\0吗?——利用代码和监视器实现
关于gets()与scanf()输入字符串与\0,\n,空格之间的问题_scanf输入空格会被当作字符吗-CSDN博客
int main()
{
char arr[] = "xxxxxxxxxx";
scanf("%s", arr);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
printf("***************************\n");
printf("***** 1.play 0.exit *****\n");
printf("***************************\n");
}
//void srand (unsigned int seed);
void game()
{
RAND_MAX;
//1. 生成随机数
int ret = rand() % 100 + 1;//可以生成随机数,随机数的范围是:0~32767
//0~99
//2. 猜数字
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
//打印菜单
//1. 玩游戏
//0. 退出游戏
int input = 0;
srand((unsigned int)time(NULL));//要给srand传递一个变化的值,计算机上的时间是时刻发生变化的
//time函数可以返回一个时间戳
do
{
menu();
printf("请选择:>");
scanf("%d", &input);//1 0
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
int main()
{
again:
printf("hehe\n");
printf("hehe\n");
printf("hehe\n");
printf("hehe\n");
goto again;
end:
return 0;
}
void test()
{
flag:
printf("test\n");
}
int main()
{
printf("hehe\n");
goto flag;//goto 语句只能一个函数内部跳转,不能跨函数跳转的
return 0;
}