1、一一.概念概念C提供的数据类型有:标准型和构造型标准型和构造型。在遇到的大量编程问题中仅用标准型是解决不了的。如:排序,查询,统计,线性方程组求解,矩阵运算等需要用构造类型,数组是其中之一。数组数组-具有相同类型数据的集合。数组中每一个数据称为元素,每一个元素均用统一的数组名和相应的下标确定。数组定义数组定义格式:格式:一维一维 类型说明符 数组名常量二维二维 类型说明符 数组名常量 常量例:int num10;float score34;在程序中定义了一维数组和二维数组;在程序中定义了一维数组和二维数组;编译时在内存开辟连续一批单元,存编译时在内存开辟连续一批单元,存放数组各元素的值放数组各
2、元素的值。2 bytesnum0num1num2 num9.4 bytes.score00score01score02 score23功能功能:定义数组名定义数组名,类型和大小。类型和大小。num 整型整型 10个元素score 实型实型 12个元素数组元素赋初值数组元素赋初值 指在定义的同时可给数组各元素或部分元素赋初值,即初始化。在编译时除分配一定的单元,同时将初值赋给相应单元(元素),否则是随机值。如果给全部元素赋值,则在数组定义时,可以不给出数组长度,系统将根据初值的个数自动确定数组的长度。num0num1.019static-表示静态存储;若定义成:static int num10;
3、所有元素均赋 0;部分元素赋初值:static int num10=0,1,2,3,4;其它元素均赋 0;num9一维数组:一维数组:static int num10=0,1,2,3,4,5,6,7,8,9;也可 static float score34=1,1,1,1,2,2,2,2,3,3,3,3;也可 static float score 4=1,1,1,1,2,2,2,2,3,3,3,3;而 static float score34;则所有元素均赋 0;部分元素赋初值部分元素赋初值:static float score34=1,2,3;表示score00;score10;score20
4、分别赋1,2,3,其它元素均为 0。static float score34=1,7,8;表示score 00=1;score10=7,score11=8,其它元素均为 0;二维数组二维数组static float score34=1,1,1,1,2,2,2,2,3,3,3,3,;对数组元素的操作对数组元素的操作 在C中,只能对已定义的数组元素逐个的操作(赋值、输出等),不可对整个数组一次进行赋值,输出等。凡是变量可出现的地方,数组元素变量可出现的地方,数组元素也可出现也可出现。数组元素引用格式:一维 数组名 二维 数组名 一维数组各元素一维数组各元素:赋值赋值,输出输出main()int n
5、um10,i;for(i=0;i10;i+)numi=i+1;for(i=0;i10;i+)numi*=10;for(i=0;i10;i+)printf(num%d=%d n,i,numi);main()int num10,i;for(i=0;i10;i+)scanf(%d,&numi);for(i=0;i10;i+)printf(num%d=%d n,i,numi);二维数组各元素二维数组各元素:赋值赋值,输出输出main()int score34;int i,j;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,&scoreij);for(i=0;i3;i+)for
6、(j=0;j4;j+)printf(score%d%d=%d,i,j,scoreij);printf(n);数组在编程中应用数组在编程中应用例:某班例:某班3人人,2门课门课,试编程试编程:1.键盘输入每个人学号和2门课成绩;2.求出每人平均分和每门课的平均分。变量设置变量设置:num3 存放每个人的学号score32 存放30人,每人9门课成绩aver3 存放每人平均成绩aver12 存放每门课平均成绩 main()int i,j;int score32,num3,sum;float aver3,aver12;for(i=0;i3;i+)scanf(%d,&numi);for(j=0;j2;
7、j+)scanf(%d,&scoreij);/*输入每人学号和2门课成绩*/for(i=0;i3;i+)sum=0;for(j=0;j2;j+)sum+=scoreij;averi=sum/2;/*求出每人平均分*/for(i=0;i3;i+)printf(Student.%d t%f n,i+1,averi);/*输出每门课平均分*/for(i=0;i2;i+)sum=0;for(j=0;j3;j+)sum+=scoreji;aver1i=sum/3;/*求每门课平均分*/for(i=0;i2;i+)printf(Course.%d t%f n,i+1,aver1i);/*输出每门课平均分*
8、/例:已知三行三列数组各元素值例:已知三行三列数组各元素值,试分别求各行元素试分别求各行元素,各列元素和每个元素之和。各列元素和每个元素之和。main()int i,j;static int a44=3,5,6,0,2,1,4,0,3,5,4,0,0,0,0,0;for(i=0;i3;i+)for(j=0;j3;j+)ai3+=aij;a3j+=aij;a33+=aij;for(i=0;i4;i+)for(j=0;j4;j+)printf(%5d,aij);printf(n);第第0列各元素之和列各元素之和所有元素之和所有元素之和第第 0 行各行各 元素之和元素之和3 5 6 xx2 1 4
9、xx3 5 4 xxxx xx xx xx例:矩阵相乘例:矩阵相乘:C=A*B条件条件:A阵的列数=B阵的行数 乘积矩阵的行数为A阵行,列为B阵列main()static int a33=1,2,3,4,5,6,7,8,9;static int b32=1,2,3,4,5,6;static int c32;int i,j,k;for(i=0;i3;i+)for(j=0;j2;j+)for(k=0;k3;k+)cij+=aik*bkj;for(i=0;i3;i+)for(j=0;j2;j+)printf(%5d,cij);printf(n);1 3 5 7 9 2 4 6 8 00 3 5 7
10、9 2 4 6 8 10 1 5 7 9 3 4 6 8 20 1 2 7 9 5 4 6 8 30 1 2 3 9 7 5 6 8 40 1 2 3 4 9 7 6 8 50 1 2 3 4 5 9 7 8 60 1 2 3 4 5 6 9 8 70 1 2 3 4 5 6 7 9 80 1 2 3 4 5 6 7 8 91 3 5 7 9 2 4 6 8 01 3 5 7 2 4 6 8 0 91 3 5 2 4 6 7 0 8 91 3 2 4 5 6 0 7 8 91 2 3 4 5 0 6 7 8 91 2 3 4 0 5 6 7 8 91 2 3 0 4 5 6 7 8 91 2
11、0 3 4 5 6 7 8 91 0 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9字符数组字符数组 C中无字符串变量中无字符串变量,字符串是用字符字符串是用字符数组处理数组处理.定义定义:一维 char cn5 (常用来处理一个字符串)二维 char name308 (常用来处理多个字符串)赋初值赋初值:static char cn5=C,h,i,n,a;static char cn6=C,h,i,n,a,0;static char cn6=“China”;static char cn6=“China”;static char cn=“China”;系统定义,自动在串尾
12、加0。若提供的初值小于数组长度,则只将这些字符赋给数组中前面的元素,其余元素自动空字符0若对全体元素赋初值,可省长度说明均等价cn0cn1cn2cn3cn4cn5China0字符串结束标志输出时:printf(“%s n”,cn);cn 是字符数组名是字符数组名,当遇到0输出结束 printf(“%c n”,cn0);cn0 是字符数组元素是字符数组元素。在内存存放:字符串处理函数字符串处理函数:n头文件是头文件是 nputs(str或字串)在屏幕上显示一个字符串(以0结束);将结束标记转为 n;可含转义字符.nstatic char str=“BBI”;puts(str);static ch
13、ar str=“n bbi”puts(str);ngets(str)n从键盘输入一个串给字符数组,返回是该数组在内存的首地址;字符串里可含空格ngets(str);键入:bbinstrcat(str1,str2)n将串2接在串1后,其结果放在字符数组中nstatic char c2=“a boy”static char c1=“I am”;printf(“%s”,strcat(c1,c2);nstrcpy(str1,字串)n将字符串拷贝到字符数组里nstrcpy(str1,”BBI”);static char str2=“bbi”;strcpy(str2,str1)nstrcmp(str1,s
14、tr2)n两串相同,返回值是0;串1串2,返回值是正整数;串1串2,返回值是负整数nstrcmp(“CCTV”,”BTV”);nstrlen(str)n返回不包括0字符串的长度nprintf(“%dn”,strlen(“bbi”);n注:str,str1,str2是字符数组名或字符型指针变量名例:实现串拷贝main()static char s2=China;char s120;int i;for(i=0;s2i!=0;i+)s1i=s2i;s1i=0;printf(%sn,s1);例:实现串连接#include main()char s130,s220;int i,j;gets(s1);ge
15、ts(s2);i=0;while(s1i)i+;for(j=0;s2j;j+,i+)s1i=s2j;s1i=0;printf(%s n,s1);例:字符串比较#include main()char s120,s220;int i;gets(s1);gets(s2);for(i=0;s1i=s2i;i+)if(s1i=0)break;printf(%d n,s1i-s2i);例:输入一串字符,统计该串里单词的个数 (单词间用空格分开),串结束用回车.Num:统计串的个数,Word:当遇到一个或多个空格,word=0;当遇到第一个非空格,若原word是0,表示新词开始,num增1,同时word=1
16、;键入字符串stri!=0stri=?Yword=0Yword=0?num增1,word=1 N输出numN#include string.hmain()char str 20,c;int i,num=0,word=0;gets(str);for(i=0;(c=stri)!=0;i+)if(c=)word=0;else if(word=0)word=1;num+;printf(num=%d n,num);二维字符数组运用二维字符数组运用,常用来处理多个常用来处理多个字符串字符串.例例:char name308 该二维数组该二维数组用来存放某班用来存放某班30个学生的名字个学生的名字.30个人个
17、人每人的名字每人的名字,其长度其长度=8name308例例:已知三个字符串已知三个字符串,挑出并输出最大串。挑出并输出最大串。C C T V 0 .B T V 0 .N T V 0 .c0是第一个串在内存存放首地址c1是第二个串在内存存放首地址c2是第三个串在内存存放首地址str是字符串在内存存放首地址#include main()char str20,c320;int i;for(i=0;i 0)strcpy(str,c0);else strcpy(str,c1);if(strcmp(c2,str)0)strcpy(str,c2);printf(max=%s n,str);例:键入一个数字串例:键入一个数字串,将其转为相应的整数将其转为相应的整数.如:“-1234”转为 -1234;“1234”转为 1234.main()char s20;int i,n,sign;scanf(%s,s);for(i=0;si=|si=t|si=n;i+);sign=(si=-)?-1:1;if(si=+|si=-)i+;for(n=0;si=0&si=9;i+)n=10*n+si-0;printf(Result is%d n,n*sign);