C语言程序设计第8章课件_第1页
C语言程序设计第8章课件_第2页
C语言程序设计第8章课件_第3页
C语言程序设计第8章课件_第4页
C语言程序设计第8章课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计TheCProgrammingLanguage华中科技大学计算机学院

曹计昌6/4/20231华中科技大学计算机学院C语言程序设计第8章数组

一维数组的声明、初始化和使用数组的运算、作为函数参数的使用字符串、多维数组同时包括:字符串操作函数,数字串与数之间的转换函数,二分查找,排序等程序的设计.相关算法和程序设计方法要熟练掌握.6/4/20232华中科技大学计算机学院8.1数组概述程序=算法+数据结构PASCAL程序设计语言发明者NiklausWirth曾经说过简单数据类型的变量仅能描述一个单独的数据对客观对象的描述能力十分有限如何描述一群有联系的数据集合?(全班C语言考试成绩)数组属于构造类型是相同数据类型数据的集合(不同数据类型数据如何考虑?如学生对象有学号,姓名性别,年龄,各科成绩等属性)元素组成数组的这些数据任何类型(简单类型、构造类型)6/4/20233华中科技大学计算机学院8.1数组概述数组特点其所有元素数目固定其所有元素类型相同其所有元素顺序存放

(在内存中也是连续存放的)数组作用集中管理将相关的同类型数据集中用一个标识符(数组名)表示元素顺序存放,但可随机定位用若干个数字序号(下标)来区别各数组元素例如定义floatscore[30],可表述30位学生成绩用数组具有什么好处?6/4/20234华中科技大学计算机学院8.1数组概述问题计算全班30位同学某门课程的平均成绩

解决方法设置30个float型变量来记录成绩设置一个有30个float型元素的数组来记录成绩问题分析参与运算的平均成绩,其数据类型都相同(符合数组特点)30位同学属于一个班,用数组可把30个成绩表示成一个整体用数组的优点便于循环处理提高效率,便于书写、检查、修改(对海量数据效果更明显)6/4/20235华中科技大学计算机学院8.2一维数组维数标识一个数组元素所需要使用的下标的个数一维数组只有一个下标可用于表示一个线性的数据队列使用数组的要求先声明数组对它进行初始化,然后才能使用6/4/20236华中科技大学计算机学院8.2.1一维数组的声明要解决三个问题确定数组的数据类型给数组定义一个名字,以便在程序中使用指明数组的大小,即数组中元素的个数声明形式[存储类型说明符][类型修饰符]类型说明符数组名[常量表达式]={初值表};存储类型说明符:extern、static类型修饰符:const、volatile类型说明符:int

char、

…数组名:是一个标识符,是一个地址常量,用以表示数组中打头元素的地址6/4/20237华中科技大学计算机学院8.2.1一维数组的声明例8.1具有基本数据类型的一维数组的声明

#defineSIZE10

intarray[5]; doubled[5],e[SIZE]; charname[SIZE*5];

错误例子unsignedintsize;charstr[size],buffer[2*size];

错误原因数组的大小一经说明就不能改变长度说明不是表达式,在编译之前就必须明确确定6/4/20238华中科技大学计算机学院8.2.1一维数组的声明例8.2采用类型修饰符的一维数组的声明staticinty[10];数组y中的每一个成员都是静态整型成员externdoubles[2];作了一个外部双精度型数组的引用性声明应该在另外的源文件中通过doubles[2];来定义s数组,这样第2个声明语句才有意义6/4/20239华中科技大学计算机学院8.2.2一维数组的使用C提供的各种操作符针对基本数据类型的变量数组是构造数据类型但其元素是基本数据类型的变量访问数组不需设计专门的数组操作符方法:数组名[下标表达式]例inta[5],j=2;5个元素依次是a[0],a[1],a[2],a[3],a[4]正确用法:

a[j+2]、a[++j]、a[j--]、a[5*j-7]错误用法:a[j-3]、a[2*j+1]6/4/202310华中科技大学计算机学院例8.3使用一维数组计算学生的平均成绩。#include〞stdio.h〞voidmain(void){

intscore[30],i,sum=0;doubleaverage;

printf("inputthescoresplease:\n");

for(i=0;i<30;i++)

scanf(“%d”,&score[i]);/*将键盘输入的成绩赋给各个数组元素*/

