1、C语言程序设计语言程序设计数 组数组是程序处理大量数据的重要手段数组是程序处理大量数据的重要手段数据类型数据类型n基本数据类型:基本数据类型:整整 型:型:int,unsigned int,long实实 型:型:float,double,long double字符型:字符型:charn构造数据类型:构造数据类型:数数 组:无关键字组:无关键字结结 构:构:struct共用体:共用体:union数组的定义W0W1W8W9W定义定义:数据类型数据类型 数组名数组名 数组长度数组长度 例:例:int w10;float data100;long class34;char name30;double
2、number,a5,i,b4;数组的本质:一组相同类型的变量的顺序集合。一组相同类型的变量的顺序集合。注意事项n命名规则与基本类型变量相同;命名规则与基本类型变量相同;float Ms.Smth15;int 34140134;n必须指明长度;必须指明长度;int number10;double x3*4+5;char name;n方括号是数组的标志;方括号是数组的标志;int a(10);long b4;n只有一个名字;只有一个名字;n同类型变量的集合同类型变量的集合.1.只能由字母、数字、下划线组成;只能由字母、数字、下划线组成;2.第一个字符不能是数字;第一个字符不能是数字;3.不能使用保
3、留字。不能使用保留字。可以是常量或常量表达式可以是常量或常量表达式数组的初始化n例:int a4=1,2,3,4;1234a0a1a2a3a数组的初始化n完整初始化:完整初始化:float x3=1.5,2,3.5;int a4=0,1,2,3;n部分初始化:部分初始化:float x5=1.5,2,3.5;char name30=N,o,N,a,m,e;部分初始化只能在前部n完整初始化的简略方式:完整初始化的简略方式:float x=1.5,2,3.5,4;int a=1,2,3,4,5,6,7,8,9,10;n无初始化:无初始化:float x4;int a3;常见错误:常见错误:int
4、a4=1,2,3,4,5;int sohu3=1,2,3;float data10=;int b6=1,2,3,5,6;int i;float datai=3,2,1;float x;float datax=3,2,1;数组的使用n与基本变量相同的用法:与基本变量相同的用法:int num4=0,0,0,0;num0=1;num1=5;num2=2;n数组中的变量必须是相同类型的:数组中的变量必须是相同类型的:num1=1;num2=3.14;num2=3;num3=a;num3=97;n使用与定义的区别:使用与定义的区别:int a3;定义语句定义语句a3=3;赋值语句赋值语句n数组的边界:
5、数组的边界:下标的变化范围从下标的变化范围从0开始。开始。num0=1;num1=5;num2=2;num3=0;数组的存贮方式a0a1a2a3 a4a5b0b1b2b3b4 c0c1abc注意:注意:C语言中,数组的越界使用是最常见的隐形错误,是程序调试的难点。语言中,数组的越界使用是最常见的隐形错误,是程序调试的难点。计算机内存是线性空间int a6;int b5;int c2;数组的使用n例1.数组基本操作#include main()int a10,i;a0=1;a1=2;a2=a0+a1;a3=a2*a1;printf(“%d,%d,%d,%d”,a0,a1,a2,a3);n例2.数
6、组基本操作#include main()int a100,i;for(i=0;i100;i+)ai=i;n例3:输入一个大数,计算其位数并逆向打印#include main()char c;int data100,k,n=0;while(c=getchar()!=n)datan=c-48;n+;printf(“%dn”,n);for(k=n-1;k=0,k-)printf(“%d”,datak);数组的应用if(c0&c=100)break;较高的程序较高的程序容错性容错性是一个优秀程序区别于普通程序的重要标志之一。是一个优秀程序区别于普通程序的重要标志之一。/-sort-for(i=0;in
7、um;i+)max=datai;imax=i;for(k=i;kmax)max=datak;imax=k;temp=datai;datai=dataimax;dataimax=temp;for(i=0;inum;i+)printf(%fn,datai);数组的应用例例4 4:选择法排序:选择法排序1.确定搜索范围;确定搜索范围;2.遍历数据,选出其中的最大值;遍历数据,选出其中的最大值;3.将最大的数据和最前面的数据交换;将最大的数据和最前面的数据交换;4.搜索范围减小一个;搜索范围减小一个;5.重复步骤重复步骤2和和3,直至排序完毕。直至排序完毕。选出一个选出一个最大的最大的交换交换#inc
8、ludevoid main()float data100,temp,max;int i,k,imax,num;/-input data-for(i=0;i100;i+)scanf(%f,&datai);if(datai=-9999.0)break;num=i;/-data number读入数据读入数据for(;)change=0;for(k=0;knum-1;k+)if(datakdatak+1)temp=datak;datak=datak+1;datak+1=temp;change=1;if(change=0)break;for(i=0;inum;i+)printf(%fn,datai);数
9、组的应用n例例5.5.冒泡法排序冒泡法排序1.1.扫描数组,相邻元素相比较,将较大的扫描数组,相邻元素相比较,将较大的调换到前面。调换到前面。2.2.重复扫描,直至没有需要交换的元素。重复扫描,直至没有需要交换的元素。#include void main()float data100,temp;int i,k,change,num;for(i=0;i100;i+)scanf(%f,&datai);if(datai=-9999.0)break;num=i;相邻两数比较相邻两数比较交换交换变动标志变动标志变动标志变动标志数组的应用n例例6.6.用筛选法求质数用筛选法求质数#include main
10、()int data100,i,j,step;for(i=0;i100;i+)datai=i+1;for(i=1;i100;i+)if(datai!=0)step=datai;for(j=i+step;j100;j+=step)dataj=0;for(i=0;i100;i+)if(datai!=0)printf(%d,datai);思路:思路:12345678910111213141516171819202122232425262728293031323334100删除删除操作操作注意:注意:数组的下标从零开始数组的下标从零开始数组的应用n例7.计算循环小数for(k=0;k+)q=a1/a2
11、;r=a1%a2;q_arrayk=q;finish=0;for(i=0;ik;i+)if(r=r_arrayi)finish=1;start=i+1;break;if(finish=1)break;r_arrayk=r;a1=r*10;for(i=0;ik+1;i+)if(i=1)printf(.);if(i=start)printf();printf(%1d,q_arrayi);printf(n);思路:思路:1.记录每次除法的余数;记录每次除法的余数;2.和以前的记录比较,直至发现重复为止。和以前的记录比较,直至发现重复为止。#include void main()int a1,a2,q
12、,r,q_array1000,r_array1000;int i,k,start,finish=0;scanf(%d,&a1);scanf(%d,&a2);将新得到的将新得到的余数与记录余数与记录的所有余数的所有余数比较比较将余数记录下来将余数记录下来并作为新的被除数并作为新的被除数二维数组的定义定义定义:数据类型数据类型 数组名数组名 长度长度1 1长度长度2 2 W00 W01 W02 W10 W11 W12int w23;计算机的内存是线性空间。右边的下标变化较快。W00W01W02W10W11W12二维数组的初始化n完全初始化:完全初始化:intint a23=1,2,3,4,5,6;
13、a23=1,2,3,4,5,6;(分行初始化)(分行初始化)intint a23=1,2,3,4,5,6;a23=1,2,3,4,5,6;(顺序初始化)(顺序初始化)n完全初始化的简略形式:完全初始化的简略形式:intint a3=1,2,3,4,5,6;a3=1,2,3,4,5,6;intint a3=1,2,3,4,5,6;a3=1,2,3,4,5,6;n部分初始化:部分初始化:intint a33=2,3,1;a33=2,3,1;200000310二维数组的应用n例1.二维数组的赋值#include main()int i,j,array34;for(i=0;i3;i+)for(j=0;
14、j4;j+)arrayij=i*3+j;01234567891011二维数组的应用n矩阵运算1 2 34 5 67 8 91 4 72 5 83 6 9ab1 4 72 5 83 6 9a1 8 218 25 4821 48 8114 32 5032 77 12250 122194abab#include void main()int a 3=1,2,3,4,5,6,7,8,9;int b 3=1,4,7,2,5,8,3,6,9;int c33;int i,j;for(i=0;i3;i+)for(j=0;j3;j+)cij=aij*bij;printf(%d,cij);printf(n);矩阵
15、运算与计算机绘图是二维数组的典型应用图形处理、数学计算、数据库等。二维数组的应用 !_|*=-.,|_,-|/!_ /|*-.,/,|.-/#|_/#_ _ _ _ _|_ _ _ _ _ _ _ _ _ _|_=_-=_-=_|!_|_=_=-_-_ =_|!_|=_=-|*-,_-_|*-.,=|.-|=|!_|_.-_-|_=-|*-.,|=_-|/|=_=-|_,-/|_-=|_ /_|_=-_ _ _|_|_ /|=_-|/,_ _ _ _ _ _/,=-|/#_=-_=_=_-=-_-=_/#|_|_/#_ _ _-_=_ _/#_ _ _-|_ _ _=_0_ _ _0 _ _
16、_=-|_=_-_=-_ =_|-=_|,|_=-_-_=-_|_|_-=-|-_|(*|=_=|-|_|=-_=|=_|_-=_|=_|/+|=_ -|_=_-.-|=_=|=_-|+|-_=-_|=_ =|=_=-_|=|+|=_-/+|-=|_=-/+|=_|=_|+|+|=-_,-,_|_=|+|+|-_|=|-|+|+|-_=/|=_|+|+|-=_|_-/|=_=|+|+|=_=|_-|+|+|_=|=/|_|=-|=_=|_=-|/|=_=|=_-_|=_|-_|(-)-(/(o _ o)(0)/_-._=_.-_ /;#.-.#;_)#(_/#.#.#/#.#_#.#/_ (_
17、)#(_)总结n数组的各元素必须类型相同;数组的各元素必须类型相同;n数组的长度定义必须是常量或常量表达式;数组的长度定义必须是常量或常量表达式;n数组在内存中是线性存贮;数组在内存中是线性存贮;n数组元素具有简单变量的一切性质;数组元素具有简单变量的一切性质;n不允许整体操作;不允许整体操作;n数组的下标从数组的下标从0开始;开始;n系统不对数组操作进行越界检查。系统不对数组操作进行越界检查。数组的本质:一组相同类型的变量的顺序集合。一组相同类型的变量的顺序集合。上机作业n1.通过键盘输入一组数据,对该组数据进行排序。排序完成后,通过键盘输入一个数,请按排序的规律将它插入到数组中。n2.通过
18、键盘输入两个方阵,计算各个方阵的转置阵和所有元素之和,以及两矩阵的点积、叉积。字符数组与字符串n字符数组char university20=B,U,A,A;.BUAA012319n字符串char university20=BUAA;.BUAA01231904 00 是字符串区别于字符数组的标志,如果没有是字符串区别于字符数组的标志,如果没有 00,专用于字符串的,专用于字符串的一些操作则不能使用,但它也是合法的,只是普通的字符数组而已。一些操作则不能使用,但它也是合法的,只是普通的字符数组而已。n字符串的定义:char class20;字符串的定义与初始化注意:注意:如果只定义而未初始化,则字
19、符串和字符数组如果只定义而未初始化,则字符串和字符数组形式上是一样的。形式上是一样的。n 字符串初始化:char class20=BUAA;char class20=BUAA;char class=BUAA;n字符串长度计算函数字符串长度计算函数 strlenchar class=391401;i=strlen(class);i=strlen(Beijing University of Aeronautics and Astronautics);注意:注意:0 是字符串的结束标志,它占用空间,但不是串的一部分。是字符串的结束标志,它占用空间,但不是串的一部分。字符串专用函数n字符串拷贝函数字符
20、串拷贝函数 strcpychar university30=Buaa,class=391401;strcpy(university,class);注意:注意:1.函数自动处理函数自动处理0;2.第一个字符串必须有足够的空间;第一个字符串必须有足够的空间;3.不能采用不能采用university=class的方式拷贝字符串。的方式拷贝字符串。字符串专用函数n字符串比较函数字符串比较函数 strcmp比较两个字符串,根据结果的不同返回不同的值。比较两个字符串,根据结果的不同返回不同的值。返回值:返回值:当当S1S2时,返回正数;时,返回正数;当当S1S2时,返回负数;时,返回负数;当当S1=S2时
21、,返回时,返回0。字符串比较依据:字符串比较依据:ASCIIASCII码表。码表。char string1=BUAA;char string2=Buaa391401;比较的方法:比较的方法:从左至右,逐字符比较,直至发现不同。从左至右,逐字符比较,直至发现不同。注意:注意:字符串的长度不作为比较依据。字符串的长度不作为比较依据。字符串专用函数n字符串拼接函数字符串拼接函数 strcatchar university30=Buaa,class=391401;strcat(university,class);结果:Buaa391401注意:注意:1.1.函数自动处理函数自动处理0;2.2.第一个字
22、符串必须有足够的空间;第一个字符串必须有足够的空间;3.3.不能采用不能采用university=university+class;n 其它常用函数其它常用函数(string.h)大写变为小写函数大写变为小写函数 strlwr 小写变为大写函数小写变为大写函数 strupr 字符串查找函数字符串查找函数 strstrstring.h不是不是C语言标准库,在不同的系统中可以不一样。语言标准库,在不同的系统中可以不一样。字符串的输入输出n字符串专用输入函数 gets(str)1.输入的一切内容均按字符串处理;2.与scanf的主要区别是:可以输入空格。例:char a10;get(a);n字符串专
23、用输出函数 puts(str)1.相当于printf(“%s”,.);2.不推荐使用;3.常用格式:printf(“%s”,a);字符串的应用n例:实现例:实现strstrstrstr功能功能假设有一个著名高校的列表,希望能够实现查找某高校是否在该列表中。list=peking,tsinghua,fudan,beihang;name=buaa;length1=strlen(list);length2=strlen(name);found=1;for(j=0;j=length1-length2;j+)if(name0=listj)for(i=0;ilength2;i+)if(namei!=listj+i)found=0;if(found=1)printf(Yes,%s is famous!n,name);else printf(“No,%s isnt famous!n,name);#include#includevoid main()char list=peking,tsinghua,beihang;char name=beihang;int length1,length2,i,j,found;作业:作业:改正程序错误,补充该程序的功能,改正程序错误,补充该程序的功能,name由用户键盘输入。由用户键盘输入。