嵌入式-----C语言学习(1)

目录

一:基础部分

1.计算机基础知识

1. 进制转换:

2. 负数在内存中的存储   

3. 程序在计算机内部如何运行:

4.计算机内存的存储单位:   

2.C语言基础部分

1.基本数据类型

        1.整数类型:

        2.字符类型:

​编辑

        3.浮点数类型:

  2.常量和变量:

          1.常量

                1.整形常量(默认为int类型)

                2.浮点型常量(默认为double类型)

                3.字符常量

                4.字符串常量

                5.标识常量

           2.变量             

           1.变量名的要求:

            2.变量的定义:

            3.变量的初始化:

            4.变量的打印:

  3.表达式:

        1.混合类型运算时表达式的类型       

                1.显示类型转换(强制类型转换)               

                2.隐式类型转换                 

  4.运算符   

        1.算术运算符:       

        2.赋值运算符:

        3.逗号运算符:

  5.语言中常用的输入输出函数

        1.putchar:

        2.getchar:

        3.printf

            1.printf打印非输出控制符

            2.printf打印输出控制符 

            3.printf打印多个输出控制符 

           4.格式化打印 

        4.scanf

        1.接收非输入控制符 

        2.接收输入控制符 

        3.多个输入控制符的接收

        5.puts 

        6.gets 

6.流程控制

1.运算符:

    1.三目运算符:

    2.关系运算符:

    3.逻辑运算符:

2.顺序结构:

3.分支结构:

    1. if分支

        1.简单分支:

        2.阶梯分支:

        3.嵌套分支:

     2.switch分支

        1.基本形式 

        2.switch嵌套形式

 4.循环结构:

    1. while 循环 

    2. do..while 循环 

    3. for循环

        1.基本形式:

        2.双层for循环使用:

    4. goto循环

 5.辅助控制语句:

    1.break:  

    2.continue:

    3.return:


一:基础部分

1.计算机基础知识

        1. 进制转换:


            二进制、八进制、十进制、十六进制 

            二进制:逢二进一
                    0、1

            八进制:逢八进一
            0、1、2、3、4、5、6、7

            十进制:逢十进一
            0、1、2、3、4、5、6、7、8、9

            十六进制:逢十六进一
            0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f

            二进制、八进制、十六进制 -> 十进制:
                对应位 * 对应位的权值再求和
    
            十进制 -> 二进制、八进制、十六进制:
                十进制数除以进制数得到的余数逆序排列

            十进制 <-> 二进制 

            二进制 <-> 八进制、十六进制 
           

            八进制的1位 == 二进制的3位
            十六进制1位 == 二进制的4位

2. 负数在内存中的存储
   

     100      1100100
    -100   
    
    负数在内存中存储:
        1.先获得原码(去掉符号位,数字对应的二进制形式)
        2.获得反码 (原码取反)
        3.获得补码(反码+1)
        4.获得内存中的值(符号位+补码)

3. 程序在计算机内部如何运行:
 

  存储器:
        1.内存 
            读写速度快
            价格昂贵
            掉电数据丢失

        2.外存
            读写速度慢
            价格便宜
            掉电数据不丢失 
            外存存储文件 

    a.out是存放在外存中的一个文件
    ./a.out时将该文件加载到内存中运行,内存负责与CPU交互执行代码内的运算处理

4.计算机内存的存储单位:
   

    1 bit
    1 byte == 8 bit
    1 kb   == 1024 byte
    1 mb   == 1024 kb 
    1 gb   == 1024 mb
    1 tb   == 1024 gb

2.C语言基础部分

