一.什么是进制数:

X进制数就是指:数字在运算,记录时遇到X就进一位。
数制系统的要素:
数字:数字即是组成当前数制的所有数,即10进制的0,1,2,3,4,5,6,7,8,9
8进制的0,1,2,3,4,5,6,7
16进制的0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
星期的数字为周一,周二,周三,周四,周五,周六,周天
一般来说x进制数的数字的范围是0到x-1的所有整数。
基数:x进制的基数就是x。
位权:某一位数上的1所表示的大小,例如(10)2上1的位权为21

二.进制数的转换:

1.十进制转二进制:短除法

 例如十进制数19,将他转为二进制的方法:
   1.先用这个数19除以基数2,商为9,余数为1
   2.用前面的商9 除以基数2,商为4,余数为1
   3.用前面的商4 除以基数2,商为2,余数为0
   4.用前面的商2 除以基数2,商为1,余数为0
   4.前面的商1除不尽基数2了,直接取出    1

   将前面所有计算出的余数从下到上排列出来,就是19的二进制数,即10011。

十进制转其他进制也是一样的,把基数的值改成对应基数的值就可以了

2.二进制转十进制:按权重进行展开相加

例如二进制数11101,将他转成十进制的方法:
每一位数上的数字乘以他那一位数的位权,再把他们相加,即得到对应的十进制数
(11101)2=()10?
1 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 1 * 24=29
(11101)2=(29)10

其他的的进制数转成十进制也是一样的,把位权改成相应的位权就可以了

3.非十进制数之间的转换

万能思路:先转换成十进制,在从十进制转成相应的进制数。

遇到二进制和 (2的次方数)进制之间的转换时,有简便得方法:

例如(11101)2=()8?
1.先看要转的基数,16 = 24,指数为4
2.即把前面的二进制数从右到左四个成组(最后一组不足四个的不需要管)
3.即1 1101
4.将每一组数转成8进制得到 1 13
5.按顺序组合起来即可(11101)2=(1D)16

反过来从其他(2的次方数)进制转成二进制也一样,从右到左将非二进制数的每一位数转成其基数的指数位数的二进制,再将这些二进制数按顺序组合即可。

4.有小数的其他进制数转十进制

以二进制转十进制为例
(1101.101)2 = ()10?
同整数的其他进制转十进制一样,按权重进行展开相加,小数部分指数取负
1 * 23 + 1 * 22 + 0 * 22 + 1 * 21 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 = 13 + 0.625 =13.625
(1101.101)2 = (13.625)10

5.有小数位的十进制转其他进制

(43.3)10 = ()16?
整数部分用短除法
43/16 商2 余11 即整数部分的十六进制为2B
小数部分0.3乘以基数16 =4.8 取出整数部分8 剩下的小数部分继续乘以基数16
剩下的小数部分0.8继续乘以基数16 =12.8 取出整数部分12 剩下的小数部分继续乘以基数16
………………直到小数部分为零或者到达要求经度位置(可能这就是有时候double型做计算时后面小数位最后几位会出现一些小数的原因?)
按照正序把取整部分排列 .8C
拼接起来 (43.3)10 = (2B.8C)16

数组的增删改查也是对于初学者来说对数组最好的理解应用了,熟练掌握它们的运用能帮助我们更好的处理数组的问题。并且能加深我们理解数组和循环的关系。
在理解这些之前,我们先要明白数组的结构和基本要素,我们先看一个例子:

int nums[5] = {2,3,5,7,11};

在这里,我们定义了一个int型的数组,这个数组叫nums,5代表这个数组中最多可以存放5个元素。大括号中是这个数组的元素,它们的数据类型要和定义数据类型相匹配。每个元素在数组中的位置可以通过元素下标来进行访问,元素下标命名规则就是数组元素中从左往右,从0开始的顺序数字。

看过解析后我们简单归纳一下数组结构和基本要素:

1.标识符(数组名称nums)
2.数组元素(大括号里存放的数据)
3.元素下标(数据在数组中的位置)
4.元素类型(int)

简单了解数组之后,我们通过一些例子来理解数组的增删改查

1. 数组的增加功能

例1:在一个数组a中插入一个用户输入的数字(假设这个数组是int型数组)

