基础课件严冬梅第6章数组在了解必要性上掌握_第1页
基础课件严冬梅第6章数组在了解必要性上掌握_第2页
基础课件严冬梅第6章数组在了解必要性上掌握_第3页
基础课件严冬梅第6章数组在了解必要性上掌握_第4页
基础课件严冬梅第6章数组在了解必要性上掌握_第5页
免费预览已结束,剩余94页可下载查看

下载本文档

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

文档简介

第6章数组(Array)主讲:严冬梅程序设计基础(The

Foundation

of

Programming)第6章数组教学要求在了解数组的必要性的基础上,掌握数组的定义、方式、初始化、输入输出和数组基本操作,并通过上机实践熟练掌握有关数组的程序设计,能够进行大规模的数据处理。第6章数组重点数组的及地址;数组的初始化;数组的输入与删输出;数组的逆序;数组元素的查找、除;矩阵常见操作;字符串的基本操作等。难点

数组的

及地址;

数组的初始化;数组元素的查找、

与删除;数组排序。第6章数组6.1数组的引入6.2

一维数组6.3

数组6.4

数组的应用实例6.1

数组的引入空值类型void字符型char数据类型整型int双精度型double浮点型(单精度型)

float基本数据类型联合体union构造数据类型数组结构体struct枚举地址类型:指针特殊数据类型6.1.1

为什么使用数组?编程时为什么要使用数组这种数据类型呢?看一个例子吧!现在要计算5个学生的平均成绩6.1.1

为什么使用数组?#include

<stdio.h>int

main(void){

i

,a2,a3,a4,a5,avg;d",&a1);scanf("%d",&a3);scanf("%d",&a4);scanf("%d",&a5);avg=(a1+a2+a3+a4+a5)/5;printf("5个学生平均成绩是%d\n",avg);}天啊!请输入5个学生的成绩\n不会定义100个、10000个学号和成绩吧?!如果是100个学生、10000个学生怎么办?("%d",&a2);6.1.2

数组的概念数组是具有一定顺序关系的若干个同种类型变量的集合体,简单地说,数组就是若干有序同类数据的集合,它包含三层意思:有序数据类型相同元素个数确定数组这个集合体的每一个元素称为数组元素数组可以使一批同类型的变量公用一个标识符6.2

一维数组数组名[元素个数];6.2.1

定义格式:[

类型]

数据类型说明:元素个数必须为正整型常量或常量表达式int

a[10];

char

s[80];

double

num['0'];const

int

N

=100;

char

s1[N];

char

s2[N*2];C语言不允许动态定义数组,元素个数不能为变量

int

i=20;char

s[i];×相同类型的数组、变量可放在一起说明int

a[5],

b[4],

c;数组的

类型不能为register6.1

一维数组6.2.2

数组元素)格式:数组名[下标][]实质是运算符说明下标从0开始下标的取值范围:[0,元素个数-1]下标 常量、变量、表达式int

a[10];则a[0]a[9]a[5]a[i]√a[10]×不要越界数组元素就相当于一个简单变量6.1

一维数组6.2.3

数组地址其:按下标递增的顺序存储在连续的内存空间中地址:数组名a数组名本质是为一常量,它代表数组的起始地址,不能向它赋值第一个元素的地址&a[0]0x0022FEC40x0022FEC80x0022FECC0x0022FEE8a[0]a[1]a[2]……a[9]aint

a[10];a是一个地址常量6.1

一维数组【6.1】数组元素顺序#include

<stdio.h>intmain(void){int

a[10],

i;for

(i=0;

i<10;

i++){

a[i]

=

(i+1)*10;printf("a[%d](0x%p):%4d\n",i,&a[i],a[i]);}printf("address

of

a:

0x%p\n",

a);printf("size

of

a[10]:

%d\n",

sizeof(a));return

0;}6.1

一维数组6.2.4

初始化数值型数组最完整的形式int

a[5]

=

{1,2,3,4,5};依次把花括号中的每个值赋给该数组的对应元素当所有的数组元素都进行初始化时,元素个数可缺省int

a[]=

{1,

2,

3,4,

5};当数组后面部分的元素不需要初始化,可省略int

a[5]

=

{1,

3};//a[2]=a[3]=a[4]=0当数组中间部分的元素不需要初始化,不可省略int

a[5]

=

{1,

0,

0,

4};

