การเขียนโปรแกรม D - อาร์เรย์
ภาษาโปรแกรม D จัดเตรียมโครงสร้างข้อมูลชื่อ arraysซึ่งจัดเก็บคอลเลกชันตามลำดับขนาดคงที่ขององค์ประกอบประเภทเดียวกัน อาร์เรย์ใช้ในการจัดเก็บชุดข้อมูล มักจะมีประโยชน์มากกว่าที่จะคิดว่าอาร์เรย์เป็นชุดของตัวแปรประเภทเดียวกัน
แทนที่จะประกาศตัวแปรเดี่ยวเช่น number0, number1, ... และ number99 คุณประกาศตัวแปรอาร์เรย์หนึ่งตัวเช่นตัวเลขและใช้ตัวเลข [0], ตัวเลข [1] และ ... , ตัวเลข [99] เพื่อแสดง ตัวแปรแต่ละตัว องค์ประกอบเฉพาะในอาร์เรย์ถูกเข้าถึงโดยดัชนี
อาร์เรย์ทั้งหมดประกอบด้วยตำแหน่งหน่วยความจำที่อยู่ติดกัน ที่อยู่ต่ำสุดสอดคล้องกับองค์ประกอบแรกและที่อยู่สูงสุดขององค์ประกอบสุดท้าย
การประกาศอาร์เรย์
ในการประกาศอาร์เรย์ในภาษาการเขียนโปรแกรม D โปรแกรมเมอร์จะระบุประเภทขององค์ประกอบและจำนวนองค์ประกอบที่อาร์เรย์ต้องการดังนี้ -
type arrayName [ arraySize ];
สิ่งนี้เรียกว่าอาร์เรย์มิติเดียว arraySizeต้องเป็นจำนวนเต็มมากขึ้นอย่างต่อเนื่องกว่าศูนย์และประเภทสามารถใด ๆ ที่ถูกต้องเขียนโปรแกรม D ชนิดข้อมูลภาษา ตัวอย่างเช่นในการประกาศอาร์เรย์ 10 องค์ประกอบที่เรียกว่าbalance of type double ให้ใช้คำสั่งนี้ -
double balance[10];
การเริ่มต้นอาร์เรย์
คุณสามารถเริ่มต้นองค์ประกอบอาร์เรย์ภาษาการเขียนโปรแกรม D ทีละรายการหรือใช้คำสั่งเดียวดังต่อไปนี้
double balance[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];
จำนวนค่าระหว่างวงเล็บเหลี่ยม [] ทางด้านขวาต้องไม่เกินจำนวนองค์ประกอบที่คุณประกาศสำหรับอาร์เรย์ระหว่างวงเล็บเหลี่ยม [] ตัวอย่างต่อไปนี้กำหนดองค์ประกอบเดียวของอาร์เรย์ -
หากคุณละเว้นขนาดของอาร์เรย์อาร์เรย์ที่ใหญ่พอที่จะรองรับการเริ่มต้นจะถูกสร้างขึ้น เพราะฉะนั้นถ้าคุณเขียน
double balance[] = [1000.0, 2.0, 3.4, 17.0, 50.0];
จากนั้นคุณจะสร้างอาร์เรย์เดียวกันกับที่คุณทำในตัวอย่างก่อนหน้านี้
balance[4] = 50.0;
คำสั่งข้างต้นกำหนดองค์ประกอบหมายเลข 5 ในอาร์เรย์เป็นค่า 50.0 อาร์เรย์ที่มีดัชนีที่ 4 จะเป็น 5 เช่นองค์ประกอบสุดท้ายเนื่องจากอาร์เรย์ทั้งหมดมี 0 เป็นดัชนีขององค์ประกอบแรกซึ่งเรียกอีกอย่างว่าดัชนีฐาน การแสดงภาพต่อไปนี้แสดงอาร์เรย์เดียวกันกับที่เรากล่าวถึงข้างต้น -
การเข้าถึงองค์ประกอบอาร์เรย์
องค์ประกอบถูกเข้าถึงโดยการสร้างดัชนีชื่ออาร์เรย์ ทำได้โดยการวางดัชนีขององค์ประกอบไว้ในวงเล็บเหลี่ยมหลังชื่อของอาร์เรย์ ตัวอย่างเช่น -
double salary = balance[9];
ข้อความข้างต้นใช้เวลา 10 ปีบริบูรณ์องค์ประกอบจาก array และกำหนดค่าให้ตัวแปรเงินเดือน ตัวอย่างต่อไปนี้ใช้การประกาศการกำหนดและการเข้าถึงอาร์เรย์ -
import std.stdio;
void main() {
int n[ 10 ]; // n is an array of 10 integers
// initialize elements of array n to 0
for ( int i = 0; i < 10; i++ ) {
n[ i ] = i + 100; // set element at location i to i + 100
}
writeln("Element \t Value");
// output each array element's value
for ( int j = 0; j < 10; j++ ) {
writeln(j," \t ",n[j]);
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Element Value
0 100
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
อาร์เรย์แบบคงที่เทียบกับอาร์เรย์แบบไดนามิก
หากระบุความยาวของอาร์เรย์ขณะเขียนโปรแกรมอาร์เรย์นั้นจะเป็นอาร์เรย์แบบคงที่ เมื่อความยาวสามารถเปลี่ยนแปลงได้ในระหว่างการทำงานของโปรแกรมอาร์เรย์นั้นจะเป็นอาร์เรย์แบบไดนามิก
การกำหนดอาร์เรย์แบบไดนามิกนั้นง่ายกว่าการกำหนดอาร์เรย์ที่มีความยาวคงที่เนื่องจากการละเว้นความยาวจะทำให้อาร์เรย์แบบไดนามิก -
int[] dynamicArray;
คุณสมบัติอาร์เรย์
นี่คือคุณสมบัติของอาร์เรย์ -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 |
.init อาร์เรย์แบบคงที่จะส่งคืนลิเทอรัลอาร์เรย์โดยแต่ละองค์ประกอบของลิเทอรัลเป็นคุณสมบัติ. init ของชนิดองค์ประกอบอาร์เรย์ |
2 |
.sizeof อาร์เรย์แบบคงที่จะส่งกลับความยาวอาร์เรย์คูณด้วยจำนวนไบต์ต่อองค์ประกอบอาร์เรย์ในขณะที่อาร์เรย์แบบไดนามิกส่งกลับขนาดของการอ้างอิงอาร์เรย์แบบไดนามิกซึ่งเป็น 8 ในการสร้าง 32 บิตและ 16 ในการสร้าง 64 บิต |
3 |
.length อาร์เรย์แบบคงที่จะส่งคืนจำนวนองค์ประกอบในอาร์เรย์ในขณะที่อาร์เรย์แบบไดนามิกใช้เพื่อรับ / กำหนดจำนวนองค์ประกอบในอาร์เรย์ ความยาวเป็นประเภท size_t |
4 |
.ptr ส่งกลับตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์ |
5 |
.dup สร้างอาร์เรย์แบบไดนามิกที่มีขนาดเท่ากันและคัดลอกเนื้อหาของอาร์เรย์ลงในนั้น |
6 |
.idup สร้างอาร์เรย์แบบไดนามิกที่มีขนาดเท่ากันและคัดลอกเนื้อหาของอาร์เรย์ลงในนั้น สำเนาถูกพิมพ์ว่าไม่เปลี่ยนรูป |
7 |
.reverse ย้อนกลับตามลำดับขององค์ประกอบในอาร์เรย์ ส่งคืนอาร์เรย์ |
8 |
.sort จัดเรียงตามลำดับขององค์ประกอบในอาร์เรย์ ส่งคืนอาร์เรย์ |
ตัวอย่าง
ตัวอย่างต่อไปนี้อธิบายคุณสมบัติต่างๆของอาร์เรย์ -
import std.stdio;
void main() {
int n[ 5 ]; // n is an array of 5 integers
// initialize elements of array n to 0
for ( int i = 0; i < 5; i++ ) {
n[ i ] = i + 100; // set element at location i to i + 100
}
writeln("Initialized value:",n.init);
writeln("Length: ",n.length);
writeln("Size of: ",n.sizeof);
writeln("Pointer:",n.ptr);
writeln("Duplicate Array: ",n.dup);
writeln("iDuplicate Array: ",n.idup);
n = n.reverse.dup;
writeln("Reversed Array: ",n);
writeln("Sorted Array: ",n.sort);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Initialized value:[0, 0, 0, 0, 0]
Length: 5
Size of: 20
Pointer:7FFF5A373920
Duplicate Array: [100, 101, 102, 103, 104]
iDuplicate Array: [100, 101, 102, 103, 104]
Reversed Array: [104, 103, 102, 101, 100]
Sorted Array: [100, 101, 102, 103, 104]
อาร์เรย์หลายมิติใน D
การเขียนโปรแกรม D ทำให้อาร์เรย์หลายมิติ นี่คือรูปแบบทั่วไปของการประกาศอาร์เรย์หลายมิติ -
type name[size1][size2]...[sizeN];
ตัวอย่าง
คำประกาศต่อไปนี้สร้างสามมิติ 5 10. อาร์เรย์จำนวนเต็ม 4 ตัว -
int threedim[5][10][4];
อาร์เรย์สองมิติใน D
รูปแบบที่ง่ายที่สุดของอาร์เรย์หลายมิติคืออาร์เรย์สองมิติ โดยพื้นฐานแล้วอาร์เรย์สองมิติคือรายการของอาร์เรย์หนึ่งมิติ ในการประกาศอาร์เรย์จำนวนเต็มสองมิติขนาด [x, y] คุณจะต้องเขียนไวยากรณ์ดังนี้ -
type arrayName [ x ][ y ];
ที่ไหน type สามารถเป็นประเภทข้อมูลการเขียนโปรแกรม D ที่ถูกต้องและ arrayName จะเป็นตัวระบุการเขียนโปรแกรม D ที่ถูกต้อง
โดยที่typeสามารถเป็นชนิดข้อมูลการเขียนโปรแกรม D ที่ถูกต้องและarrayNameคือตัวระบุการเขียนโปรแกรม D ที่ถูกต้อง
อาร์เรย์สองมิติสามารถคิดเป็นตารางซึ่งมี x จำนวนแถวและจำนวนคอลัมน์ y อาร์เรย์สองมิติa ที่มีสามแถวและสี่คอลัมน์สามารถแสดงได้ดังต่อไปนี้ -
ดังนั้นทุกองค์ประกอบในอาร์เรย์ a ถูกระบุโดยองค์ประกอบเป็น a[ i ][ j ], ที่ไหน a คือชื่อของอาร์เรย์และ i และ j คือตัวห้อยที่ระบุแต่ละองค์ประกอบโดยไม่ซ้ำกันในไฟล์.
การเริ่มต้นอาร์เรย์สองมิติ
อาร์เรย์แบบหลายมิติอาจเริ่มต้นโดยการระบุค่าวงเล็บสำหรับแต่ละแถว อาร์เรย์ต่อไปนี้มี 3 แถวและแต่ละแถวมี 4 คอลัมน์
int a[3][4] = [
[0, 1, 2, 3] , /* initializers for row indexed by 0 */
[4, 5, 6, 7] , /* initializers for row indexed by 1 */
[8, 9, 10, 11] /* initializers for row indexed by 2 */
];
วงเล็บปีกกาที่ซ้อนกันซึ่งระบุแถวที่ต้องการเป็นทางเลือก การเริ่มต้นต่อไปนี้เทียบเท่ากับตัวอย่างก่อนหน้านี้ -
int a[3][4] = [0,1,2,3,4,5,6,7,8,9,10,11];
การเข้าถึงองค์ประกอบอาร์เรย์สองมิติ
องค์ประกอบในอาร์เรย์ 2 มิติเข้าถึงได้โดยใช้ตัวห้อยหมายถึงดัชนีแถวและดัชนีคอลัมน์ของอาร์เรย์ ตัวอย่างเช่น
int val = a[2][3];
คำสั่งข้างต้นนำองค์ประกอบที่ 4 จากแถวที่ 3 ของอาร์เรย์ คุณสามารถตรวจสอบได้ใน digram ด้านบน
import std.stdio;
void main () {
// an array with 5 rows and 2 columns.
int a[5][2] = [ [0,0], [1,2], [2,4], [3,6],[4,8]];
// output each array element's value
for ( int i = 0; i < 5; i++ ) for ( int j = 0; j < 2; j++ ) {
writeln( "a[" , i , "][" , j , "]: ",a[i][j]);
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
a[0][0]: 0
a[0][1]: 0
a[1][0]: 1
a[1][1]: 2
a[2][0]: 2
a[2][1]: 4
a[3][0]: 3
a[3][1]: 6
a[4][0]: 4
a[4][1]: 8
การดำเนินการอาร์เรย์ทั่วไปใน D
นี่คือการดำเนินการต่างๆที่ดำเนินการในอาร์เรย์ -
การแบ่งอาร์เรย์
เรามักใช้ส่วนหนึ่งของอาร์เรย์และการแบ่งส่วนอาร์เรย์มักมีประโยชน์มาก ตัวอย่างง่ายๆสำหรับการแบ่งส่วนอาร์เรย์แสดงไว้ด้านล่าง
import std.stdio;
void main () {
// an array with 5 elements.
double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];
double[] b;
b = a[1..3];
writeln(b);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
[2, 3.4]
การคัดลอกอาร์เรย์
เรายังใช้การคัดลอกอาร์เรย์ ตัวอย่างง่ายๆสำหรับการคัดลอกอาร์เรย์แสดงไว้ด้านล่าง
import std.stdio;
void main () {
// an array with 5 elements.
double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];
double b[5];
writeln("Array a:",a);
writeln("Array b:",b);
b[] = a; // the 5 elements of a[5] are copied into b[5]
writeln("Array b:",b);
b[] = a[]; // the 5 elements of a[3] are copied into b[5]
writeln("Array b:",b);
b[1..2] = a[0..1]; // same as b[1] = a[0]
writeln("Array b:",b);
b[0..2] = a[1..3]; // same as b[0] = a[1], b[1] = a[2]
writeln("Array b:",b);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Array a:[1000, 2, 3.4, 17, 50]
Array b:[nan, nan, nan, nan, nan]
Array b:[1000, 2, 3.4, 17, 50]
Array b:[1000, 2, 3.4, 17, 50]
Array b:[1000, 1000, 3.4, 17, 50]
Array b:[2, 3.4, 3.4, 17, 50]
การตั้งค่าอาร์เรย์
ตัวอย่างง่ายๆสำหรับการตั้งค่าในอาร์เรย์แสดงไว้ด้านล่าง
import std.stdio;
void main () {
// an array with 5 elements.
double a[5];
a[] = 5;
writeln("Array a:",a);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Array a:[5, 5, 5, 5, 5]
การต่ออาร์เรย์
ตัวอย่างง่ายๆสำหรับการต่ออาร์เรย์สองอาร์เรย์แสดงไว้ด้านล่าง
import std.stdio;
void main () {
// an array with 5 elements.
double a[5] = 5;
double b[5] = 10;
double [] c;
c = a~b;
writeln("Array c: ",c);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Array c: [5, 5, 5, 5, 5, 10, 10, 10, 10, 10]