蓝桥杯单片机第一周C语言

**蓝桥杯备赛 第一周(C语言)

1.编写一个简单的C代码(printf)

#include <stdio.h>
#include <stdlib.h>
​
int main()
{
    printf("Hello micu");
    return 0;
}

1.1转义序列

\n换行【\\n:则是显示\n】

#include <stdio.h>
#include <stdlib.h>
​
int main() 
{
    printf("hello micu\nhello may");
    return 0;
}

1.2变量和赋值

变量的声明需要在使用之前

//整数
int a = 3;
//小数
float b = 3.14;

加减乘除:+ - * / 取余:%

例题:设计一个C语言,通过长宽高计算长方体体积

#include <stdio.h>
#include <stdlib.h>
​
int length=2;
int width=3;
int hight=4;
int volum;
​
int main(int argc, char *argv[]) 
{
    volum=length*width*hight;
    printf("该长方体的体积为:%d",volum);
​
    return 0;
}

占位符:int 类型的占位符为%d float类型的占位符为%f

scanf:输入内容赋值给变量

#include <stdio.h>
#include <stdlib.h>
​
int length;
int width;
int hight;
int volum;
​
int main(int argc, char *argv[]) 
{
    printf("请输入长:");
    scanf("%d",&length);
    printf("请输入宽:");
    scanf("%d",&width);
    printf("请输入高:");
    scanf("%d",&hight);
    volum=length*width*hight;
    printf("该长方体的体积为:%d",volum);
​
    return 0;
}

注释:// /* */

main函数有且只有一个

1.3相关扩展

1.3.1预处理指令

//预处理指令
#include stdio.h
#include stdlib.h
​
#define PI 3.14f //宏定义
//area=3.14*r*r等价area=PI*r*r

1.3.2变量的声明

变量的命名规则:

只能包含英文字母,数字,下划线 temputure_2

不能以数字开头,必须以英文字母或者下划线开头 3val 3_val val3 val_3

不能和关键字重复 main int return

区分大小写 May mAy maY may MAY MAy May

可以一次声明多个,中间用逗号隔开

int length,width,hight;

1.3.3格式化输入/输出

int x;
f(x)=X^2 //f(2)=4
//占位符%d 整数 %f 小数
   printf("a=%d\nb=%f",a,b);
/*
%n.md  %n.mf
n代表最小栏宽,如果不足将会左侧补空格,超过则正常显示
前者m代表显示有效位数,不足补0,超过则正常显示 
后者表示小数点后有效位数,默认6
*/
printf("a=%d\nb=%.2f",a,b);
scanf("%d%f",&a,&b);//一一匹配
​

随堂练习:

例1:提示用户输入圆的半径,计算体积并显示

#include <stdio.h>
#include <stdlib.h>
#define PI 3.14f
​
int r;
float volum;
​
int main(int argc, char *argv[]) 
{
    printf("请输入半径:");
    scanf("%d",&r);
    volum=4.0f/3.0f*PI*r*r*r;
    printf("圆的体积为:%f",volum);
return 0;
}

例2:提示用户输入两个不同的圆的半径,计算体积并显示

#include <stdio.h>
#include <stdlib.h>
#define PI 3.14f
​
int r1,r2;
float volum1,volum2;
​
int main(int argc, char *argv[]) 
{
    printf("请输入第一个圆的半径r1:");
    scanf("%d",&r1);
    printf("请输入第二个圆的半径r2:");
    scanf("%d",&r2);
    volum1=4.0f/3.0f*PI*r1*r1*r1;
    volum2=4.0f/3.0f*PI*r2*r2*r2;
    printf("第一个圆的体积为:%f\n",volum1);
    printf("第二个圆的体积为:%f",volum2);
return 0;
}

2.1表达式和选择语句

