欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言函數(shù)數(shù)組是什么 go語言函數(shù)式編程

數(shù)組的概念是什么?

數(shù)組是一個(gè)由若干同類型變量組成的集合,引用這些變量時(shí)可用同一名字。數(shù)組均由連續(xù)的存儲(chǔ)單元組成,最低地址對(duì)應(yīng)于數(shù)組的第一個(gè)元素,最高地址對(duì)應(yīng)于最后一個(gè)元素,數(shù)組可以是一維的,也可以是多維的。

來賓網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

5.1 一維數(shù)組

一維數(shù)組的一般說明形式如下:

type-specifier var_name [size];

在C語言中,數(shù)組必須顯示地說明,以便編譯程序?yàn)樗鼈兎峙鋬?nèi)存空間。在上式中,類型說明符指明數(shù)組的類型,也就是數(shù)組中每一個(gè)元素個(gè)數(shù),一維數(shù)組的總字節(jié)數(shù)可按下式計(jì)算:

sizeof( 類型) *數(shù)組長度= 總字節(jié)數(shù)

[例5-1] 將數(shù)字0到9裝入一個(gè)整型數(shù)組。

main( )

{

int x[10]; /* 定義包含1 0個(gè)整型數(shù)的數(shù)組,引用為x [ 0 ] ,x [ 1 ] . . . x [ 9 ] * /

int t ;

for (t=0; t10;++t) x[t]=t;

}

C語言并不檢驗(yàn)數(shù)組邊界,因此,數(shù)組的兩端都有可能越界而使其它變量的數(shù)組甚至程序代碼被破壞。在需要的時(shí)候,數(shù)組的邊界檢驗(yàn)便是程序員的職責(zé)。例如,當(dāng)使用gets( )接收字符輸入時(shí),必須確認(rèn)字符數(shù)組的長度足以存放最長的字符串。

一維數(shù)組在本質(zhì)上是由同類數(shù)據(jù)構(gòu)成的表,例如,對(duì)下列數(shù)組a :

char a[7]

圖5 - 1說明了數(shù)組a在內(nèi)存中的坦攜情形,假定起始地址為1000。

5.1.1 向函數(shù)傳遞一維數(shù)組

將一維數(shù)組傳遞給函數(shù)時(shí),把數(shù)組名作為參數(shù)直接調(diào)用函數(shù)即可,無需任何下標(biāo)。這樣,數(shù)組的第一個(gè)元素的地址將傳遞給該函數(shù)。C語言并不是將整個(gè)數(shù)組作為實(shí)參來傳遞,而是用指針來代替它。例如,下面的程序?qū)?shù)組i的第一個(gè)元素的地址傳遞給函數(shù)func1( )。

main( )

{

int i[10];

func1(i); /*函數(shù)調(diào)用,實(shí)參是數(shù)組名* /

. . .

}

函數(shù)若要接收一維數(shù)組的傳遞,則可以用下面的二種方法之一來說明形式參數(shù); 1) 有界數(shù)組;2) 無界數(shù)組。例如,函數(shù)func1 ( )要接收數(shù)組i可如下說明:

func1(str)

char str[10]; /* 有界數(shù)組,數(shù)組的下標(biāo)只能小于或等于傳遞數(shù)組的大小。* /

{

.

. .

}

也可說明為:

func1(str)

char str[ ]; / * 無界數(shù)組* /

{

.

. .

}

這二種說明方法的效果是等價(jià)的,它們都通知編譯程序建立一個(gè)字符指針。第一種說明使用的是標(biāo)準(zhǔn)的數(shù)組說明;后一種說明使用了改進(jìn)型的數(shù)組說明,它只是說明函數(shù)將要接收一個(gè)具有一定長度的整型數(shù)組。細(xì)想就會(huì)發(fā)現(xiàn),就函數(shù)而言,數(shù)組搭信掘究竟有多長并無關(guān)緊要,因?yàn)镃語言并不進(jìn)行數(shù)組的邊界檢驗(yàn)。事實(shí)上,就編譯程序而言,下面的說明也是可行的。

func1 (str);

int str[32];

{

. . .

}

因?yàn)榫幾g程序只是產(chǎn)生代碼使函數(shù)func1( )接收一個(gè)指針,并非真正產(chǎn)生一個(gè)包含3 2個(gè)元素的數(shù)組。

5.1.2 字符串使用的一維數(shù)組

顯然,一維數(shù)組的最普通的用法是作為字符串。在C語言中,字符串被定義為一個(gè)以空字符終結(jié)的字符數(shù)組。空字符以‘ \ 0’來標(biāo)識(shí),它通常是不顯示的。因此,在說明字符數(shù)組時(shí),必須比它要存放的最長字符串多一個(gè)字符。例如,假如要定義一個(gè)存放長度為1 0的字符串的數(shù)組s,可以寫成:

char s[11];

這樣就給字符串末尾的空字符保留了空間。

盡管C語言并不把字符串定義知核為一種數(shù)據(jù)類型,但卻允許使用字符串常量。字符串常量是由雙引號(hào)括起來的字符表。例如,下面兩個(gè)短語均為字符串常量:

"hello there"

"this is a test"

不必向字符串的末尾加空字符, C編譯程序會(huì)自動(dòng)完成這一工作。

C語言支持多串操作函數(shù),最常用的有:

名字功能

strcpy(s1 s2) 將s2拷貝到s1

strcat(s1 s2) 將s 2連接到s 1的末尾

strlen(s1) 返回s1的長度

strcmp(s1,s2) 若s1與s2相等,返回值為0

若s1 s2,返回值小于0

若s1 s2,返回值大于0

例5 - 2說明了這些函數(shù)的用法。

[例5 - 2 ]

#includestdio.h

main( )

{

char s1[80],s2[80]; /*定義字符數(shù)組* /

gets (s1); /*輸入字符串* /

gets (s2);

printf ("lengthsf: %d %d\n" ,strlen(s1),strlen(s2));

if (!strcmp(s1,s2))

printf ("the strings are equal \n");

strcat(s1,s2);

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

}

切記,當(dāng)兩個(gè)串相等時(shí),函數(shù)strcmp( )將返回Fa l s e,因而當(dāng)測試串的等價(jià)性時(shí),要像前例中的那樣,必須用邏輯運(yùn)算符!將測試條件取反。

當(dāng)程序運(yùn)行并以“hello”和“hello”這兩個(gè)串作為輸入時(shí),其輸出為:

hello

hello

lengths:5 5

The strings are equal

hellohello

5.2 二維數(shù)組

5.2.1 二維數(shù)組的一般形式

C語言允許使用多維數(shù)組,最簡單的多維數(shù)組是二維數(shù)組。實(shí)際上,二維數(shù)組是以一維數(shù)組為元素構(gòu)成的數(shù)組,要將d說明成大小為(10,20)的二維整型數(shù)組,可以寫成:

int d[10][20]

請(qǐng)留心上面的說明語句, C不像其它大多數(shù)計(jì)算機(jī)語言那樣使用逗號(hào)區(qū)分下標(biāo),而是用方括號(hào)將各維下標(biāo)括起,并且,數(shù)組的二維下標(biāo)均從0計(jì)算。

與此相似,要存取數(shù)組d中下標(biāo)為( 3,5)的元素可以寫成:

d[ 3 ][ 5 ]

在例5 - 3中,整數(shù)1到12被裝入一個(gè)二維數(shù)組。

[例5 - 3 ]

main ( )

{

int t,i,num[3][4]

for (t=0; t3; ++t)

for (i=0;i4;++i)

num[t][i] = (t * 4) + i + 1;

}

在此例中, num[0][0]的值為1,num[0][2]的值為3, . . . . . .,num[2][3]的值為1 2。可以將該數(shù)組想象為如下表格:

0 1 2 3

0 1 2 3 4

1 5 6 7 8

2 9 10 11 12

二維數(shù)組以行—列矩陣的形式存儲(chǔ)。第一個(gè)下標(biāo)代表行,第二個(gè)下標(biāo)代表列,這意味著按照在內(nèi)存中的實(shí)際存儲(chǔ)順序訪問數(shù)組元素時(shí),右邊的下標(biāo)比左邊的下標(biāo)的變化快一些。圖5 - 2是一個(gè)二維數(shù)組在內(nèi)存中的情形,實(shí)際上,第一下標(biāo)可以認(rèn)為是行的指針。

記住,一旦數(shù)組被證明,所有的數(shù)組元素都將分配相應(yīng)的存儲(chǔ)空間。對(duì)于二維數(shù)組可用下列公式計(jì)算所需的內(nèi)存字節(jié)數(shù):

行數(shù)×列數(shù)×類型字節(jié)數(shù)=總字節(jié)數(shù)

因而,假定為雙字節(jié)整型,大小為( 10,5)的整型數(shù)組將需要:10×5×2=100 字節(jié),當(dāng)二維數(shù)組用作函數(shù)的參數(shù)時(shí),實(shí)際上傳遞的是第一個(gè)元素(如[ 0 ] [ 0 ])的指針。不過該函數(shù)至少得定義第二維的長度,這是因?yàn)镃編譯程序若要使得對(duì)數(shù)組的檢索正確無誤,就需要知道每一行的長度。例如,將要接收大小為( 10,10)的二維數(shù)組的函數(shù),可以說明如下:

func1(x)

int x[ ][10]

{

.

. .

}

第一維的長度也可指明,但沒有必要。

C編譯程序?qū)瘮?shù)中的如下語句:

X[2][4]

處理時(shí),需要知道二維的長度。若行長度沒定義,那么它就不可能知道第三行從哪兒開[例5-4] 用一個(gè)二維數(shù)組存放某一教師任教的各班學(xué)生的分?jǐn)?shù)。假定教師有三個(gè)班,每班最多有三十名學(xué)生。注意各函數(shù)存取數(shù)組的方法。

#define classes 3

#define grades 30

#include stdio.h

main( )

{

void enter_grades();

void disp_grades( );

int get_grade( );

int a[classes] [grades];/* 定義二維數(shù)組,每行存放一個(gè)班學(xué)生成績* /

char ch;

for( ; ;)

do { /*菜單顯示* /

printf("(E)nter grades\n");

printf("(R)eport grades\n");

printf("(Q)uit\n");

ch=toupper(getchar()); /* 將鍵盤輸入字符轉(zhuǎn)換為大寫* /

} while(ch!='E' ch!='R' ch!='Q');

switch(ch){

case 'E':

enter_grades( );

break;

case 'R':

disp_grades(grade);

break;

case 'Q':

exit(0);

}

}

}

void enter_grades(a)

int a[][grades];

{

int t, i;

for (t=0;tclasses;t++)

{

printf("class #%d:\n",t+1);

for(i=0; igrades; i++)

a[t][i] = get_grade(i);

}

}

int get_grades(num)

int num;

{

char s[80];

printf("enter grade for student # %d:\n" ,n u m + 1 ) ;

gets(s);/ *輸入成績* /

return(atoi(s));

}

void disp_grades(g) /*顯示學(xué)生成績* /

int g[ ][grades];

{

int t,i;

for(t=0; tclasses; ++t) {

printf("class # %d:\n" ,t + 1);

for(i = 0 ; i grades; ++i)

printf("grade for student #%d is %d\n" ,i + 1 ,g[t][i]);

}

}

我們將實(shí)際問題簡化為共有2個(gè)班,每班兩個(gè)學(xué)生,即將程序中的常量定義修改如下:

#define classes 2

#define grades 2

運(yùn)行程序:

(E)nter grades

(R)eport grades

(Q)uit: e

class #1:

enter grade for student #1: 7 8

enter grade for student #2: 8 9

class #2

enter grade for student #1: 9 8

enter grade for student #2: 9 0

(E)nter grades

(R)eport grades

(Q)uit: r

class #1

grade for student #1 is 78

grade for student #2 is 89

class #2

grade for student #1 is 98

grade for student #2 is 90

(E)nter grades

(R)eport grades

(Q)uit :q

運(yùn)行程序,我們首先看到一個(gè)菜單,選擇“ e”輸入成績,選擇“ r”顯示成績,選擇“q”

退出。atoi( )函數(shù)用于將實(shí)參字符串轉(zhuǎn)換為整型。

5.2.2 字符串?dāng)?shù)組

程序設(shè)計(jì)中經(jīng)常要用到字符串?dāng)?shù)組。例如,數(shù)據(jù)庫的輸入處理程序就要將用戶輸入的命令與存在字符串?dāng)?shù)組中的有效命令相比較,檢驗(yàn)其有效性。可用二維字符數(shù)組的形式建立字符串?dāng)?shù)組,左下標(biāo)決定字符串的個(gè)數(shù),右下標(biāo)說明串的最大長度。例如,下面的語句定義了一個(gè)字符串?dāng)?shù)組,它可存放3 0個(gè)字符串,串的最大長度為8 0個(gè)字符:

char str_array[30][80];

要訪問單獨(dú)的字符串是很容易的,只需標(biāo)明左下標(biāo)就可以了。例如,下面的語句以數(shù)組str_array中的第三個(gè)字符串為參數(shù)調(diào)用函數(shù)gets( )。

gets(str_array[2]);

該語句在功能上等價(jià)于:

gets(str_array[2][0]);

但第一種形式在專業(yè)程序員編制的C語言程序中更為常見。

為幫助理解字符串?dāng)?shù)組的用法,研究例5 - 5。它以一個(gè)字符串?dāng)?shù)組為基礎(chǔ)做簡單的文本編輯。

[例5 - 5 ]

#includestdio.h

#define MAX 100

#define LEN 80

char text [MAX][LEN]

/* 一個(gè)非常簡單的文本編輯器* /

main( )

{

register int t,i,j;

for(t=0;tMAX; t++) /*逐行輸入字符串* /

{

printf("%d:",t);

gets(text[t]);

if(! text[t][0])

break; /* 空行退出*/

}