//a[1]=a[2]=a[4]=0int

a[5]

=

{0};

int

a[5]={};

×未初始化的数组全局或static数组每个元素都是0;auto数组元素为随机值6.1

一维数组6.2.4

初始化字符型数组像数值型数组那样初始化char

str[7]={'H','e','l','l','o','!','\0'};charstr[]={72,

101,108,

108,

111,

33,0};也可以使用字符串特有格式charstr[]={"char

str[]="o!"};o!";//最常用形式6.1

一维数组6.2.5

输入、输出及赋值数值型数组数值型数组不能整体输入、输出及赋值,必须使用循环inta[10],i;for(i=0;i<10;i++) /*输入*/scanf("%d",&a[i]);for(i=0;i<10;i++) /*输出*/printf("%7d",a[i]);//printf("%d",a[i]);printf("\n");a[]={1,2,3,…};

×

a=b;

×a[0]=1;a[1]=2;…a[9]=10;

/*赋值*/for(i=0;i<10;i++)

a[i]=i+1;#include

<stdio.h>int

main(void){const

int

N=100;int

a[N]printf("请输入%d个学生的成绩for

(i=0;i<N;i++){ scanf("%d",

&a[i]);avg

+=

a[i];}vg

/=N;printf("%d个学生平均成绩是%d\n",N,avg);return

0;}现在就是求十万个学生平均成绩也不怕了!使用数组求平均成绩【例6.2】求学生平均成绩6.1

一维数组6.2.5

输入、输出及赋值字符型数组字符型数组可以整体输入、输出scanf("%s",

str);

输入时不能有空白字符printf("%s\n",

str);赋值不能整体进行,但可使用字符串处理函数str[]="Good!"

×str[0]='G';

str[1]='o';str[2]='o';

str[3]='d';str[4]='!';

str[6]='\0';6.1

一维数组6.2.6

字符串处理函数字符串输入函数gets(s)#include<stdio.h>char

str[20];

gets(str);与scanf相比,可以略过空白字符,以回车作为结束char

s1[20],

s2[20];scanf("%s",

s1);

gets(s2);同样输入"Michael

Jeffrey

Jordan"结果s1="Michael",s2="Michael

Jeffrey

Jordan"6.1

一维数组6.2.6

字符串处理函数字符串输出函数puts(s)#include<stdio.h>puts(str);puts("Michael

Jeffrey

Jordan");6.1

一维数组6.2.6

字符串处理函数求字符串长度strlen(s)#include<string.h>返回字符串长度(不包括'\0')char

str[20]=

"Jordan";n=strlen(str);

结果

n=66.1

一维数组6.2.6

字符串处理函数#include

<string.h>字符串

函数strcpy(str1,str2);功能:将str2中的字符 到str1中(包括'\0'

)str1必须为变量串,str2可为变量串或常量串;strcpy(s1,s2);strcpy(s1,

"Jordan");str1必须足够长6.1

一维数组6.2.6

字符串处理函数#include

<string.h>字符串连接函数strcat(str1,str2);功能:str1中的'\0'去掉,将str2中的字符分别复制到str1的尾部,再加上'\0'str1必须为变量串,str2可为变量串或常量串;strcat(s1,s2);strcat(s1,

"Jordan");str1必须足够长6.1

一维数组6.2.6

字符串处理函数

#include

<string.h>字符串比较函数strcmp(str1,str2)返回值为整数:正整数,str1>str2;0,str1==str2;负整数,str1<str2。两个整数a和b若a>b,a-b>0;若a==b,

a-b==0;若a<b,

a-b<0;"Basic"

<

"C""Basic"

>

"Base""Basic"=="Basic"相同位置的字符进行比较比较字符的ASCII码6.2.7

简单应用【例6.3】求和、平均数#include

<stdio.h>int

main(void){int

i,n,data[100];return0;}float

sum=0,avg;printf("请输入元素个数(<100):");scanf("%d",&n);printf("请输入%d个整数:",n);for(i=0;

i<n;

i++){scanf("%d",&data[i]);sum+=data[i];}avg=sum/n;printf("元素总和为%f,平均值为:%f\n",sum,avg);6.2.7

简单应用【例6.4】求最大、最小值(1)#include

<stdio.h>int

main(void){const

int

N=10;return0;}int

i,

max,

min,

data[N];printf("请输入%d个整数:",

N);for(i=0;

i<N;

i++)scanf("%d",

&data[i]);max=min=data[0];for

(i=1;

i<N;

i++){

if

(max<data[i])

max=data[i];elseif

(min>data[i])

min=data[i];}printf("最大值为%d,最小值为:%d\n",

max,

min);#include

<stdio.h>intmain(void){

const

int

N=10;}printf("最大值为%d,最小值为:%d\n",max,min);return0;}返回int

