C语言笔记(一)

一、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 84  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
   逢二进一
   01
   基数: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 		--82、存储类型: auto register extern static const volatile			    --63、语句: if else switch case while do for continue break goto return default --124、构造: struct unione enum										--35、空类型: void 
6、取别名: typedef
7sizeof运算符: sizeof

2、标识符

标识符是程序员按照命名规则自定义的符号
命令规则:
    1、只能由字母、数字、下划线组成
    2、不能以数字开头
    3、不能和关键字重名 
大小写敏感

3、运算符

1、算数运算符: + - * / %
2、逻辑运算符: && ||3、关系运算符: > < == != >= <=
4、位运算符: & | ~ ^ >> <<
5、赋值运算符: = += -= *= /=    
6、递增递减运算符: ++ --
7、地址运算符: * & 
8、逗号运算符: ,
9sizeof运算符: 计算数据类型的大小
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、位运算符 << >> & | ~ ^ 
    &:00
    |:11
    ~: 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);
从左至右依次执行,输出最后一个逗号右边的值
    
8sizeof运算符
    计算数据类型或者变量的大小
    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

staticextern 关键字
static:
	修饰局部变量
        延长局部变量的生命周期
        局部变量只被初始化一次
    修饰全局变量和函数
    	限制作用域
extern
    外部调用

运算符优先级表

1、scanf – 通用输入函数

int scanf(const char *format, ...);
const char *format:格式控制字符串
eg:
	scanf("格式控制字符串", 地址表);
功能:从键盘上获取一个数据,通过变量的地址,保存在该地址对应的内存单元中
      获得一个变量的地址,用取地址符号 &
格式控制符和地址表一一对应,地址表中有多个变量的地址,用 , 隔开
数值型数据:空格 tab 回车键代表输入数据之间的分隔符
非数值型数据:空格 tab键 回车代表一个字符,会被捕获输入
格式控制符:
    %d --- 输入整型数据
    %f --- 输入浮点型数据
    %o --- 输入八进制
    %x --- 输入十六进制
    %u --- 输入无符号整型数据
    %c --- 输入字符型数据
    %s --- 输入字符串
修饰符:
    l: 表示输入数据是长整型 longdouble 双精度浮点型数据
    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 语句可以嵌套使用
     elseif 配对
    
练习:从键盘输入三个整型数据,输出打印最大值
    #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;
}
注意:一般 gotoif 连用
    标识符可以有多个
    goto不能跨函数使用
    一般情况下不使用goto

5、break

  • 从当前循环体内跳出

6、continue

  • 提前结束本次循环,并判断下一次是否进入循环
  • continue是结束本次循环,break是终止本层循环

作业

打印一个菱形
打印九九乘法表
对于一个大于等于3的正整数,判断是否为素数

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式石油工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值