从0开始学习C语言————数组、进制转换、函数

数组:
什么是数组: 变量的组合,是一种批量定义变量的方式
定义: 类型 数组名[数量];
int num1,num2,num3,num4,num5;
int arr[5];
使用:数组名[下标];
下标:从零开始 范围:0~数量-1
遍历:与for循环配合使用,使用循环变量i作为数组的下标
初始化: 类型 数组名[数量] = {1,2,3,4,5,…};
1、数组与普通变量一样默认值是随机的,为了安全要对数组进行初始化
2、这种初始化语法只能在定义语句时使用,而且只能逐个赋值,不能整体赋值
3、初始化数据过多,编译器会产生警告并丢弃多余的数据
4、初始化数据不够,编译器会自动补0
5、初始化时数据可以省略,只写大括号,相当于给所有成员初始化为0
6、初始化时数组的长度可以省略,编译器会自动统计数组元素的个数并告诉数组
sizeof(arr)/sizeof(arr[0]) = 数组的元素个数
数组的总字节数/数组元素的字节数 = 数组的元素个数

数组的越界:C语言为了程序的运行效率是不会检查数组的下标是否越界
    数组越界的后果:
        1、一切正常
        2、段错误
        3、脏数据

二维数组:
一维数组相当于把变量排成一排,通过编号来访问
二维数组相当于把变量排成矩阵,通过行号和列号来访问

定义:  类型 数组名[行数][列数];
    int arr[3][5];
    [0,0][0,1][0,2][0,3][0,4]
    [1,0][1,1][1,2][1,3][1,4]
    [2,0][2,1][2,2][2,3][2,4]
使用:数组名[行下标][列下标]; arr[1][2]
    行下标: 0~行数-1
    列下标: 0~列数-1
遍历:需要与双层for循环配合,外层一般负责遍历行,内层一般负责遍历列
    for(int i=0; i<行数; i++)
    {   
        for(int j=0; j<列数; j++)
        {   
            printf("%d ",arr[i][j]);
        }   
        printf("\n");
    }
初始化:
    类型 数组名[行数][列数] = {
  {第一行},{第二行},{第三行},...};

练习4:定义一个5*5的二维数组并初始化,找出数组中最大值的坐标
练习5:定义一个5*5的二维数组并初始化,找出最小值的坐标,计算该位置周围的数的和是多少?

变长数组:
定义数组时使用变量来作为它的长度,在代码编译期间数组的长度是不确定,当执行到数组定义语句时它的长度才确定下来,一旦确定就无法改变
优点:可以根据实际情况来确定数组的长度,达到节约内存的目的
缺点:因为初始化在编译时完成,而此时变长数组的长度并不确定,因此不能初始化

进制转换:
为什么使用二进制、八进制、十六进制?
由于现在的CPU只能识别高低两种电平,只能使用二进制数据进行计算
二进制虽然能够被计算机直接计算,但是不方便书写、记录,因此将数据以八进制方式为了更方便记录在文件中
随着CPU位数不断增加,八进制不能满足需求,所以发展出了十六进制来表示数据,
由于历史原因八进制还不能退出历史舞台

十进制转二进制:(十进制转其他进制)
求余法: 用2对数据求余,然后再继续对商求余,知道商为0结束,过程中产生的余数就是该数据的二进制(逆序)
n %2 余数
商%2

    127 %2      1
    63  %2      1
    31  %2      1
    15  %2      1
    7   %2      1
    3   %2      1
    1   %2      1
    0           0
    二进制:01111111
求权法:   数据- 2^(n-1) 如果可以减,则第n位为1,否则为0
    137
    128 64 32 16 8 4 2 1
    1    0  0  0 1 0 0 1

手算: 79 28 63 119
练习1:输入一个正整数m,显示该数据的n进制(n>=2),如果n>=10,超出10的数字用字母表示
    10 A 11 B

