6.1绪论
数据太多怎么办,能不能构建一个数组,数据的集合,把数字集合起来处理;
所以咱们就建立一个新的概念。
数组;
就是这一万个数咱们这样编个号 : S0;S1;S2;S3;S4…S9999
数字是下标;下标作用是确定编号的意思;每个数字有且只有一个编号;这儿没法写出;就用这个代替;;注意了数组下标是从0开始的0 1 2 3 4 5 6 7 8 9
整个s1到s9999就组成一个数组;s就是咱们定义的数组名字;
那么咱们再说说数组是什么 :
数组是一群数据的集合;什么样的数据;拥有一个数组名字的同种类型编好号的数据;
6.2 一维数组
6.2.1 如何定义一个数组
数组的基本形式:
定义类型 数组名 [常量] ;
int a[10]; 1.首先你得给数组取一个名字;a 2.你要定义这些数据的类型;int 定义一个数据储存2或4个字节;依据补码的形式储存; 3.你要知道他有多少个;10个这样的数据 大概20到40个字节
6.2.2 如何引用一维数组
怎么调用呢;
数组名[下标]
下标可以是整型常量;也可以是整形表达式;
int f[20]={1,1}; for(i=0;i<=9;i++) f[i]=i; for(i=9;i>=0;i--) printf("%d\n",f[i]);
6.2.3 一维数组初始化
那我们怎么去给数组赋值,也叫初始化
int a[10]={0,1,8,9,3,7,7,3,4,5}; int a[10]={0,1,8,9,3,7};没赋值的 电脑给你赋值 ;就是0; int a[10]={}; ;0,0,0,0,0,0,0,0,0,0 int a[10];电脑给你随机赋值
6.3 二维数组
对于如下一组数据:
A: a1 a2 a3 a4 a5 a6;
B: b1 b2 b3 b4 b5 b6 ;
C: c1; c2; c3; c4; c5; c6;
其中一类是A,B,C
还有一类就是:a1,a2,a3,a4…
有两种类型的数据,那么就不能定义一维数组了。
这里引申出了二维数组;
6.3.1 二维数组定义与储存方式
一般形式:
定义类型 数组名 [常量表达式1] [常量表达式2];
这儿储存数量变成了两种种类 首先说明有多少行;然后说明有多少列 即每行有多少个;
int a[3] [6]; 也是定义定义三个部分 1.首先定义名字; 2.数据的数量 ; 3.最后 数据的类型 也就是储存空间储存方式;
这样每个数字就有自己的数组编号了;比如;a [0] [1];
那我们看一个二位数组通常使用矩阵的方式去理解 ;但是把;电脑储存这些数据时是不知道矩阵的;它坑定是一个一个去储存的;那么怎么储存 按照矩阵来说 从第一行第一个到最后一个然后到第二行第一个;到最后一个;在第三行;电脑按照线性的方式储存;
同样的咱们可以推理到三维数组 int a[1] [2] [3];储存方式也是按照线性的方式去储存;我这边简写
001 002 003 004 005 006 007 008 009;
010 020 030 040 050 060 070 080 090;…
6.3.2 引用与初始化
引用:
那我们看看二维数组怎么引用的呢
a[行下标] [列下标];
注意下标从0开始;
01 02 03 04
11 12 13 14
21 22 23 24
int a[3] [4];与a [3] [4]的区别;int a[3] [4] 中 没有a[3] [4]这个数值;
ina[3][4];
初始化:
你知道计算机时怎么读取数值的; 按顺序的线性读取; 如果你没特地去赋初值 电脑会自动定义你的初值时0;所以我只介绍两种赋值的形式;
int a[3][4]={{1,2,3,1},{1,2,3,4},{1,2,3,4}};正常赋值 int a[3][4]={1,2,3,4,5,6,7,8,9,1,2,3};按线性赋值,不够电脑自动赋值0 int a[3][4]={};电脑自动赋值0 int a[3][4];电脑随机分配
6.4 字符数组
前面咱们说过了有一个字符串常量;然后咱们说了定义一个字符变量,但是只能够储存一个字符;
对于字符咱们可以用变量去储存;那字符串呢咱们只能用数组去储存;
6.4.1 定义一个字符数组
怎么定义一个字符数组;
和定义数值数组一样;只不过之前的数据类型 在这儿被改变成
char 数组名[数量]
但是不管是int char float 还是什么,依旧依据各自数据类型的储存方式;只不过数组是按照线性的方式去储存;
定义二维数组与前面基本相同;引用一个数组也是一样;c[0],c[9]…
c[8] [2]…
6.4.2 初始化一个字符数组
怎么初始化一个字符数组;和之前一样
char a[10]={'i','','a','m',' ','s','t','d','e','n','t','.'};和前面一样 按照一个个去输入; 如果你没有定义那么 电脑会自动把没有定义的字符 ,定义为ASCALL表中字符为0的那个字符; 记作 '\0'; char a[]="i am a student."; char a[]={"i am a student."}; 如果有括号会编译器会对数组进行初始化,否则不会。 char a[10]; 在你没有对数组初始化的情况下;数组初始化是随机的; 并不是你想的那样都会系统把他都当作\0处理; char a[10] = { }; 数组全部初始化为\0,如果是整型数组初始化为0。 char a[10] = { ‘a’ }; 第一个元素为a,其他元素被初始化为\0
ps:这里说一下当电脑遇到\0时候 这里的\0就是字符串结束标志;也就是说,对于这字符串而言到这就结束了;不要管后面有还是没有了;如果要输出的话就输出到这儿;字符串终止符是一个非常好的字符 是ascall码中排第0位的字符 意思为空操作;不会产生任何新操作和出现任何不必要的字符;所以说\0作为终止字符串再好不过了
6.4.3 字符串的长度和数组的长度的关系
咱们既然用数组去储存字符串,那么字符串的长度和数组的长度有什么关系呢;
一般而言,字符串的长度比数组的长度小;
数组是可以反复储存的;所以数组的长度应该始终大于储存过程中最大的那个数 ;
那我具体举一个例子,比如定义一个char a[20]; 第一次char a[10]=“da shuai ge” 第二次char a[10]=“shuai ge” 首先我说过空格也算字符;前面一共有11位被定义了; 然后后面的所有都没有被定义就被电脑自动定义为 \0 了; 第二次一共有8位,由于第一次已经被定义了第9 10 11 , 所以要是你没有字符串终止符你就输出错了,你会输出shuai ge ge; 那么就是说字符串结束标志 是非常重要的 最好自己定义。 不要等着电脑给你定义 ,会很容易出现错误;
6.4.4 字符数组的输入输出
输入:
正常而言 scanf(“…",…)前面必须要一一对应才行,后面必须要有地址&;
1.但是对于数组而言 ;地址符号可以不要;应为数组名就代表地址。
2.系统已经把空格规定了,他是字符串之间的间隔符
比如把 how are you?输入到一个数组中去; 用scanf("%s",c1); 实际而言在电脑读取到第一个空格时候就停止了; 为什么 因为系统已经把空格规定了,他是字符串之间的间隔符; 不仅仅再作为一个单独的字符使用;已经有了它特殊的含义; 所以这个scanf只能识别how; 具体这句话的意思是;计算机识别到了how ;按照线性一个个把他放置到名为c1的数组中去;其他没有被放置的位置被系统自动全部放置为\0; 所以理解这个就能理解这个了; scanf("%s%s%s",c1,c2,c3); 同样输入 how are you? 空格作为分隔开的作用的话;就能一个个放置在how ///are/// you?在里面;
输出:
然后咱们说输出字符
printf("…",…);
可以一个个输出字符;举个例子; #include <stdio.h> int main(){ char c[15]={'i','','a','m','','a','s','t','u','d','e','n','t'}; int i; for(i=0;i<15;i++){ printf("%c",c[i]); printf("\n"); return 0; } } 从这个代码可以看出 数组是可以一个个输出的; 咱们看看其实还可以一起输出的;怎么输出的? 就是利用%s解决 比如printf("%s",c1)这样就说他输出的时候输出到有\0的位置就停止输出; 计算机是这样识别的; 首先就是找到地址c1 然后就是按照线性一个个提取出来输出,知道遇到|\0;
6.5 专门处理字符串的函数
但是在如果想要使用这些函数;就必须加上一个头文件;
#include <string.h>
6.5.1 puts()
他是用来输出字符串的;包括可以输出一些转义字符;空格照样输出;
输出截至位置是\0;
使用printf 效果一摸一样;同样可以输出转义字符 也可以输出 空格;
#include <stdio.h> int main(){ char a[]="china beijing"; puts(a); return 0; }
#include <stdio.h> int main(){ char a[]="china\tbeijing"; puts(a); return 0; }
6.5.2 gets()
输入一个字符串给数组, 同时顺便返回一个函数值;而该函数值就是这个数组的地址;
所以说gets是可以输入空格的 此 时空格不应该是起到间隔字符串的作用;
#include <stdio.h> int main(){ char a[10]; gets(a); printf("%s",a); return 0; }
看看scanf;
#include <stdio.h> int main(){ char a[10]; scanf("%s",a); printf("%s",a); return 0; }
所以说scanf 与gets 是由明显的区别的;
但是scanf printf是可以同时输入和输出多个数组的;但是对于gets puts 一次只能输出一个;不能写成
puts(a,b,c);可以这样写;
puts(a);
puts(b);
puts©;
同理可以得到gets,一样的道理;
6.5.3 strcat()
字符串连接函数
strcat(字符数组1,字符数组2);
这个函数是什么意思;直观来说就是把字符串2和字符串1 连接起来 变成一个字符串;这样输出的结果变成一个字符串;而且函数调用会得到一个返回值 ;而这个返回值就是函数1的地址;
具体计算机内部是怎么处理这个过程;
就是前面不变;从\0那里接上去;
#include <stdio.h> #include <string.h> int main(){ char s[30]="wumnda"; char t[]="dedede"; printf("%s",strcat(s,t)); return 0;}
6.5.4 strcpy()
字符串能直接赋值么?
刚刚我在想;字符串可以直接赋值给一个数组的么;就像数值是可以直接赋值给变量的;我想说这是不行的;错误的;
char a[]=“wuminda”;
char b[30];
b=a;
可不可以??
不可以这是错误的;
这需要用到一个特殊的函数叫做strcpy();或者叫做:strncpy();
strcpy(字符数组1,字符串2);
这是什么作用么??这是字符串赋值函数;解决了刚才的问题;就是把字符串2 直接给字符数组1;字符串2那儿是可以写字符串的 也可以写数组的
这里面有一个问题 就是当你发str1 他并没有初始化得时候;就会出现一个bug; 举例子 char str1[10]; char str2[6]="china"; printf("%s",strcpy(stri,str2)); 你会发现str2 只有5为加上一位\0;当给str1 时 你会发现str1;他并没有初始化;他的出现是随机得;这是你只是把前六位复制到str1;后面4位并不是你所想的那样全部转换成\0;就是说吧,他原本随机得是什么数值 ,现在就是什么数值;
6.5.5 strcmp();
字符串不能直接比较 要用函数!叫做函数值比较;
strcmp(字符串1,字符串2);
意思就是让两个字符串进行比较 ;
如果两个比较等价;那么输出得结果就是0;
小于;那么输出的结果就是一个负整数;
大于;输出的结果就是一个正整数;
那么你坑定会问 ;怎么进行比较的呢; 首先自左向右进行比较;通过ascall 1)完全相同; 说明字符串完全相等; 2)有不同 以第一对为准; 3)如果两个字符串都是英语都是英文;大写小于小写;在英文字典在后面得位置为大;
6.5.6 strlen();
测量字符串长度函数;
strlen(字符数组);
测的是字符;\0不测
6.5.7 strlwr();
字符串转换成小写得函数:
strlwr(字符串);
6.5.8 strupr();
字符串转换成大写的函数:
strupr(字符串);
6.6 例题
例题一:冒泡法 :随机输入十个数 从小到大输出
冒泡法/*随机输入十个数 从小到大输出*/ #include <stdio.h> int main(){ int i,j,t ; int a[10]; printf("please ten numbers:要用空格隔开\n"); for(i=0;i<=9;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<=9;j++) { for(i=0;i<=9-j;i++) { if(a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } } } printf("输出结果"); for(i=0;i<=9;i++) printf("%d\n",a[i]); return 0; }
例题二:输入0123456789 输出9876543210
/*输入0123456789 输出9876543210*/ #include <stdio.h> int main(){ int i; int f[20]={1,1}; for(i=0;i<=9;i++) f[i]=i; for(i=9;i>=0;i--) printf("%d\n",f[i]); return 0; }
例题三:将二维数组行列互换
/*将二维数组行列互换*/ #include <stdio.h> int main(){ int a[2][3]={1,2,3,4,5,6}; int b[3][2],i,j; printf("原矩阵是:\n"); for(i=0;i<=1;i++) { for(j=0;j<=2;j++){ printf("%5d",a[i][j]); b[j][i]=a[i][j]; } printf("\n"); } printf("\n请输出第二种矩阵:\n"); for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } return 0; }