for(i=0;i<30;i++)sum+=score[i];/*求学生成绩的累加和*/average=sum/30.0;/*计算平均成绩*/printf("sum=%d\n",sum);printf("average=%lf\n",average);}演示EX8_3.C6/4/202311华中科技大学计算机学院8.2.3一维数组的初始化显式初始化值的个数与说明长度相同intx[5]={0,1,2,3,4};inty[5]={0,1,2,3,4,5};错误:初值个数大于数组长度有初始化值时,长度说明可缺省数组长度由初值个数确定inty[]={1,2,3,4,5,6,7,8}; 初始化值的个数可以小于说明长度,但只能缺省最后连续元素的初值intz[10]={0,1,2,3,4};/*前5个下标变量赋值*/intu[9]={,1,,,2};

错误:缺省u[0],u[2]不是最后连续元素6/4/202312华中科技大学计算机学院例8.8观察局部数组、静态数组和外部数组的缺省初值的程序#include"stdio.h"doubles[2];voidmain(void){

inta[2],i;

staticintb[2];

for(i=0;i<2;i++){

printf("s[%d]=%d\n",i,s[i]);

printf("a[%d]=%d\n",i,a[i]);

printf("b[%d]=%d\n",i,b[i]); }}演示EX8_8.C程序的运行结果如下:

s[0]=0,a[0]=64,b[0]=0s[1]=0,a[1]=3129,b[1]=0结论:

外部数组s和静态数组b的元素的缺省初值都是0

局部数组a的初值则是随机的

6/4/202313华中科技大学计算机学院8.2.4一维数组的存储结构存放方法各个元素从数组名标明的起始地址开始在内存中连续存放

例如inta[5];这里是16位机,1个int变量占2个字节空间数组元素a[0]a[1]a[2]a[3]a[4]元素地址a+0a+1a+2a+3a+4&a[0]&a[1]&a[2]&a[3]&a[4]6/4/202314华中科技大学计算机学院例8.9观察一维数组的存储情况的程序#include"stdio.h"#defineSIZE3voidmain(void){

int

x[SIZE]={1,3,5},k;chars[SIZE+1]="ABC";floatf[SIZE]={1.414,3.1415,5.25};

printf("thevalueofxis0x%x\n",x);

for(k=0;k<SIZE;k++)