1.基本数据类型

        1.整数类型:

        2.字符类型:
        3.浮点数类型:

           float      单精度浮点数类型       4个字节                    1位符号位 + 8位指数位 + 23位尾数位                
           double  双精度浮点数类型       8个字节                    1位符号位 + 11位指数位 + 52位尾数位

         1.浮点数类型均为有符号
         2.float 6-8位有效数字、double 12-14位有效数字

  2.常量和变量:

          1.常量
                1.整形常量(默认为int类型)

                    123
                    123l            长整型
                    123ul           无符号长整型 
                    123u            无符号整形

                    123L 
                    123U 
                    123UL 
                    0100            八进制常量
                    0x1f            十六进制常量

                2.浮点型常量(默认为double类型)

                    3.14
                    3.14f 
                    3.14F 
                    3.14e3
                    3.14e-3

                3.字符常量

                    '!'
                    '\''
                    '\\'
                    '\n'    换行符
                    '\r'    回车符
                    '\t'    横向制表符
                    '\b'    退格符
                   '\v'    纵向制表符 
                    'a'
                    'A'
                    '0'     字符0 

                    0       零
                    '\0'    反斜杠零
                    '0'     字符零

                    '\0' -> 0           '\0' 与 0 等价  
                    '0'  -> 48          '0'  与 48 等价(字符0)

                    '\141'  八进制141对应的字符
                    '\x32'  十六进制32对应的字符

                4.字符串常量
                5.标识常量
        2.变量             
           1.变量名的要求:


                1.不能与C语言关键字重名
                2.最好不要与系统的库函数重名
                3.变量名可以以字母、数字、下划线组成,但是不能以数字开头
                4.变量名不允许重名
                5.变量名最好做到见名知意
                6.变量必须先定义再使用

            2.变量的定义:


                数据类型 变量名; 

                short d;
                long e;
                int a;
                char f;
                float b;
                double c; 

            3.变量的初始化:


                变量定义时未经初始化值为随机值
                初始化:变量定义时为变量赋初值

                不要使用未经初始化的变量

                int a = -3, b = -4, c = -5;
                unsigned int a = 10;

                float f = 3.14;
                double d = 5.12;

        

            4.变量的打印:


                short 
                int 
                long 
                %d打印 

                float 
                double 
                %f打印

                char 
                %c打印

3.表达式:

    由常量和变量所组成的式子
    1.表达式一定有值 
    2.表达式一定有类型

    int a = 100;
    int b = 20;
    1 + 2
    a + 5
    a / b
    (1 > 2) + 3  
    5.0 / 2.0 
    'a' + 3
    'B' + 32 

    5.0 / 2  

        1.混合类型运算时表达式的类型
       

类型转换:


                1.显示类型转换(强制类型转换)
               

                (int)变量名
                (double)变量名
        

                2.隐式类型转换  
               

                主要出现在混合类型计算时 

                低精度转换成高精度
                1.同种类型所占空间越大精度范围越高
                  long > int > short > char  
                2.整数类型中无符号类型精度大于有符号类型精度
                    unsigned > signed 
                3.浮点数类型精度高于整数类型精度 
                    double > float > 整数类型 
                
                注意:
                    1.short char int进行数据运算和数据处理时会默认转换为long类型
                    2.float double进行数据运算和数据处理时会默认转换为double类型

                float f1 = 3.0;
                float f2 = 5.0;

                f1 + f2; 

                double f = 5 / 2;

                printf("f = %f\n", f);

4.运算符
   

        1.算术运算符:
       

        +
        -
        *
        /
练习:
       定义两个变量a和b,并对a b赋初值,打印出a b四则运算的结果 

        %       唯一不能对浮点数操作的算数运算符

练习:定义一个整形变量,并给定一个三位数,请打印出各个位上的数字的和值
        int a = 123;

        ++      自增运算符
        --      自减运算符

        i++     后置++      先用再+
        ++i     前置++      先+再用

       2.赋值运算符:


        = 
        +=          
        -=
        *=
        /=
        %=

        左值:能够放在等号左边的值,可以是变量,不能是常量或表达式
        右值:能够放在等号右边的值,可以为常量、变量、表达式
    
        char ch = 0;
        int num = 1568;

        ch = num;

        printf("%d\n", ch);

        1.整形赋值给浮点数类型扩展精度
        2.浮点数类型赋值给整形舍弃精度
        3.左右两边空间大小一致直接完成内存数据拷贝
        4.小数据放入大空间时需要补位,有符号数补符号位,无符号数补0 
        5.大数据放入小空间时需要截断,截取数据低位

        char ch = 480;

        printf("ch = %d\n", ch);

      3.逗号运算符:


        val = (a, b, a+b, b+c, a+3, b-3)

        从左到右依次运行,最后一个逗号表达式的结果为整体表达式的结果
 

