学习内容
全局变量与局部变量
switch语句
for循环
while循环
Break与Continue关键字
printf与scanf相关
数组
rand() 与 srand()函数
循环训练demon之ATM
循环训练demon之记数字
数组训练之不同随机数
1.全局变量与局部变量
因为变量作用域的不同,分为了局部变量与全局变量
全局变量
在所有函数外部定义的变量
作用域是从声明时刻开始,到程序结束局部变量
函数内部定义的变量
作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错
- 在同一源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用
- 允许在不同的函数中使用相同的变量名,他们代表不同变量
- 当全局变量与局部变量重名的时候,起作用的是局部变量,全局变量被屏蔽掉
- 局部变量不能赋值为同名全局变量的值
#include
int a = 3;//全局变量 int main(){ int a = 4;//局部变量 printf("a = %d",a); return 0; } 输出: a = 4
2.switch语句
一个变量有多种值的情况下,不同值对应的情况不同,根据不同的值执行不同的语句
switch(表达式){ case 常量表达式1: 语句 1; case 常量表达式2: 语句 2; ...... case 常量表达式n: 语句 n; default: 语句 n+1; }
- 表达式必须是一个常量(int,char类型等)或者枚举类型
- 表达式与常量表达式必须都是相同的数据类型
- 当表达式的值等于某个常量表达式的值之后,执行该表达式之后的语句
- 当语句中出现 break 的时候,语句中断,并跳出 switch
- 如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾
//通过输入1-3来判断输入的结果 int main(){ int a = 0; printf("请输入一个数1-3:"); scanf("%d", &a); switch(a){ case 1: printf("你输入的是1\n"); break; case 2: printf("你输入的是2\n"); break; default: printf("你输入的是3\n"); break; } return 0; } 输出: 请输入一个数1-3:3 你输入的是3
3.for循环
for( init ; condition ; increment ){ 语句 // init : 循环变量赋初值(表达式1) //condion : 循环条件(表达式2) //increment : 循环变量增值(表达式3) }
- 循环控制变量的定义和初始化只执行一次
- 表达式1、表达式2和表达式3之间是用分号
;
隔开的- for(表达式1;表达式2;表达式3)的后面不要加(
;
)分号- for 循环的循环条件(condition)是决定循环的次数
- for( ; ; )与while(1) 等价,都是死循环,不停的执行语句
int main(){ //输出1-10 之间的整数 for(int i = 1; i <=10; i++){ printf("i = %d\n", i); } //输出不停输出1-10之间的整数 for(int i = 1; i <= 10; i++){ printf("i = %d\n", i); if(i == 10){ i = 0; } } //死循环 for(; ;) { } return 0; } 输出: 第一个循环输出 i = 1 到 i =10; 第二个循环持续输出 i = 1 到 i =10 ; 第三个循环死循环,一直加载,从未停止;
4.while循环
while(表达式){ 语句块 } //表达式:循环条件 //语句块:循环体
- 先计算“表达式”的值,当值为真时, 执行“语句块”
- 执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”
- 重复执行这个过程,直到表达式的值为假,就退出循环,执行 while 语句后面的代码
//使用while循环打印1-100的和 int main(){ int i=1;//控制循环条件 int sum=0;//总和 while(i<=100){ sum+=i; i++; } printf("sum = %d\n",sum); return 0; } 输出: sum = 5050
5.Break与Continue关键字
Break
在 switch 语句,当遇到 break 时,不再执行 switch 中的任何语句
在 while,for 循环当中,当遇到 break 时,会终止循环而执行整个循环语句后面的代码
Continue
跳过循环体中剩余的语句而强制进入下一次循环 (只用于 while、for 循环语句当中)
6.printf与scanf相关
缓冲区:输入输出流
printf
向终端输出字符串
先将字符串内容输入到缓冲区,之后再依次输出缓冲区内容
scanf
接收终端的输入
在缓冲区里读数据,当缓冲区里有对应类型数据,就从缓冲区里面取数据
如果没有对应类型数据,就等待用户输入数据getchar(): 从缓冲区读取一个字符
#include
int main(){ char a; printf("请输入a:"); scanf("%c", &a); char b; printf("请输入b:"); getchar(); scanf("%c", &b); char c; printf("请输入c:"); scanf("%c", &c); printf("\na=%c b=%c c=%c\n",a,b,c); return 0; } 输出 请输入a:A 请输入b:B 请输入c: a=a b=b c= 输入 A ,按下回车之后,缓冲流里面为
A\n
之后取出 A 放到 a 的地址里面,此时缓冲区还剩下\n
输入 B,按下回车之后,此时缓冲区里面为\nB\n
getchar()从缓冲区里面拿走一个\n,缓冲里还剩下B\n
之后取出 B 放到 b 的地址里,此时缓冲区还剩下\n
因为缓冲区里面有字符\n
,scanf就将缓冲里的内容放到 c 的地址里
所以当我们输入A,B之后,就直接输出了结果
7.数组
数组:用于储存多个相同类型数据的集合
数组相关
- 能够存储数据 就必须要有内存
- 如何定义一个数值的同时为他分配内存
- 数组定义时必须明确知道数组的大小
- 数组名就是数组的首地址
声明数组
在C 语言中,声明一个数组,需要指定元素的类型和元素的数量
//数组声明格式 type arrayName [arraySize]; //arrayName:数组名字 //[]:数组标识 //type:数组存储类型 //arraySize:数组大小
初始化数组
- C 语言当中,可以逐个初始化数组,也可以使用一个初始化语句。大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
int a[4] = {2,45,21,45};
- 如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。
int a[] = {2,3,564,7};
- 在定义时期明确指定数组的大小
int temp[5];
数组元素赋值
a[3] = 56; //将数组第4个位置的值赋为56
8.rand() 与 srand()函数
rand()函数
函数头文件:stdlib.h
函数定义:int rand(void)
函数功能:产生一个随机数
返回值: 返回0至RAND_MAX之间的随机整数值
srand()函数
函数头文件:stdlib.h
函数定义:void srand(unsigned int seed)
函数功能:设置随机数种子
函数说明:通常可以用getpid()(获取当前进程的进程识别码)或者time(NULL)(获取当前系统的时间信息)来充当种子,保持每次运行时种子是不一样的#include
#include #include int main(){ for(int i = 0;i < 5;i++){ //产生1-10以内的数字 int temp = rand()%9 + 1; printf("%d ",temp); } printf("\n"); srand(time(NULL));//播种 for(int i = 0;i < 5;i++){ int temp1 = rand()%9 + 1; printf("%d ",temp1); } return 0; } 输出:(第一次结果) 6 9 8 5 9 5 3 1 4 6 输出:(第二次次结果) 6 9 8 5 9(与第一次相同) 5 2 1 7 2
9.循环训练demon之ATM
#include
int main(){ int old = 123;//原始密码 int input;//输入密码 int wrongTime = 3; //错误次数 printf("**********************\n"); printf(" 欢迎使用建设银行系统\n"); printf("**********************\n"); printf("请输入密码:"); for(int i = 1;i <= wrongTime; i++){ scanf("%d", &input); //判断密码 if(input == old){ //密码正确 break; } if(i == wrongTime){ printf("错误次数过多!\n"); return 1; } //密码不正确 printf("密码不正确,请重新输入密码:"); } int choice;//接收用户选择 char goon;//是否继续 for(; 1 < 2;){ //主界面 printf("*****************************\n"); printf("1.存款\n"); printf("2.取款\n"); printf("3.查询\n"); printf("4.更改密码\n"); printf("5.退出\n"); printf("*****************************\n"); //提示用户选择 printf("请选择操作:"); scanf("%d", &choice); //判断操作 switch(choice){ case 1: //存款 int temp;//存款金额 printf("请输入存款金额:"); scanf("%d", &temp); total += temp; printf("存款成功!可用余额为:%d\n",total); break; case 2: //取款 int temp2;//取款金额 for(;1<2;){ printf("输入取款金额:"); scanf("%d", &temp2); if(temp2 > total){ printf("余额不足 "); }else{ total -= temp2; printf("取款成功 余额为%d\n",total); break; } } break; printf("当前余额为:%d\n",total); break; case 4: //更改密码 int n1;//第一次输入的密码 int n2;//第二次输入的密码 for(;1<2;){ printf("请输入新密码:"); scanf("%d", &n1); printf("请确认密码:"); scanf("%d", &n2); if (n1 == n2){ printf("密码设置成功!\n"); old = n1; break; } else{ printf("两次输入不一致!"); } } break; default://退出 exit(EXIT_SUCCESS);//成功退出 break; } //提示是否继续 for(;1<2;){ printf("是否继续(y/n):"); getchar(); scanf("%c", &goon); if(goon == 'y'){ break; } if (goon == 'n'){ exit(EXIT_SUCCESS); } printf("输入无效 "); } } return 0; }
10.循环训练demon之记数字
#include
#include #include #include int main(){ int count = 3;//记录每次生成多少个随机数 while(1){ unsigned int seed = time(NULL); //设置产生种子的时间固定 //设置随机数的种子 srand(seed); for(int i = 0; i < count; i++){ //生成一个随机数 int temp2 = rand() % 9 + 1; printf("%d ",temp2); } printf("\n"); // 延时2s Sleep(2000); //刷新屏幕 system("cls"); int temp;//定义用户输入的变量 printf("请输入:"); //重新设种子和之前生成时的种子一样 srand(seed); //接收用户输入 一个一个接收 for(int i = 0; i < count; i++){ scanf("%d", &temp); //获取对应的生成的随机数 int old = rand() % 9 + 1; //比较输入的和随机数是否相同 if (temp != old){ printf("错误 退出!\n"); exit(EXIT_SUCCESS); } } printf("正确!\n"); //增加产生数字的个数 count++; } return 0; }
11.数组训练之不同随机数
#include
#include #include int main(){ int array[4] = {}; srand(time(NULL));//初始化随机种子 for (int i = 0; i < 4; i++){ //产生一个随机数 int temp = rand() % 4; if (i == 0){//第一个随机数 直接保存到数组 array[i] = temp; }else{ //判断前面是否已经存在了 int j = 0; for(; j