printf("x[%d]=%d\t

addr=0x%x\n",x[k],&x[k]);演示EX8_9.C程序运行结果如下:

thevalueofxis0xffc8x[0]=1addr=0xffc8x[1]=3addr=0xffcax[2]=5addr=0xffcc6/4/202315华中科技大学计算机学院例8.9观察一维数组的存储情况的程序k=0;printf("\nthevalueofsis0x%x\n",x);while(s[k])

printf("s[%d]=%c\t

addr=0x%x\n",s[k],&s[k]),k++;printf("s[%d]+X=%c\t

addr=0x%x\n",s[k]+'X',&s[k]);printf("\nthevalueoffis0x%x\n",f);for(k=0;k<SIZE;k++)

printf("f[%d]=%f\t

addr=0x%x\n",f[k],&f[k]);} 程序运行结果如下:

thevalueofsis0xffces[0]=Aaddr=0xffces[1]=Baddr=0xffcfs[2]=Caddr=0xffd0s[3]+X=Xaddr=0xffd1thevalueoffis0xffd2f[0]=1.414000addr=0xffd2f[1]=3.141500addr=0xffd6f[2]=5.250000addr=0xffda6/4/202316华中科技大学计算机学院8.2.5一维数组的运算C提供的各种操作符赋值运算、各种算术运算、++、--针对基本数据类型的变量可针对int、float、以及double类型数组中元素合法操作intx[3]={1,2,3},y[3]={4,5,6},z[3],k=1;z[0]=x[0]+y[0];z[1]=x[0]+y[3];z[k]=++x[0]+--y[k++];z[1]=x[0]+y[x[1]];不允许两个数组直接相加z=x+y;编译时给出提示“cannotaddtwopointers”6/4/202317华中科技大学计算机学院数组的直接相加

例8.10设5个同学修了高等数学﹑普通物理、程序设计语言并取得了成绩,现计算三门课总分、平均分,每门课的总分、平均分,每个同学的总分、平均分#include"stdio.h"#defineSIZE5voidmain(void){

int

math[SIZE]={91,67,88,78,81};

int

physics[SIZE]={87,79,81,86,67};

int

programming[SIZE]={86,81,85,92,87};/*3个数组依次存放数学、物理、程序设计的成绩*/6/4/202318华中科技大学计算机学院例8.10(演示EX8_10.C)intcourse_sum[3]={0,0,0};doublecourse_even[3];/*分别为各门课程总分、平均分数组*/int

student_sum[5]={0,0,0,0,0};doublestudent_even[5];/*分别为各位同学总分、平均分数组*/intsum=0;doubleeven;/*分别为全部课程的总分、平均分*/inti;for(i=0;i<5;i++){course_sum[0]+=math[i];course_sum[1]+=physics[i];course_sum[2]+=programming[i]; }/*计算各门课程的总分*/

for(i=0;i<3;i++){

course_even[i]=course_sum[i]/5.0;sum+=course_sum[i]; }/*计算各门课平总分*/

even=sum/(3.0*SIZE);/*计算全部课程的平均分*/

6/4/202319华中科技大学计算机学院例8.10for(i=0;i<5;i++){/*计算每个学生的总分、平均分*/

student_sum[i]=math[i]+physics[i]+programming[i];

student_even[i]=student_sum[i]/3.0;}printf("三门课程的总分:%d\n",sum);printf("三门课程的平均分:%lf\n",even);程序的运行结果如下三门课程的总分:1236

三门课程的平均分:82.4000006/4/202320华中科技大学计算机学院例8.10for(i=0;i<3;i++){

printf("course_sum[%d]=%d\n",i,course_sum[i]);

printf("course_even[%d]=%lf\n",i,course_even[i]);}程序的运行结果如下

course_sum[0]=405course_even[0]=81.000000course_sum[1]=400course_even[1]=80.000000course_sum[2]=431course_even[2]=86.2000006/4/202321华中科技大学计算机学院例8.10for(i=0;i<5;i++){

printf("student_sum[%d]=%d\n",i,student_sum[i]);

printf("student_even[%d]=%lf\n",i,student_even[i]);}}程序的运行结果如下

student_sum[0]=264student_even[0]=88.000000student_sum[1]=227student_even[1]=75.666667student_sum[2]=254student_even[2]=84.666667student_sum[3]=256student_even[3]=85.333333student_sum[4]=235student_even[4]=78.3333336/4/202322华中科技大学计算机学院8.2.6一维数组作为函数参数参数的传递传值传地址数组作为函数参数采用的是参数传址传送的是数组的地址或传送数组元素的地址还需传送数组元素的个数6/4/202323华中科技大学计算机学院例8.11一维数组作为函数参数的例子12345xy#include"stdio.h"voidfun(int

y[],intn);/*y是形式数组*/voidmain(void){intk,x[5]={1,2,3,4,5};……

fun(x,3);

……fun(&x[2],3);

……}voidfun(int

y[],intn){……}演示EX8_11.C子函数需给出形式数组的声明和形式数组中元素的个数调用函数实参的值是数组x的起始地址参数传递6/4/202324华中科技大学计算机学院例8.12对n个整数采用冒泡法对其排序(演示EX8_12.C)

分析输入n个数存放在一数组中,便于循环处理排序是将一个数据元素任意的序列按照一定的规则排列成为一个有序的序列voidbubble_sort(int

a[],intn){对a[n]表示的n个整数进行排序处理}main(){输入n个数;

输出n个数检验排序效果}调用bubble_sortsort对n个数排序;6/4/202325华中科技大学计算机学院例8.12冒泡排序a[0]a[1]a[2]a[3]a[4]a[5]原始312512864261-1253112864261-2251231864261-3251231864261-4251231428661-525123142686第一遍从下标为0的元素开始,对两两相邻的元素进行比较如果前一个元素大于后一个元素,就交换这两个元素的值循环n-1次比较在第一遍循环后不仅把最大整数移到数组最末尾(其下标为n-1)(像冒泡)还尽量把较大值往后挪,例如“31”还剩前面n-1个数需排序6/4/202326华中科技大学计算机学院例8.12冒泡排序a[0]a[1]a[2]a[3]a[4]a[5]1遍251231426862遍122531642863遍122563142864遍126253142865遍61225314286第2遍对前n-1个数,与第1遍一样循环处理还剩前n-2个数未排序第i遍对前n-i+1个数,与第1遍一样循环处理还剩前n-i个数未排序大循环结束时机(对i)i>=n-1一遍循环中未发生交换,即已排好序6/4/202327华中科技大学计算机学院例8.12冒泡排序voidbubble_sort(int

a[],intn)/*形参用形式数组a[]*/{

int

i,j,t,k;intflag=1;

for(i=0;(i<n-1)&&flag;i++)*共进行n-1轮"冒泡"*/ {flag=0;

for(j=0;j<n-i-1;j++)

if(a[j]>a[j+1])/*对两两相邻的元素进行比较*/ {t=a[j],a[j]=a[j+1],a[j+1]=t;flag=1;} }}6/4/202328华中科技大学计算机学院8.3字符数组8.3.1字符数组的声明和使用字符数组元素的数据类型为char或wchar_t

声明格式与前面讨论的一维数组相同chars[81];字符串用一对双引号界定的一个字符序列C语言没有规定字符串类型用一个字符数组来存放字符序列,并且在末尾加一个空字符ˊ\0ˊ来构造字符串6/4/202329华中科技大学计算机学院8.3字符数组字符串的存储字符串的长度字符串的长度=字符串的存储长度–1设计字符数组的最小长度应该等于该字符串的存储长度或字符数组的最小长度应该等于该字符串的长度加1字符数组的使用通过下标来访问字符数组中的具体字符元素ˊWˊˊuˊˊhˊˊaˊˊnˊˊ\0ˊ6/4/202330华中科技大学计算机学院#include"stdio.h"voidmain(void){charCapital[27],Lowercase[27];

inti,delt=ˊaˊ-ˊAˊ; Capital[0]=ˊAˊ;Lowercase[0]=Capital[0]+delt;

for(i=1;i<26;i++){

Capital[i]=Capital[i-1]+1;

Lowercase[i]=Lowercase[i-1]+1;}Capital[26]=ˊ\0ˊ;Lowercase[26]=Capital[26];

printf("%s\n",Capital);

printf("%s\n",Lowercase);}

