数组:
什么是数组: 变量的组合,是一种批量定义变量的方式
定义: 类型 数组名[数量];
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      163  %2      131  %2      115  %2      17   %2      13   %2      11   %2      10           0二进制:01111111
求权法:   数据- 2^(n-1) 如果可以减,则第n位为1,否则为0137128 64 32 16 8 4 2 11    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 ,再或1010printf("%d\n",n & ~(0xf<<4) | (0xA << 4));00000000 00001111 00000000 1111000011111111 00001111xxxxxxxx 0000xxxx0xA << 400000000 10100000xxxxxxxx 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 数学库中,使用时需要在编译时加参数-lmdouble 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,不能重复 rand()%33+1蓝球1个:1-16           rand()%16+1系统函数系统函数不是函数,只是操作系统以函数接口的形式提供的一些功能内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程管理、线程同步、网络通信第三方库函数由第三方提供的收费、开源的库函数githubMD5XMLJSON自定义函数:为了更方便地管理代码、减少冗余把代码封装成函数注意:一个函数尽量控制在50行左右,一个函数一个功能函数声明:函数声明目的是为了告诉其他代码该函数的调用格式返回值类型 函数名(类型1 变量名1,类型2 变量名2...);1、C语言中函数名一般全部小写,用下划线分隔2、如果不需要参数建议写void,不要空着3、如果不需要返回值写void4、如果在调用前有函数的定义,那么函数声明可以省略隐式声明:当调用函数时没有函数声明或定义,编译器会猜测函数的格式,参数列表会根据调用时的提供数据来猜测,返回值猜测为int类型如何避免:在调用前,提供函数的声明或定义函数定义:返回值类型 函数名(类型1 变量名1,类型2 变量名2...){函数体;return val;}注意:return语句的作用:1、返回值给调用者  2、结束函数的执行函数调用:函数名(实参);返回值会放在调用的位置,可以用变量记录下来,也可以直接显示,如果不记录就会丢失函数传参:1、实参与形参之间是以赋值的形式传递数据的(单向值传递)2、在函数内定义的参数,只属于它所在的函数,出了该函数就不能在使用了3、return语句其实是把数据放置到一个公共区域(函数和调用者共用),如果不写return语句,调用者从该区域中获取的是一个随机的垃圾数据4、当数组作为函数的参数时,长度会丢失,需要额外多加长度的参数来把长度传递过去5、数组的传递是"址传递",函数和函数的调用者可以共享数组练习5:实现一个函数,找出数组中的最大值练习6:实现一个函数,对数组进行排序练习7:实现一个函数,查找数组中是否存在某个值,如果存在则返回该数据在数组中的下标int find_arr(int arr[],int len,int val);

课后练习
1、 实现一个函数,判断一个整数是否是素数,调用它显示出100~10000之间所有的素数

#include<stdio.h>
int issushu(int n)
{   int i,m=1;for(i=2;i<n;i++){if(n%i==0){m=0;}}if(m==1){printf("%d  ",n);}
}
int main()
{   int i;for(i=100;i<=10000;i++){issushu(i);}return 0;
}

2、输入两个日期(yyyy-mm-dd),计算两个日期之间间隔了多少天

