Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Встроенные типы данных 2 страница




2. Исключение может определить программист с помощью конструкции throw.

Для реализации механизма обработки исключений в С# используются следующие ключевые слова:

try (контролировать)

catch (ловить)

finally (завершить)

throw (генерировать, порождать).

 

Синтаксис конструкции try

try

{

оператор_1; …..;

оператор_n;

}

[блоки catch]

[finally { оператор_1; …..; оператор_n;}]

 

Таблица 4.1.

Стандартные классы исключений

Имя Описание
AritheticException Ошибка в арифметических операциях или преобразованиях (является предком DivideByZeroException и OverFlowException)
ArrayTypeMismatchException Попытка сохранения в массиве несовместимого типа
DivideByZeroException Попытка деления на ноль
FormatException Попытка передать в метод аргумент неверного формата
IndexOutOfRangeException Индекс массива выходит за пределы диапазона
InvalidCastException Ошибка преобразования типа
OutOfMemoryException Недостаточно памяти для создания нового объекта
OverFlowException Переполнение при выполнении арифметической операции
StackOverFlowException Переполнение стека

 

Ключевое слово try служит для обозначения контролируемого блока, то есть блока программы, в котором может генерироваться исключение. Непосредственно после него может быть описание один или несколько блоков catch – так называемые обработчики исключений. В данных блоках определяется действия, которые должны выполниться в случае возникновения исключения. После блоков catch возможно описать блок finally, операторы которого определяют действия, выполняемые программой вне зависимости от того возникло исключение или нет.

Среди операторов, заключенных в контролируемый блок могут быть описания, определения, любые операции и вызовы методов, которые потенциально могут генерировать исключения, и специальные конструкции генерации исключений:

throw [выражение];

В качестве выражения (параметра) конструкции throw можно использовать любой объект, порожденный от стандартного класса Exception. Именно этот объект используется для передачи информации об исключении его обработчику.

Например,

throw new Exception ();

throw new Exception (“Исключение в функции F”);

Это наиболее часто используемые способы создания исключений. В первом случае используется конструктор без параметров, который инициализирует новый экземпляр класса Exception. Во втором случае используется конструктор с параметром типа string, который выполняет инициализацию нового экземпляра класса Exception, используя указанное в качестве строки сообщение об ошибке.

Предпочтительно генерировать исключение с информативным сообщением об ошибке, которое должно подсказывать пользователю как ее исправить.

Класс Exception содержит свойства, которые позволяют получить информацию о возникшем исключении. Некоторые из них приведены в таблице 2. Подробнее ознакомиться со свойствами и методами данного класса можно в библиотеке MSDN[10].

Таблица 4.2.

Некоторые свойства класса Exception

Имя Описание
HelpLink Возвращает или задает ссылку на файл справки, связанный с этим исключением.
HResult Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.
InnerException Возвращает экземпляр объекта Exception, который вызвал текущее исключение.
Message Возвращает сообщение, описывающее текущее исключение.
Source Возвращает или задает имя приложения или объекта, вызывавшего ошибку.
StackTrace Получает строковое представление непосредственных кадров в стеке вызова.
TargetSite Возвращает метод, создавший текущее исключение.

 

Конструкция throw может быть описана как внутри блока throw, так и в любом методе. Отметим, что на практике конструкция генерации исключения throw не находятся непосредственно в блоке try, а описывается в методах, прямо или косвенно, вызываемых в этом блоке. Именно это позволяется разделить вычислительный процесс на две независимые части. Например,

static void f () { … throw new Exception(“F”); …}

statiс void Main ()

{

try {… f(); ….}

catch () {……..};

}

Выражение (параметр) конструкции throw может отсутствовать только, если исключение генерируется внутри блока - обработчика исключения catch.

При генерации исключения (выполнении конструкции throw или генерации стандартного исключения) выполнение контролируемого блока прекращается и управление передается непосредственно за пределы контролируемого блока на соответствующий обработчик исключений (catch).

 

Обработчик исключений может иметь один из трех форматов

catch (тип_исключения имя) {оператор_1; … оператор_n;}

В данном случае указывается и тип исключения и имя. Роль имени здесь подобна роли имени формального параметра в функции. Предполагается, что имя будет использоваться в операторах обработки исключения.

catch (тип_исключения) { оператор_1; … оператор_n;}

В данном варианте не преподается использования значения исключения. Для обработчика важен только его тип и факт получения.

catch { оператор_1; … оператор_n;}

