C语言基础(二)

目的:掌握用C语言编程的基本技能
内容:1.全局变量与局部变量
   2.switch语句
   3.for循环
   4.while循环
   5.break与continue
   6. getchar()的运用
   7. 数组
   8. while训练之十进制转化为二进制
   9. 数组训练之产生不同随机数
   10. "最强大脑“小游戏实战
   11. ATM实战

全局变量与局部变量

根据变量的作用域不同,可分为全局变量和局部变量
1.全局变量:在所有函数外部定义的变量(即在main函数前面定义的变量),作用域为从声明开始到程序结束
局部变量:在函数内部定义的变量(即在代码块之间定义的变量),作用域仅限于函数内部,离开该函数后无效
2.在同一源文件中,允许全局变量与局部变量重名。重名时,在局部变量作用域内,起作用的是局部变量,同名的全局变量被屏蔽
3.允许在不同的函数中使用相同的变量名,因为它们代表不同的变量
4.局部变量不能赋值为同名全局变量的值

#include <stdio.h>

int a = 0;//全局变量 
int main(){
  int a = 1;//局部变量 
  printf("a = %d",a);//输出 a = 1 

 return 0;
}

switch语句

1.用于一个变量有多个确定的值,而不同的值对应的执行语句不同的情况,格式如下:

switch(表达式){
      case 常量表达式1:
           语句1:
      case 常量表达式2:
           语句2;
      ......
      case 常量表达式 n:
           语句n;
      default:
           语句 n + 1 ; 
  } 

2.注意:

  • 表达式必须是一个常量(如 int,char类型等)或者枚举类型,且表达式与常量表达式必须是相同的数据类型
  • 当表达式的值为某个常量表达式时,执行该表达式后的语句
  • 当语句中出现break时,语句中断并跳出switch;如果没有出现break,控制流将继续执行后面的case,直到遇到break才结束
  • 一个switch语句可以有一个出现在switch语句末端的default case
#include <stdio.h>

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;
} 

for循环

1.for循环的格式为:for(循环控制变量;运行的条件;控制变量的变化){语句块}
例如: for(int i=0;i<10;i++){printf("%d",i);}

  1. for循环中间条件是必须的,其他部分可以省略,但分号不可以省略
    如:for(;1<2;)

3.循环控制变量的定义和初始化只执行一次
4.循环控制变量什么时候变化?当这一次循环结束之后
5.for( ; ; )与while(1)等价,都时不停执行语句的死循环

int main(){
  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;
      }
  }//不断输出1-10之间的整数
  
  for(; ;) {
      
  }//死循环 

while循环

  1. while循环的格式为:while(表达式){语句块}
  2. 先计算表达式的值,当值为真时,执行语句块
  3. 执行完语句块后再次计算表达式的值,如果为真,继续执行语句块
  4. 重复执行这个过程,直到表达式的值为假再退出循环,执行while语句后的代码
#include <stdio.h>

//使用while循环计算1-10的和 
int main(){
  int a = 1;
  int sum = 0;
  while(a <= 10){
      sum += a;
      a++;
  }
  printf("%d",sum);

 return 0;
}

break与continue

  1. break:
    在switch语句中,当遇到break时,跳出switch;在while和for循环中,当遇到break时,会跳出循环而执行后面的代码
  2. continue(只用于while和for循环语句):
    跳过循环体中剩余语句而强制进入下一次循环

getchar()的运用

  1. getchar()用于从缓冲区取走一个字符
  2. 输入1,按下回车键后,缓冲区里为1\n,之后1被放到a的地址中,此时缓冲区剩下\n
    输入2,按下回车键后,缓冲区里为\n2\n,而getchar()从缓冲区取走一个\n,缓冲区剩下2\n,之后2被放到b的地址中,此时缓冲区剩下\n
    输入3,按下回车键后,缓冲区里为\n3\n,而getchar()从缓冲区取走一个\n,缓冲区剩下3\n,之后3被放到c的地址中,此时缓冲区剩下\n
#include <stdio.h>

int main(){
  char a;
  printf("请输入a:"); 
  scanf("%c", &a);
  
  char b;
  printf("请输入b:");
  getchar();
  scanf("%c", &b);
  
  char c; 
  printf("请输入c:");
  getchar();
  scanf("%c", &c);
  
  printf("a=%c b=%c c=%c\n",a,b,c);


 return 0;
}
/*程序运行: 
请输入a:1
请输入b:2
请输入c:3
a=1 b=2 c=3*/

