4.6.2 CLR数组(6)
试一试:使用数组的数组
创建一个CLR控制台程序项目,并将其修改成如下形式:
- // Ex4_17.cpp : main project file.
- // Using an array of arrays
-
- #include "stdafx.h"
-
- using namespace System;
-
- int main(array<System::String ^> ^args)
- {
- array< array< String^ >^ >^ grades = gcnew array< array< String^ >^ >
- {
- gcnew array<String^>{"Louise", "Jack"}, // Grade A
- gcnew array<String^>{"Bill", "Mary", "Ben", "Joan"},
- // Grade B
- gcnew array<String^>{"Jill", "Will", "Phil"}, // Grade C
- gcnew array<String^>{"Ned", "Fred", "Ted", "Jed", "Ed"},
- // Grade D
- gcnew array<String^>{"Dan", "Ann"} // Grade E
- };
- wchar_t gradeLetter = 'A';
-
- for each(array< String^ >^ grade in grades)
- {
- Console::WriteLine(L"Students with Grade {0}:", gradeLetter++);
-
- for each( String^ student in grade)
- Console::Write(L"{0,12}",student); // Output the current name
- Console::WriteLine(); // Write a newline
- }
- return 0;
- }
该示例产生下面的输出:
- Students with Grade A:
- Louise Jack
- Students with Grade B:
- Bill Mary Ben Joan
- Students with Grade C:
- Jill Will Phil
- Students with Grade D:
- Ned Fred Ted Jed Ed
- Students with Grade E:
- Dan Ann
示例说明
数组定义完全与前面看到的一样。接下来,我们定义wchar_t类型的变量gradeLetter,其初值为'A'。该变量将用来在输出中给出等级。
学生和等级在嵌套循环中输出。外部的for each循环逐一处理grades数组的元素:
- for each(array< String^ >^ grade in grades)
- {
- // Process students in the current grade...
- }
循环变量grade是array< String^ >^类型,因为这是grades数组的元素类型。变量grade依次引用元素类型为String^句柄的各个数组,因此第一次执行循环时引用A等学生的姓名数组,第二次引用B等学生的姓名数组,直到最后一次执行循环时引用E等学生的姓名数组。
在外部循环的每次重复中,都执行下面的代码:
- Console::WriteLine(L"Students with Grade {0}:", gradeLetter++);
-
- for each( String^ student in grade)
- Console::Write(L"{0,12}",student); // Output the current name
-
- Console::WriteLine(); // Write a newline
第一条语句输出的信息中包括gradeLetter的当前值-- 最初是'A',该语句还使gradeLetter递增,因此在外部循环以后的重复中该变量的值将依次变为'B'、'C'、'D'和'E'。
接下来,我们用for each循环依次输出当前数组中的每个姓名。输出语句使用Console::Write()函数,因此所有姓名都显示在同一行上。输出的姓名靠右对齐,字段宽度为12字符,因此各输出行的姓名是上下对齐的。在循环之后,WriteLine()只是将换行符写到输出流中,从而使下次输出从新行上开始。
也可以使用for循环作为内部循环:
- for (int i = 0 ; i < grade->Length ; i++)
- Console::Write(L"{0,12}",grade[i]); // Output the current name
该循环受制于grade变量引用的当前数组的Length属性。
我们同样可以使用for循环作为外部循环,这种情况下对内部循环需要作进一步的修改,这样的嵌套循环如下所示:
- for (int j = 0 ; j < grades->Length ; j++)
- {
- Console::WriteLine(L"Students with Grade {0}:", gradeLetter+j);
- for (int i = 0 ; i < grades[j]->Length ; i++)
- Console::Write(L"{0,12}",grades[j][i]); // Output the current name
- Console::WriteLine();
- }
现在,grades[j]引用第j个姓名数组,因此表达式grades[j][i]将引用第j个姓名数组的第i个姓名。