for(i = 0 ; i t,i++) /*按行,逐個(gè)字符輸出字符串* /

{

for(j=0; text [i][j];j++)

putchar(text [i][j]);

putchar( '\n');

}

}

該程序輸入文本行直至遇到一個(gè)空行為止,而后每次一個(gè)字符地重新顯示各行。

5.3 多維數(shù)組

C語言允許有大于二維的數(shù)組,維數(shù)的限制(如果有的話)是由具體編譯程序決定的。多維數(shù)組的一般說明形式為:

Type-specifier name [a][b][c]...[z];

由于大量占有內(nèi)存的關(guān)系,二維或更多維數(shù)組較少使用。如前所述,當(dāng)數(shù)組定義之后,所有的數(shù)組元素都將分配到地址空間。例如,大小為( 10,6,9,4)的四維字符數(shù)組需要10×6×9×4即2160字節(jié)。

如果上面的數(shù)組是兩字節(jié)整型的,則需要4320字節(jié),若該數(shù)組是雙字型的(假定每個(gè)雙字為8字節(jié))則需要34560字節(jié),存儲(chǔ)量隨著維數(shù)的增加呈指數(shù)增長。

關(guān)于多維數(shù)組,需要注意一點(diǎn):計(jì)算機(jī)要花大量時(shí)間計(jì)算數(shù)組下標(biāo),這意味著存取多維數(shù)組中的元素要比存取一維數(shù)組的元素花更多的時(shí)間。由于這些和其它原因,大量的多維數(shù)組一般采用C語言動(dòng)態(tài)分配函數(shù)及指針的方法,每次對(duì)數(shù)組的一部分動(dòng)態(tài)地分配存儲(chǔ)空間。

多維數(shù)組傳遞給函數(shù)時(shí),除第一維外,其它各維都必須說明。例如,將數(shù)組m定義成:

int m[4][3][6][5];

那么接收m的函數(shù)應(yīng)寫成:

func1 (d)

int d[][3][6][5];

當(dāng)然,如果愿意,也可加上第一維的說明。

5.4 數(shù)組的初始化

5.4.1 數(shù)組初始化

C語言允許在說明時(shí)對(duì)全局?jǐn)?shù)組和靜態(tài)局部數(shù)組初始化,但不能對(duì)非靜態(tài)局部數(shù)組初始化。

與其它變量相似,數(shù)組初始化的一般形式如下:

type-specifier array_name[size1]...[sizen]={value-list};

數(shù)值表是一個(gè)由逗號(hào)分隔的常量表。這些常量的類型與類型說明相容,第一個(gè)常量存入數(shù)組的第一個(gè)單元,第二個(gè)常量存入第二個(gè)單元,等等,注意在括號(hào)“ }”后要加上分號(hào)。

下列中一個(gè)1 0元素整型數(shù)組被初始化裝入數(shù)字1到10:

int i[10]={1,2,3,4,5,6,7,8,9,10 } ;

這意味著i[0]的值為1,而i[9]的值為10。

存放字符串的字符數(shù)組的初始化可采用如下簡化的形式:

char array_name[size] = "string";

例如,以下代碼段將str 初始化為”hello”。

char str[6] = "hello";

上面代碼產(chǎn)生和下面代碼相同的結(jié)果:

char str[6]={'h',' e ' ,' l ' ,' l ' ,' o ' ,'\o '};

因?yàn)镃語言中的字符串都以空( NULL)字符為終結(jié),故要確認(rèn)定義的數(shù)組足夠長以存放空字符。這就是為什么h ello只有5個(gè)字符,而str 要有6個(gè)字符長的原因。使用字符串常量時(shí),編譯程序自動(dòng)地在末尾加上空字符。

多維數(shù)組初始化的方法與一維數(shù)組相同,例如,下式將sqrs初始化為從1到1 0及它們各自的平方數(shù)。

int sqrs[10][2]={

1,1,

2,4,

3,9,

4,1 6 ,

5,2 5 ,

6,3 6,

7,4 9 ,

8,6 4 ,

9,8 1,

1 0,1 0 0 ,

} ;

5.4.2 變長數(shù)組的初始化

設(shè)想用數(shù)組初始化的方法建立一個(gè)如下錯(cuò)誤信息表:

char e1[12] = "read error\n";

char e2[13] = "write error\n";

char e3[18] = "cannot open file\n";

可以想象,如果用手工去計(jì)算每一條信息的字符數(shù)以確定數(shù)組的長度是何等的麻煩。利用變長數(shù)組初始化的方法可以使C自動(dòng)地計(jì)算數(shù)組的長度。變長數(shù)組初始化就是使C編譯程序自動(dòng)建立一個(gè)不指明長度的足夠大的數(shù)組以存放初始化數(shù)據(jù)。使用這種方法,以上信息表變?yōu)椋?/p>

char e1[] = "read error\n";

char e2[] = "write error\n";

char e3[] = "cannot open file\n";

給定上面的初始化,下面的語句printf("%s has length %d\n" ,e2,sizeof(e2));

將打印出:

write error

has length 13

除了減少麻煩外,應(yīng)用變長數(shù)組初始化使程序員可以修改任何信息,而不必?fù)?dān)心隨時(shí)可能發(fā)生的計(jì)算錯(cuò)誤。

變長數(shù)組初始化的方法不僅僅限于一維數(shù)組。但在對(duì)多維數(shù)組初始化時(shí),必須指明除了

第一維以外其它各維的長度,以使編譯程序能夠正確地檢索數(shù)組。其方法與數(shù)組形式參數(shù)的

說明類似。這樣就可以建立變長表,而編譯程序自動(dòng)地為它們分配存儲(chǔ)空間。例如,下面用

變長數(shù)組初始化的方法定義數(shù)組sqrs:

int sqrs[ ][2]={

1,1,

2,4,

3,9,

4,1 6,

5,2 5,

6,3 6,

7,4 9,

8,6 4,

9,8 1,

1 0,1 0 0

} ;

相對(duì)定長數(shù)組的初始化而言,這種說明的優(yōu)點(diǎn)在于可以在不改變數(shù)組各維長度的情況下,隨時(shí)增加或縮短表的長度。

5.5 應(yīng)用程序舉例

[例5-6] 為比賽選手評(píng)分。

計(jì)算方法:從1 0名評(píng)委的評(píng)分中扣除一個(gè)最高分,扣除一個(gè)最低分,然后統(tǒng)計(jì)總分,并除以8,最后得到這個(gè)選手的最后得分(打分采用百分制)。

#includestdio.h

main( )

{

int score[10]; / * 10 個(gè)評(píng)委的成績* /

float mark; /* 最后得分* /

int i;

int max = -1; / *最高分* /

int min = 101; /*最低分* /

int sum = 0; /*10個(gè)評(píng)委的總和* /

for( i = 0 ; i 10 ; i ++)

{

printf("Please Enter the Score of No. %d",i + 1 ) ;

scanf("%d\n",score[i]);

sum = sum + score[i];

}

for(i = 0 ; i 10 ; i++)

{

if(score[i] max)

max = score[i];

}

for(i = 0;i 10 ; i++)

{

if(score[i]min)

min = score[i];

}

mark = ( sum - min - max ) / 8.0;

printf("The mark of the player is %.1f\n" ,mark);

}

[例5-7] 數(shù)列排序,采用選擇法實(shí)現(xiàn)對(duì)有5個(gè)數(shù)的數(shù)列進(jìn)行排序。

選擇法的算法思想是:(降序)

1. 將待排序的n個(gè)數(shù)放入數(shù)組num中,即num[0]、num[1]、. . . num[n-1]。

2. 讓num[ 0 ]與后續(xù)num[1] . . . num[ n - 1 ]依次比較,保證大數(shù)在前、小數(shù)在后。此次比較,num[0]是數(shù)組中最大。

3. 余下n - 1個(gè)元素

4. num[1]與num[ 2 ] . . . num[ n - 1]依次比較,大數(shù)在前、小數(shù)在后,此次num[ 1 ]是全部元素的最大。

num[ n - 2 ]與num[ n - 1 ]比較,num[ n - 2 ]存大數(shù)。

num[ n - 1 ]存小數(shù),比較結(jié)束,整理有序。

例:待排序5個(gè)數(shù)為: 44 76 82 63 71

一趟排序: 1次比較:76 44 82 63 71

2次比較:82 44 76 63 71

3次比較:82 44 76 63 71

4次比較:82 44 76 63 71

最大

#include stdio.h

main( )

{

int num[5];

int i,j ;

int temp;

num[0]=94; num[1]=76; num[2]=82; num[3]=63; num[4]=71;

for(i=0; i4; i++)

for(j=i+1; j5; j++)

{

if(num[i]num[j])

{

temp = num[i];

num[i] = num[j];

num[j] = temp;

}

}

for(i=0; i5; i++)

printf("%4d" ,num[i]);

printf("ok\n");

}

這是一個(gè)非常簡單的排序程序,我們只需稍加擴(kuò)展就可以編制出很多功能強(qiáng)大的管理程序,如學(xué)生統(tǒng)計(jì)總分、平均排列年級(jí)名次等。

[例5-8] 簡易學(xué)生成績查詢系統(tǒng)。

圖5 - 3為學(xué)生成績登記表,下例程序完成如下功能:

1) 根據(jù)輸入的學(xué)生學(xué)號(hào),給出各次考試成績及平均成績;

2) 根據(jù)輸入考試的次數(shù),打印出該次考試中每個(gè)學(xué)生的成績,并給出平均分;

3) 根據(jù)學(xué)號(hào)查出學(xué)生某次考試成績;

4) 錄入考試成績。

#include stdio.h

main( )

{

int select;

int i,j ;

int score[5][7];

int average=0;

int sum=0;

do{

printf("本程序有4項(xiàng)功能\n");

printf("1、根據(jù)學(xué)號(hào)查詢學(xué)生成績\n");

printf("2、根據(jù)考試號(hào)統(tǒng)計(jì)成績\n");

printf("3、根據(jù)考試號(hào)和學(xué)號(hào)查詢成績\n");

printf("4、成績錄入\n");

printf("0、退出\n");

printf("請(qǐng)輸入選擇(0 - 4 ):");

scanf("%d\n",select);

switch(select)

{

case 0:

printf("OK\n");

exit(0)

break;

case 1:

printf("輸入學(xué)號(hào):");

scanf("%d\n",i);

for(j=1; j7; j++)

{

printf("第%d科成績是%d\n",j,score[i][j]);

sum += score[i][j];

}

average = sum/6;

printf("學(xué)生的平均成績是%d\n",average);

break;

case 2:

printf("輸入考試號(hào):");

scanf("%d\n",j);

for(i=1; i5; i++)

{

printf("第%d號(hào)學(xué)生本科成績是%d\n",i,score[i][j]);

sum += score[i][j];

}

average = sum/4;

printf("本科平均成績是%d\n",average);

break;

case 3:

printf("輸入學(xué)號(hào)和考試號(hào):");

scanf("%d %d\n",,i,j);

printf("第%d 號(hào)學(xué)生的第%d 科考試成績是%d\n",i, j,score[i][j]);

break;

case 4:

printf("請(qǐng)輸入成績\n");

for(i=1; i5; i++)

for(j=1; j7; j++)

scanf("%d\n",score[i][j]);

break;

default:

break;

}while(1);

}

從本例中可以看出,當(dāng)涉及到二維數(shù)組時(shí),通常用兩重for循環(huán)來存取元素。

go語言函數(shù)如何傳遞數(shù)組變量

按值傳遞函數(shù)參數(shù),是拷貝參數(shù)的實(shí)際值到函數(shù)的形式參數(shù)的方法調(diào)用。在這種情況下,參數(shù)在函數(shù)內(nèi)變化對(duì)參數(shù)不會(huì)有影響。

默認(rèn)情況下,Go編程語言使用調(diào)用通過值的方法來傳遞參數(shù)。在一般情況下,這意味著,在函數(shù)內(nèi)碼不能改變用來調(diào)用所述函數(shù)的參數(shù)。考慮函數(shù)swap()的定義如下。

代碼如下:

/* function definition to swap the values */