5.语言中常用的输入输出函数

        1.putchar:


            1.功能:给定一个数字,并将其对应的ASCII码显示在屏幕上 
            2.使用形式:
                putchar('a');

        练习:
            1.利用putchar实现将hello world打印在终端屏幕上

        2.getchar:


            1.功能:从键盘读取一个字符,并将其对应的ASCII码返回 
            2.使用形式:
                char ch = 0;

                ch = getchar();

        练习:
            从终端接收一个小写字符,将其对应的大写形式显示出来

            所有能够在终端显示的和输入的均为字符

        3.printf


            格式化输出函数,将双引号中的内容以字符串形式显示在终端


            1.printf打印非输出控制符


                printf("hello world");

                \n      换行符
                \t      制表符
                \b      退格符
                \v      纵向制表符 
                \r      回车符
                \\      \字符 
                \"      "字符

            2.printf打印输出控制符 


                int Num = 100;
                printf("Num = %d\n", Num1);

                %d      按照有符号十进制打印
                %o      按照无符号八进制打印
                %x      按照无符号十六进制打印
                %X      按照十六进制打印
                %#      打印八进制前的0和十六进制前的0x
                %s      按照字符串打印 
                %p      按照指针打印 
                %%      打印%字符
                %u      按照无符号十进制打印
                %e      按照浮点数类型打印
                %f      按照浮点数类型打印
                %c      按照字符(ASCII码表)打印

            3.printf打印多个输出控制符 


                int Num1 = 100;
                int Num2 = 200;
                char ch = 'a';

                printf("Num1 = %d, Num2 = %d\n", Num1, Num2);
                printf("ch = %c, ch = %d\n", ch, ch);

           4.格式化打印 


               printf("%5d", Num);

               %nd         n:不足域宽高位用空格补齐
               %-nd        -:左对齐
               %0nd        0:不足域宽高位用0补齐
               %.mf        m:显示小数点后m位有效数字


作业:
1.定义两个变量,并初始化为两个两位数,根据这两个数构建一个新数,规则为:
    第一个数的十位作为新数的个位
    第一个数的个位作为新数的十位
    第二个数的十位作为新数的百位
    第二个数的个位作为新数的千位
    打印该数:
    12  34
    4321

        4.scanf


        格式化输入函数


        1.接收非输入控制符 


            scanf("m");

            scanf中出现非输入控制符,需要原封不动的从终端输入该字符
       

        2.接收输入控制符 


            %d      按照int类型接收
            %f      按照float类型接收
            %lf     按照double类型接收
            %c      按照char类型接收(会接收' '和'\n'字符)
            _%c     接收一个非' '和'\n'的字符
            %s      按照字符串类型接收


        3.多个输入控制符的接收


            int Num1 = 0;
            int Num2 = 0;

            scanf("%d %d", &Num1, &Num2);

        注意:
            1.scanf中内容写的越短越好
            2.scanf中不要加入\n字符 
            3.scanf只有%s可以不加&,其余均需要加上& 
            4.scanf中' '和'\n'字符表示数据末尾
            5.scanf中只有%c可以接收' '和'\n'字符,其余均认为是数据结束的标志

    练习:从终端接收两个数,打印出这两个四则运算的结果

        int Num = 0;
        scanf("%d", &Num);

        float f = 0;
        scanf("%f", &f);

        double d = 0;
        scanf("%lf", &d);

        char ch = 0;
        scanf("%c", &ch);

        int Num1 = 0;
        int Num2 = 0;

        scanf("%d%d", &Num1, &Num2);

        float f1 = 0;
        float f2 = 0;

        scanf("%f%f", &f1, &f2);

        double d1 = 0;
        double d2 = 0;

        scanf("%lf%lf", &d1, &d2);

        5.puts 


        打印一行字符串 

        字符数组 
        char ch[32] = {"Hello World"};

        puts(ch);
        
        注意:
            1.puts会多打印一个\n 
            2.printf不会多打印\n

       6.gets 


        从终端接收一行字符串

        注意:
            1.gets会去掉从终端接收的\n字符 
            2.gets能够接收带' '的字符串
            3.scanf不能接收带' '的字符串 

6.流程控制

1.运算符:

    1.三目运算符:


           ?     :

        逻辑表达式?表达式1:表达式2;

        练习:定义三个变量,从终端获得三个变量的值,
             请打印出三个变量中的最大值

        a > b ? a : (b > c ? b : c)

        注意:
            三种特殊运算符,结合方向自右至左
            1.单目运算符 
            2.赋值运算符 
            3.三目运算符

    2.关系运算符:


        >       大于
        <       小于
        >=      大于等于
        <=      小于等于
        ==      等于
        !=      不等于

    3.逻辑运算符:


        &&      逻辑与      既..又..
        ||        逻辑或       要么..要么..
        !          逻辑非      真取非得假  假取非得真

        逻辑与:一假为假,全真为真
        逻辑或:一真为真,全假为假
        逻辑非:真取非得假,假取非得真
        截断特性:
            逻辑与左边为假时,右边不再计算
            逻辑或左边为真时,右边不再计算 

2.顺序结构:


    从main函数第一句开始执行,执行到main函数结束 

