《C语言利用数组处理数据.ppt》由会员分享,可在线阅读,更多相关《C语言利用数组处理数据.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 利用数组利用数组处理批量数据处理批量数据数学科学学院:汪小平数学科学学院:汪小平2/31一维数组概述一维数组概述n C语言简单变量无法表示下标,当要表示数学中一语言简单变量无法表示下标,当要表示数学中一系列数:系列数:a0,a1,a2,an时,就无能为力,如果用单时,就无能为力,如果用单个变量表示,很难简便的表达算法。个变量表示,很难简便的表达算法。#include int main()int i,a1,a2,a3,sum=0;scanf(%d%d%d,&a1,&a2,&a3);for(i=1;i=3;i+)sum+=ai;printf(sum is:%d,sum);return
2、0;3/31一维数组概述一维数组概述-数组的声明与引用数组的声明与引用n C语言的数组弥补了这一点。下面是改写后的程序:语言的数组弥补了这一点。下面是改写后的程序:#include int main()int i,a3,sum=0;scanf(%d%d%d,&a0,&a1,&a2);for(i=0;i3;i+)sum+=ai;printf(sum is:%d,sum);return 0;特别注意:特别注意:C语言数组下标都是从语言数组下标都是从0开始,因此定义开始,因此定义为为a3,只能取,只能取a0、a1、a2。4/31一维数组概述一维数组概述-数组的声明与引用数组的声明与引用n 利用数组下
3、标的变化,可以使表达形式不变,但运利用数组下标的变化,可以使表达形式不变,但运算内容变化,所以数组通常与循环联系,以构造简便算内容变化,所以数组通常与循环联系,以构造简便有效的算法。有效的算法。n 从存储上讲,数组就是在内存分配了一连续空间,从存储上讲,数组就是在内存分配了一连续空间,存储数组元素。其中数组名即是所分配内存的首地址。存储数组元素。其中数组名即是所分配内存的首地址。n 当访问数组元素当访问数组元素ai时,编译器通过运算得出第时,编译器通过运算得出第i个个元素的地址,再访问其中的元素,计算方式如下:元素的地址,再访问其中的元素,计算方式如下:a+i*sizeof(数组类型数组类型)
4、-第第i个元素在内存中地址个元素在内存中地址n 特别注意,特别注意,ai相当于是一个变量,使用方式与一相当于是一个变量,使用方式与一般变量完全一样。般变量完全一样。在在C程序中不用加,程序中不用加,C语言会根据声明中语言会根据声明中a的的类型自动乘上类型自动乘上5/31一维数组概述一维数组概述-数组的声明与引用数组的声明与引用n 整数、浮点数、字符三种类型,都可以声明对应的整数、浮点数、字符三种类型,都可以声明对应的数组,访问方式完全一样数组,访问方式完全一样float f10,sum=0.0;f9=3.14156;printf(“%f”,f9);#include int main()int
5、i;char a10;for(i=0;i=0;i-)printf(%c,ai);return 0;6/31一维数组的初始化一维数组的初始化n 三种数组的初始化非常相似。数组在定义时就可以三种数组的初始化非常相似。数组在定义时就可以初始化元素,格式为:初始化元素,格式为:数组类型数组类型 数组名数组名常量表达式常量表达式=对应类型元素列表对应类型元素列表 例如:例如:int a4=1,2,3,4;n 数组元素如果没有初始化,其值是不定的。数组元素如果没有初始化,其值是不定的。n 初始化规则有下面几条:初始化规则有下面几条:v 列表元素个数可以少于数组元素个数,这时剩下元列表元素个数可以少于数组元
6、素个数,这时剩下元素初始化为素初始化为0(字符类型相当于字符类型相当于0)。切记不能多于定。切记不能多于定义的元素个数,否则编译会报错义的元素个数,否则编译会报错 例:例:int a10=0;7/31一维数组的初始化一维数组的初始化v 利用初始化,也可以不定义数组长度,通过初值列利用初始化,也可以不定义数组长度,通过初值列表确定元素的个数。表确定元素的个数。例:例:char ch=C,h,i,n,a;8/31一维数组应用举例一维数组应用举例例例1 输出以下的杨辉三角形输出以下的杨辉三角形(要求为要求为12行行)9/31一维数组应用举例一维数组应用举例#include#define N 12in
7、t main(void)int i,j;int aN=1;/第一个元素为第一个元素为1,其余元素为其余元素为0 printf(%-5dn,a0);for(i=1;i0;j-)aj+=aj-1;for(j=0;j=i;j+)printf(%-5d,aj);putchar(n);return 0;10/31一维数组应用举例一维数组应用举例例例2 从外界读入一个整数,编程显示该数的从外界读入一个整数,编程显示该数的32位补码。位补码。11/31一维数组应用举例一维数组应用举例#include int main(void)int k,i=0;unsigned kk;char ch32=0;scanf(
8、%d,&k);kk=k;/直接传送,转化为无符号数直接传送,转化为无符号数dochi=kk%2;kk=kk/2;i+;while(kk!=0);for(i=31;i=0;i-)printf(%d,chi);return 0;scanf(%d,&kk);12/31一维数组应用举例一维数组应用举例例例3 输入输入10个数,进行排序,升序输出。个数,进行排序,升序输出。分析:排序方法很多,简单的有:直接插入排序、分析:排序方法很多,简单的有:直接插入排序、冒泡法、简单选择排序。这里用冒泡法、简单选择排序。这里用简单选择排序简单选择排序。13/31一维数组应用举例一维数组应用举例#define N 1
9、0#include int main(void)int i,j,k,t,aN;for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN-1;i+)k=i;for(j=i+1;jN;j+)/记住最小元素的位置记住最小元素的位置 if(ajak)k=j;t=ai;ai=ak;ak=t;/交换到前面交换到前面for(i=0;iN;i+)printf(%-5d,ai);return 0;14/31二维数组概述二维数组概述n 在数学中,经常用到矩阵,对应到在数学中,经常用到矩阵,对应到C语言,用二维语言,用二维数组表达矩阵。例如:数组表达矩阵。例如:int a43;声明了一个四行三声
10、明了一个四行三列的一个矩阵。若要访问二维数组的第列的一个矩阵。若要访问二维数组的第i行第行第j列元素,列元素,用用aijn 一维数组的使用,通常用单重循环,对应的,二维一维数组的使用,通常用单重循环,对应的,二维数组的使用,通常使用二重循环数组的使用,通常使用二重循环for(i=0;iM;i+)for(j=0;jN;j+)scanf(%d,&aij);15/31二维数组概述二维数组概述n 若有定义:若有定义:int aMN;。数组中的元素。数组中的元素C语言是语言是按按行行存储在一片存储在一片连续连续的内存内。的内存内。a是数组在内存中首地是数组在内存中首地址址。同时,。同时,M行的二维数组在
11、行的二维数组在C语言中可以看作语言中可以看作M个个一维数组,其中一维数组,其中a0是第一行的数组首地址,是第一行的数组首地址,a1是是第二行的首地址,第二行的首地址,n 由于数组元素在内存是连续存放,所以元素由于数组元素在内存是连续存放,所以元素aij在内存中的地址为在内存中的地址为(N是列数是列数):a+i*N+jn 二维数组在定义时也可以初始化二维数组在定义时也可以初始化 int a23=1,2,3,4;16/31二维数组举例二维数组举例例例4 完成矩阵的行列互换。完成矩阵的行列互换。#include int main(void)int i,j,t,a33=8,1,6,3,5,7,4,9,
12、2;for(i=0;i3;i+)for(j=i+1;j3;j+)/针对右上角针对右上角 t=aij;aij=aji;aji=t;for(i=0;i3;i+)for(j=0;j3;j+)printf(%3d,aij);printf(n);return 0;17/31二维数组举例二维数组举例#include int main(void)int i,j,t,a33=8,1,6,3,5,7,4,9,2;for(i=0;i3;i+)for(j=0;j3;j+)printf(%3d,aji);printf(n);return 0;也可以进行形式上的行列互换:也可以进行形式上的行列互换:18/31二维数组举
13、例二维数组举例例例5 完成两个矩阵的乘法。完成两个矩阵的乘法。#include int main(void)int i,j,k,a44,b44,c44=0;for(i=0;i4;i+)for(j=0;j10);aij=k;while(k=rand()10);bij=k;19/31二维数组举例二维数组举例for(i=0;i4;i+)for(j=0;j4;j+)for(k=0;k4;k+)cij+=aik*bkj;for(i=0;i4;i+)for(j=0;j4;j+)printf(%-6d,aij);printf(|);for(j=0;j4;j+)printf(%-6d,bij);printf(
14、|);for(j=0;j4;j+)printf(%6d,cij);putchar(n);return 0;20/31二维数组举例二维数组举例例例6 输出奇数阶魔方矩阵。规律如下:输出奇数阶魔方矩阵。规律如下:首先,将数首先,将数1置于第一行中间的方格里,然后将相继置于第一行中间的方格里,然后将相继的数按自然顺序置入右上角的方格内的数按自然顺序置入右上角的方格内n 当前行若是第一行,下一个数应置入最下行右邻列当前行若是第一行,下一个数应置入最下行右邻列的方格里,就像把最下行移到了第一行的上边似的的方格里,就像把最下行移到了第一行的上边似的n 当前列是最右列时,下一个数应置入第一列的上邻当前列是最
15、右列时,下一个数应置入第一列的上邻行的方格里,就像把第一列移到最右列的右边似的行的方格里,就像把第一列移到最右列的右边似的n 当右上方格已经填有数字或者当前方格在正方形的当右上方格已经填有数字或者当前方格在正方形的右上角时,下一个数应置入该方格正下方的相邻方格右上角时,下一个数应置入该方格正下方的相邻方格内内21/31二维数组举例二维数组举例22/31二维数组举例二维数组举例#define N 5#include int main(void)int i,j,row=0,col=N/2,dataNN=0;for(i=1;i=N*N;i+)/*设设row和和col是准备填充的行列是准备填充的行列*
16、/if(row=N)/*已在右上角已在右上角*/row=1;col=N-1;else/*只在第只在第0行上行上*/row=N-1;23/31二维数组举例二维数组举例else if(col=N)/*只可能在右列外只可能在右列外*/col=0;if(datarowcol0)/*如果当前位置已填充如果当前位置已填充*/row+=2;col-;/*到此已找到正确的填充位置到此已找到正确的填充位置row和和col*/datarow-col+=i;for(i=0;iN;i+)/*打印结果打印结果*/for(j=0;jN;j+)printf(%6d,dataij);putchar(n);return 0;2
17、4/31字符串及其使用字符串及其使用n C语言中,字符串是作为字符数组来处理的,可以语言中,字符串是作为字符数组来处理的,可以认为,字符串的每个字符,是顺序存储在字符数组中,认为,字符串的每个字符,是顺序存储在字符数组中,但一定注意,但一定注意,最后一个元素是最后一个元素是0,这是字符串的识,这是字符串的识别标志别标志n 字符串的长度是指字符数组中字符串的长度是指字符数组中0之前的元素个数之前的元素个数n 字符串不是一种数据类型,不能进行赋值操作,字字符串不是一种数据类型,不能进行赋值操作,字符串整体的操作,只能通过多条语句实现符串整体的操作,只能通过多条语句实现char ch10=C,h,i
18、,n,a,0;char ch=C,h,i,n,a,0;char ch=China;char ch=China;ch=China;25/31字符串及其使用字符串及其使用例例7 从键盘读入一个字符串保存入数组,原样输出;从键盘读入一个字符串保存入数组,原样输出;把该字符串反向复制入另一个字符数组,并输出。把该字符串反向复制入另一个字符数组,并输出。26/31字符串及其使用字符串及其使用#include int main(void)char str20,newstr20;int i,k;printf(Please input a string:);scanf(%s,str);printf(%s,st
19、r);for(k=0;strk!=0;k+);for(k-,i=0;k=0;k-,i+)newstri=strk;newstri=0;printf(n%sn,newstr);return 0;27/31字符串及其使用字符串及其使用#include int main(void)char str20;int i;printf(Please input a string:);scanf(%s,str);for(i=0;i20;i+)printf(%3c,stri);putchar(n);for(i=0;i20;i+)printf(%3d,stri);putchar(n);printf(%sn,str
20、);printf(Please input a string:);scanf(%s,str);for(i=0;i20;i+)printf(%3c,stri);putchar(n);for(i=0;is2,返回一个大于,返回一个大于0的数,的数,若若s1s2,返回一个小于,返回一个小于0的数,否则返回的数,否则返回0v 数字字符数字字符大写字母大写字母小字字母小字字母n size_t strlen(char*str):求字符串:求字符串str的长度,不包的长度,不包含含0,其中,其中size_t相当于相当于unsigned例例8 编写程序完成以下功能:输入一串字符,直到读编写程序完成以下功能:输入一串字符,直到读到句号为止,记录下这串字符中既不是数字也不是字到句号为止,记录下这串字符中既不是数字也不是字母的字符的个数,然后把这些字符按与输入相反的次母的字符的个数,然后把这些字符按与输入相反的次序输出。序输出。31/31常用的字符串处理函数常用的字符串处理函数#include int main(void)char ch81=0;int i,k=0;for(i=79;(chi=getchar()!=.;i-)if(chi9&chiZ&chiz)k+;printf(n%s,%d,&chi+1,k);return 0;32/31习题习题P1682、4、8、12、13、14、15