#include<stdio.h>
int runyear(int year)
{if(year%400==0||year%4==0&&year&100!=0){return 1;}elsereturn 0;
}
int day(int *day1,int *day2)
{int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int isdays=0,i;int *tmp;if(day1[0]==day2[0]){if(day1[1]==day2[1]){isdays=day1[2]-day2[2];isdays=(isdays<0)?-isdays:isdays;}else{if(day1[1]<day2[1]){tmp=day1;day1=day2;day2=tmp;}for(i=day2[1]+1;i<day1[1];i++){isdays+=month[i];}isdays+=month[day2[1]]-day2[2]+day1[2];if(day2[1]<=2&&day1[1]>2){if(runyear(day1[0]))isdays++;}}}else{if(day1[0]<day2[0]){tmp=day1;day1=day2;day2=tmp;}for(i=day2[0]+1;i<day1[0];i++){if(runyear(i))isdays+=366;elseisdays+=365;}for(i=day2[1]+1;i<=12;i++){isdays+=month[i];}isdays+=(month[day2[1]]-day2[2]);if(day2[1]<=2){if(runyear(day2[0]))isdays++;}for(i=1;i<day1[1];i++){isdays+=month[i];}isdays+=day1[2];if(day1[1]>2){if(runyear(day1[0]))isdays++;}}return isdays;
}
int main()
{   int isdays;int i=0;int day1[3],day2[3];printf("请输入两个日期:\n");scanf("%d-%d-%d",&day1[0],&day1[1],&day1[2]);scanf("%d-%d-%d",&day2[0],&day2[1],&day2[2]);isdays=day(day1,day2);printf("相差%d天",isdays);return 0;
}```

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

  1. Nwafu-OJ-1437 Problem h C语言实习题六——6.进制转换函数设计

    问题 : C语言实习题六--6.进制转换函数设计 时间限制: 1 Sec  内存限制: 128 MB 提交: 3451  解决: 2057 [提交][状态][讨论版] 题目描述 设计一个函数,将任意一 ...

  2. c语言中10转8和16的转换,(C语言)10进制转换2,8,16进制

    (C语言)10进制转换2,8,16进制 作者:vinseven #include"stdio.h" #include"conio.h" #include&quo ...

  3. 小乐乐与进制转换-c++(六进制转换函数)

    题目描述 小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣.因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果.请你帮助他解决这个问题. 输入描述: 输入一个正整数n ...

  4. 写一个比较全的进制转换函数--ic

    //写一个比较全的进制转换函数-----未完成 #include <stdio.h> //D进制转换后 (比如10-2进制) 结果可能会很大 需要很长的字符串来存 #include < ...

  5. python进制转换函数及方法

    python进制转换函数 一.通过int函数实现其他进制转十进制 假设 M 为某已知进制字符串 n 的进制数 result = int(n,M) --------------------------- ...

  6. python转换函数使用_python进制转换函数代码的使用

    python进制转换函数代码的使用 发布时间:2020-04-23 10:23:22 来源:亿速云 阅读:188 作者:小新 以上就是python进制转换函数代码的使用的详细内容了,看完之后是否有所收 ...

  7. python进制转换函数-Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  8. oracle转换为16进制,Oracle的十进制和16进制转换函数

    Oracle的10进制和16进制转换函数 在数据库中,常常需要将10进制转16进制,又会需要将16进制转10进制.有两个使用PL/SQL开发的函数,可以方便使用. create or replace ...

  9. java语言编写进制转换_Java 3种方法实现进制转换

    由其他进制转换为十进制比较简单,下面着重谈一谈十进制如何化为其他进制. 1.使用Java带有的方法Integer,最简单粗暴了,代码如下 //使用java提供的方法 //但仅局限于比较常用的二进制.八 ...

最新文章

  1. HTTP缓存详解之etag
  2. 使用SqlCommandBuilder
  3. 网络编程模型综述 之 UNIX网络I/O模型
  4. 算法导论-用于不相交集合的数据结构
  5. Python设置默认语言编码
  6. 官方再曝vivo X30系列拍照新技能:主角光环不虚焦
  7. 销售管理c语言程序设计,C语言课程设计销售管理系统
  8. 螺旋传动设计系统lisp_[罗升机电]第236期 丝杆升降机系统工程之齿轮传动的设计!...
  9. 6.4Spring环境配置等级和优先级
  10. [生存志] 第91节 鬼谷捭阖之策
  11. Mocking and Stubbing
  12. Linux之磁盘配额
  13. RGBD相机的标定和图像配准
  14. 野火 步进电机 视频笔记
  15. LintCode(M) 乱序字符串
  16. 基于校园网的SSM高校财务预约报账J2EE报销系统javaweb
  17. MT5 EA交易期货-市价单开仓平仓
  18. matlab将二值图像与原图重叠_MATLAB:增加噪声,同时多次叠加噪声图和原图以及求平均图像(imnoise,imadd函数)...
  19. 都21世纪了,还会有人不学C语言吗?
  20. 安防:激光对射周界报警系统原理解析系统组成

热门文章

  1. 模块预制式数据中心方案评估与建议
  2. mql4 mysql_MQL4的几个常用函数
  3. 王道计算机网络第三章
  4. activiti学习01
  5. 2M误码仪都有哪些功能? TFN T1000M数据误码传输测试仪
  6. 孔子的名言,值得一生品读!
  7. 微信清理网页缓存的办法
  8. 我眼中的CTO:提升IT管理的价值
  9. torch.Linear(input_size,output_size, bia = True/Flase)
  10. 端到端与点到点到底是什么?