3.分支结构:

    1. if分支


        1.判断逻辑时使用分支语句
        2.同一类数据执行不同操作

        1.简单分支:


            if (逻辑表达式)
            {
                语句块1;
            }
            else 
            {
                语句块2;
            }

            注意:
                1.if后面必须加条件, else后面不能加条件
                2.if可以脱离else单独使用,但是else不能脱离if单独使用
                3.if和else如果不加{},默认只能控制一句代码

            ch >= 'a' && ch <= 'z'
            ch >= 'A' && ch <= 'Z'

        ch是字母:
            (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')

        ch不是字母:
            !(ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')

        练习:
            从终端接收两个分别给Num1和Num2 
            如果第一个数比第二个数大则直接打印第一个数
            如果第一个数没有第二个数大则两个数交换后打印第一个数

        int Num1 = 10;
        int Num2 = 20;

        Num1 = Num2;
        Num2 = Num1;

        if简单分支可以与三目运算符等价转换

    1.作业:       
    1.从终端接收三角形三边的长,计算三角形的周长和面积?
      海伦公式   

      #include <math.h>

      sqrt();

      gcc filename.c -lm 

     2.从终端接收一个年份,判断该年是闰年还是平年?
        1900    平年       
        2000    闰年 

        普通闰年:4的倍数却不是100的倍数
        世纪闰年:400的倍数

        2.阶梯分支:


        if (逻辑表达式1)
        {
            语句块1;
        }
        else if (逻辑表达式2)
        {
            语句块2;
        }
        else if (逻辑表达式3)
        {
            语句块3;
        }
        else 
        {
            语句块4;
        }

练习:
1. 从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,
   例如,输入a,则输出b。如果输入的字符不在26个英语字母中,
   则显示输入数据有误,如果输入的字符是z或Z,则输出a或A。

    char ch = 0;

    ch >= 'a' && ch <= 'z'
    ch >= 'A' && ch <= 'Z'

        3.嵌套分支:


                if (逻辑表达式1)
                 {
                        if (逻辑表达式2)
                        {
                                语句块1;
                        }
                        else
                        {
                                语句块2;
                         }
                 }
               else 
                {

                }

        注意:嵌套太深会导致可读性变差,最多嵌套3 - 5层

  2.switch分支

    1.基本形式 


        switch (整形表达式)
        {
            case 常量1:语句块1;break;
            case 常量2:语句块2;break;
            case 常量3:语句块3;break;
            default:
                语句块4;
        }

        注意:
            1.switch后面的表示式类型必须为整形,不能为浮点数类型 
            2.case后面必须为常量,不允许是变量或表达式
            3.switch只与case后面的值比一次,然后顺序向下执行直到break或者switch结束

练习:
    1.从终端输入一个成绩,打印成绩的级别 (使用switch实现)
        90 - 100打印 优秀
        80 - 89打印 良好
        70 - 79打印 中等
        60 - 69打印 及格
        0 - 59打印 不及格

    2.switch嵌套形式


        switch (整形表达式1)
        {
            case 常量1:switch (整形表达式2)
                       {
                            case 常量2:语句块2;break;
                            case 常量3:语句块3;break;
                            default:
                                语句块4;
                       };break;
            default:
                语句块5;
        }

        注意:
            1.双层switch中,里层switch结束,如果没有break,外层switch会继续向下执行
        

4.循环结构:


        1.重复执行一段代码时使用循环结构
        2.有规律的代码使用循环结构 
        未知循环次数使用while
        已知循环次数使用for

    1. while 循环 


        while (逻辑表达式)
        {
            语句块;
        }   

        练习:编写代码实现0 - 100的求和,并将和值打印在终端   

        while (1)
        {

        }
        死循环

    2. do..while 循环 


        do {

        } while (逻辑表达式);

        人机交互、界面控制 

    3. for循环

        1.基本形式:


            for (A; B; C)
            {
                D;
            }

            A:for循环前执行一次
            B:循环判断条件
            D:满足条件执行的循环体内部代码
            C:每轮循环执行结束后会执行的代码

        穷举法:将所有的情况都使用循环试一遍

    练习:鸡兔同笼,共50只,140只脚,打印出鸡兔的个数
        x:0 - 50  
        2*x + 4*(50-x)

        2.双层for循环使用:


            for (A; B; C)
            {
                for (D; E; F)
                {
                    G;
                }
            }

        外层执行一次,里层执行一遍
    练习:利用双层for循环打印 99乘法表

    4. goto循环

        代码中尽量不要使用goto,因为破坏程序的逻辑性、可读性

        出错处理使用goto

作业:
    1.使用穷举法打印出所有的水仙花数:
        1.是一个3位数
        2.各位数字的立方和等于该数本身
        例:153 == 1*1*1 + 5*5*5 + 3*3*3

5.辅助控制语句:
    1.break:  

            只能在循环或者switch中使用
            跳出当前循环

   2.continue:

            只能在循环中使用
            结束本次循环

    3.return:

.           在函数中使用,让当前函数结束

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值