C语言数组学习课件_第1页
C语言数组学习课件_第2页
C语言数组学习课件_第3页
C语言数组学习课件_第4页
C语言数组学习课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

数组数组是构造类型的数据结构,是前面学习的同一类型变量的组合。数组中的每一个元素就是一个变量,因此前面所学习的对变量的操作完全适用于数组元素。这些变量的特点是存放的位置是有规律的,因此要充分利用这个规律。数组数组是构造类型的数据结构,是前面学习的同一类型变量的组合1为什么需要数组?当需要将一组相同性质的数据存放起来的时候,可以使用数组何谓“需要”?例如:求一组数的平均值(不需要)求一组数中每个数与平均值的差(需要)对一组数排序(需要)为什么需要数组?当需要将一组相同性质的数据存放起来的时候,可2数组的概念数组是共享一个名字的一组具有相同类型的连续存放的变量的集合。我们称这些变量为“数组元素”,可看做“下标变量”,因为知道下标,就是找到了变量。数组的特点:所有的数组元素具有统一的数据类型。数组名是数组的首地址,每个元素是连续存放的。数组元素由数组名和下标唯一地确定。

数组的概念数组是共享一个名字的一组具有相同类型的连续存放的变3数组的定义数组是构造类型一维数组inta[10];二维数组intb[2][3];数组的定义整型数组inta[5];实型数组floatx[5];字符型数组chars[20];数组的定义数组是构造类型4一维数组一维数组是基础学习都是围绕着下标的操作进行的一维数组一维数组是基础5一维数组的定义一维数组的定义类型说明符数组名[常量表达式]特别说明:常量表达式指明数组的长度,必须事先指定,不能为变量表达式。例如:存放10个学生的成绩intscore[10];存放n个数,n不多于10

inta[10];scanf("%d",&n);

inta[n];scanf(“%d”,&n);一维数组的定义一维数组的定义6一维数组的引用一维数组的引用数组名[下标]特别说明:必须先定义,才能使用数组元素。数组元素要一个一个地引用。(除字符串)下标必须为整数,可以是常量,也可以是变量。下标不许超出数组的长度!!数组定义后,数组名代表数组的首地址,其中的元素按照下标依次存放。一维数组的引用一维数组的引用7一维数组的引用数组定义后,数组名代表数组的首地址,其中的元素按照下标依次存放。且下标从0

开始!例如:inta[5];对于某一个元素a[i]来说它的下一个元素是:a[i+1]它的上一个元素是:a[i–1]依次引用所有的元素for(i=0;i<5;i++)...a[i]...a[0]a[1]a[2]a[3]a[4]一维数组的引用数组定义后,数组名代表数组的首地址,其中的元素8数组元素的下标不能越界!!例如,对于inta[10],i;输入模块:printf("Inputarray:\n“);for(i=0;i<10;i++)scanf("%d“,&a[i]);顺序输出模块:printf("Outputarray:\n“);for(i=0;i<10;i++)printf("%5d“,a[i]);思考:如何逆序输出?一维数组的引用数组元素的下标不能越界!!一维数组的引用9一维数组的初始化⑴各初始化值放在一对大括号里面,之间用逗号隔开。如:inta[5]={0,1,2,3,4,5};⑵当初始化值中包含的数值超过了数组长度,给出错误信息。