i,

max,

min,

data[N];max=-2147483648;

min=2147483647;printf("请输入%d个整数:",

N);for

(i=0;

i<N;

i++){

scanf("%d",

&data[i]);if

(max<data[i])

max=data[i];if

(min>data[i])

min=data[i];6.2.7

简单应用【例6.5】求最大、最小值(2)6.2

数组6.3.1

定义格式:类型

数据类型

数组名[元素1][元素2][

]……;char

p[2][3];

int

a[3][4][5];说明:“行”、“列”等必须为正整型常量或常量表达式#define

MAXLEN

100char

str[5][MAXLEN*2];×

int

i=10,j=5; int

a[i][j];相同类型的数组、变量可放在一起说明inta[5][10],

b[4],

c;6.2数组6.3.2格式数组名[下标1][下标2]……;说明下标

常量或变量int

a[4][6];a[0][5]

a[3][0]

a[i][j]√a[4][6]×下标的取值范围:[0,元素个数-1]数组元素就相当于一个简单变量6.2数组6.3.3方式及地址按下标递增的顺序在连续的内存空间中,而且“靠右边的下标先变化”“按行主序”逐级分解,降低维数地址:数组名a第一个元素的地址&a[0][0]逐级分解中第一个数组的地址a[0]a=&a[0][0]=a[0]0x0022FEC40x0022FEC80x0022FECC0x0022FED8a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]afloata[2][3];6.2

数组a[0][0]aa[0]a[1]逐级分解,降低维数int

a[2][3];a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a=a[0]=&a[0][0]6.2

数组a[0][0]aa[0]a[1]逐级分解,降低维数int

a[2][3][2];a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a=a[0]=a[0][0]=&a[0][0][0]a[0][0][0]a[0][0][1]a[0][1][0]a[0][1][1]a[0][2][0]a[0][2][1]a[1][0][0]a[1][0][1]a[1][1][0]a[1][1][1]a[1][2][0]a[1][2][1]6.2

数组6.3.4

初始化数值型数组可将所有数据写在一个大括号内inta[][3]={2,4,6,8,10,12,14};亦可int

a[2][3]={{2,4,6},{8,10,12}};数组初始化,仅最左边的一个[]中的个数可省略int

a[][3]

={{1},

{0,1},

{0,0,1}};6.2

数组6.3.4

初始化字符型数组charstr[][7]={{'B','a','s','i','c','\0'},{'C','\0'},{'P','a','s','c','a','l','\0'}};char

str[][7]={{65,97,……,0},{C,0},{80,97,……0}};charstr[][7]={"Basic","C","Pascal"};二维字符数组表示多个字符串,按最长字符串+1定义下标二维字符数组表示多个字符串,要用分层花括号初始化6.2

数组6.3.5

输入、输出及赋值数值型数组数值型数组不能整体输入、输出及赋值,必须使用循环。int

a[3][4],i,j;for(i=0;i<3;i++)

/*输入*/for(j=0;j<4;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++)

/*输出*/{

for(j=0;j<4;j++)printf("%7d",a[i][j]);/*printf("%d

",a[i][j]);*/printf("\n");}6.2

数组6.3.5

输入、输出及赋值字符型数组二维字符型数组不能整体输入、输出及赋值,必须使用循环。char

str[3][20];

int

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

/*输入*/scanf("%s",str[i]);for(i=0;i<3;i++)

/*输出*/printf("%s\n",str[i]);#include

<stdio.h>int

main(void){const

int

M=3,

N=4;

int

i,j,a[M][N],

sum=0;for

(i=0;

i<M;

i++)for

(j=0;

j<N;

j++)scanf("%d",&a[i][j]);for(i=0;

i<M;

i++)for

(j=0;

j<N;

j++)sum

+=

a[i][j];printf("total=%d",

sum);return

0;}6.3.6

简单应用10

11

1291

2

3 4

A

5

6

7 8