2.1.1注意

  • int类型和float类型 6.7f/2 = 3.35

  • %操作不能是浮点数,只能是整数

  • /和%用作负数时,结果难以确定

  • a+=2 等价于 a=a+2

  • a++和++a的区别

    #include <stdio.h>
    #include <stdlib.h>
    ​
    int a=2;
    int b=3;
    ​
    int main()
    {
        a=b++;
        printf("a=%d\nb=%d",a,b);
        return 0;
    }
    
  • !非 ||或 &&且

    2.1.2 if语句

    例1:设计一个C程序,提示用户输入一个数,并判断这个数是奇数还是偶数,如果是奇数,就乘3再显示,如果是偶数,就乘5再显示

    #include <stdio.h>
    #include <stdlib.h>
    ​
    int num;
    ​
    int main()
    {
    printf("请输入一个数:");
    scanf("%d",&num);
    ​
    if(num%2==0)
    {
        num=num*5;
        printf("这是一个偶数%d",num);
    }
    else
    {
    num=num*3;
    printf("这是一个奇数%d",num);
    }
    return 0;
    }
    
  • else悬空问题:就近原则

    //else所属后一个if
    if(a<b)
    {
    a=5;
    }
    if(b<c)
    {
    a=3;
    }
    else
    {
    a=2;
    }
    
    • 布尔值:1/0

      2.1.3 switch语句

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int num;
      ​
      int main()
      {
      printf("请输入你的成绩:");
      scanf("%d",&num);
      ​
      switch(num)
      {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
          printf("您的成绩不合格");
          break;
      case 6:
      case 7:
          printf("您的成绩合格");
      case 8:
      case 9:
      case 10:
          printf("您的成绩优秀");
          break;
      default:
          printf("您的成绩输入有误");
          break;
      }
      return 0;
      }
      

      2.2循环语句

      2.2.1 while循环

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int i=5;
      ​
      int main()
      {
          
          while(i)
          {
              printf("%d\n",i);
              i=i-1;//i--
          }
          
      return 0;
      }
      

      2.2.2 do while循环

      • 一定执行一次
      #include <stdio.h>
      #include <stdlib.h>
      ​
      int i=5;
      ​
      int main()
      {
          
          do
          {
              printf("%d\n",i);
              i++;
          }while(i==5);
          
      return 0;
      }
      

      例:设计一个C程序,计算用户输入的整数的位数

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int num;
      int i;
      ​
      int main()
      {
          
      printf("请输入一个整数:");
      scanf("%d",&num);
      //do while 让0也可以实现
      do
      {
          num=num/10;
          i++;
      }while(num>0);
      ​
      printf("输入的数字有%d位",i);
      ​
      return 0;
      }
      

      2.2.3 for循环

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int i;
      ​
      int main()
      {
          
          for(i=5;i>0;i--)
          {
              if(i==2)
              {
                  break;//跳转到循环结束之后
              }
              printf("%d\n",i);
          }
      ​
      return 0;
      }
      

      2.2.4 continue和break的区别

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int i;
      ​
      int main()
      {
          
          for(i=1;i<3;i++)
          {
              printf("1");
              printf("2");
              continue;
              printf("3");
              printf("4");
              
              //continue语句转跳到这里
          }
          //break转跳到循环体末尾之后执行
      ​
      return 0;
      }
      

      2.2.5 goto语句

      #include <stdio.h>
      #include <stdlib.h>
      ​
      int a,b,c;
      ​
      int main()
      {
          goto b;
          
          a:
              printf("这是a\n");
          b://goto b 就会跳转到这里执行
              printf("这是b\n");
          c:
              printf("这是c\n");    
                  
      return 0;
      }
      

      3.1数制与码制的基本数据类型

      • 常见数制(纯数学层面) 2进制 8进制 10进制 16进制

      • 位权

        632.45

        数字: 6 3 2. 4 5

        位权 10^2 10^1 10^0 10^-1 10^-2

        位值: 610^2 + 310^1 + 210^0 + 410^-1 + 510^-2

        科学计数法: 6.3245*10^2

        • 0X表示16进制

        3.1.1码制

        • 存储带正负的整数,一个字节,8位;正负、符号,有符号数;最高位为符号位【0为整数、1为负数】

        • 逻辑层面:-6**【正数的原码、反码、补码完全相同】**

        • 编码格式: 原码 反码 补码(常用)【补码=反码+1】

        • 物理实在: 1000 0110 1111 1001 1111 1010

        3.1.2 C语言中的基本类型

        • 有符号整型int

        • 无符号整型unsigned int

        • 长整型long int 、long long int

        • 短整型short int

        • 自由组合 unsigned long long int

        • 有符号字符变量char

        • 无符号字符变量unsigned char

        • 单精度浮点型float 双精度浮点型double

        • float比较中谨慎使用== !=

        • 强制转换

        #include <stdio.h>
        #include <stdlib.h>
        ​
        float a=6.7;
        ​
        int main()
        {
            
        printf("%d\n",(int)a);
        ​
        return 0;
        }
        