func swap(int x, int y) int {

var temp int

temp = x /* save the value of x */

x = y /* put y into x */

y = temp /* put temp into y */

return temp;

}

現(xiàn)在,讓我們通過使實(shí)際值作為在以下示例調(diào)用函數(shù)swap():

代碼如下:

package main

import "fmt"

func main() {

/* local variable definition */

var a int = 100

var b int = 200

fmt.Printf("Before swap, value of a : %d\n", a )

fmt.Printf("Before swap, value of b : %d\n", b )

/* calling a function to swap the values */

swap(a, b)

fmt.Printf("After swap, value of a : %d\n", a )

fmt.Printf("After swap, value of b : %d\n", b )

}

func swap(x, y int) int {

var temp int

temp = x /* save the value of x */

x = y /* put y into x */

y = temp /* put temp into y */

return temp;

}

讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生培茄以下結(jié)果:

Before swap, value of a :100

Before swap, value of b :200

After swap, value of a :100

After swap, value of b :200

這表明,參數(shù)值沒有被改變,雖然它們已經(jīng)在函數(shù)內(nèi)部改變。

通過傳遞函數(shù)參數(shù),即是拷貝參數(shù)的地址到形式參數(shù)的參考方法調(diào)用。在函數(shù)內(nèi)部,地址是訪問調(diào)用中使用的實(shí)際參數(shù)。這意味著,對(duì)參數(shù)的更改會(huì)影響傳遞的參數(shù)。