Данный обработчик реагирует на любое исключение независимо от его типа. Сравнение сгенерированного исключения со спецификациями обработчиков проводится последовательно, следовательно данный тип обработчика следует помещать только в конец списка обработчиков. В противном случае он перехватил бы все исключения и написание последующих обработчиков было бы бессмысленно.

Обработчики исключений должны непосредственно располагаться за try-блоком. Допускается наличие как одного, так и нескольких обработчиков (расположенных подряд). Если обработчиков несколько они должны отличаться типами исключений. В соответствии с типом переданного из контролируемого блока объекта-исключения и выбирается нужный обработчик. Это похоже на перегрузку функций с одним параметром. Обработчик считается найденным, если тип объекта указанного после throw такой же как и указанный в параметре catch или является производным от указанного в параметре catch. Следовательно, обработчики производных классов следует размещать до обработчиков базовых, поскольку в противном случае им никогда не будет передано управление

Если обработчик исключения отсутствует и в процессе выполнения блока try возникло исключение, или метод, сгенерировавший исключение, вызван вне блока try, то произойдет завершение программы с выводом системного сообщения.

После обработки исключения управление предается первому оператору блока finally при его наличии или первому оператору находящемуся непосредственно за обработчиками исключений. Туда же передается управление, если исключение в контролируемом блоке не было сгенерировано.

В завершающем блоке finally обычно записываются операторы, которые выполнятся вне зависимости от генерации исключений, например, закрытие файлов, которые были открыты в контролируемом блоке, или вывод информации.

 

Рассмотрим пример обработки стандартных исключений.

//program_exc1.cs

using System;

 

class ExceptionTestClass

{

public static void Main()

{

int x;

Console.Write("Enter int x: ");

string buf=Console.ReadLine();

try

{

x = int.Parse(buf);

int y = 100 / x;

Console.WriteLine("Result: " + y);

}

catch (FormatException e)

{

Console.WriteLine("FormatException: {0}\nFile: {1}\nLocation: {2} ", e.Message, e.Source, e.TargetSite);

}

catch (ArithmeticException e)

{

Console.WriteLine("ArithmeticException: {0}\nFile: {1}\nLocation: {2} ", e.Message, e.Source, e.TargetSite);

}

catch (Exception e)

{

Console.WriteLine("Generic Exception: {0}\nFile: {1}\nLocation: {2} ", e.Message, e.Source, e.TargetSite);

}

Console.ReadKey();

}

}

В данном примере в контролируемый блок включены потенциально опасные операции:

· Попытка передать в метод Parse аргумент неверного формата (при ошибочном вводе)

· Попытка деления на ноль.

В данной программе три обработчика исключений.

Первый из них перехватывает исключение типа FormatException. Это исключение будет сгенерировано, при работе метода Parse, если при вводе целого числа пользователь допустит ошибку (например введет последовательность букв).

Например, при вводе буквы на экране появиться сообщение следующего вида:

FormatException: Попытка передать в метод параметр неверного формата

File: mscorlib

Location: Void StringToNumber(…)

Второй обработчик перехватывает исключение типа ArithmeticException. Это исключение будет сгенерировано при ошибке в арифметической операции, например при делении на ноль.

При вводе нуля на экране появиться сообщение следующего вида:

ArithmeticException: Попытка деления на ноль.

File: program_exc1

Location: Void Main()

Третий из обработчиков перехватит любое из исключений, возникших в контролируемом блоке.

Если исключение в данной программе не будет сгенерировано, то на экран будет выведен результат деления 100/x.

 

Рассмотрим пример, в котором исключение генерирует один из методов класса, определенных программистом, а обрабатывается данное исключение в другом методе класса. В качестве метода класса, генерирующего исключения, опишем метод нахождения наибольшего общего делителя

 

using System;

 

class ExceptionTestClass1

 

{

static int GCM(int x, int y)

{

if (x==0 || y==0) throw new Exception("\nZero!");

if (x<0) throw new Exception ("\nNegative parametr 1");

if (y<0) throw new Exception ("\nNegative perametr 2");

while (x!=y)

{

if (x>y) x-=y;

else y-=x;

}

return x;

}

 

static void Main()

{

try

{

Console.WriteLine("\nCGM(66,44) = "+ GCM(66, 44));

Console.WriteLine("\nCGM(0,7) = " + GCM(0, 7));

Console.WriteLine("\nCGM(-12,8) = " + GCM(-12, 8));

}

catch (Exception exc) { Console.WriteLine(exc.Message); }

finally {Console.WriteLine("\nFinally"); }

 

Console.ReadKey();

}

}

}

Результат работы программы