(演示EX8_13.C)例8.13产生大写和小写的26个英文字母字符串程序运行结果如下:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnop

qrstuvwxyz

6/4/202331华中科技大学计算机学院8.3.2字符数组的初始化通过初始化列表chars1[8]={ˊWˊ,ˊuˊ,ˊhˊ,ˊaˊ,ˊnˊ,ˊ\0ˊ};ˊ\0ˊ必须在初始化列表中显示给出用字符串初值chars2[28]=〞ComputerScience〞;末尾将自动加上一个ˊ\0ˊ第三种方法数组长度未明显给出chars3[]=〞ComputerEngineering〞;字符数组的容量恰好等于字符串的存储长度6/4/202332华中科技大学计算机学院8.4字符串处理函数串操作函数求字符串长度字符串的拷贝字符串的比较字符串的连接求字符串的子串删除字符串首尾空白字符从字符串中删除所有与给定字符相同的字符将字符串反转等函数6/4/202333华中科技大学计算机学院例8.14求字符串长度的函数int

strlen(chars[]){

intj=0;

while(s[j]!=′\0′) j++; returnj;}(演示EX8_14.C)voidmain(void){ charstr[]="thereisaboatonthelake";

intlength; length=strlen(str);

printf("lengthofthestringis%d\n",length);}运行结果:

lengthofthestringis286/4/202334华中科技大学计算机学院例8.15字符串拷贝的函数voidstrcpy(chart[],chars[]){

intj=0;

while(t[j]=s[j++]) ;}(演示EX8_15.C)voidmain(void){ charstr1[30],str2[]="thereisaboatonthelake.";

strcpy(str1,str2); puts(str1);}运行结果:

thereisaboatonthelake.6/4/202335华中科技大学计算机学院例8.16两个字符串比较函数比较规则从两个字符串的第一个字符起开始按照字符ASCII码值的大小进行比较返回规定当两个字符串相等时,返回0当第一个串大于第二个串时,返回一个大于零的值当第一个串小于第二个串时,返回一个小于零的值int

strcmp(char

s[],chart[]){

intj=0;

while(s[j]==t[j]&&s[j]!=′\0′) j++; returns[j]-t[j];}(演示EX8_16.C)6/4/202336华中科技大学计算机学院例8.16两个字符串比较函数voidmain(void){ chars1[]="car",s2[]="bus",s3[]="truck",s4[]="car";

printf("%sis%s%s.\n",s1,strcmp(s1,s2)>0?"greatthen":strcmp(s1,s2)<0?"lessthen":"equalto",s2);

printf("%sis%s%s.\n",s1,strcmp(s1,s3)>0?"greatthen":strcmp(s1,s3)<0?"lessthen":"equalto",s3);

printf("%sis%s%s.\n",s1,strcmp(s1,s4)>0?"greatthen":strcmp(s1,s4)<0?"lessthen":"equalto",s4);}运行结果:

