一、Wmware workstation
虚拟机,虚拟化操作系统的使用
Windows系统、Linux系统、MacOS系统
Windows版本:Win11 Win10....
Linux版本:Ubuntu、redhat、Vxworks、debin...
二、为什么要使用Ubuntu Linux?
开源、免费、安全性高、可靠性强、可裁剪、可移植
三、Linux介绍
1、Linux 和 Windows存储结构的区别
Windows:磁盘区分
C盘 D盘 ....
|| ||
文件夹 文件夹
|| ||
文件 文件
Linux:Linux下一切皆文件
计算机 /
|
home bin dev boot ...
|
hyqj
|
....
路径表示
/home/hyqj
第一个/:表示根目录
第二个/:分隔符
~:表示家目录
2、终端
(1) 在当前终端下新建一个终端
ctrl + shift + t
(2) 在当前工作路径下打开一个新的终端
ctrl + shift + n
(3) 终端字体变大
ctrl + shift + '+'
(4) 终端字体变小
ctrl + '-'
(5) tab键补全
(6) 清屏
ctrl + l
(7) 强制结束
ctrl + c
3、Linux常用相关命令
[1] pwd:
输出当前的工作路径
[2] ls:
显示当前路径下的所有文件
ls -a:
显示当前路径下的所有文件(包括隐藏文件)
ls -l:
显示文件详细信息
drwxr-xr-x 2 hqyj hqyj 4096 8月 4 2021 Desktop
drwxr-xr-x
d:文件类型
r:读权限
w:写权限
x:执行权限
-:没有权限
有权限用1表示,没有权限用0表示
rwxr-xr-x: 111101101
八进制表示为755
[3] chmod:修改文件权限
chmod 775 文件名
[4] mkdir: 新建一个文件夹
mkdir 文件夹名
[5] rmdir: 删除一个文件夹
rmdir 文件夹名
注意:只能删除空目录
[6] cd: 切换目录
cd /: 切换到根目录下
cd ~:切换到家目录下
cd :切换到家目录下
cd 绝对路径
cd /home/hqyj/test
绝对路径:从根目录出发依次向下找到当前文件所在路径
cd 相对路径
cd ./test
相对路径:从当前路径出发表示该文件所在路径
.. :表示上一级
. :表示当前这一级
cd . :跳转到当前路径
cd .. :跳转到上一级路径
[7] touch: 新建一个文件
touch 文件名(要有后缀)
touch 1.txt 新建一个文本文件
[8] rm : 删除文件
rm 文件名
rm -r 文件夹名:强制删除文件夹
[9] cat: 查看文件内容,显示到终端
cat 文件名
[10] clear: 清屏
4、编辑器和编译器
vim/vi 编辑器
vim 1.c //vim编辑器打开一个1.c文件,如果文件不存在则创建文件并打开
vim编辑器三模式:
1、命令行模式:vim编辑器打开文件直接进入该模式,再该模式,可以进行复制、粘贴、剪切、撤销等操作
yy:复制光标所在行到剪切板
nyy:复制光标所在行以下的n行代码(包括光标所在行)
p: 在光标下一行粘贴剪切板的内容
dd:剪切光标所在行
ndd:剪切光标所在行以下的n行代码(包括光标所在行)
u: 撤销
gg
G
gg=G
2、插入模式
键盘上i o a三个键分别都可以进入该模式
i:在光标之前插入
o: 在光标下一行插入
a: 在光标所在位置后开始插入
Esc:退出插入模式,回到命令行模式
3、底行模式
保存、退出文件
在命令行模式,键盘输入 shift + : 进入底行模式
w:保存文件
q:退出文件
wq:保存并退出
x: 保存并推出
!: 强制执行
q!:强制退出
gcc 编译器
gcc 文件名 //有语法错误会报警告或错误,如果没有则会生成一个可执行文件a.out
./a.out //运行可执行文件
预处理 --> 编译 --> 汇编 --> 链接
5、代码规范
#include <stdio.h> //头文件,c语言不具备输入输出的功能,通过调用外部标准库来实现
int main(int argc, char *argv[])
{
printf("hello world\n");//功能代码
return 0;
}
//main函数,程序入口,从main函数开始,到main函数结束
{}:一个模块
return 代表程序的结束
return 返回值
Day2
复习
pwd: 输出当前工作目录的绝对路径
ls: 显示当前目录下的所有文件
ls -a: 显示当前目录下的所有文件,包括隐藏文件
ls -l:显示文件的详细信息
d:文件类型
bcd-lsp
chmod:更改文件权限
mkdir:创建一个目录
rmdir:删除一个空目录
touch:创建一个普通文件,加上文件后缀
rm: 删除一个文件
rm -r:删除一个目录
cp:copy 复制文件
cp 要复制的文件名 复制的位置
mv:移动文件
mv 要移动的文件名 移动的位置
cat:查看文件内容
clear:清屏
vim编辑器
命令行模式、插入模式、底行模式
命令行模式:复制、粘贴、剪切、撤销等
插入模式:键盘 a i o进入插入模式,Esc退出插入模式
底行模式:保存、退出
gcc 编译器
预处理
头文件展开、宏定义替换
gcc -E test.c -o test.i
编译
将原文件输出为汇编文件
gcc -S test.i -o test.s
汇编
将汇编文件输出为二进制文件
gcc -c test.s -o test.o
链接
将二进制文件链接库,生成可执行文件
gcc test.o -o a.out //可执行文件名可以自己修改
C基础
一、计算机的基本结构
输入设备:鼠标、键盘、麦克风
输出设备:显示屏、扬声器
存储器:内存、外存
运算器、控制器
二、数值数据表示
1、常见的进制
1、十进制
逢十进一
0~9
基数:10
位权:10^n-1
123 = 1*10^2 + 2*10 + 3 = 100 + 20 + 3 = 123
2、二进制 0b 0B
逢二进一
0,1
基数:2
位权:2^n-1
0b1001 + 0b0011 = 0b1100
1001 - 0011 = 0110
1111 = 1*2^3 + 1*2^2 + 1^2 + 1 = 15
3、八进制 0
逢八进一
0~7
基数:8
位权:8^n-1
0456 + 0123 = 0601
456 = 4*8^2 + 5*8^1 + 6 = 302
4、十六进制 0x
逢十六进一
0~9 a b c d e f
基数:16
位权:16^n-1
0x4a5 = 4*16^2 + 10*16 + 5 = 1189
2、进制之间的转换
1、十进制转二进制
除基数取余法、8421法(凑项)
2、八进制转二进制
1bytes = 8bit
一个八进制用三个二进制位表示
八进制 二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
0456 100 101 110
3、十六进制转二进制
一个十六进制用四个二进制位表示
十六进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111
0xa5f8 1010 0101 1111 1000
4、十进制、八进制、十六进制之间的转换
八进制 ===> 十六进制
||
二进制/十进制 ==> 十六进制
3、计算机中数据的存储方式
数据都是以补码的形式存放
1、正数的原码、反码、补码都是本身
2、反码:符号位不变,其他位按位取反 0-1 1-0
3、补码:补码 = 反码 + 1
4、已知补码求原码
补: 1011 1011
反: 1100 0100
原: 1100 0101
对补码再求补码也可以得到原码
三、非数值数据表示
非数值数据包括字符、符号、转义符等等
ASCII表提供非数值数据的整数表达
man帮助手册查询ASCII表
man ascii
man手册是一个帮助文档
'\0' ----- 0
'\n' ----- 10
SPACE ---- 32
'A' ----- 65
'a' ----- 97
四、词法符号
1、关键字 – 32个
1、数据类型: char short int long float double signed unsigned --8个
2、存储类型: auto register extern static const volatile --6个
3、语句: if else switch case while do for continue break goto return default --12个
4、构造: struct unione enum --3个
5、空类型: void
6、取别名: typedef
7、sizeof运算符: sizeof
2、标识符
标识符是程序员按照命名规则自定义的符号
命令规则:
1、只能由字母、数字、下划线组成
2、不能以数字开头
3、不能和关键字重名
大小写敏感
3、运算符
1、算数运算符: + - * / %
2、逻辑运算符: && || !
3、关系运算符: > < == != >= <=
4、位运算符: & | ~ ^ >> <<
5、赋值运算符: = += -= *= /=
6、递增递减运算符: ++ --
7、地址运算符: * &
8、逗号运算符: ,
9、sizeof运算符: 计算数据类型的大小
10、三目运算符: ? :
4、分隔符
分隔符是用来分割其他的词法符号
空格符、制表符、换行符、注释
注释:
//表示注释一行
/*
gfsjkkjsjkf
fhsjfhdh
*/
#if 0
#endif
5、标点符号
, ; : () {} []
四、数据类型
[1]char 字符型
'a' 'b'
占 1 字节空间大小
1bytes = 8bit
取值范围:
signed char : -2^7 ~ 2^7 - 1
unsigned char : 0 ~ 2^8 - 1
[2]short 短整型
占 2 个字节空间大小
取值范围:
signed short: -2^15 ~ 2^15 - 1
unsigned short : 0 ~ 2^16 - 1
[4] int 整型
占 4 个字节空间大小
[5] long 长整型
32位: 4bytes
64位: 8bytes
[6] 浮点型
float : 单精度浮点型,精确到小数点后6~7位
占 4 bytes
double: 双精度浮点型,精确到小数点后15~16位
占 8 bytes
[7] bool 类型
true false
[8] void 空类型
五、常量
整型常量: 1 2 100 500
字符常量: 'a' 'A' '0'
字符串常量: "a" "hello" "122434"
"hello" ==> 'h' + 'e' + 'l' + 'l' + 'o' + '\0'
浮点型常量: 3.14 3.338e-8 // 3.338 * 10^-8
标识常量:宏定义
#define MAX 100
六、变量
- 变量用来保存不同的常量值
1、变量的定义
<存储类型> <数据类型> 变量名
存储类型: register auto extern static
auto:自动存储类型,系统自动为变量开辟空间,在内存中
register: 将变量存储在寄存器中,但一般申请不成功,此时变量的存储类型为 auto
extern: 外部声明
static: 静态修饰变量
数据类型: char int short float double...
变量名: 标识符
标识符要遵守命名规则
1、由数字、字母、下划线组成
2、不能以数字开头
3、不能和关键字重名
eg:
int a;
2、变量的初始化
int a = 10; //初始化变量a的值为10
3、局部变量和全局变量
- 定义在模块内的变量为局部变量
- 定义在模块外的变量为全局变量
- 当模块结束后,该模块在内存中的空间会被系统回收,局部变量的空间也被回收
Day3
复习
输入设备、输出设备、存储器、运算器、控制器
常用进制:
二进制:逢二进一
十进制:逢十进一
八进制:逢八进一
十六进制:逢十六进一
进制之间的转换
十进制--->二进制
除基数取余法,8421法
八进制 --> 十六进制
ASCII码表
虚拟机中,在终端上 man帮助手册
man ascii
词法结构
1、关键字 -- 32个
数据类型: char short int long float double signed unsigned --8个
存储类型: auto register static extern const volatile --6个
语法:if else switch case do while for continue break goto return default --12个
空类型:void
构造:struct union enum
取别名:typedef
sizeof运算符:sizeof
2、标识符
用户自己取的名字
命名规则:
1、只能由数字、字母、下划线构成
2、不能以数字开头
3、不能和关键字重名
3、运算符
算数运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、递增递减运算符、逗号运算符、三目运算符、sizeof运算符
4、分隔符
回车 空格 注释
5、标点符号
, ; : () {} []
数据类型
char short int long float double...
常量变量
常量数据类型:整型常量、浮点型常量、字符型常量、字符串常量、宏定义
变量
1、语法形式
<存储类型> <数据类型> 变量名;
存储类型: auto register static extern
int a;
数据类型: char int short double...
变量名:标识符,遵守命令规则
2、变量的定义
int b;
3、变量的初始化
int a = 10; //初始化一个整型变量a的值为10
4、全局变量和局部变量
定义在模块{}外部的变量为全局变量,全局变量未初始化默认值为0
定义在模块内部的变量为局部变量,局部变量未初始化默认值为随机数
在整个程序结束之后,全局变量内存空间才会被回收
局部变量随着模块结束,空间被回收
当局部变量和全局变量同时存在,局部变量优先级更高
通用输出函数 — printf
#include <stdio.h>
printf("hello world\n");
//printf("", a,b,c);
printf("格式控制字符串", 参数列表);
格式控制字符串中的内容会原本显示输出 “”
格式控制符
%d ------ 有符号的整型数据
%f ------ 浮点型数据
%c ------ 字符型数据
%s ------ 字符串
%o ------ 八进制整型数据
%x ------ 十六进制整型数据
%u ------ 无符号整型数据
%p ------ 输出地址
修饰符:
# ------- 八进制、十六进制输出带有前缀
m ------- 整型数据域宽
实际数值域宽 > m 原样输出
实际数值域宽 < m 左边补空格,空格数为实际域宽与m的差值
l ------- 输出长整型的数据和double类型的数据
.n ------ 浮点型数据域宽(显示小数点后n位)
实际小数点后的数值域宽 > n 保留小数点后n位
实际小数点后的数值域宽 < n 添0
转义符:
反斜杠 + 要转移功能的字符
\n:换行符
\t:制表符tab
\\: 输出 \
'\011' : \ + 八进制
'\xfffff': \ + 十六进制
虚拟内存
- 程序提前运行的环境,被直接加载到物理内存
- 4G 1G系统占用 3G用户可以使用
static 关键字
static修饰局部变量时
延长局部变量的生命周期
被static修饰的局部变量,只被初始化一次
static修饰全局变量时:
限制该变量的作用域,表示该变量只能在本文件中使用
static修饰函数,限制函数作用域
extern 关键字
extern 外部调用
extern int a; //外部调用时不能初始化
运算符
1、算术运算符:+ - * / % ++ --
eg:
int a = 10, b = 20;
printf("a + b = %d\n", a + b);
printf("a %% b = %d\n", a % b);
float c = 3.14;
//printf("a %% c = %d\n", a % c); error
char e = 'a';
char f = 'A';
printf("e %% f = %d\n", e % f);
递增、递减
++ --
后++:
先赋值,再运算
前++:
先运算、再赋值
eg2:
int a = 1;
int b = ++a; //b = 2
int c = a++; //c = 1
printf("b = %d\n", b);
2、关系运算符: > < == != >= <=
(1 > 2)
(表达式) 如果表达式为真,则输出结果为1
如果表达式为假,则输出结构为0
eg:
int a = (2 > 3);
printf("a = %d\n", a);
3、逻辑运算符:&& || !
(表达式1) && (表达式2)
如果表达式1为真并且表达式2为真,那么该输出为 1
如果表达式1和表达式2其中一个为假,则输出 0
(表达式1) || (表达式2)
如果表达式1和表达式2其中一个为真,那么该输出为 1
如果表达式1和表达式2全为假,则输出 0
!(表达式)
短路法则:
(表达式1) && (表达式2)
如果表达式1为假,那么则不执行表达式2
(表达式1) || (表达式2)
如果表达式1为真,则不执行表达式2
4、位运算符 << >> & | ~ ^
&: 遇0则0
|: 遇1则1
~: 0 -> 1 1 -> 0
^: 相同为0, 不同为1
<<: 向左移n位,低位补0,高位舍弃
>>: 高位补0 低位舍弃
5、赋值运算符
int a = 10;
a += 1; //a = a + 1
6、三目运算符
(表达式1) ? (表达式2) : (表达式3)
逻辑:
判断表达式1是否为真,如果为真,则执行表达式2,如果为假,则执行表达式3
eg:
int a,b = 0;
(2 > 3) ? (a = 1) : (b = 2);
printf("a = %d b = %d\n", a, b);
7、逗号运算符
int a = (1,2,3,4,5);
从左至右依次执行,输出最后一个逗号右边的值
8、sizeof运算符
计算数据类型或者变量的大小
sizeof(int);//计算int数据类型的大小
char c;
sizeof(c); //计算变量c的大小
9、数据类型的转换
自动转换
精度低的数据类型往精度高的数据类型转换
char->short->int->long->float->double
优先级高的先转换
强转
int a = 10;
//(float)a
运算符优先级表
Day4
复习
printf -- 通用输出函数
printf("格式控制字符串", 参数列表);
格式控制字符串中的内容会被原样输出
格式控制符
%d ---- 输出有符号十进制整型数据
%c ---- 输出字符型数据
%f ---- 输出浮点型数据
%s ---- 输出字符串
%o ---- 输出八进制整型数据
%x ---- 输出十六进制整型数据
%u ---- 无符号型整型数据
%p ---- 输出地址
修饰符:
l ---- 修饰%f ,表明输出double型数据
m ---- 整型数据域宽
m > 数值实际域宽 左补空格
m < 数值实际域宽 原样输出
.n ---- 限制小数点后几位数据
n > 小数点后位数 后补0
n < 保留小数点后n位
# ---- 区分十六进制和八进制
转义符
\ + 要转移的字符
\n
\t
\100
\xfff
\\
运算符
算数运算符:+ - * / %
关系运算符: > < == != >= <=
(1 > 2)
表达式为假,结果为 0,表达式为真,结果为 1
逻辑运算符:&& || !
(表达式1) && (表达式2)
赋值运算符:
= += -= ....
a += 1; //a = a + 1
位运算符:
& | ~ ^ << >>
递增递减运算符:
++ --
eg:
int a;
a++; //a = a + 1;
前++:
先运算、在赋值 //b = ++a;
后++
先赋值,再运算
int b = a++;
三目运算符
(表达1)?(表达式2):(表达式3)
执行表达式1,如果表达1为真,输出结果为表达式2,如果结果为假,输出结果为表达式3
逗号运算符
int a = (1,2,3);
从左至右依次执行,最后输出结果为最右边的数据
sizeof运算符
计算变量、或者数据类型的大小
int a;
sizeof(a); //4
sizeof(int);
数据类型转换
自动转换 低精度往高精度转换
char --> short --> int --> long --> float --> double
signed --> unsigned
eg:
unsigned int a = 10;
int b = -4;
if(b > a)
{
printf("b > a\n");
}
//打印 b > a
static 和 extern 关键字
static:
修饰局部变量
延长局部变量的生命周期
局部变量只被初始化一次
修饰全局变量和函数
限制作用域
extern
外部调用
运算符优先级表
1、scanf – 通用输入函数
int scanf(const char *format, ...);
const char *format:格式控制字符串
eg:
scanf("格式控制字符串", 地址表);
功能:从键盘上获取一个数据,通过变量的地址,保存在该地址对应的内存单元中
获得一个变量的地址,用取地址符号 &
格式控制符和地址表一一对应,地址表中有多个变量的地址,用 , 隔开
数值型数据:空格 tab 回车键代表输入数据之间的分隔符
非数值型数据:空格 tab键 回车代表一个字符,会被捕获输入
格式控制符:
%d --- 输入整型数据
%f --- 输入浮点型数据
%o --- 输入八进制
%x --- 输入十六进制
%u --- 输入无符号整型数据
%c --- 输入字符型数据
%s --- 输入字符串
修饰符:
l: 表示输入数据是长整型 long 或 double 双精度浮点型数据
h: 对整型的数据,表示输入为 short 短整型
m: 代表输入整型数据的域宽
m < 实际域宽 只保留m域宽的值
m > 实际域宽 原样输入
*:抑制某个类型的变量输入
%*c: 抑制脏字符 空格 tab 回车
返回值:
返回从键盘上成功输入数据的个数
2、字符输入输出函数
getchar
函数原型:
int getchar(void);
功能:
从键盘上获取一个字符
eg:
char b,c;
scanf("%c", &b);
getchar(); //可以抑制脏字符
scanf("%c", &c);
printf("b = %c c = %c\n", b, c);
putchar
函数原型:
int putchar(int c);
功能:
显示一个字符到终端上
参数:
可以是字符常量、变量或表达式
eg:
char a = 'A';
putchar(a);
putchar('\n');
3、字符串输入输出函数
gets
函数原型:
char *gets(char *s);
参数:
char *s : 字符串保存的缓冲区 //数组
功能:
从键盘上获取字符串,并将字符串保存到缓冲区(数组)中
eg:
char arr[10];
gets(arr);
printf("%s\n", arr);
puts
函数原型:
int puts(const char *s);
参数:
const char *s : 字符串首地址
功能:
输出字符串
puts函数自带'\n'
eg:
puts("hello world");
puts(" ");
4、控制语句
顺序语句
- 代码从main函数开始按照顺序执行
选择语句
一般书写形式:
单分支:
if(表达式1)
{
代码块;
}
执行规则:先执行表达式1,判断表达式1是否为真(非 0 为真, 0 为假),如果为真,则执行代码块中的内容,否则跳过 if 选择语句
表达式1通常为逻辑或关系表达式,也可以为常量
eg:
int a = 0;
if(a > 0)
{
printf("a = %d\n", a);
}
a = 20;
printf("a = %d\n", a);
二分支:
if(表达式1)
{
代码块1;
}
else
{
代码块2;
}
执行规则:
先判断表达式1是否为真,如果表达式1为真,则执行代码块1,并跳出选择语句;如果为假,则执行 else 中的语句
eg:
int a = 20;
if(a == 10)
{
printf("a = 10\n");
}
else
{
printf("a != 10\n");
}
多分支:
if(表达式1)
{
代码块1;
}
else if(表达式2)
{
代码块2;
}
else if(表达式3)
{
代码块3;
}
else
{
代码块4;
}
执行规则:
先判断表示1是否为真,如果为真则执行代码块1,并跳出选择语句;如果为假,则判断表达式2,表达式2为真,则执行代码块2,如果为假,则继续判断表达式3....., 当以上的表达式均不满足条件, 则执行else下的语句
注意:如果选择语句中的代码块有多条,需用 {} 将代码包围
if 语句可以嵌套使用
else 与 if 配对
练习:从键盘输入三个整型数据,输出打印最大值
#include <stdio.h>
int main(int argc, char *argv[])
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
printf("a = %d, b = %d, c = %d\n",a ,b, c);
if(a > b && a > c)
{
printf("max = %d\n", a);
}
else if(b > a && b > c)
{
printf("max = %d\n", b);
}
else
printf("max = %d\n", c);
return 0;
}
练习2:从键盘输入a,b,c的值,求一元二次方程的根
switch...case
一般形式:
switch(表达式)
{
case 常量表达式1 :
语句块1;
break;
case 常量表达式2 :
语句块2;
break;
default:
语句块3;
}
表达式:常量或常量表达式
运算规则:根据表达式的值,选择满足条件的常量表达式1~2,执行相应的代码块
练习:键盘输入一个同学的分数 (0 ~ 100),输出该同学分数的等级
100 : A+
100 ~ 90: A
90 ~ 80: B
80 ~ 70: C
70 ~ 60: D
< 60 : 不及格
#include <stdio.h>
int main(int argc, char *argv[])
{
float grade;
scanf("%f", &grade);
int n = grade / 10;
switch(n)
{
case 10:
printf("A+\n");
break;
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("不及格\n");
}
return 0;
}
作业
Day5
随机数
函数原型
int rand(void);
功能:
生成一个 >= 0 的随机整数
参数:
void
返回值:
返回生成的随机整数
头文件:
#include <stdlib.h>
注意:rand生成的随机数,是一个伪随机数
srand
函数原型:
void srand(unsigned int seed);
函数功能:
播下随机数种子
参数:
unsigned int seed; //随机数种子
time(NULL) //随机数种子根据系统时间变化
#include <time.h>
返回值:
void 无返回值
头文件:
#include <stdlib.h>
eg:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a;
srand(time(NULL)); //根据系统时间播下随机数种子
a = rand() % 51; //将生成的随机数控制在0~50范围内
printf("a = %d\n", a);
return 0;
}
练习:猜硬币游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
int sys_num = 0;
srand(time(NULL));
sys_num = rand() % 101;
printf("please input 1 or 2: ");
int my_num = 0;
scanf("%d", &my_num);
int flag = 0;
if(sys_num < 50)
{
flag = 1;
printf("硬币为正面\n");
}
else
{
flag = 2;
printf("硬币为反面\n");
}
if(my_num == flag && my_num == 1)
{
printf("猜对了!是正面\n");
}
else if(my_num == flag && my_num == 2)
{
printf("猜对了!是反面\n");
}
else
printf("猜错了\n");
return 0;
}
循环语句
1、while
基本形式
while(表达式)
{
代码块;
}
step:先判断表达式是否为真,如果为真,则执行循环体中的代码块一次,执行完再判断表达式是否为真... 如果为假,则跳出循环
练习:求1~100的和
#include <stdio.h>
int main()
{
int i = 1;
int sum = 0;
while(i <= 100)
{
sum = sum + i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
while(1) //死循环
2、do…while
1、基本形式
do
{
代码块;
}while(表达式);
step:
先执行一次代码块,再判断表达式是否为真,如果为真则继续执行循环体中的代码块... 如果为假退出该循环体。
练习:打印100 ~ 1000的水仙花数
3、for
1、表达形式
for(表达式1; 表达式2; 表达式3)
{
代码块;
}
表达式1: 循环控制变量的初始化,只在第一次进入for循环初始一次
表达式2: 循环退出的条件
表达式3: 循环控制变量的自增或自减
step:
先初始化表达式1, 再判断表达式2是否为真,如果表达式2为真,则进入循环体,执行一次代码块,再执行表达式3.... ; 如果表达式2为假,则直接退出循环
练习:
1、从键盘输入一个整型数据,打印n个*
2、键盘输入 n m 两个整型数据,打印n*m排列组成的矩形,用*号显示
3、打印一个直角三角形
4、goto
goto 标识符
标识符:
只要程序遇到goto,那么程序就会无条件跳转到标识符处
eg: 用goto实现1~100的和
int main()
{
int i = 1;
int sum = 0;
A:
sum = sum + i;
i++;
if(i <= 100)
goto A;
printf("sum = %d\n", sum);
return 0;
}
注意:一般 goto 和 if 连用
标识符可以有多个
goto不能跨函数使用
一般情况下不使用goto
5、break
- 从当前循环体内跳出
6、continue
- 提前结束本次循环,并判断下一次是否进入循环
- continue是结束本次循环,break是终止本层循环
作业
打印一个菱形
打印九九乘法表
对于一个大于等于3的正整数,判断是否为素数