CGM(66,44)=22

Zero!

Finally

 

Процессом генерации исключений, возникающих при переполнении, можно управлять помощью ключевых слов checked и unchecked. Данную проверку можно реализовать как для отдельного выражения, так и для блока операторов.

a=checked (b+c);

unchecked {a=b+c;}

 

Данная проверка не распространяется на функции, вызванные в блоке.

Пример проверки переполнения.

using System;

class ExceptionTestClass

 

{

static byte s(byte a, byte b)

{

return checked((byte)(a + b));

}

static void Main()

{

try

{

byte n=255, m=1;

Console.WriteLine(s(n, m));

}

catch (OverflowException e) { Console.WriteLine(e.Message); }

 

Console.ReadKey();

}

}

При данных значениях n и m сгенерируется исключение и обработается исключение, т.е. на экран будет выведено «Переполнение в результате арифметической операции».

Если, например, n=10,m=5, то исключение не будет сгенерирована (так как их сумма меньше 255) на экран будет вывдено 15.

Если в функции s удалить слово checked, то исключение также не будет сгенерировано и на экран будет выведено 0.

Проверку переполнения обычно выключают только в тех случаях, когда усечение результата необходимо в соответствии с алгоритмом. Можно задать проверку переполнения во всей программе с помощью ключа компилятора /checked. Так как это замедляет работу программы, то данный прием обычно используют при отладке.

В заключении темы отметим, что все потенциальные фрагменты программы следует заключать в блок try и обрабатывать хотя бы одно исключение типа Exception, но лучше все возможные для данного блока типы исключений.

Генерировать исключения рекомендуется в тех случаях, когда в месте возникновения ошибки недостаточно данных для ее обработки.

 

Задание 4. Обработка стандартных исключений

Каждому студенту необходимо сформулировать задание для решения простейшей задачи, подразумевающей обработку по крайне мере двух типов стандартных исключений (см. таблицу 1). Согласовать задание с преподавателем. Составить и протестировать соответствующую программу. Обработчики исключений должны выводить на экран информацию, используя свойства класса Exception (см. таблицу 2).

 

Задание 5. Генерация исключений

Каждому студенту необходимо сформулировать задание для решения простейшей задачи, подразумевающей обработку исключения, описанного пользователем. Согласовать задание с преподавателем. Составить и протестировать соответствующую программу. Исключение должно быть сгенерировано в методе класса.


 

Глава 5. Массивы в C#

Массив - самая распространенная структура данных, реализованная практически во всех языках программирования. Массив – это именованная последовательность однотипных элементов, расположенных в памяти компьютера последовательно. Тип элементов массива называют базовым. К любому элементу массива можно обращаться произвольным образом, так как он имеет определенный номер, называемый индексом. В языке C#, как и во многих других языках, индексы задаются целочисленным типом, индекс первого элемента массива равен 0. Количество элементов в массиве называет размерностью.

Массивы делятся на статические (число элементов массива известно в момент его объявления и память выделяется на этапе трансляции) и динамические (число элементов массива заранее не известно и память выделяется динамически в процессе выполнения программы).

Массивы в языке C# являются динамическими массивами. Массивы относятся к ссылочным типам, память им отводится динамически в хипе ("куче").

Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы). Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы.

Все массивы в языке C# имеют общий базовый класс Array, определённый в пространстве имен System.

В языке C# все массивы делятся на

одномерные массивы - single-dimensional arrays

многомерные массивы (прямоугольные) - multidimensional arrays (rectangular arrays),

массивы массивов (ступенчатые) - array-of-arrays (jagged arrays).

 

Описание одномерного массива в C# в общем случае имеет следующий формат:

[атрибуты][модификаторы]тип[]имя[инициализрующий_список];

Простейшее описание одномерного массива имеет следующий вид:

тип [] имя [инициализрующий_список];

Обратите внимание, что в отличие от языка C квадратные скобки приписаны не к имени массива, а к типу. Они являются неотъемлемой частью определения класса, так что запись T[] следует понимать как класс одномерный массив с элементами типа T.

Такая характеристика массива как размерность к классу не относится, она является характеристикой переменных-экземпляров (объектов класса), каждый из которых является одномерным массивом со своим числом элементов, задаваемых в инициализирующем списке.

Имя (имя массива)– идентификатор языка, выбираемый программистом.

Если инициализирующий список отсутствует (говорят, инициализация отложена), то массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его в вычислениях нельзя. Например, объявления двух массивов с отложенной инициализацией.

int[] a, b;

В качестве инициирующего списка можно использовать:

1. явный список констант, заключенный в инструктивные скобки, например,

double[] с= {5.5, 6.6, 7.7};

В этом случае в памяти создается константный массив, с которым и связывается ссылка.

2. конструкторы класса Array c помощью операции new, например

int[] d= new int[5];

int[] e= new int[]{1,2,3};

int[] f= new int[3]{1,2,3};

В этом случае в динамической памяти создается сам массив, элементы которого инициализируются константами соответствующего типа, и ссылка связывается с этим массивом.

При создании массива с помощью операции new после типа данных в квадратных скобках задается число, представляющее собой размерность массива. Это может быть как константа, так и любое выражение, преобразующееся к целому тип, значение которого неотрицательно. Например,

int n;

string buf = Console.ReadLine();

n = Convert.ToInt32(buf);

int[] g= new int[n*3];

Однако, если операция new используется с указанием размерности и с со списком констант, то размерность должна быть константой. Например,

int n = 10; int[] g= new int[n]; // допустимо

int n = 10; int[] g= new int[n]{1,2,3}; //недопустимо

const int n = 10; int[] g= new int[n]{1,2,3}; //допустимо

int[] g= new int[3]{1,2,3}; //допустимо

int[] g= new int[]{1,2,3}; //допустимо

Если массив не инициализирован при создании, то элементам присваиваются значения по умолчанию: нули для значимых типов и null для ссылочных.

Присвоить массиву список элементов после его создания невозможно, т.е. следующая запись недопустима

int[] d= new int[5]; d={1,2,3,4,5};

Обычно доступ к элементам массива осуществляется с помощью комбинации имя массива + индекс элемента следующим способом:

имя_массива[индекс элемента].

То есть, чтобы обратится к i- тому элементу массива а, используют запись а[i], при этом первый элемент массива имеет индекс 0.

Если при работе с массивом значение индекса выходит за границы массива, генерируется исключение IndexOutOfRangeException.

Обработка элементов массива обычно организуется в цикле.

В языке С# определены 4 конструкции цикла.

for (список_инициализаторов; выражение- условие; список_операторов) тело_цикла

while (выражение- условие) тело_цикла

do тело_цикла while (выражение- условие);

foreach (тип имя in выражение) тело_цикла

Первые три цикла имеют такой же синтаксис как в языке С.

Напомним, что выход из любого цикла может осуществиться не только в случае, если выражение-условие ложно, и в теле цикла с помощью любой конструкции передачи управления:

break (выход из цикла)

goto (безусловный переход на метку)

return (возврат из функции)

throw (генерации исключения)

continue (переход к следующей итерации)

Конструкция foreach повторяет группу вложенных операторов (тело цикла) для каждого элемента массива или коллекции объектов (коллекции объектов будут рассмотрены позднее). Удобство этого вида цикла заключается в том, что не требуется определять количество элементов в группе и выполнять их перебор по индексу. Имя в операторе foreach задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива (коллекции). В качестве выражения чаще всего применяется имя массива или коллекции объектов. В теле цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива. Например,

int[] fibarray = new int[] {0, 1, 2, 3, 5, 8, 13};

foreach (int i in fibarray) System.Console.WriteLine(i);

 

Обычно конструкция foreach используется для «просмотра» массива или коллекции (получения необходимой информации о его (ее) элементах). Не рекомендуется использовать конструкцию foreach для добавления или удаления элементов исходной коллекции во избежание непредвиденных побочных эффектов. Если нужно добавить или удалить элементы исходной коллекции, следует использовать цикл for.

Для массивов определена операция присваивания как операция присваивания ссылок. Рассмотрим пример.

//объявление массивов с отложенной инициализацией

int[] u,v;

u = new int[3];

for(int i=0; i<3; i++) u[i] =i+1;

v = new int[4];

v = u; //допустимое присваивание

Это корректное ссылочное присваивание: хотя u и v имеют разное число элементов, но они являются объектами одного класса. В результате присваивания память, отведенная массиву v, освободится. Обе ссылки u и v будут теперь указывать на один и тот же массив, так что изменение элемента одного массива немедленно отражается на другом массиве.

Так как массивы в языке C# имеют общего предка - базовый класс Array, то на практике для работы с массивами используют свойства и методы данного класса, наиболее популярные из которых приведены в таблице 1 и таблице 2 соответственно.

Таблица 5.1.

Некоторые свойства класса Array

