标准c基础知识笔记二

13年前


 
 流程
 if (条件)
 {
 }else
 {
 }
 
 
 #include <stdio.h>
 
 int main()
 {
  int age;
  printf("please input your age:");
  scanf("%d",&age);//age的地址,这里一定是&,要不后期可能会出问题
  if (age<0 || age>1000)
  {
   printf("This is not human\n");
  }
  else if(age<16)
  {
   printf("smaller,dont move");
  }
  else if (age>100)
  {
   printf("you are order");
  }
  else
  {
   printf("welcome to here\n");
  }
  return 0;
 }
 
 
 vi自动缩进:set autoindent
 
 
 switch(int,表达式)
 {
  case int字面量(或者short,char):
  case int字面量:
  
 
 }
 首先先计算表达式,得到一个结果;然后再根据结果与case入口对比,执行后面的语句
 break;出口语句;如果没有break,会执行case入口后的所有的语句,直到碰到break
 default;可选入口;
 
 #include <stdio.h>
 
 int main()
 {
  printf("我们这里有如下课程:\n");
  printf("1---c++\n");
  printf("2---嵌入式\n");
  printf("3---java\n");
  printf("你想学哪一门");
  
  char ch;
  scanf(" %c",&ch);
  switch(ch){
  case '1':   //思考为什么这里不是case 1:    缘由上面定义的ch为字符
   printf("学会c++,有饭吃\n");
   break;
  case '2':
   printf("学会嵌入式,有肉吃\n");
   break;
  case '3':
   printf("学会java,吃香的喝辣的\n"); 
   break;
  default:
   printf("你想学什么呢");
   break;
  }
  
 }
 

 
 
 循环(迭代)
 
 while(条件){...}
 do{...}while(条件);//至少做一次
 
 #include <stdio.h>
 
 int main()
 {
  double money;
  printf("来到游戏厅\n");
  printf("你现在有多少钱?\n");
  scanf("%lf",&money);
  while(money>=10){
   printf("换10元游戏币\n");//或者puts("换10元游戏币");
   money-=10;
   puts("玩游戏..........游戏币用完");
  
  }
  printf("钱不够了,回家喽\n");
 }
 
 //常规性的写无限次循环,用while(1)
 
 vi dowhile.c
 
 //考驾照
 #include <stdio.h>
 
 int main()
 {
  int score;
  do{
   printf("考试完毕,输入成绩:");
   
  }while(score<60);
  printf("恭喜你通过考试!\n");
  return 0;
 }
 
 
 scanf不是直接从键盘读取数据,而是键盘输入信息之后,存在键盘缓冲区内,一旦敲入回车后,数据就存储到输入缓冲区中;
 使用scanf时,会按照对应类型一个个的从输入缓冲区中提取数据
 如果输入的数据多了,会供下次读取使用,而不是丢弃。如果真想丢弃剩下的内容,可以用
 scanf("%d",&score);
 scanf("%*[^\n]%*c");//清除输入缓冲区剩余的字符
 
 #include <stdio.h>
 
 int main()
 {
  int score;
  do{
   printf("考试完毕,输入成绩:");
   if (scanf("%d",&score)==1)
   {
    printf("成绩是%d\n",score);
   }
   else
   {
   printf("输入无效\n");
   }
  }while(score<60);//成绩小于60重新再考
  printf("恭喜你通过考试!\n");
  return 0;
 }
 
 
 变量的作用范围:在{}之内定义的,本{}之外就不能用了。
 
 
 
 for(准备;条件;调整)
 {
 循环体
 }
 
 从键盘输入10个成绩,输出其平均成绩
 
 vi for.c
 #include <stdio.h>
 
 int main()
 {
  int score;
  int sum=0;
  int i;
  for (i=0;i<10;i++)
  {
   printf("请输入%d个成绩",i+1);
   scanf("%d",&score);
   sum+=score;
  }
  printf("平均成绩为:%f\n",(float)sum/10);//sum/10.0
  return 0;
 }

 无限循环用:for(;;){}
 
 vi for1.c
 #include <stdio.h>
 
 int main()
 {
  int score;
  int sum=0;
  int i;
  for (i=0;i<10;i++)
  {
   printf("请输入%d个成绩",i+1);
   if(scanf("%d",&score)!=1){
    printf("输入无效!\n");
    scanf("%*[^\n]%*c");
    //什么意思呢?
    //判断用户输入的是1个有效还是多个有效输入,如果是一个则继续
    --i;//考虑到下面continue调整部分照常执行,而有时我们并不希望他这样执行
    continue;//跳过循环体中剩余的内容;调整部分照常执行
        //循环体执行到此为止,不再执行下面内容
   }
   if (score<0 || score>100)
   {
    break;//跳出循环;switch case和for循环中可以使用break
   }
   sum+=score;
  }
  printf("平均成绩为:%f\n",(double)sum/i);//sum/10.0
  return 0;
 }
 

 goto让程序变的比较乱,程序中尽量少使用goto。如果费用,则在同一个函数或者从里层跳到外层使用
 
 
 要求输入1-9之间的整数,如果不是的话,重来?do{....}while()
 然后再根据输入的数字,来输出99表
 
 vi inttest.c
 
 #include <stdio.h>
 
 int main()
 { 
  int m=0;
  int cnt;
  //1读取一个1-9的整数
  //1.1读取一个整数
  //1.2清除缓冲区
  //1.3只要输入无效或者不在1-9之间就重来,回到1.1
  //2以那个数为行数输出九九表
  //2.1反复m次,每次输出一行
  //2.2反复根据是第几行决定输出几列
  //2.3每个乘法式:小x大=积
  //2.4乘法式后面输出逗号或者换行
  
  do{
   printf("请输入一个0-10以内的整数:\n");
   cnt=scanf("%d\n",&m);
   scanf("%*[^\n]%*c"); 
  }while(cnt!=1||m<1||m>9);
  int i,j;
  for(i=1;i<=m;i++)//理解2.1
  {
   for(j=1;j<=i;j++)//理解2.2
   {
    printf("%d*%d=%d%c",j,i,j*i,j!=i?',':'\n');
    //理解2.3,2.4
   }
  }
 
  return 0;
 }
 
 
 
 
 //在C语言中可以用名字代替一段什么东西
 方法一:#define CPP '1'
 方法二:枚举enum,可以定义一些枚举常量,只能是整数;也可以用字符
 c语言里面可以定义一些枚举
 
 比如,我们可以用枚举来实现一个bool类型;(用0和1不如用true和false直观)
 #include <stdio.h>
 //#define true 1
 //#define false 0
 enum bool{true,false};//我们自定义的枚举类型,bool为类型名,{}为枚举常量,也是字面量
 //在这里true和false为枚举常量;第一个是0,后面一个是前一个值+1
 //从0开始,一次加1
 //也可以自己指定enum bool{true=1,false=0,adc}
 //true为1,false为0,adc为1
 enum mode{UREAD=0400,UWRITE=0400,UEXEC=0100,GREAD=0040,GWRITES=0020,GEXEC=0010,OREAD=0004,OWRITE=0002,OEXEC=0001,NONE=0000};
 enum course{CPP,JAVA,DOTNET,TEST};
 int main()
 {
  printf("%d\n",true);
  printf("%d,%d,%d,%d\n",CPP,JAVA,DOTNET,TEST);
  printf("%d--C++\n",CPP);
  printf("%d--JAVA\n",JAVA);
  printf("%d--.NET\n",DOTNET);
  printf("%d--测试\n",TEST);
  printf("请选择:");
  int n;
  scanf("%d",&n);
  switch(n){
  case CPP:puts("C++课程");break;
  case JAVA:puts("java课程");break;
  case DOTNET:puts(".net课程");break;
  case TEST:puts("测试课程");break;
  default:puts("无效");break;
  }
  
  enum bool a;//定义变量
  typedef enum bool BL;//给类型起别名
  BL b;
  b=false;
  a=true;
  printf("a=%d,b=%d",a,b);
  
  return 0;
 }


 从键盘输入一个整数,输出它的二进制形式
 vi bin.c
 
 #include <stdio.h>
 
 int main()
 {
  const int bits=sizeof(int)*8;//int有多少位
  unsignedint mask=0x80000000; //unsigned int mask=1<<bits-1
  int n;
  printf("input an integer:");
  scanf("%d",&n);
  int i;
  for(i=0;i<bits;i++)
  {
   printf("%c",n&mask?'1':'0');
   //mask=mask>>1;
   n<<=1;
  }
  printf("\n");
  return 0;
 }
 
练习: 
 从键盘输入1个有效日期,如果无效重来;输出这个日期是这一年的第几天?
 从键盘输入10个整数,输出最大最小的整数是谁?