carisgreatthenbus.carislessthentruck.carisequaltocar.6/4/202337华中科技大学计算机学院例8.17字符串的连接函数char*strcat(char

t[],chars[]){ intj=0,k=0;

while(t[j++]!=′\0′) ; j--;

while((t[j++]=s[k++])) ; returnt;}(演示EX8_17.C)voidmain(void){ chars1[80]="Ilike",s2[]="theCprogramming.";

strcat(s1,s2); printf("%s\n",s1);}运行结果:

IliketheCprogramming.6/4/202338华中科技大学计算机学院例8.18求字符串子串的函数int

strstr(char

cs[],charct[]){intj=0,k;for(;cs[j]!=′\0′;j++)

if(cs[j]==ct[0]){ k=1;

while(cs[j+k]==ct[k]&&ct[k]!=′\0′) k++;

if(k==strlen(ct)) returnj;}return-1;}6/4/202339华中科技大学计算机学院例8.18求字符串子串的函数voidmain(void){ chars1[80]="Cisthemostwidelyusedprogramminglanguage.",s2[]="use";

int

i,j=0; i=strstr(s1,s2);

printf("the

sub_string'sbeginningpositionis%d\n",i);

while(j<i) putchar(s1[j++]);

putchar(ˊ\nˊ); while(putchar(s1[i++])) ;

putchar(′\n′);}(演示EX8_18.C)运行结果:

thesub_string'sbeginningpositionis21Cisthemostwidelyusedprogramminglanguage.6/4/202340华中科技大学计算机学院例8.19删除字符串首尾空白字符的函数int

trim(chars[]){inti,num,j=0,k=0,L=strlen(s);while(s[j]==′′||s[j]==′\t′||s[j]==′\n′||s[j]==′\r′)

j++;/*j计算首部空白字符的个数*/ i=L-1;/*i为字符串最后一个字符(‘\0’前面)的下标*/

while(s[i-k]==′′||s[i-k]==′\t′||s[i-k]==′\n′||s[i-k]==′\r′) k++;/*k计算尾部空白字符的个数*/

num=L-j-k; for(i=0;i<num;i++) s[i]=s[i+j]; s[num]=′\0′;

returnstrlen(s);}(演示EX8_19_21.C)6/4/202341华中科技大学计算机学院例8.20从字符串s中删除所有与给定字符相同的字符从字符串s中去掉与字符变量c值相同的字符voiddelete_c(char

s[],charc){

intj=0,k=0;/*j-读指示器,k-写指示器*/

while(s[j]!=′\0′){

if(s[j]!=c)

s[k++]=s[j]; j++; }

s[k]=′\0′;}(演示EX8_19_21.C)6/4/202342华中科技大学计算机学院例8.21将字符串反转的函数

将一个字符串首尾颠倒过来如:将″abcde″颠倒为″edcba″voidreverse(chars[]){

intj,k;/*j-前指示器k-尾指示器*/charc;

for(j=0,k=strlen(s)-1;j<k;j++,k--) c=s[j],s[j]=s[k],s[k]=c;}(演示EX8_19_21.C)6/4/202343华中科技大学计算机学院上面三个函数的应用voidmain(void){ charstr[80]="atbtctdtetft";

printf("before

trim,thestringis\"%s\"\n",str);

trim(str);

printf("after

trim,thestringis\"%s\"\n",str);

delete_c(str,ˊtˊ);

printf("afterdelete't',thestringis\"%s\"\n",str);

reverse(str);

printf("after

reverse,thestringis\"%s\"\n",str);}运行结果:

beforetrim,thestringis"atbtctdtetft"aftertrim,thestringis"atbtctdtetft"

afterdeleteˊtˊ,thestringis"abcdef"afterreverse,thestringis"fedcba"6/4/202344华中科技大学计算机学院8.4.2数字串与数之间转换的函数例8.22将一个十进制数字串转换成为对应的整数的函数atoi函数功能将s字符数组中存放的一个十进制数字串转换成为对应的整数,并返回该整数算法:ASCII码字符s[j]转换为对应数字s[j]-′0′本位乘以10加下一位的算法54321=((((5)*10+4)*10+3)*10+2*10)+16/4/202345华中科技大学计算机学院例8.22atoi函数#defineBASE10intatoi(chars[]){ intj=0,num=0; for(;s[j]!=′\0′;j++) num=num*BASE+s[j]-′0′; returnnum;}(演示EX8_22.C)6/4/202346华中科技大学计算机学院例8.23将一个整数转换成为基数为BASE的数字串的函数#defineBASE10voiditoa(int

n,chars[]){ int

sign,j=0;

if((sign=n)<0)

n=-n; while(n>0){ s[j++]=n%BASE+′0′;

n/=BASE; }

if(sign<0)

s[j++]=′-′;

s[j]=′\0′;算法见p232

reverse(s);}(演示EX8_19_23.C)6/4/202347华中科技大学计算机学院例8.24将一个十六进制数字串转换成为对应的整数的函数问题当基数BASE大于10,如:16,由于十六进制数的表示形式,如′a′和′A′,′b′和′B′以及0到f或F在ASCII码表的编码不连续性因此需要在转换中进行一定的调整