如:inta[3]={0,1,2,3,4};是错误的。⑶可以只对部分元素初始化。如:inta[5]={0};/*其余元素的值自动为0*/⑷对全部数组元素赋初值时,可不指定数组长度。如:inta[]={0,1,2,3,4};一维数组的初始化⑴各初始化值放在一对大括号里面,之间用逗号10一维数组编程方法充分利用数组的特点:因为数据是顺序存放的,只要知道了下标,就找到了对应的元素,因此每一个元素可看作“下标变量”。对数组下标(即序号)的处理,是学习数组的重点。用数组编程时,往往需要用到for循环,使下标依次变化,一一访问数组元素,达到求解的目的。一维数组编程方法充分利用数组的特点:因为数据是顺序存放的,只11一维数组编程举例如:inta[10],i;输入模块:printf("Inputarray:\n“);for(i=0;i<10;i++)scanf("%d“,&a[i]);输出模块:printf("Outputarray:\n“);for(i=0;i<10;i++)printf("%5d“,a[i]);逆序输出:pirntf("Outputreversionarray:\n");for(i=9;i>=1;i--)printf("%5d",a[i]);一维数组编程举例如:inta[10],i;12一维数组编程举例用数组求Fibonacci前20个数列。(sz_1End.c)(sz_2End.c)写算法:赋初值:Fibonassi数列前两个数为1求其他的数输出数组一维数组编程举例用数组求Fibonacci前20个数列。(s13一维数组编程举例将数组元素逆序存放并输出。(sz_3End.c)写算法将元素首尾交换(a[i]与a[n-1-i]交换)输出结果一维数组编程举例将数组元素逆序存放并输出。(sz_3End.14一维数组编程举例用“折半查找法”在有序数组中找某数。可能找得到,也可能找不到。(sz_4End.c)思路:与中间的数比较,决定是向上找还是向下找。向上找就修改下限,向下找就修改上限。算法上下限赋初值:low=0;high=n-1;while(low<high){求出中间的位置mid=(low+high)/2;与中间的数比较:if(n<a[mid])向上找elseif(n>a[mid])向下找elsebreak;(找到了,mid就是对应的位置)}输出信息一维数组编程举例用“折半查找法”在有序数组中找某数。可能找得15实验书:p18(1)已知一個已排好序的陣列,今輸入一個數,要求按原來的規律將它插入陣列中。(实验5-1-1.c~实验5-1-4.c)分析:重點在於插入算法上,可以初始化陣列,以簡化程序。假設陣列按從小到大排列。測試程序,應考慮:n插到最前面;n插到中間;n插到最後。方法一:先找到要插入的位置,即第一個比n大的位置i;再將位置i以後的數向後挪;最後將n插進去。方法二:將n與每一個數比較,n總是放較大的數,最後將n放入最後一個位置。方法三:先將n放入第一個位置(已知的陣列的數從第2個位置開始存放),將n慢慢挪到後面,直到出現第一個比n小的數為止。方法四:先將n放入最後一個位置,方法與方法三類似。实验书:p18(1)已知一個已排好序的陣列,今輸入一個16方法一:先找到要插入的位置,即第一個比n大的位置i;再將位置i以後的數向後挪;最後將n插進去。#include<stdio.h>voidmain(void){ inta[6]={1,3,5,7,9},i,j,n; printf(“inputinsertednumber:”);scanf(“%d”,&n); //找到要插入的位置i for(i=0;i<5;i++) if(a[i]>n)break; //將a[i]~a[4]的數據向後挪 for(j=4;j>=i;j--) a[j+1]=a[j]; a[i]=n; //將n插進去

//輸出結果

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

printf(‘%5d”,a[i]);printf(“\n”);}方法一:先找到要插入的位置,即第一個比n大的位置i;17方法二:將n與每一個數比較,n總是放較大的數,最後將n放入最後一個位置。

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

{

if(a[i]>n){t=a[i];a[i]=n;n=t;}} a[5]=n;方法三:先將n放入第一個位置(已知的陣列的數從第2個位置開始存放),將n慢慢挪到後面,直到出現第一個比n小的數為止。

初始化時,a[6]={0,1,3,5,7,9}; a[0]=n; for(i=0;i<6;i++)

{

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}elsebreak;}方法二:將n與每一個數比較,n總是放較大的數,最後將18排序问题输入n个数,对n个数排序(假设由小到大)排序问题输入n个数,对n个数排序(假设由小到大)19#include<stdio.h>voidmain(void){ inta[20],n,i,j,t;