要通過引用傳遞的值,參數(shù)的指針被傳遞給函數(shù)就像任何其他的值。所以,相應(yīng)的,需困蠢要聲明函數(shù)的參數(shù)為指針類型如下面的函數(shù)swap(),它的交換兩個(gè)配尺察整型變量的值指向它的參數(shù)。

代碼如下:

/* function definition to swap the values */

func swap(x *int, y *int) {

var temp int

temp = *x /* save the value at address x */

*x = *y /* put y into x */

*y = temp /* put temp into y */

}

現(xiàn)在,讓我們調(diào)用函數(shù)swap()通過引用作為在下面的示例中傳遞數(shù)值:

代碼如下:

package main

import "fmt"

func main() {

/* local variable definition */

var a int = 100

var b int= 200

fmt.Printf("Before swap, value of a : %d\n", a )

fmt.Printf("Before swap, value of b : %d\n", b )

/* calling a function to swap the values.

* a indicates pointer to a ie. address of variable a and

* b indicates pointer to b ie. address of variable b.

*/

swap(a, b)

fmt.Printf("After swap, value of a : %d\n", a )

fmt.Printf("After swap, value of b : %d\n", b )

}

func swap(x *int, y *int) {

var temp int

temp = *x /* save the value at address x */

*x = *y /* put y into x */

*y = temp /* put temp into y */

}

讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生以下結(jié)果:

Before swap, value of a :100

Before swap, value of b :200

After swap, value of a :200

After swap, value of b :100

這表明變化的功能以及不同于通過值調(diào)用的外部體現(xiàn)的改變不能反映函數(shù)之外。

go語言實(shí)現(xiàn)一個(gè)簡單的簡單網(wǎng)關(guān)

網(wǎng)關(guān)=反向代理+負(fù)載均衡+各種策略,技術(shù)實(shí)現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實(shí)現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。

這篇文章主要是講如何基于 golang 實(shí)現(xiàn)一個(gè)簡單的網(wǎng)關(guān)。

轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/

整理:go語言鐘文文檔:

啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)

這里使用命令行工具進(jìn)行測試

具體代碼

直接使用基礎(chǔ)庫 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對(duì)象實(shí)現(xiàn)了serveHttp方法,因此可以直接作為 handler。

具體代碼

director中定義回調(diào)函數(shù),入?yún)?http.Request,決定笑蘆鎮(zhèn)如何構(gòu)造向后端的請(qǐng)求,比如 host 是否向后傳遞,是否進(jìn)行 url 重寫,對(duì)于 header 的處理,后端 target 的選擇等,都可以在這里完成。

director在這里具體做了:

modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。

最終依舊是返回一個(gè)ReverseProxy,然后將這個(gè)對(duì)象作為 handler 傳入即可。