Имя Описание
IsFixedSize Получает значение, показывающее, имеет ли список Array фиксированный размер.
IsReadOnly Получает значение, указывающее, доступен ли объект Array только для чтения
Length Получает 32-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.
LongLength Получает 64-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.
Rank Получает ранг (размерность) объекта Array

 

Таблица 5.1.

Некоторые методы класса Array

Имя Описание
BinarySearch(Array, Object) Выполняет поиск заданного элемента во всем отсортированном одномерном массиве Array
Clear Задает диапазон элементов массива Array равным нулю, false или null в зависимости от типа элемента.
Clone Создает неполную копию массива Array.
Copy(Array, Array, Int32) Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-разрядное целое число.
CopyTo(Array, Int32) Копирует все элементы текущего одномерного массива Array в заданный одномерный массив Array, начиная с указанного индекса в массиве назначения Array. Индекс задается как 32-разрядное целое число.
Equals(Object) Определяет, равен ли заданный объект Object текущему объекту Object. (Унаследовано от Object.)
Exists<T> Определяет, содержит ли заданный массив элементы, удовлетворяющие условиям указанного предиката.
Find<T> Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает первое найденное вхождение в пределах всего списка Array.
FindAll<T> Извлекает все элементы, удовлетворяющие условиям указанного предиката.
FindIndex<T>(T[], Predicate<T>) Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка Array.
FindLast<T> Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает последнее найденное вхождение в пределах всего списка Array.
ForEach<T> Выполняет указанное действие с каждым элементом указанного массива.
GetLength Получает 32-разрядное целое число, представляющее количество элементов в заданном измерении массива Array.
GetLowerBound

 

Получает нижнюю границу заданного измерения массива Array.
GetUpperBound Получает верхнюю границу заданного измерения массива Array.
GetValue(Int32) Получает значение, хранящееся в указанной позиции одномерного массива Array. Индекс задается как 32-разрядное целое число.
IndexOf(Array, Object) Выполняет поиск заданного объекта внутри всего одномерного массива Array и возвращает индекс его первого вхождения.
Initialize Инициализирует каждый элемент массива Array типа значения путем вызова конструктора по умолчанию для типа значений.
LastIndexOf(Array, Object) Выполняет поиск заданного объекта и возвращает индекс его последнего вхождения внутри всего одномерного массива Array.
Resize<T> Изменяет количество элементов в массиве до указанной величины.
Reverse(Array) Изменяет порядок элементов во всем одномерном массиве Array на обратный.
SetValue(Object, Int32) Присваивает значение элементу, находящемуся в указанной позиции одномерного массива Array. Индекс задается как 32-разрядное целое число.
Sort(Array) Сортирует элементы во всем одномерном массиве Array.
ToString Возвращает строку, которая представляет текущий объект. (Унаследовано от Object.)
TrueForAll<T> Определяет, все ли элементы массива удовлетворяют условиям указанного предиката.

Многие из методов, указных в таблице 2 многократно переопределены. Подробнее со свойствами и метода класса Array можно познакомиться в библиотеке MSDN[11].

Рассмотрим пример работы с массивами.

using System;

namespace array

{

class SamplesArray

{

 

static void PrintValues(Object[] myArr)

{

foreach (Object i in myArr)

{

Console.Write("\t{0}", i);

}

Console.WriteLine();

}

 

static void PrintValues(int[] myArr)

{

foreach (int i in myArr)

{

Console.Write("\t{0}", i);

}

Console.WriteLine();

}

 

static void Main()

{

 

// Создание и инициалиция массивов типа int и object.

int[] myIntArray = new int[5] { 1, 2, 3, 4, 5 };

Object[] myObjArray = new Object[5] { 26, 27, 28, 29, 30 };

// Вывод на экран элементов двух массивов.

Console.WriteLine("Initially,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

 

// Копирование первых 2 элементов из массива myIntArray в массив myObjArray

System.Array.Copy(myIntArray, myObjArray, 2);

 

// Вывод на экран элементов двух массивов

Console.WriteLine("\nAfter copying the first two elements of the integer array to the Object array,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

 

// Копирование последних 2 элементов из массива myObjArray в массив myIntArray.

System.Array.Copy(myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, myIntArray.GetUpperBound(0) - 1, 2);

/*Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.*/

 

// Вывод на экран элементов двух массивов

Console.WriteLine("\nAfter copying the last two elements of the Object array to the integer array,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

Console.ReadKey();

}

}

/*

Результат выполнения программы.

 

Initially,

integer array: 1 2 3 4 5

Object array: 26 27 28 29 30

 

After copying the first two elements of the integer array to the Object array,

integer array: 1 2 3 4 5




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 457; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.176 сек.