//输入数组的大小n printf("Inputn:“);

scanf("%d“,&n);

//输入n个数到数组中

printf(“input%dnumbers:\n”,n); for(i=0;i<n;i++) scanf(“%d”,&a[i]);

//输出原始数据

printf(“beforesorted:”); for(i=0;i<n;i++) printf(“%d“,a[i]);

//排序处理 //输出排序后的数据

printf(“\n\naftersorted:”); for(i=0;i<n;i++) printf(”%d“,a[i]); printf(“\n”);}#include<stdio.h>20排序问题常见算法:冒泡法选择法插入法排序问题常见算法:21数组a[0]a[1]a[2]a[3]a[4]数组的初始状态823165947第一轮比较318265829824782第二轮比较31659654765第三轮比较93147第四轮比较93182654731冒泡法排序(由小到大)做法:将相邻两个数比较,小的放前头,大的放后头。效果:排序一轮后,大数逐步“沉入”数组的底部,让小数象气泡似的“冒起”到数组的顶端。算法:控制轮数for(I=1;I<4;I++){将所有的相邻两数比较,小的放前面}数组a[0]a[1]a[2]a[3]a[4]数组的初始状态822冒泡法排序for(i=1;i<n;i++){for(j=0;j<n–i;j++){if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}}for(i=1;i<n;i++)(控制轮数)相邻两数比较,前小后大for(j=0;j<n–i;j++)相邻两数比较,小的放前面冒泡法排序for(i=1;i<n;i+23选择法排序(由小到大)基本思想:先选择要参加排序的数和要存放的位置。具体做法:每一次在某个范围内先找到最小元素,再放到相应位置。823165947a[0]a[1]a[2]a[3]a[4]9316582479314782659314765823441for(i=0;i<n–1;i++)在a[i]~a[n-1]范围内找最小元素a[mini],与a[i]互换注意:要记下最小值的位置mini。931658247第一轮比较第二轮比较第三轮比较第四轮比较选择法排序(由小到大)基本思想:先选择要参加排序的数和要存放24for(i=0;i<n–1;i++)

{

mini=i; for(j=i+1;j<n;j++) {if(a[mini]>a[j]) mini=j; /*记录最小元素的位置*/} if(mini!=i) {t=a[mini];a[mini]=a[i];a[i]=t;}}for(i=0;i<n–1;i++)在a[i]~a[n-1]范围内找最小元素a[mini],然后与a[i]互换for(i=0;i<n–1;i++25插入法排序上网查资料,了解排序思想写出程序还有其他的排序法吗?上网查资料插入法排序上网查资料,了解排序思想26上机书本p1056.1,6.2(筛选法是指先将素数或非素数做标记,然后根据标记来输出素数),6.3,6.5必须写预习报告上机书本p1056.1,6.2(筛选法是指先将素数或非素27二维数组学习重点:学习行标、列标的特点使用双重循环使行标和列标变化二维数组学习重点:28类型说明符数组名[常量1][常量2]存放的特点:先按行存放,再按列存放aa[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]二维数组的定义类型说明符数组名[常量1][常量2]aa[0][29任意一个矩阵或者表格都可以看作是二维数组例如:学生的成绩表学生的花名册教师的工资单任意矩阵该表格定义为3行4列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]0123012二维数组的定义任意一个矩阵或者表格都可以看作是二维数组a[0][0]a[030引用形式数组名[行下标][列下标]例如:a[1][2]a[1,2]=1;注意:C语言程序在执行过程中并不检测数据的下标是否越界,但是运行时会出现警告对话框。如:inta[3][4];a[3][4]=3;二维数组元素的引用引用形式二维数组元素的引用31⑴将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。例:inta[3][4]={1,2,3,4,5,6,7,8,9};⑵可分行给二维数组赋初值。

例:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};⑶可只对部分元素赋初值,未赋值的元素的值自动为0.

例:inta[3][4]={{1},{

},{0,10}};⑷可以通过赋初值定义二维数组的大小,第一维的长度可以不指定,但第二维的长度必须指定。

例:inta[][4]={1,2,3,4,5,6,7,8,9,10};

1000000001000a[0][0]a[1][1]a[0][3]a[0][1]a[2][2]a[2][0]a[1][2]a[1][0]a[0][2]a[2][3]a[2][1]a[1][3]二维数组的初始化⑴将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值32对二维数组中的每个元素进行操作必须使用二重循环!通常外层循环控制行下标的变化,内层循环控制列下标的变化。例如对于inta[2][3],如果要求存放数据如图所示,若输入模块为:

printf(“Inputarray:“);

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

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

scanf(”%d“,&a[i][j]);

二维数组程序举例123456a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]对二维数组中的每个元素进行操作必须使用二重循环!二维数组程序33一般输出时按行输出,代码如下: printf(“outputthearray:“); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf(“%5d”,a[i][j]); printf(“\n”); }一般输出时按行输出,代码如下:34如果要求:输出时按列输出,则代码如下:

printf(“outputthearray:“); for(j=0;j<3;j++) { for(i=0;i<2;i++) printf(“%5d”,a[i][j]); printf(“\n”); }如果要求:输出时按列输出,则代码如下:35对二维数组的操作对二维数组元素的操作,实际上就是先找出对应元素的行下标与列下标,然后进行操作。例如,方阵a[M][M]

对第一行元素的操作模块,可以写成:

for(j=0;j<M;j++){...a[0][j]...}

对第一列元素的操作模块为:

for(i=0;i<M;i++){…a[i][0]…}

对方阵中右上三角元素的操作模块为:

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

for(j=i;j<M;j++)

{…a[i][j]…}

对方阵中左下三角元素的操作模块为:

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

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

{…a[i][j]…}对二维数组的操作对二维数组元素的操作,实际上就是先找出对应元36例:请将下列程序编写完整。该程序的功能是:使矩阵左下半三角元素中的值全部置成0。#include<stdio.h>voidmain(void){ inta[3][3]={1,9,7,2,3,8,4,5,6},i,j;

for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d“,a[i][j]); printf("\n“); }}二维数组编程举例for(i=0;i<3;i++){ for(j=0;j<=i;j++) a[i][j]=0;}例:请将下列程序编写完整。该程序的功能是:使矩阵左下半三角元37若有一个N*N的二维数组a,要求不使用任何辅助数组,实现数组a的行列元素的互换。二维数组编程举例for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]

a[j][i]a[0][1]a[1][0]a[1][0]a[0][1]i=0,j=1i=1,j=0又换回来了!怎么办?ii=012j=01213617284512922992若有一个N*N的二维数组a,要求不使用任何辅助数组,实现38p97例6-5:有一个4×4阶矩阵,将最小值所在的行与最后一行互换。算法:输入数组元素输出原始数据找到最小值所在的行与最后一行互换输出结果二维数组编程举例p97例6-5:有一个4×4阶矩阵,将最小值所在的行与最后39字符数组字符数组40字符数组用来存放字符型数据的数组称为字符数组,每一个数组元素存放一个字符型数据,都可以当作一个字符型变量使用。一维char数组名[常量表达式]二维char数组名[常量表达式][常量表达式]例如:

charc[10];//一维字符数组

charstr[3][4];//二维字符数组字符数组初始化:charstr[10]={'s','t','r','i','n','g'};charstr[]={'s','t','r','i','n','g'};字符数组用来存放字符型数据的数组称为字符数组,每一个数组元素41为什么把字符数组单独作为一个内容来讲?字符数组可以存放“字符串”。C提供了很多函数可以对字符串进行整体操作。存放“字符串”的字符数组,可看作“字符串变量”。可以利用函数进行整体操作。字符串只是字符数组的一种具体应用。为什么把字符数组单独作为一个内容来讲?字符数组可以存放“字符42字符串的基本概念C语言中对字符串的约定规定,以字符‘\0‘作为”字符串结束标志。'\0'作为标志占用存储空间,但不计入串的实际长度。在C语言中,字符串只能借助于字符型一维数组来存放。C语言中对字符串常量表示的规定不需要人为在其末尾加入'\0',编译程序自动完成。字符串的基本概念C语言中对字符串的约定43字符数组并不限定最后一个字符应该是什么。什么情况下字符数组可以看做“字符串变量”?字符串必须要有“字符串结束标志”,即空字符’\0’,因此字符数组必须含有“串尾标志”。如果字符数组没有“串尾标志”,则只是普通数组,必须一个一个元素进行操作。可以对“字符串变量”进行整体操作。字符数组与字符串的关系字符数组并不限定最后一个字符应该是什么。字符数组与字符串的关44例如:赋初值时直接赋字符串常量。charstr[10]={"string"};charstr[]="string";注意以这种方式赋值时,要保证数组的长度足够容纳字符串,否则虽然在侥幸的情况下能够得到正确结果,但实质上是不正确的,应该避免。如:charstr[6]="string";是普通字符数组。charstr[]="string";则是字符变量,数组长度为7。字符串变量初始化例如:赋初值时直接赋字符串常量。字符串变量初始化45字符串变量的输入和输出利用%s格式说明符进行整串输入和输出。如:charstr[15];scanf("%s",str);printf("%s\n",str);说明:输入时,空格和回车符作为分隔符而不能被读入。如输入:aprogram<CR>,则str中只存放了字符串"a"。如果字符数组的长度不够容纳输入的字符个数,系统不报错,但下标越界,应避免。scanf函数中,str代表地址值,输入的字符从该地址开始存入。又如:scanf("%s“,&str[2]);printf函数中,str也代表地址值,输出时从该地址开始,一次输出存储单元中的字符,直到遇到第一个‘\0’为止。又如:

printf(“%s\n”,&str[2]);字符串变量的输入和输出利用%s格式说明符进行整串输入和输出。46调用gets、puts函数进行输入和输出头文件stdio.h调用形式:gets(str);输入的字符可以包括空格,以回车符表示结束。回车符不作为字符串的内容,系统自动用'\0'代替。puts(str);输出的字符从该地址开始,依次输出该存储单元的字符,直到遇到第一个'\0'为止,并自动输出一个换行符。调用gets、puts函数进行输入和输出47字符串编程充分利用字符串的串尾标记,即使事先不知道字符串的长度,也可以方便地知道什么时候该结束这是字符串编程的特点字符串编程充分利用字符串的串尾标记,即使事先不知道字符串的长48程序举例求字符串长度(不用库函数)#include<stdio.h>voidmain(void){ charstr[80]; intlen;printf("Inputstring:“); gets(str);

len=0; while(str[len]!='\0‘) len++;printf("%slenghis%d\n“,str,len);}程序举例求字符串长度(不用库函数)49字符串的复制(不用库函数)#include<stdio.h>voidmain(void){ chars1[20],s2[20]="abcdefg“; inti; for(i=0;s2[i]!=‘\0’;i++) s1[i]=s2[i]; s1[i]=‘\0’; //thinkover:why? puts(s1);}课后写出串连接、串比较的程序来i=0;while((s1[i]=s2[i])!='\0‘)

i++;

字符串的复制(不用库函数)i=0;50字符串的连接(不用库函数)#include<stdio.h>voidmain(void){ chars1[80],s2[80]; inti; printf(“Inputs1ands2:\n“); gets(s1); gets(s2);

//将下标移到s1串尾 for(i=0;s1[i]!=‘\0’;i++)

温馨提示

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

评论

0/150

提交评论