chapter 6 利用数组批量处理数据

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 定义一个数据储存24个字节;依据补码的形式储存; 
3.你要知道他有多少个;10个这样的数据 大概2040个字节

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};没赋值的 电脑给你赋值 ;就是0int a[10]={};0000000000
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,如果是整型数组初始化为0char 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;
} 

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值