C和指標 程式設計練習 第8章

2021-10-08 09:19:06 字數 3910 閱讀 9295

/*

修改問題6 的array_offset函式, 使它訪問以列為主序的偽陣列, 也就是最左邊的下標率先變化. 這個新函式array_offset2在其他方面與原先的那個函式一樣.

例如:假定arrayinfo陣列包含了值3, 4, 6, 1, 5, -3, 3. 這些值提示我們所處理的是三維偽陣列.

第乙個下標範圍從4 到6; 第二個下標範圍從1 到5; 第三個下標範圍從-3 到 3.

在這個例子中, array_offset2被呼叫時將有3 個下標引數傳遞給它. 下面顯示了幾組下標值以及它們所代表的偏移量.

下標: 偏移量:

4, 1, -3 0

5, 1, -3 1

6, 1, -3 2

4, 2, -3 3

4, 3, -3 6

4, 1, -2 15

4, 1, -1 30

5, 3, -1 37

6, 5, 3 104

*/#define max_dim 10

intcompute_offset

(int dim,

int*arrayinfo,

int*arg,

int*weight )

;#include

#include

intarray_offset2

(int

*arrayinfo,..

.)int i;

va_list ap;

//引數指標

int arg[max_dim]

;//max_dim 最大維度, arg存放可變部分引數i

va_start

( ap, arrayinfo )

;for

( i =

0; i < arrayinfo[0]

;++i )

arg[i]

=va_arg

( ap,

int)

;//讀取可變部分引數值, 並存放到arg中

}va_end

( ap )

;int weight;

//weight(權), 表示當前維度乙個偏移量表示的前面維度累計累計偏移量(在記憶體中累計的實際偏移量)

return

compute_offset

( arrayinfo[0]

, arrayinfo, arg,

&weight );}

intcompute_offset

(int dim,

int*arrayinfo,

int*arg,

int*weight )

*weight = arrayinfo[2]

- arrayinfo[1]

+1;//把第一維的權返回給下一維(第二維)

return arg[0]

- arrayinfo[1]

;//返回第一維偏移量

}int offset;

offset =

compute_offset

( dim -

1, arrayinfo, arg, weight )

;//向高一維度遞迴

if( offset ==-1

)if( arg[dim -1]

< arrayinfo[dim *2-

1]|| arg[dim -1]

> arrayinfo[dim *2]

) offset +

=*weight *

( arg[dim -1]

- arrayinfo[dim *2-

1]);

//當前維度總偏移量 = 前面高維度總偏移量 + 當前維度權 * 當前維度偏移量

*weight *

= arrayinfo[dim *2]

- arrayinfo[dim *2-

1]+1

;//更新低一維權

return offset;

//返回當前維度總偏移量, 如果遞迴結束, 返回值就是函式總偏移量

}int

main

(void);

printf

("arrayinfo: ");

for( i =

0; i < arrayinfo[0]

*2+1

;++i )

printf

("\n");

offset =

array_offset2

( arrayinfo,4,

1,-3

);printf

("下標為: 4, 1, -3 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,5,

1,-3

);printf

("下標為: 5, 1, -3 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,6,

1,-3

);printf

("下標為: 6, 1, -3 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,4,

2,-3

);printf

("下標為: 4, 2, -3 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,4,

3,-3

);printf

("下標為: 4, 3, -3 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,4,

1,-2

);printf

("下標為: 4, 1, -2 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,4,

1,-1

);printf

("下標為: 4, 1, -1 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,5,

3,-1

);printf

("下標為: 5, 3, -1 時: 偏移量為: %d\n"

, offset )

; offset =

array_offset2

( arrayinfo,6,

5,3)

;printf

("下標為: 6, 5, 3 時: 偏移量為: %d\n"

, offset )

;return0;

}

程式執行結果:

C和指標 程式設計練習 第9章

這個問題的最後部分就是編寫函式 void decrypt char data,char const key 它接受乙個加密過的字串為引數,它的任務是重現原來的資訊.除了它是用於揭秘之外,它的工作原理應該與encrypt 相同 void decrypt char data,char const key...

C和指標 程式設計練習 第9章

標準i o庫並沒有提供一種機制,在列印大整數時用逗號進行分割.在這個練習中,你需要編寫乙個程式,為美元數額列印提供這種功能.函式把乙個數字字串 代表以美分為單位的金額 轉換成美元形式,如下表所示 輸入 輸出 輸入 輸出 null 0.00 12345 123.45 1 0.01 123456 1,2...

C和指標 第8章 陣列

1.2 2 arry arry 2 arry 2 1.3下標絕不會比指標更有效率,但指標有時會比下標有效。結論 1.當根據某個決定數目的增量在乙個陣列中移動的時候,使用指標比使用下標產生效率更高的 當這個增量是1並且機器具有位址自動增量模型時,這點表現更突出。2.宣告為暫存器變數的指標通常比位於靜態...