二进制转十进制:(其他进制转十进制)
二进制数据每位 乘2^(n-1) 结果求和
10011101 128+16+8+4+1 157

二进制转八进制:
三个二进制位转为一位八进制位
二进制 10 011 001 101 110
八进制 2 3 1 5 6

二进制转十六进制:
四个二进制位转为一位十六进制位
二进制 10 0110 0110 1110
十六进制: 2 6 6 E

在C代码中,以0开头的数据是八进制数据,以0x开头的是十六进制数据
%o  以八进制形式显示数据
%x  以十六进制显示数据
%#o  %#x    以对应的进制显示数据

原码、反码、补码:
原码: 数据的二进制
反码:
正数的原码就是它的反码
负数的反码是它的原码符号位不变,其它位按位求反
补码: 数据在内存中是以补码形式存储的
正数的原码就是它的补码
负数的补码是它的反码+1
负数的补码:
1、数据转换为二进制
2、二进制符号位不变,其余按位求反得到反码
3、反码+1得到补码
-127
1111 1111
1000 0000
1000 0001 补码
0000000000000000000000001000 0001 %d --127->129

补码转数据:
    无符号的补码直接转成十进制数据
    有符号看最高位是0,说明是正数,也直接转成十进制数据
    有符号且最高位是1,说明是负数
        1、补码-1得到反码
        2、反码符号位不变,按位求反得到原码
        3、原码转换成十进制

11111111    补码
11111110    反码
10000001    原码    -1

最大值+1 = 最小值
最小值-1 = 最大值

位运算符:& | ~ ^ << >>
A & B 按位相与
01101010 0x6A
01110110 0x76
01100010 0x62
A | B 按位相或
01101010 0x6A
01110110 0x76
01111110 0x7E
~A 按位求反
01101010 0x6A
10010101 0x95
A^B 按位异或 相同为0,相异为1
01101010 0x6A
01110110 0x76
00011100 0x1C
A<<n 把A的补码向左移动n位,左边丢弃,右边补0
01101010 0x6A << 4
10100000 0xA0
A>>n 把A的补码向右移动n位,右边丢弃,左边补符号位
11101010 0xEA >> 3
11111101 0xFD

练习2:
    输入一个整数n,把它的4~7位设置为1010,其它位保持不变
        4位先与0 ,再或1010
        
        printf("%d\n",n & ~(0xf<<4) | (0xA << 4));
        00000000 00001111 
        00000000 11110000
        11111111 00001111
        xxxxxxxx 0000xxxx
        0xA << 4
        00000000 10100000
        xxxxxxxx 1010xxxx

函数:
是一段具有某项功能的代码,是C语言中管理代码的最小单位
把代码封装成一个个的函数,可以方便管理和调用代码
函数的分类:
标准库函数
C语言标准委员会为C语言以函数形式提供一些基础的功能,被封装在libc.so库,默认添加的,所以使用时需要包含头文件,以函数名(参数) 来调用函数
int isalnum(int c);
int isalpha(int c);
int isdigit(int c);
int islower(int c);
int isupper(int c);
int isxdigit(int c);
int toupper(int c);
int tolower(int c);
int abs(int j);

        以下函数被封装在libm.so 数学库中,使用时需要在编译时加参数-lm
        double sqrt(double x);
        double pow(double x, double y);
        double ceil(double x);
        double floor(double x);
        double fabs(double x);

        time_t time(time_t *t);
        功能:返回自1970-1-1 0:0:0 到运行时过了多少秒
        int system(const char *command);
        功能:调用系统命令  system("clear");
        
        int rand(void);
        功能:返回一个随机数
        void srand(unsigned int seed);
        功能:种随机种子,设置取随机数的位置

        练习3:获取10个[100,1000]范围内的随机数
                num = rand()%901+100
                [a,b)   rand()%(b-a)+a

        练习4:随机出一注双色球中奖号码
            红球6个:1-33,不能重复
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值