c语言第7章数组与字符串.ppt
一一.概念概念C提供的数据类型有:标准型和构造型标准型和构造型。在遇到的大量编程问题中仅用标准型是解决不了的。如:排序,查询,统计,线性方程组求解,矩阵运算等需要用构造类型,数组是其中之一。数组数组-具有相同类型数据的集合。数组中每一个数据称为元素,每一个元素均用统一的数组名和相应的下标确定。数组定义数组定义格式:格式:一维一维 类型说明符 数组名常量二维二维 类型说明符 数组名常量 常量例:int num10;float score34;在程序中定义了一维数组和二维数组;在程序中定义了一维数组和二维数组;编译时在内存开辟连续一批单元,存编译时在内存开辟连续一批单元,存放数组各元素的值放数组各元素的值。2 bytesnum0num1num2 num9.4 bytes.score00score01score02 score23功能功能:定义数组名定义数组名,类型和大小。类型和大小。num 整型整型 10个元素score 实型实型 12个元素数组元素赋初值数组元素赋初值 指在定义的同时可给数组各元素或部分元素赋初值,即初始化。在编译时除分配一定的单元,同时将初值赋给相应单元(元素),否则是随机值。如果给全部元素赋值,则在数组定义时,可以不给出数组长度,系统将根据初值的个数自动确定数组的长度。num0num1.019static-表示静态存储;若定义成:static int num10;所有元素均赋 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分别赋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 num10,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(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;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);/*输出每门课平均分*/例:已知三行三列数组各元素值例:已知三行三列数组各元素值,试分别求各行元素试分别求各行元素,各列元素和每个元素之和。各列元素和每个元素之和。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 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);main()main()int num10,i,j,k,tem;int num10,i,j,k,tem;for(i=0;i10;i+)scanf(%d,&numi);for(i=0;i10;i+)scanf(%d,&numi);for(i=0;i9;i+)for(i=0;i9;i+)for(j=i+1;j10;j+)for(j=i+1;jnumj)if(numi numj)tem=numi;tem=numi;numi=numj;numi=numj;numj=tem;numj=tem;for(k=0;k10;k+)printf(%d,numk);for(k=0;k10;k+)printf(%d,numk);1 3 5 7 9 2 4 6 8 00 3 5 7 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 9main()main()int num10,i,j,k,tem;int num10,i,j,k,tem;for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,&numi);scanf(%d,&numi);for(i=0;i9;i+)for(i=0;i9;i+)for(j=0;j9-i;j+)for(j=0;jnumj+1)if(numj numj+1)tem=numj;tem=numj;numj=numj+1;numj=numj+1;numj+1=tem;numj+1=tem;for(k=0;k10;k+)for(k=0;k10;k+)printf(%d,numk);printf(%d,numk);1 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 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”;系统定义,自动在串尾加0。若提供的初值小于数组长度,则只将这些字符赋给数组中前面的元素,其余元素自动空字符0若对全体元素赋初值,可省长度说明均等价cn0cn1cn2cn3cn4cn5China0字符串结束标志输出时:printf(“%s n”,cn);cn 是字符数组名是字符数组名,当遇到0输出结束 printf(“%c n”,cn0);cn0 是字符数组元是字符数组元素素。在内存存放:n n可以用可以用scanfscanf对一个字符数组赋值,即对一个字符数组赋值,即输入一个字符串。但字符串中不能有输入一个字符串。但字符串中不能有空格,否则将以空格作为串结束符。空格,否则将以空格作为串结束符。n nChar st20;scanf(“%s”,st);Char st20;scanf(“%s”,st);n n注意,注意,stst是数组名而非变量名,故不是数组名而非变量名,故不可用可用&st&stn n数组名代表了数组的首地址,整个数数组名代表了数组的首地址,整个数组存放在以首地址开始的一块连续内组存放在以首地址开始的一块连续内存单元中存单元中字符串处理函数字符串处理函数:n n头文件是头文件是头文件是头文件是 n nputs(strputs(str或字串或字串)在屏幕上显示一个字符串在屏幕上显示一个字符串(以以00结结束束););将结束标记转为将结束标记转为 n;n;可含转可含转义字符义字符.n nstatic char str=“BBI”;static char str=“BBI”;puts(str);puts(str);static char str=“n bbi”puts(str);puts(str);n ngets(str)gets(str)n n从键盘输入一个串给字符数组从键盘输入一个串给字符数组,返回返回是该数组在内存的首地址是该数组在内存的首地址;字符串里字符串里可含空格可含空格n ngets(str);gets(str);键入键入:bbi:bbin nstrcat(str1,str2)strcat(str1,str2)n n将串将串2 2接在串接在串1 1后后,其结果放在字符数其结果放在字符数组中组中n nstatic char c2=“a boy”static char c2=“a boy”static char c1=“I am”;static char c1=“I am”;printf(“%s”,strcat(c1,c2);printf(“%s”,strcat(c1,c2);n nstrcpy(str1,strcpy(str1,字串字串)n n将字符串拷贝到字符数组里将字符串拷贝到字符数组里n nstrcpy(str1,”BBI”);strcpy(str1,”BBI”);static char str2=“bbi”;static char str2=“bbi”;strcpy(str2,str1)strcpy(str2,str1)n nstrcmp(str1,str2)strcmp(str1,str2)n n两串相同两串相同,返回值是返回值是0;0;串串11串串2,2,返回值返回值是正整数是正整数;串串11串串2,2,返回值是负整数返回值是负整数n nstrcmp(“CCTV”,”BTV”);strcmp(“CCTV”,”BTV”);n nstrlen(str)strlen(str)n n返回不包括返回不包括00字符串的长度字符串的长度n nprintf(“%dn”,strlen(“bbi”);printf(“%dn”,strlen(“bbi”);n n注注:str,str1,str2: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);gets(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;键入字符串stri!=0stri=?Yword=0Yword=0?num增1,word=1 N输出numN#include string.h#include string.hmain()main()char str 20,c;char str 20,c;int i,num=0,word=0;int i,num=0,word=0;gets(str);gets(str);for(i=0;(c=stri)!=0;i+)for(i=0;(c=stri)!=0;i+)if(c=)if(c=)word=0;word=0;else if(word=0)else if(word=0)word=1;num+;word=1;num+;printf(num=%d n,num);printf(num=%d n,num);二维字符数组运用二维字符数组运用,常用来处理多个常用来处理多个字符串字符串.例例:char name308 该二维数组该二维数组用来存放某班用来存放某班30个学生的名字个学生的名字.30个人个人每人的名字每人的名字,其长度其长度=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);