学习内容
全局变量与局部变量
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
");
break;
case 2:
printf("你输入的是2
");
break;
default:
printf("你输入的是3
");
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
", i);
}
//输出不停输出1-10之间的整数
for(int i = 1; i <= 10; i++){
printf("i = %d
", 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
",sum);
return 0;
}
输出:
sum = 5050
5.Break与Continue关键字
Break
在 switch 语句,当遇到 break 时,不再执行 switch 中的任何语句
在 while,for 循环当中,当遇到 break 时,会终止循环而执行整个循环语句后面的代码
Continue
跳过循环体中剩余的语句而强制进入下一次循环 (只用于 while、for 循环语句当中)
6.printf与scanf相关
缓冲区:输入输出流
printf
向终端输出字符串
先将字符串内容输入到缓冲区,之后再依次输出缓冲区内容
printf
scanf
接收终端的输入
在缓冲区里读数据,当缓冲区里有对应类型数据,就从缓冲区里面取数据
如果没有对应类型数据,就等待用户输入数据
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("
a=%c b=%c c=%c
",a,b,c);
return 0;
}
输出
请输入a:A
请输入b:B
请输入c:
a=a b=b c=
输入 A ,按下回车之后,缓冲流里面为 A
之后取出 A 放到 a 的地址里面,此时缓冲区还剩下
输入 B,按下回车之后,此时缓冲区里面为 B
getchar()从缓冲区里面拿走一个
,缓冲里还剩下 B
之后取出 B 放到 b 的地址里,此时缓冲区还剩下
因为缓冲区里面有字符 ,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("
");
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("**********************
");
printf(" 欢迎使用建设银行系统
");
printf("**********************
");
printf("请输入密码:");
for(int i = 1;i <= wrongTime; i++){
scanf("%d", &input);
//判断密码
if(input == old){
//密码正确
break;
}
if(i == wrongTime){
printf("错误次数过多!
");
return 1;
}
//密码不正确
printf("密码不正确,请重新输入密码:");
}
int choice;//接收用户选择
char goon;//是否继续
for(; 1 < 2;){
//主界面
printf("*****************************
");
printf("1.存款
");
printf("2.取款
");
printf("3.查询
");
printf("4.更改密码
");
printf("5.退出
");
printf("*****************************
");
//提示用户选择
printf("请选择操作:");
scanf("%d", &choice);
//判断操作
switch(choice){
case 1: //存款
int temp;//存款金额
printf("请输入存款金额:");
scanf("%d", &temp);
total += temp;
printf("存款成功!可用余额为:%d
",total);
break;
case 2: //取款
int temp2;//取款金额
for(;1<2;){
printf("输入取款金额:");
scanf("%d", &temp2);
if(temp2 > total){
printf("余额不足 ");
}else{
total -= temp2;
printf("取款成功 余额为%d
",total);
break;
}
}
break;
printf("当前余额为:%d
",total);
break;
case 4: //更改密码
int n1;//第一次输入的密码
int n2;//第二次输入的密码
for(;1<2;){
printf("请输入新密码:");
scanf("%d", &n1);
printf("请确认密码:");
scanf("%d", &n2);
if (n1 == n2){
printf("密码设置成功!
");
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("
");
// 延时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("错误 退出!
");
exit(EXIT_SUCCESS);
}
}
printf("正确!
");
//增加产生数字的个数
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
//比较j对应的值和temp是否相同
if(array[j] == temp){
//重复了 打印重复了的数字
printf("重复了:%d
",temp);
break;
}
}
//判断是怎么出来的
if (j == i){
//将i前面的比较一遍都没发现重复的
//保存temp值
array[i] = temp;
}else{
//重复了
//重新回到当前这一次
i--;
}
}
}
//输出
for (int i = 0; i< 4; i++){
printf("%d ", array[i]);
}
return 0;
}