參考 2.2 中的NewSingleHostReverseProxy,只需要實(shí)現(xiàn)一個(gè)類似的、支持多 targets 的方法即可,具體實(shí)現(xiàn)見后面。

作為一個(gè)網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:

隨便 random 一個(gè)整數(shù)作為索引,然后取對(duì)應(yīng)的地址即可,實(shí)現(xiàn)比較簡單。

具體代碼

使用curIndex進(jìn)行累加計(jì)數(shù),一旦超過 rss 數(shù)組的長度,則重置。

具體代碼

輪詢帶權(quán)重,如果使用計(jì)數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會(huì)瞬間壓力過大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應(yīng)該稱之為平滑加權(quán)輪詢,思路是:

后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:

操作步驟:

具體代碼

一致性 hash 算法,主要是用嘩陸于分布式 cache 熱點(diǎn)/命中問題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿足流量綁定,一旦后端目標(biāo)節(jié)點(diǎn)故障,會(huì)自動(dòng)平移到環(huán)上最近的那么個(gè)節(jié)點(diǎn)。

實(shí)現(xiàn):

具體代碼

每一種不同的負(fù)載均衡算法,只需要實(shí)現(xiàn)添加以及獲取的接口即可。

然后使用工廠方法,根據(jù)傳入的參數(shù),決定使用哪種負(fù)載均衡策略。

具體代碼

作為網(wǎng)關(guān),中間件必不可少,這類包括請(qǐng)求響應(yīng)的模式,碰粗一般稱作洋蔥模式,每一層都是中間件,一層層進(jìn)去,然后一層層出來。

中間件的實(shí)現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計(jì)數(shù);一種是鏈?zhǔn)秸{(diào)用。

具體代碼

分享名稱:go語言函數(shù)數(shù)組是什么 go語言函數(shù)式編程
文章起源:http://chinadenli.net/article26/dsphejg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器虛擬主機(jī)外貿(mào)網(wǎng)站建設(shè)商城網(wǎng)站域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)