int main()
{
    int count = 5;                      //定义数组长度变量,增加和删除会改变数组长度。
    int num;                            //需要插入的数字和用来交换数字的临时变量
    int a[] = {2,8,11,1,5};             //定义一个数组
    printf("请输入您需要增加的数字:");
    scanf("%d",&num);
    //插入数字
    a[count] = num;                     //把输入的数字赋给数组,再将数组总长度+1
    count++;
    //打印结果
    printf("插入数字后的结果是:\n");
    for(int i = 0; i < count; i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;
}

打印结果是:

[数组的增加打印结果](https://tieba.baidu.com/p/5706406675 "数组的增加打印结果")

数组的增加就是把它的长度扩充一位,然后在那个多出来的位置上赋上我们要插入的数据。

2.数组的删除功能

首先我们要理解删除的本质,它不是真正删除数组中的某个数据,而是先找到这个值之后,把它后边的值依次赋给前一个值,最后再把数组长度扣掉一位来实现删除的目的。

如在数组{2,8,11,1,5}中我们想删除8,那么我们只需把8之后的值依次赋给前一个值,即{2,11,1,5,5},最后将总长度减1,得到{2,11,1,5}从而实现删除。

例2:在例1定义的数组中,实现删除它其中一个数字的功能

int main()
{
    int count = 5;                  //定义一个变量来表示数组元素的个数
    int a[] = {2,8,11,1,5};
    int deleteNum;                  //定义一个用户想删除的值的变量
    int deleteIndex = -1;           //定义一个需要删除的战力值的下标,并给它赋一个不可能实现的初值。方便判断(理解这里)
    //输入想要删除的数字
    printf("请输入您想删除的战力值:");
    scanf("%d",&deleteNum);
    //开始查找需要删除的数字
    for(int i = 0; i < count; i++)  //循环次数和数组元素个数相同
    {
        if(deleteNum == a[i])       //输入的战力被找到
        {
            deleteIndex = i;        //记录下找到的值的下标
            break;                  //找到后直接跳出循环,提升效率
        }
    }
    //根据判断它是否找到,执行后续操作
    if(deleteIndex == -1)           //没有找到的情况
    {
        printf("没有找到您想删除的战力值。\n");
    }
    else                            //找到的情况
    {
        for(int i = deleteIndex; i < count - 1; i++)        //找到之后,数组的元素个数要比原来少一个,所以是i < count - 1
        {
            a[i] = a[i + 1];        //把要删除的后一个值依次赋给前一个值
        }
        //删除完毕后,数组的总长度要减1
        count--;
    }
    //打印结果
    printf("删除后的结果为:\n");
    for(int i = 0; i < count; i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;
}

打印结果是:

[数组的删除打印结果](https://tieba.baidu.com/p/5706406675 "数组的删除打印结果")

定义元素下标并给初值就是为了方便我们进行判断没有找到的情况。因为下标不可能是负数。

3.数组的修改功能

想要修改数组中的某个元素,我们需要先判断用户输入的数字是不是数组里的元素,如果是我们需要找到它所在的位置(下标),然后直接给它赋一个修改后的新值即可。

例3:在例1的数组中将11改成45并打印结果。

int main()
{
    int a[5] = {2,8,11,1,5};        //定义数组
    int findNum;                    //定义需要查找的数字的变量
    int temp;                       //修改数字的临时变量
    int findIndex = -1;             //要查找的数字的元素下标并服初值
    //开始输入
    printf("请输入您要查找的数字:");
    scanf("%d",&findNum);
    //开始查找
    for(int i = 0; i < 5; i++)
    {
        if(findNum == a[i])
        {
            findIndex = i;         //如果找到直接赋值并跳出循环
            break;
        }
    }
    //判断是否找到的情况
    if(findIndex == -1)
    {
        printf("没有查找到该数字!\n");
    }
    else
    {
        printf("请输入修改后的数字:");      //输入的数字直接赋值给他
        scanf("%d",&temp);
        a[findIndex] = temp;
    }
    //打印结果
    printf("修改后的数组是:\n");
    for(int i = 0; i < 5; i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;
}

打印结果是:
[数组增加打印](https://tieba.baidu.com/p/5706406675 "数组增加打印")

不难看出程序的执行过程,我们先找到需要删除的数组元素直接赋值,就达到了修改的目的。

4.数组元素的查询功能

从数组的增,删,改中我们不难发现,想实现这三个功能数组必须先查询。所以查询是实现增删改的基础。只要了解了数组的增删改,查询也就不难实现了。下面我们用一个简单的小例子来理解它。

例4.还是例1的数组,要求用户从键盘录入一个数,程序判断这个数是不是数组中的元素

int main()
{
    int a[5] = {2,8,11,1,5};            //定义数组
    int findNum,index;                  //查找的数字变量和下标
    //开始查找
    printf("请输入数字:");
    scanf("%d",&findNum);
    int i;
    for(i = 0; i < 5; i++)
    {
        if(findNum == a[i])             //如果输入的数字恒等于数组中某个i的值,即输入的数字和数组中i的元素是相同的
        {
            index = i;                  //记录这个数字所在的下标
            printf("您输入的数字在数组中!它所在的下标是%d。\n",index);
            break;                      //数组的查询是挨个比较,所以找到需要用break跳出循环
        }
    }
    if(i == 5)                          //元素下标恒等于5代表输入的数字已经和数组的元素全部比较过一遍都不匹配。
    {
        printf("没有您想找的数字!\n");
    }
    return 0;
}

如果输入的数字在数组中,打印结果为:
[输入的数字被找到](https://tieba.baidu.com/p/5706406675 "输入的数字被找到")

如果输入的数字不在数组中,打印结果为:
[输入的数字不在数组中](https://tieba.baidu.com/p/5706406675 "输入的数字不在数组中")

最后思考一个问题:为什么我们找到数字之后需要用break直接跳出循环呢?

  • 因为我们输入的数字是和数组里的元素挨个进行比较的,如果不加break语句,输出结果里不管有没有找到都会打印出来,如下所示:

[不加break中断](https://tieba.baidu.com/p/5706406675 "不加break中断")

找到数字之后它还会和其他的数字进行比较,并得出没有找到的结论。所以加break不仅可以节省资源和时间,还能避免程序犯一些逻辑方面的错误。

总结:

  • 数组的增删改查是我们学习代码的基本,它将数组和循环灵活的结合在一起,只要搞清楚它们的原理,就能更好的帮助我们学习更复杂的代码。希望这篇笔记能帮助同学们更好的理解数组和循环的使用实现数组的增删改查。

 C/C++主要用于PC软件开发、底层开发、单片机和嵌入式系统;如:QQ、Windows、英雄联盟、Linux、Unix。
 Java和C#不但可以用来开发软件,还可以用来开发网站后台程序;后续我们介绍的Eclipse就是采用Java开发。Windows的MSDN网站使用的就是C#技术。咱们常用京东、淘宝等网站就是使用Java开发。
 PHP技术主要用于Web网站开发,属于服务端脚本语言。比如一些门户网站、服务号。比如我们老九学堂的服务号的二次开发就是采用的PHP。
 JavaScript 主要负责网站的前端工作(现在也有公司使用 Node.js 开发网站后台)。