4.1数组和指针入门

4.1.1一维数组

例:假设已经存储了3名学生的成绩信息,学号1,2,3。编写一段C代码来让用户输入学号查询对应学员成绩

#include <stdio.h>
#include <stdlib.h>
​
int student1=45;
int student2=56;
int student3=67;
int num;
​
int main()
{
    printf("请输入学员的学号:");
    scanf("%d",&num);
    switch(num)
    {
    case 1:
        printf("学员1的成绩为:%d",student1);
        break;
    case 2:
        printf("学员2的成绩为:%d",student2);
        break;
    case 3:
        printf("学员3的成绩为:%d",student3);
        break;
    }
​
return 0;
}

例:假设需要顺序输入3名学生的成绩信息,学号为1,2,3,输入完成后支持学号查询成绩信息

#include <stdio.h>
#include <stdlib.h>
​
int student1;
int student2;
int student3;
int num;
​
int main()
{
    printf("请输入学员1的成绩:");
    scanf("%d",&student1);
    printf("请输入学员2的成绩:");
    scanf("%d",&student2);
    printf("请输入学员3的成绩:");
    scanf("%d",&student3);
    printf("请输入学员的学号:");
    scanf("%d",&num);
    switch(num)
    {
    case 1:
        printf("学员1的成绩为:%d",student1);
        break;
    case 2:
        printf("学员2的成绩为:%d",student2);
        break;
    case 3:
        printf("学员3的成绩为:%d",student3);
        break;
    }
​
return 0;
}

例:假设输入3个学生信息,并通过学号查询

#include <stdio.h>
#include <stdlib.h>
​
int student[3]={0};
int i;
int j;
​
int main()
{
for(i=0;i<3;i++)
{
    printf("请输入学员的学号:");
    scanf("%d",&j);
    printf("请输入学员的成绩:");
    scanf("%d",&student[j-1]);
}
printf("请输入学员的学号:");
scanf("%d",&j);
​
printf("学员%d的成绩为:%d",j,student[j-1]);
    
return 0;
}

4.1.2多维数组

#include <stdio.h>
#include <stdlib.h>
​
int a[2][3]={{1,2,3},{4,5,6}};
​
int main()
{
​
    printf("%d",a[1][0]);
    
return 0;
}
  • 常数数组:

  • const 关键字 在代码运行过程中不会被修改的值,节省内存

  • const char a[]={‘0’,‘1’,‘2’,‘3’,‘A’,‘B’,‘C’};

  • 字符串,双引号"hello";字符,单引号’a’

  • 字符串是特殊的字符数组char string[3]={‘a’,‘b’,c’}; char string[]=“abc”

  • 字符串占位符%s,字符占位符%c

4.1.3指针

  • 指针变量:用来存储地址的变量 int* a 指针的使用*a_p
#include <stdio.h>
#include <stdlib.h>
​
int a=1;
int* p=NULL;
​
int main()
{
    
p=&a;
*p=5;
printf("%d",a);//a=5
    
return 0;
}