htoi函数将一个存放在字符数组s中的十六进制数字串转换成为对应的整数并且返回转换后的整数6/4/202348华中科技大学计算机学院htoi函数(演示EX8_24.C)int

htoi(chars[]){intj=0,num=0;

if(s[j]==‘0’&&(s[j+1]==‘x’||s[j+1]==‘X’))j+=2;elsereturn-1;

for(;s[j]!=′\0′;j++){

if(s[j]>=‘0’&&s[j]<=‘9’)num=num*16+s[j]-’0’; if(s[j]>=‘a’&&s[j]<=‘f’)num=num*16+s[j]-’a’+10; if(s[j]>=‘A’&&s[j]<=‘F’)num=num*16+s[j]-’A’+10; } returnnum;}6/4/202349华中科技大学计算机学院8.5多维数组语文数学010285829195实际应用有时需要用多个下标来实现对数组元素的访问例如张三同学,学号为01,语文和数学成绩分别为85,91,李四同学,学号位02,语文和数学成绩分别为82,95解决方法用二维数组可以描述学号-课程成绩表中的成绩数据多维数组的用途二维数组可以描述数学中的矩阵或行列式三维数组可以描述空间中的点集n维数组来描述n维线性空间中的n维向量6/4/202350华中科技大学计算机学院8.5.1多维数组的说明与使用形式类型说明数组名[常量表达式1][常量表达式2]…[常量表达式n]={初值表};类型说明:[存储类型说明符][类型修饰符]数据类型例如,intx[2][2];对其元素的引用数组名[下标1][下标2]…[下标n]例如,x[1][0]=3;6/4/202351华中科技大学计算机学院例8.25对二维数组中元素的访问与操作#include"stdio.h"voidmain(void){

intx[2][3],a=2; x[0][2]=8; scanf("%d",&x[1][2]); x[1][1]=x[0][2]; x[1][2]<<=a;/*将元素x[1][2]的内容左移2位*/ printf("%d\n",x[1][2]);}6/4/202352华中科技大学计算机学院计算每个同学的平均成绩并且输出数组中各元素的地址和内容

#include"stdio.h"#defineSIZE2voidmain(void){ intx[SIZE][SIZE+1];

int

i,j;

for(i=0;i<SIZE;i++){

for(j=0;j<SIZE;j++)

scanf("%d",&x[i][j]);

x[i][SIZE]=(x[i][0]+x[i][1])/2;}

printf("\n");(演示EX8_26.C)例8.26用二维数组表示学号-课程成绩表(1)输入如下:

85918295语文数学0102858291956/4/202353华中科技大学计算机学院例8.26用二维数组表示学号-课程成绩表(2)for(i=0;i<SIZE;i++){

for(j=0;j<SIZE+1;j++)

printf("%p\tx[%d][%d]=%d\t",&x[i][j],i,j,x[i][j]);

printf("\n");}}程序的运行结果为:

FFD0x[0][0]=85FFD2x[0][1]=91FFD4x[0][2]=88FFD6x[1][0]=82FFD8x[1][1]=95FFDAx[1][2]=886/4/202354华中科技大学计算机学院8.5.2多维数组的存储结构x[0][0]=85x[0][1]=91x[0][2]=88x[1][0]=82x[1][1]=95x[1][2]=88地址元素值0xFFD0x[0][0]850xFFD20xFFD40xFFD60xFFD80xFFDAx[0][1]x[0][2]x[1][0]x[1][1]x[1][2]9188829588二维数组x的逻辑存储结构二维数组x的物理存储结构6/4/202355华中科技大学计算机学院8.5.3多维数组的初始化按照物理存储结构的顺序inta[2][2]={85,91,82,95};按照逻辑存储结构的顺序可读性好,但初值表的形式与数组的维数有关intx[2][3]={{85,91,0},{82,95,0}};intd[2][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};注意当数组的初值全部给出时,第1维大小的说明可以省略intx[][3]={{85,91,0},{82,95,0}};intd[][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};其它维大小不能省略6/4/202356华中科技大学计算机学院8.5.4二维字符数组二维字符数组与其它二维数组类似用char说明的二维数组chartext[25][80];初始化与其它二维数组类似chars[2][4]={‘a’,’b’,’c’,’\0’,’d’,’e’,’f’,’\0’};chars[2][4]={{‘a’,’b’,’c’,’\0’},{’d’,’e’,’f’,’\0’}};用字符串对二维数组进行初始化chardevices[3][12]={“harddisk”,”CRT”,”keyboard”};省略第1维的方式chardevices[][12]={“harddisk”,”CRT”,”keyboard”};6/4/202357华中科技大学计算机学院二维字符数组的使用引用单个字符元素weekend[i][j]=m;引用字符串weekend[i]表示weekend数组中第i行字符串的首地址printf(“%s”,weekend[i]);6/4/202358华中科技大学计算机学院例8.27字符串数组的输入输出操作#include"stdio.h"voidmain(void){

inti; chardevices[3][12]={"harddisk","CRT","keyboard"}; devices[0][0]=′H′;/*"harddisk"变为"Harddisk"*/ devices[2][0]=′K′;/*"keyboard"变为"Keyboard"*/

for(i=0;i<3;i++)

printf("%s\n",&devices[i][0]); scanf("%s",devices[1]);

for(i=0;i<3;i++)

printf("%s\n",devices[i]);}(演示EX8_27.C)6/4/202359华中科技大学计算机学院*8.6数组的应用程序设计8.6.1矩阵乘法运算算法定义3个2维数组通过三重循环来实现

外层循环用于控制乘积矩阵C的行中间层循环用于控制乘积矩阵C的列内层循环用于计算乘积矩阵元素Cij

6/4/202360华中科技大学计算机学院例8.28矩阵的乘法运算

#include"stdio.h"#defineN3#defineK4#defineM3voidmul_matrix(int

a[][K],int

b[][M],int

c[][M],intn,intk,intm){inti,j,p,sum;

for(i=0;i<n;i++)

for(j=0;j<m;j++){ sum=0;

for(p=0;p<k;p++) sum+=a[i][p]*b[p][j];

c[i][j]=sum; }}(演示EX8_28.C)6/4/202361华中科技大学计算机学院例8.28矩阵的乘法运算

voidmain(void){ intA[N][K]={{1,2,3,4},{5,6,7,8},{9,0,1,2}};

intB[K][M]={{1,2,3},{4,5,6},{7,8,9},{0,1,2}};

intC[N][M]; int

i,j;

mul_matrix(A,B,C,N,K,M);

for(i=0;i<N;i++){

for(j=0;j<M;j++) printf("%8d",C[i][j]);

printf("\n"); }}程序的运行结果为:

304050781041301628406/4/202362华中科技大学计算机学院8.6.2基于分治策略的二分查找函数二分查找算法的思路将已排好序的n个元素数组a分成两半,取a[n/2]与x比较如果x=a[n/2],则找到x,算法结束如果x<a[n/2],则在数组a的前半部分继续查找x如果x>a[n/2],则在数组a的后半部分继续查找x返回值如果找到x,返回该数所在单元的下标如果没有找到,返回-16/4/202363华中科技大学计算机学院例8.29二分查找函数#include"stdio.h”(演示EX8_29.C)int

BinarySearch(int

a[],int

x,intn){intfront=0,back=n-1,middle;

while(front<=back){ middle=(front+back)/2;/*计算中间单元的下标*/

if(x<a[middle]) back=middle-1;/*查找单元变成原来的前半部*/elseif(x>a[middle]) front=middle+1;/*查找单元变成原来的后半部*/ else return(middle);/*找到,返回下标*/ } return-1;}/*没有找到,返回-1*/}6/4/202364华中科技

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论