C语言数组和字符串

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2019/11/251第8章数组与字符串本章重点介绍:8.1一维数组8.2二维数组8.3字符数组与字符串8.4动态分配与void类型指针2019/11/252整型基本类型:实型字符型、枚举类型数组类型构造类型:结构体类型公用体类型指针类型空类型C语言的数据类型2019/11/253引言简单变量:如a,b2,x3,day,sum,如同一个姓名代表一个人一样,变量间没有任何联系。有一些变量可以归结为同一类型,如s1,s2,s3,s4,s5,…s10代表同一个班中10个学生每个学生的成绩。这些变量都用相同的名字,只是下角标有所区别,即用相同的名字不同的下标代表同一类型的一组数据,这种变量称为下标变量。C语言中同样也可以用下标变量,只是把下标用方括号括起来。即s[1],s[2],…s[10],这就是数组类型变量。2019/11/254什么构造类型?所谓构造类型是指由基本类型数据按一定的规则组成的,是用户自己按规则定义的。数组是构造类型之一。在数学中我们学过数列、矩阵的概念,数列通常表示为:a1、a2、a3、….、an矩阵通常表示为:a11a12a13a14a21a22a23a242×42019/11/255在C语言中表示数组和矩阵的方法是:数组:a[0]、a[1]、a[2]、a[3]、a[4]、a[5]其中a:称为数组名。方括号中的数:称为下标下标是一个数时,也就是数列,称为一维数组。下标是两个数时,也就是矩阵,称为二维数组。还有三维数组、四维数组等。2019/11/256第8章数组与字符串一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score[0],score[1],…score[4]。下标变量也称为数组元素。2019/11/257引言数组的特点:1、数组是有序数据的集合;2、数组中的每一个元素都属于同一个数据类型;3、用一个统一的数组名和下标来唯一的确定数组中的元素。2019/11/2588.1一维数组例如:inta[10];floatscore[5];“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。8.1.1一维数组的定义数据类型数组名[常量表达式];2019/11/259以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];doubleb['a'..'d'];charstr[];8.1.1一维数组的定义(续)2019/11/2510数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组2019/11/25118.1.2数组元素的引用格式:例如:输入学生成绩for(i=0;i5;i++)scanf(%f,&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2019/11/25128.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10];scanf(%d,&a[10]);/*下标越界*/C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2019/11/25138.1.2数组元素的引用(续)②[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:(1)计算2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH218CHscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.02019/11/2514合法标识符表示元素个数引用时下标从0开始[]:数组运算符单目运算符例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存内存字节数=数组大小*sizeof(元素数据类型)数组名表示内存首地址,是地址常量–一维数组的定义定义方式:类型说明符数组名[常量表达式];返回2019/11/2515main(){inti,a[10];for(i=0;i=9;i++)a[i]=i;for(i=9;i=0;i--)printf(“%d”,a[i]);}–一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]–其中:下标可以是常量或整型表达式–例8.1数组元素的引用运行结果:98765432102019/11/25168.1.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:inta[5]={0,1,2,3,4,5};2019/11/25178.1.4一维数组应用举例【例8.1】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;iN;i++)scanf(%f,&score[i]);for(i=N-1;i=0;i--)printf(%8.1f,score[i]);}运行情况如下:6774899234678395737878.073.095.083.067.034.092.089.074.067.02019/11/2518【例8.2】用数组求Fibonacci数列前20个数分析:定义一个含有20个元素的数组f,即intf[20];其中f[0]=1,f[1]=1,f[n]=f[n-1]+f[n-2](n≥2)用一个循环结构:让循环变量n从2到20,循环体为f[n]=f[n-1]+f[n-2]程序如面所示:lt162019/11/2519f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#includestdio.hmain(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%12d,f[i]);}}2019/11/2520【例8.4】冒泡法排序(从小到大)。排序过程:(1)比较第一个数与第二个数,若为逆序a[0]a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟起泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟起泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟起泡排序后,排序结束2019/11/2521例3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟4938659776132730初始关键字n=81376767627301365276530651313494930492738273830381327第七趟38497697979797271327302019/11/2522冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。冒泡法排序for(i=0;iN;i++)输入a[i]for(j=1;jN;j++)for(i=0;iN-j;i++)a[i]a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]2019/11/2523#includestdio.hmain(){inta[11],i,j,t;printf(Input10numbers:\n);for(i=1;i11;i++)scanf(%d,&a[i]);printf(\n);for(j=1;j=9;j++)for(i=1;i=10-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(Thesortednumbers:\n);for(i=1;i11;i++)printf(%d,a[i]);}2019/11/2524以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例8.5】选择法排序(从小到大)。2019/11/2525【例8.5】选择法排序(续)图8.3选择法排序for(i=0;iN;i++)输入a[i]for(j=0;jN-1;j++)for(i=j+1;iN;i++)a[j]a[i]TFa[j]与a[i]交换输出a[0]~a[N-1]2019/11/2526#defineN5main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);printf(\n);for(j=0;jN-1;j++)/*确定基准位置*/for(i=j+1;iN;i++)if(a[j]a[i]){t=a[j];a[j]=a[i];a[i]=t;}printf(Thesortednumbers:\n);…}程序运行情况如下:9678658640Thesortednumbers:40657886962019/11/25278.2二维数组数据类型数组名[常量表达式1][常量表达式2];例如:floatx[2][3];8.2.1二维数组的定义X[0][0]X[0][1]X[0][2]X[1][0]X[1][1]X[1][2]inta[3,4],b(3,4),c[][],d(3)(4);2019/11/2528x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址值数组元素二维数组元素在内存中的排列顺序:按行存放2019/11/2529例inta[3][4];二维数组理解每个元素a[i]由包含4个元素的一维数组组成二维数组a是由3个元素组成a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]行名014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]2019/11/2530x[0]是数组名,是元素x[0][0]的地址x[1]是数组名,是元素x

1 / 76
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功