基礎課件嚴冬梅第6章數組在了解必要性上掌握_第1頁
基礎課件嚴冬梅第6章數組在了解必要性上掌握_第2頁
基礎課件嚴冬梅第6章數組在了解必要性上掌握_第3頁
基礎課件嚴冬梅第6章數組在了解必要性上掌握_第4頁
基礎課件嚴冬梅第6章數組在了解必要性上掌握_第5頁
免費預覽已結束,剩余94頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章數組(Array)主講:嚴冬梅程序設計基礎(The

Foundation

of

Programming)第6章數組教學要求在了解數組的必要性的基礎上,掌握數組的定義、方式、初始化、輸入輸出和數組基本操作,并通過上機實踐熟練掌握有關數組的程序設計,能夠進行大規(guī)模的數據處理。第6章數組重點數組的及地址;數組的初始化;數組的輸入與刪輸出;數組的逆序;數組元素的查找、除;矩陣常見操作;字符串的基本操作等。難點

數組的

及地址;

數組的初始化;數組元素的查找、

與刪除;數組排序。第6章數組6.1數組的引入6.2

一維數組6.3

數組6.4

數組的應用實例6.1

數組的引入空值類型void字符型char數據類型整型int雙精度型double浮點型(單精度型)

float基本數據類型聯(lián)合體union構造數據類型數組結構體struct枚舉地址類型:指針特殊數據類型6.1.1

為什么使用數組?編程時為什么要使用數組這種數據類型呢?看一個例子吧!現(xiàn)在要計算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語言不允許動態(tài)定義數組,元素個數不能為變量

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

數組地址其:按下標遞增的順序存儲在連續(xù)的內存空間中地址:數組名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

輸入、輸出及賦值數值型數組數值型數組不能整體輸入、輸出及賦值,必須使用循環(huán)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;}現(xiàn)在就是求十萬個學生平均成績也不怕了!使用數組求平均成績【例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方式及地址按下標遞增的順序在連續(xù)的內存空間中,而且“靠右邊的下標先變化”“按行主序”逐級分解,降低維數地址:數組名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

輸入、輸出及賦值數值型數組數值型數組不能整體輸入、輸出及賦值,必須使用循環(huán)。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

輸入、輸出及賦值字符型數組二維字符型數組不能整體輸入、輸出及賦值,必須使用循環(huán)。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】求矩陣行最大(?。┲?.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)基本思想是從查找表的第一個數據開始進行比較,如果找到則返回該值在查找表中的位置(位序),如果沒有找到則往下一個記錄繼續(xù)進行比較,直到最后一個記錄為止。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繼續(xù)比較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】線性查找(標志變量)標志變量:用來標志某種狀態(tài)的量,有2個或多個取值。設置初值、判斷、修改

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

一維數組的應用實例——折半查找折半查找(binary

search)又稱二分查找基本思想先確定待查元素所在區(qū)間范圍,通過與中間位置元

素進行比較,將待查記錄區(qū)間范圍縮小為原來的一半,如此往復,直至找到需查找的元素,返回其位序,或者查找區(qū)間

也沒有找到為止(查找失敗)。前提條件一維數組元素已排序。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——區(qū)間下界high——區(qū)間上界mid——區(qū)間中間位置6.4.1

一維數組的應用實例——折半查找key:6101234

5

6

7

8

9

10513192137566475808892ahigh

lowlow>high,沒有區(qū)間,查找失??!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——區(qū)間下界high——區(qū)間上界mid——區(qū)間中間位置6.4.1

一維數組的應用實例——折半查找算法(條列式步驟)10

準備數據1.10初始化數組a1.20輸入查找的數據key1.20low=0;high=N-1;20

只要存在查找區(qū)間(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;查找方法的比較線性查找優(yōu)點:算法簡單,程序容易實現(xiàn)缺點:查詢速度慢情況比較N次;情況為log2N最好情況,比較1次;平均情況為N/2折半查找優(yōu)點:查詢速度快,缺點:要求數組已排序6.4.1

一維數組的應用實例數值型數組,在某位置(位序)前

一個元素1020位置以后的元素后移(從最后開始)元素j<i-1循環(huán)結束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循環(huán)結束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循環(huán)結束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循環(huán)結束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循環(huán)結束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初始狀態(tài)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初始狀態(tài)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初始狀態(tài)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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論