数组

  1. 数组:用于储存多个相同类型数据的集合
  2. 数组的声明格式: 数组储存类型+数组名字+[数组大小]
    例如:int array[3]
  3. 数组名就是数组的首地址
  4. 系统为数组分配内存空间的时候,必须明确知道数组元素的个数
  5. 在C语言中,可以逐个初始化数组,也可以使用一个初始化语句
  6. 数组的初始化:
  • 定义时要明确指定数组的大小,如:
int array1[4];
  • 如果省略了数组的大小,数组的大小则为初始化时元素的个数,如:
  int array[] = {1,2,3,4};
  • 大括号里,值的数目不能大于数组声明时在方括号里指定的数组大小,如:
int array2[2] = {1,2}; 
  1. 数组元素的赋值:
array[0] = 2;//将数组第1个位置赋值为2 
array[1] = 23;//将数组第2个位置赋值为23 

while训练之十进制转化为二进制

#include <stdio.h>

int main(){
  int num;
  printf("请输入一个数字:");
  scanf("%d",&num);
  
  //二进制
  int wei = 1;
  long long sum = 0; 
  while(1){
      //取余
      int yu = num % 2;
      num = num / 2;
      
      //目前的总和:当前位数的值 + 之前的值
      sum = sum + yu * wei;
      wei = wei * 10;
      
      if(num < 2){
          sum = sum + num * wei;
          break;
      } 
  }
  printf("%d\n",sum);

 return 0;
}

数组训练之产生不同随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h> 

//4.产生4个(不同)随机数 保存到数组 输出 
int main(){
  int array[4] = {};
  
  srand(time(NULL));
  
  /*生成数组  产生随机数的同时比较是否重复 
  如果重复就重新产生一个随机数 
  如果不重复就保存
  每次i的值正好可以用来判断已经有几个数了*/ 
  for(int i = 0;i < 4;i++){
      int temp = rand() % 100;
      
      if(i == 0){
          //第一个 直接保存
          array[i] = temp; 
      }else{
          //判断前面是否已经存在这个数
          int j = 0;
          for(;j < i;j++){
              //比较j对应的值和temp是否相同
              if(array[j] == 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;
}

"最强大脑“小游戏实战

#include <stdio.h>
#include <stdlib.h>//设置随机数需导入该头文件
#include <time.h>//设置随机数需导入该头文件 
#include <windows.h>//设置延时需导入该头文件 

int main(){
  int count = 3;//记录每次生成多少个随机数 
  printf("欢迎来到最强大脑!游戏开始!\n");
  
  while(1){ 
  unsigned int seed = time(NULL);//1000
  //设置随机数的种子 
   srand(seed);
  for(int i = 0;i < count;i ++){
      //生成一个随机数 
      int temp = rand() % 9 + 1;
      printf("%d\n",temp);
  }
  
  //延时2s 
  Sleep(2000); 
  //for(int i = 0;i < 10000000000/15*2;i++)
  
  //刷新屏幕
  system("cls");
  /* mac: 
  for(int i = 0;i < 20;i++){
     printf("\n");
   }
   */
  
  int input;
  printf("请输入你看到的数字:");
  
  //重新设种子 和之前生成的种子一样
   srand(seed); 
  
  //接收用户输入 一个一个接收 
  for(int i = 0;i < count;i++){
      scanf("%d",&input);
      
      //获取对应生成的随机数
      int old = rand() % 9 + 1;
      
      //判断输入的数和随机数是否相同 
      printf("old:%d\n",old);
      if(input != old){
          printf("错误 退出!\n");
          exit(EXIT_SUCCESS); 
      } 
  }
  
  count ++; 
  } 

   return 0;
}

ATM实战

#include <stdio.h>
#include <stdlib.h>

int main(){
  int password = 123;//原始密码 
  int input;//输入密码
  int wrongtime = 3;//错误次数
  int total = 1000;//余额 
   
  printf("*****************************\n");
  printf("      欢迎使用建设银行       \n"); 
  printf("*****************************\n");
  printf("请输入密码:"); 
  
   for(int i = 1;i <= wrongtime;i ++){
      scanf("%d",&input); //输入密码 
      //密码正确 
      if(input == password){
          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; 
      case 3://查询余额 
      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");
                  password = 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;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,325评论 0 2
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,617评论 3 71
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,424评论 3 44
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,895评论 2 13
  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 1,124评论 0 0