Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Пример 4.5.2. Описание одномерных массивов на изыках Java и c#.

// C#

static vold Main()

{

float [] mas1= new float [3];

mas1[0]= 1.1F; mas1[1]= 1.2F; mas1[2]=1.3F;

for (int i= 0; i < 3; i++)

Console.Write(" mas1[" + i.ToString() + "]= " + mas1[i].ToString());

Console.WriteLine();

float [] mas2= new float [3] {2.1F, 2.2F, 2.3F};

for (int i= 0; i < 3; i++)

Console.Write(" mas2[" + i.ToString() + "]= " + mas2[i].ToString());

Console.WriteLine();

float [] mas3= { 3.1F, 3.2F, 3.3F};

for (int i= 0; i < mas3.Length; i++)

Console.Write(" mas3[" + i.ToString() + "]= " + mas3[i].ToString());

}

Результат:

mas1[0]= 1,1 mas1[1]= 1,2 mas1[2]= 1,3

mas2[0]= 2,1 mas2[1]= 2,2 mas2[2]= 2,3

mas3[0]= 3,1 mas3[1]= 3,2 mas3[2]= 3,3

// Java и J#

public class Test

{

public static void main(String[] args)

{

float [ ] masl= new float [3];

masl[0]= 1.1F ; masl[1]= 1.2F; masl[2]= 1.3F;

for (int i= 0; i < 3; i++)

System.out.print (" masl["+ i + "]= " + masl[i]);

System.out.println();

float [] mas3={ 3.1F, 3.2F, 3.3F};

for (int i= 0; i < mas3.length; i++)

System.out.print (" mas3["+ i + "]= " + mas3[i]);

}

}

Результат:

masl[0]= 1.1 masl[1]= 1.2 masl[2]= 1.3

mas3[0]= 3.1 mas3[1]= 3.2 mas3[2]= 3.3

Java. В примере 4.5.2 созданы два одномерных массива с плавающей точкой на языке Java. Если в первом массиве masl присваивается значения поэлементно, то второй массив mas3 инициализируется списком. При выдаче значений элементов массива masl на консоль в операторе for переменная цикла i сравнивается с числом 3, равным длине массива. В операторе же for для массива mas3 вместо числа используется переменная length массива.

В аргументе функции print() вывода строки на консоль формируется выводимая строка путём объединения её частей, соединённых операцией "+".

C#. Программа на языке C# включает три массива, два из которых инициализированы так же, как и массивы программы на языке Java. Массив mas2 инициализирован иначе. Оператор for, выводящий элементы массива mas3, использует свойство Length, определяющее длину массива. Это свойство является свойством класса Array, из которого наследуется любой массив на языке C#. Из программы видно, что в отличие от функции print() языка Java функция Write() класса Console требует преобразования не строковых значений аргумента в строку с помощью специальной функции ToString().

В примере 4.5.3 показано создание массивов из объектов на языке C++/CLI.

Пример 4.5.3. Создание массивов объектов на языке C++CLI.

// C++/CLI

#include "stdafx.h"

class CFl // Описание неуправляемого класса

{

float fl; // Закрытая (по умолчанию) переменная fl

public: // Открыть функции

void Set(float vFI) {fl= vFI;}// Установить значение переменной fl

float Get(){return fl;} // Получить значение закрытой переменной fl

};

ref class CBool // Описание управляемого класса

{

bool b; // Закрытая (по умолчанию) переменная b

public: // Открыть функции

void Set (bool vB) {b= vB;} // Установить значение переменной b

bool Get ( ) {return b; } // Получить значение закрытой переменной b

};

int main(array<System::String ^> ^args)

{

// размещение массива в стеке

CFl m1[2]; // Массив объектов в стеке

m1[0].Set(1.1F); m1[1].Set(1.2F);

System::Console::Write("m1[0].fl= " + (m1[0].Get()).ToString());

System::Console::WriteLine(" m1[1].fl= {0}", (m1[1].Get()).ToString());

// размещение массивов в неуправляемой куче

CFl *m2 = new CFl [2];// Массив объектов в неуправляемой куче

m2[0].Set(2.1F); m2[1].Set(2.2F);

System::Console::Write ("m2[0].fl= {0} ", (m2[0].Get()).ToString());

System::Console::WriteLine (" m2[1].fl= " + (m2[1].Get()).ToString());

CFl *m3[2]; // Массив указателей на объекты в неуправляемой куче

m3[0]= new CFl(); m3[1]= new CFl(); // Создать объекты в куче

m3[0]->Set(3.1F); m3[1]->Set(3.2F);

System::Console::Write ("m3[0]->fl= " + (m3[0] ->Get()).ToString());

System::Console::WriteLine(" m3[1]->fl= " +(m3[1]->Get()).ToString());

// размещение массива в управляемой куче

array<CBool^>^ m4 = gcnew array<CBool^>(2); // Массив

// управляемых указателей на объекты в управляемой куче

//Присвоение управляемым указателям(дескрипторам) ссылок на объекты

m4[0]= gcnew CBool(); m4[1]= gcnew CBool(); // Создать объекты

m4[0]->Set(true); m4[1]->Set(false);

System::Console::Write ("m4[0]->b= " + (m4[0]->Get()).ToString());

System::Console::WriteLine (" m4[1]->b= " + (m4[1]->Get()).ToString());

}

Результат:

m1[0].fl= 1,1 m1[1].fl= 1,2

m2[0].fl= 2,1 m2[1].fl= 2,2

m3[0]->fl= 3,1 m3[1]->fl= 3,2

m4[0]->b= True m4[1]->b= False

В программе примера 4.5.3 созданы массив ml из двух объектов типа CFl в стеке, массивы m2 и m3, каждый из двух объектов типа CFl, в неуправляемой куче и массив m4 из двух объектов типа CBool в управляемой куче. После выделения памяти присваиваются значения закрытым переменным fl и b с помощью интерфейсной функции Set() соответствующих объектов. А при выводе значений в функциях Write() или WriteLine() к объекту массива применяется интерфейсная функция Get(), возвращающая значение закрытой переменной fl или b.

Как видно из примера 4.5.3, применение управляемых массивов, оперирующих с дескрипторами, отличается от применения неуправляемых массивов. На языках C# и Java , имеющих дело только с управляемыми объектами, размещаемыми в управляемой куче, использование массивов подчинено единым правилам и, конечно, проще, чем на языке C++/CLI. Это иллюстрирует пример 4.5.4.