5.1函数与程序结构

  • 无需返回值 void
#include <stdio.h>
#include <stdlib.h>
​
//函数声明
void hanshu1(void)
{
    printf("hello micu");
}
​
int main()
{
    hanshu1();
    return 0;
}

例:设计一个代码,求两个数的平均值

#include <stdio.h>
#include <stdlib.h>
​
float a=2,b=7,c=0;
//函数声明
float average(float x,float y)
{
    float f=0;
    f=(x+y)/2;
    return f;
}
​
int main()
{
    c=average(a,b);
    printf("%f",c);
    
    return 0;
}

例:设计一个代码,交换两个数的值

#include <stdio.h>
#include <stdlib.h>
​
int a=2,b=3,c=0;
​
void exchange(int* x,int* y)
{
    int j=0;
    j=*x;
    *x=*y;
    *y=j;
}
​
int main()
{
    exchange(&a,&b);
    printf("a=%d b=%d",a,b);
    
    return 0;
}

例:设计一个程序,找出数组a中的最大值,找出数组b中的的最大值,然后求他们的平均值

//存在平均数如果为小数,只会显示整数的问题,要将int类型换成float类型
#include <stdio.h>
#include <stdlib.h>
​
int num1[5]={5,9,2,45,7};
int num2[5]={23,67,12,2,5};
int c1;
int c2;
int h;
​
int max(int* addr)
{
    int m=0;
    int i=0;
    
    for(i=0;i<5;i++)
    {
        if(addr[i]>m)
        {
            m=addr[i];
        }
    }
    return m;
}
int average(int x,int y)
{
    int k=0;
    k=(x+y)/2;
    return k;
}
int main()
{
    c1=max(num1);
    c2=max(num2);
    h=average(c1,c2);
    //h=average(max(num1),max(num2))
    printf("c1=%d c2=%d average=%d",c1,c2,h);
    return 0;
}

例:设计一个程序,找出数组a中的最大值,找出数组b中的的最大值,然后交换他们

#include <stdio.h>
#include <stdlib.h>
​
int num1[5]={5,9,2,45,7};
int num2[5]={23,67,12,2,5};
int c1;
int c2;
int h;
​
int* max(int* addr)
{
    int* m=NULL;
    m=addr;//不能*m=0 空指针不能赋值
    int i=0;
    
    for(i=0;i<5;i++)
    {
        if(addr[i]>*m)
        {
            m=addr+i;//数组首地址+偏移量
        }
    }
    return m;
}
​
void exchange(int* x,int* y)
{
    int l=0;
    l=*x;
    *x=*y;
    *y=l;
}
​
​
​
int main()
{
    exchange(max(num1),max(num2));
    printf("num1[3]=%d num2[1]=%d",num1[3],num2[1]);
    return 0;
}

5.1.1递归

  • 阶乘
#include <stdio.h>
#include <stdlib.h>
​
int fun2(int n)
{
    if(n<=1)
    {
        return 1;
    }
    else
    {
        return n*fun2(n-1);
    }
​
}
​
int main()
{
    
    printf("%d",fun2(5));
    
    return 0;
}

*函数声明必须在主函数之前

5.2程序结构

  • 预处理指令

  • 全局变量声明,函数声明【全局变量声明,全局变量是不在函数里面的变量,一般情况不初始化就默认等于0;局部变量是在函数里面声明的变量,只有在这个函数内部才能访问,局部变量不初始化,值随机】

  • main函数

  • 其他函数原型

  • 函数内,局部变量 局部变量不初始化值是随机的

  • 语句必须出现在函数内

  • C语言就是由函数组成的,语句不能凭空出现

  • C语言默认从main函数开始执行

  • c文件存放各类原型,h文件存放各类声明【头文件max.h存放声明,这样main函数引入库比如#include <max.h>或“max.h"】

  • 外部变量extern【可以分装main函数和其他函数】extern int p =5;也可以放在头文件