【例6.6】求矩阵的所有元

和#include

<stdio.h>intmain(void){

const

int

M=3,

N=4;int

i,

j,

a[M][N],

row[M];for

(i=0;

i<M;

i++)for

(j=0;

j<N;

j++)scanf("%d",&a[i][j]);for(i=0;

i<M;

i++){row[i]=0;for

(j=0;j<N;j++)

row[i]+=a[i][j];printf("row[%d]=%d\n",

i,

row[i]);}return0;}6.3.6

简单应用1

2

3 4

A

5

6

7

8【例6.7】求矩阵的行和6.3.6

简单应用1

2

3 4

A

5

6

7

8#include

<stdio.h>intmain(void){

const

int

M=3,

N=4;int

i,

j,

a[M][N],

col[N];for

(i=0;

i<M;

i++)for

(j=0;

j<N;

j++)scanf("%d",&a[i][j]);for(j=0;

j<N;

j++){col[j]=0;for

(i=0;

i<M;

i++)

col[j]+=a[i][j];printf("col[%d]=%d\n",

j,

col[j]);}return0;}【例6.8】求矩阵的列和#include

<stdio.h>int

main(void)}return0;}{const

intM=3,N=4;int

i,

j,a[M][N],

max[M],index[M];for

(i=0;i<M;

i++)for

(j=0;

j<N;

j++)

scanf("%d",

&a[i][j]);for

(i=0;

i<M;i++){

max[i]=a[i][0];

index[i]=0;for

(j=1;

j<N;j++)if(max[i]<a[i][j]){max[i]=a[i][j];index[i]=j;}printf("max[%d]=a[%d][%d]=%d\n",i,

i,

index[i],max[i]);6.3.6

简单应用1

2

3 4

A

5

6

7 8

【例6.9】求矩阵行最大(小)值6.3.6

简单应用1

2

3 4

A

5

6

7 8

【例6.10】求矩阵列最大(小)值#include

<stdio.h>int

main(void){

const

int

M=3,N=4;int

i,j,a[M][N],max[N],index[N];for

(i=0;

i<M;i++)for

(j=0;

j<N;

j++)

scanf("%d",

&a[i][j]);for

(j=0;

j<N;j++){

max[j]=a[0][j];

index[j]=0;for

(i=1;

i<M;i++)if(max[j]<a[i][j]){max[j]=a[i][j];

index[j]=i;}printf("max[%d]=a[%d][%d]=%d\n",j,index[j],j,max[j]);}return0;}6.3.6

简单应用1

2

3 4

A

5

6

7 8

【例6.11】求矩阵的最大(小)值#include

<stdio.h>int

main(void){

const

int

M=3,

N=4;int

i,

j,

a[M][N],max,

indexI,

indexJ;for

(i=0;

i<M;

i++)for

(j=0;

j<N;

j++)

scanf("%d",

&a[i][j]);return0;}max=a[0][0];

indexI=0;

indexJ=0;indexJ=j;

}for

(i=0;

i<M;

i++){

for

(j=0;

j<N;

j++)if

(max<a[i][j]){

max=a[i][j];

indexI=i;}printf("max=a[%d][%d]=%d",indexI,indexJ,max);6.3

数组的应用实例6.4.1

一维数组的应用实例6.4.2

二维数组的应用实例6.4.1

一维数组的应用实例逆置数值型数组逆序字符串逆序查找线性查找折半查找有序数组

元素删除数组元素6.4.1

一维数组的应用实例排序冒泡法选择法法字符串操作字符串字符串连接字符串比较6.4.1

一维数组的应用实例——逆置012345iiiii100908070605040302010i6

7

8

9i>=N/2,停止交换[i][x]0918273645N

=

10i+

x

==

N-1x

==

N-1-i[i]

[N-1-i]6.4.1

一维数组的应用实例——逆置for(i=0;i<N;

i++)

scanf("%d",&data[i]);for(i=0;i<N/2;

i++){【6.12】数值型数组逆序(1)#include

<stdio.h>int

main(void){

const

intN

=

10;

int

i,

t,

data[N];printf("please

Input

%d

integers:",

N);t=data[i];

data[i]=data[N-1-i];data[N-1-i]=t;}//for

交换data[i]与data[N-1-i]printf("The

new

array

is:");for

(i=0;

i<N;i++)printf("%5d",

data[i]);printf("\n");return

0;}6.4.1

一维数组的应用实例——逆置0123456789iiii100908070605040302010[i][j]0918273645N

=

10[i]→

[j]jj

j

ji>=j,

停止交换i

j

ij6.4.1

一维数组的应用实例——逆置for(i=0;i<N;

i++)

scanf("%d",

&data[i]);for(i=0,j=N-1;

i<j;

i++,j--){return0;}【6.13】数值型数组逆序(2)#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

i,

j,

t,data[N];printf("please

Input

%d

integers:",

N);t

=

data[i];

data[i]

=

data[j];

data[j]

=

t;}//for

交换data[i]与data[j]printf("The

new

array

is:");for

(i=0;i<N;i++)printf("%5d",

data[i]);printf("\n");6.4.1

一维数组的应用实例——逆置【6.14】字符串逆序#include

<stdio.h>#include

<string.h>int

main(void){

char

str[50],

c;

int

i=0,

j=0;printf("please

input

a

string

(<50):\n");scanf("%s",

str);while

(str[j]

!=

'\0')

{

j++;

}j--;

/*j=strlen(str)-1;*/return0;}while(i<j){c

=i++;str[i];j--;str[i]

=str[j];

str[j]

=c;}printf("Thereversedstringis:%s\n",str);6.4.1

一维数组的应用实例——查找查找——查询某个特定的数据元素是否在一维数组中。如果在,则查询成功,返回该元素的位序;如果不在,查询失败。线性查找折半查找6.4.1

一维数组的应用实例——线性查找线性查找(Linear

Searching)又称顺序查找(Seqential

Searching)基本思想是从查找表的第一个数据开始进行比较,如果找到则返回该值在查找表中的位置(位序),如果没有找到则往下一个记录继续进行比较,直到最后一个记录为止。6.4.1

一维数组的应用实例——线性查找a1325345查找key57i4比较a[i]与key相等,查找成功,返回i(4)6.4.1

一维数组的应用实例——线性查找a1325345查找key97ii越界,查找失败6比较a[i]与key6.4.1

一维数组的应用实例——线性查找算法(条列式步骤)10

输入数据1.10

输入数组a1.20

输入查找的数据key20

查找2.10

设下标i为02.20

只要下标在可取值范围内如果a[i]==key,查找成功,i就是最终结果否则,i增一,回到2.20继续比较30

输出查询结果6.4.1

一维数组的应用实例——线性查找输入数组a输入查找的数据key下标i=0;a[i]==key未找到返回-1找到返回ii++;是否i<N?是?否6.4.1

一维数组的应用实例——线性查找【6.15】线性查找(break)#include

<stdio.h>int

main(void){const

int

N=10;int

a[N],i,key;//数据说明for

(i=0;

i<N;i++)scanf("%d",&a[i]);//输入数组aelseprintf("Nofound!\n");return0;}scanf("%d",

&key);for

(i=0;

i<N;i++)//输入查找的数据key//下标i在可取值范围内if

(a[i]==key)

break;if

(i<N)

printf("Found!

index=%d\n",

i);#include

<stdio.h>int

main(void){const

int

N=10;

int

a[N],

i,

key,

found=0;for

(i=0;

i<N;

i++)scanf("%d",

&a[i]);

//输入数组ascanf("%d",

&key);

//输入查找的数据keyfor

(i=0;

i<N

&&

found==0;

i++)if

(a[i]==key)

found

=1;if

(found==1)

printf("Found!

index=%d\n",

i);6.4.1

一维数组的应用实例【6.16】线性查找(标志变量)标志变量:用来标志某种状态的量,有2个或多个取值。设置初值、判断、修改

。elseprintf("Nofound!\n");return0;}6.4.1

一维数组的应用实例——折半查找折半查找(binary

search)又称二分查找基本思想先确定待查元素所在区间范围,通过与中间位置元

素进行比较,将待查记录区间范围缩小为原来的一半,如此往复,直至找到需查找的元素,返回其位序,或者查找区间

也没有找到为止(查找失败)。前提条件一维数组元素已排序。6.4.1

一维数组的应用实例——折半查找key:910513192137566475808892lowmidhighmid=(low+high)/2;if

(key<a[mid])

high=mid-1;else

if

(key>a[mid])

low=mid+1;else

break;

//找到了查找成功,返回mid(2)a数组a——查询数据集key——要查找的数据low——区间下界high——区间上界mid——区间中间位置6.4.1

一维数组的应用实例——折半查找key:6101234

5

6

7

8

9

10513192137566475808892ahigh

lowlow>high,没有区间,查找失败!mid=(low+high)/2;if

(key<a[mid])

high=mid-1;else

if

(key>a[mid])

low=mid+1;else

break;

//找到了mid数组a——查询数据集key——要查找的数据low——区间下界high——区间上界mid——区间中间位置6.4.1

一维数组的应用实例——折半查找算法(条列式步骤)10

准备数据1.10初始化数组a1.20输入查找的数据key1.20low=0;high=N-1;20

只要存在查找区间(low<=high)2.10

mid=(low+high)/2;2.20

比较key与a[mid]If

(key<a[mid])

high=mid-1;else

if

(key>a[mid])

low=mid+1;else

break;

//找到了30

输出查询结果6.4.1

一维数组的应用实例——折半查找【6.17】折半查找(break)#include

<stdio.h>int

main(void){

const

intN=10;

int

a[N],i,key,low=0,high=N-1,mid;for

(i=0;

i<N;

i++)

scanf("%d",

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

&key);while

(low

<=high){mid

=

(low+high)

/

2;if

(key<a[mid])

high=mid-1;else

if

(key>a[mid])

low=mid+1;else

break;}if

(low<=high)

printf("Found!

Index=%d\n",mid);else

printf("Not

Found!\n");return

0;}6.4.1

一维数组的应用实例{const

intN=10;int

a[N],i,

key,

low=0,high=N-1,mid,found=0;}【6.18】折半查找(标志变量)#include

<stdio.h>int

main(void)for

(i=0;

i<N;

i++)

scanf("%d",

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

&key);while

(low

<=

high

&&

found==0){mid

=

(low+high)

/

2;if

(key<a[mid])

high=mid-1;else

if

(key>a[mid])

low=mid+1;else

found=1;}if

(found==1)

printf("Found!

Index=%d\n",mid);else

printf("Not

Found!\n");

return

0;查找方法的比较线性查找优点:算法简单,程序容易实现缺点:查询速度慢情况比较N次;情况为log2N最好情况,比较1次;平均情况为N/2折半查找优点:查询速度快,缺点:要求数组已排序6.4.1

一维数组的应用实例数值型数组,在某位置(位序)前

一个元素1020位置以后的元素后移(从最后开始)元素j<i-1循环结束i:5x:45012367891010203040455060708090100jjj4

5j

j

ja[j+1]

=x;j6.4.1

一维数组的应用实例【6.19】数值型数组,在某位置前

一个元素#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N+1],

i,

j,

x;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

insert

order

ID:");

scanf("%d",&i);printf("Input

insert

integer:");

scanf("%d",

&x);for

(j=N-1;

j>=

i-1;

j--){a[j+1]=a[j];//后移}a[j+1]

=

x;

//

a[i-1]=x;for

(i=0;

i<N+1;

i++)

printf("%5d",a[i]);printf("\n");return0;}0123106.4.1

一维数组的应用实例数值型数组,在某元素前 一个元素10

确定 位置(线性查找)20

位置以后的元素后移(从最后开始)30

元素x:5010203040455060708090100iiii8j7j6ja[i]==x找到了5j4jjij<i循环结束9ja[j+1]

=

x;6.4.1

一维数组的应用实例【6.20】数值型数组,在某元素前

一个元素#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N+1],

i,

j,

x,

y;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

the

next

data:");

scanf("%d",&y);printf("Input

insert

integer:");

scanf("%d",

&x);位置for

(i=0;

i<N;

i++)

if(a[i]==y)

break;

//if

(i==N)

printf("Not

found!

%d\n",y);else

{for

(j=N-1;j>=i;j--)a[j+1]=a[j];

//后移a[j+1]

=

x;

//

a[i]=x;for

(i=0;

i<N+1;

i++)

printf("%5d",a[i]);printf("\n");}return0;}01210一维数组的应用实例数值型有序数组,

一数仍为有序(正序)10

确定 位置20

位置以后的元素后移(从最后开始)30

元素10203040455060708090100iii

i8j7j6jx:45a[i]>x找到位置5j3

4j

i

jj<i循环结束9ja[j+1]

=

x;6.4.1

一维数组的应用实例【6.21】数值型有序数组,

一数仍为有序(1)#include

<stdio.h>int

main(void){

const

intN

=

10;

int

a[N+1],

i,

j,

x;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

insert

integer:");

scanf("%d",

&x);for

(i=0;

i<N;i++)if(a[i]>x)break;//

位置for

(j=N-1;j>=i;

j--)a[j+1]=a[j];a[j+1]

=

x;

////后移a[i]=x;for

(i=0;

i<N+1;

i++)

printf("%5d",a[i]);printf("\n");return0;}012367891010203040455060708090100jjj

4

j

5

j

jjx:45一维数组的应用实例数值型有序数组,

一数仍为有序(正序)10

确定 位置的同时后移(从最后开始)20

元素a[j]<=x循环结束a[j+1]

=

x;6.4.1

一维数组的应用实例【6.22】数值型有序数组,

一数仍为有序(2)#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N+1],

i,

j,

x;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

insert

integer:");

scanf("%d",

&x);for

(j=N-1;

j>=0

&&

a[j]>x;

j--)a[j+1]=a[j];

//后移a[j+1]

=

x;

//printf("%5d",a[i]);for

(i=0;

i<N+1;

i++)printf("\n");return

0;}6.4.1

一维数组的应用实例删除数组指定位序元素10

删除位置以后的元素前移(从最头开始)20

输出删除后的数组0123456789i:5iiii1020304060708090100100ii6.4.1

一维数组的应用实例【6.23】删除数组指定位序元素#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N],

i;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

the

delete

order

ID:");scanf("%d",&i);for

(i--;i<N-1;i++)a[i]=a[i+1];

//前移printf("The

new

array:\n");for

(i=0;

i<N-1;

i++)printf("%5d",a[i]);printf("\n");return

0;}01234567896.4.1

一维数组的应用实例删除数组元素10

查找数组中是否存在要删除的元素if(查找成功)1.10删除位置以后的元素前移(从最头开始)1.20输出删除后的数组else

输出没有找到ix:50ii

ii1020304060708090100100iiiia[i]==x找到了i>=N-1循环结束i6.4.1

一维数组的应用实例【6.24】删除数组元素#include

<stdio.h>int

main(void){

const

intN

=

10;

int

a[N],

i,

x;for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);printf("Input

the

delete

data:");scanf("%d",&x);for

(i=0;

i<N;

i++)

if

(a[i]==x)

break;if

(i==N)

printf("Not

found!\n");else{for

(;i<N-1;i++)

a[i]=a[i+1];//前移printf("Found!

delete

data=%d\n",x);for

(i=0;i<N-1;

i++)

printf("%5d",a[i]);printf("\n");}return

0;}6.4.1

一维数组的应用实例无序序列R[1..i-1]有序序列R[i..n]一趟排序后排序冒泡法对当前还未排好序的全部结点,自上而下对相邻的两个结点依次进行比较和调整(不满足排序要求时交换两个结点的位置),每一趟比较都找到一个极大(小)值。如此重复直到所有结点都按要求排好序一趟排序开始

i无序序列R[1..i]有序序列R[i+1..n]83754968375496排序:冒泡法37854968375496排序:冒泡法4913865977613274923849165761327492973849165初始状态i=0i=1i=23849197381327491492657697132738491492657697i=4i=5i=6132738491492657697i=338976.4.1

一维数组的应用实例【6.25】冒泡法排序#include

<stdio.h>int

main(void){

const

intN

=

10;

int

a[N],i,

j,

t;printf("Input

data:");for

(i=0;

i<N;

i++)scanf("%d",

&a[i]);for

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

j<N-1-i;

j++)if

(a[j]>a[j+1]){

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}printf("\nThe

result

is:");for

(i=0;

i<N;

i++)printf("%5d",

a[i]);printf("\n");return

0;}6.4.1

一维数组的应用实例【6.26】改进的冒泡法排序#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N],

i,

j,

t,

tag=1;printf("Input

data:");for

(i=0;

i<N;

i++)

scanf("%d",

&a[i]);i

=

0;while

(tag!=0){

tag=0;for

(j=0;

j<N-1-i;

j++)if

(a[j]>a[j+1]){

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

tag=1;

}i++;}printf("\nThe

result

is:");for

(i=0;

i<N;

i++)

printf("%5d",

a[i]);printf("\n");

return

0;}6.4.1

一维数组的应用实例选择法思想:在排序过程序中,依次从待排序的记录序列中选择

出关键字值最小的记录、关键字值次小的记录…,并分别与

无序序列中的第1个位置、第二个位置……,最后剩下一个关键字值最大的记录位于序列的最后一个位置,从而使待排序的记录序列成为按关键字值由小到大排列的的有序序列。有序序列R[1..i-1]无序序列R[i..n]有序序列R[1..i-1]R[i]

R[j]有序序列R[1..i]无序序列R[i+1..n]一趟排序后一趟排序开始a[k]与a[j]比较排序:选择法i=0k=3i=41

362816j=4a[k]与a[i]交换j=k=k=a[k]与a[j]比较k=4j=4a[k]与a[i]交换a[k]与a[j]比较排序:选择法k=i=2k=3716283641i=3716283641j=j=4a[k]与a[i]交换a[k]与a[j]比较j=4k=3i==k,a[k]与a[i]不交换排序:选择法4913865492761327524912752491385249165524916552132738492491766552132738492491526576初始状态i=0i=1i=2i=3i=4i=5i=6132738492491526576排序:选择法求最小值int

main(void){

const

intN=10;

intj,min,data[N];for

(j=0;

j<N;

j++)scanf("%d",&data[j]);min=data[0];for

(j=1;

j<N;

i++)if(data[j]<min)min=data[j];printf("最小值为:%d\n",min);}求最小值下标int

main(void){

const

intN=10;

intj,k,data[N];for

(j=0;

j<N;

j++)scanf("%d",&data[j]);k=0;for

(j=1;

j<N;

i++)

if(data[j]<data[k])k=j;printf(“最小值为:%d,最小值下标为:%d

\n",data[k],k);}6.4.1

一维数组的应用实例【6.27】选择法排序#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N],

i,

j,

t;printf("Input

data:");for

(i=0;

i<N;

i++)scanf("%d",

&a[i]);for

(i=0;

i<N-1;i++){k=i;for

(j=i+1;

j<N;

j++)

if

(a[j]<a[k])

k=j;if

(i!=k)

{

t=a[i];

a[i]=a[k];

a[k]=t;

}}printf("\nThe

result

is:");for

(i=0;

i<N;

i++)

printf("%5d",

a[i]);printf("\n");return

0;}6.4.1

一维数组的应用实例排序基本思想:依次将记录序列中的每一个记录 到有序段中,使有序段的长度不断地扩大。其具体的排序过程可以描述如下:首先将待排序记录序列中的第一个记录作为一个有序段,将记录序列中的第二个记录 到上述有序段中,形两个记录组成的有序段,再将记录序列中的第三个记录到这个有序段中,形 三个记录组成的有序段,…依此类推,每一趟都是将一个记录 到前面的有序段中。R[i]有序序列R[1..i]无序序列R[i+1..n]一趟排序后一趟排序开始有序序列R[1..i-1]无序序列R[i..n]排序:法693436943469934起始6934排序:法49138659776132749238491659776132749238491659776132749238491659776132749238491657697491657697274927697492132738491492657697初始状态i=1i=2i=3i=4i=5i=6i=7intmain(void){

const

int

N=10;int

a[N+1],

t,

j;…………printf("Input

insert

integer:");scanf("%d",

&t);for

(j=N-1;

j>=0&&a[j]>t;

j--)a[j+1]=a[j];a[j+1]=t;for

(j=0;

j<N+1;

i++)

printf("%5d",a[j]);printf("\n");}排序:

法元素6.4.1

一维数组的应用实例【6.28】

法排序#include

<stdio.h>int

main(void){

const

int

N

=

10;

int

a[N],

i,

j,

t;printf("Input

data:");for

(i=0;

i<N;

i++)scanf("%d",

&a[i]);for

(i=1;

i<N;

i++){t

=

a[i];for

(j=i-1;

j>=0&&a[j]>t;

j--)a[j+1]

=a[j];a[j+1]

=

t;}printf("\nThe

result

is:");for

(i=0;

i<N;

i++)printf("%5d",

a[i]);printf("\n");

return

0;}for(j=N-1;j>=0&&a[j]>t;j--)a[j+1]=a[j];a[j+1]=t;6.4.1

一维数组的应用实例【

温馨提示

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

最新文档

评论

0/150

提交评论