C# Программирование на языке высокого уровня. Среда разработки Microsoft Visual Studio.NET
Объектно-ориентированная технология создания программ. Среда разработки Visual Studio.NET. Особенности среды Microsoft Visual Studio 2010. Приложения C# для расчетов по формулам, консольный ввод-вывод. Форматирование значений данных. Программы с циклами.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | методичка |
Язык | русский |
Дата добавления | 11.09.2014 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Инициализация массивов
Как уже отмечалось, массив - это структура данных, содержащая несколько элементов одного типа. В следующих примерах показано создание и инициализация одномерных массивов.
// Объявление массива
int[ ] arrayl = new int[5];
// Объявление и инициализация массива
int[ ] array2 = new int[ ] {1, 3, 5, 7, 9} ;
// Альтернативный синтаксис
int[ ] array3 = {1, 2, 3, 4, 5, 6} ;
// при инициализации массива его размер можно
// указывать явным образом, но этот размер
// должен совпадать с числом инициализаторов
int[ ] array4 = new int[10] {99, 10, 100, 18, 1, 78, 22, 69};
Ввод-вывод массивов
Заполнить массив, т. е. определить значения элементов массива можно следующими способами:
• при помощи оператора присваивания;
• непосредственным вводом с клавиатуры;
• подготовкой и вводом данных из текстового файла;
• использования датчика случайных чисел;
• заполнением массива при помощи стандартных функций
Пример 2.
// Ввод массива с клавиатуры
using System;
namespace Example5
{
class Example5_2
{
static void Main()
{
int j;
// начальное значение
string strValue;
int[ ] iArray = new int[10];
for (j = 0; j < 10; j++)
{
strValue = Console.ReadLine();
// ввод и присваивание значений
iArray[j]= Convert.ToInt32(strValue);
}
for (j = 0; j < 10; j++)
// вывод элементов
Console.WriteLine("\n " + j + " " + iArray[j]);
}
}
}
Для организации ввода необходимо объявить строковую переменную, которой присваивается очередное введенное с клавиатуры число. Следующий оператор
iArray[j] = Convert.ToInt32(strValue);
преобразует строковую переменную strValue в целое 32-разрядное число. Ввод и преобразование происходит в цикле, после завершения которого массив iArray содержит исходные данные.
Каждый объект (переменная), каждый операнд при вычислении выражения, в том числе и само выражение характеризуется парой (значение, тип), задающей значение выражения и его тип. В процессе вычислений зачастую возникает необходимость преобразования типов - необходимость преобразовать пару (значение1, тип1) к паре (значение2, тип2).
Исходная пара называется источником преобразования, заключительная - целью преобразования. Некоторые преобразования типов выполняются автоматически. Такие преобразования называются неявными, и они часто встречаются при вычислении выражений. Все остальные преобразования называются явными и для них существуют разные способы таких преобразований - операция кастинга (приведение к типу), методы специального класса Convert, специальные методы ToString, Parse.
Все скалярные типы (арифметический, логический, символьный) имеют статический метод Parse, аргументом которого является строка, а возвращаемым результатом - объект соответствующего типа. Метод явно выполняет преобразование текстового представления в тот тип данных, который был целью вызова статического метода.
Для преобразований внутри арифметического типа можно использовать кастинг - приведение типа. Для преобразований строкового типа в скалярный тип можно применять метод Parse, а в обратную сторону - метод ToString.
Однако, во всех ситуациях, когда требуется выполнить преобразование из одного базового встроенного типа в другой базовый тип, можно использовать методы универсального класса Convert, встроенного в пространство имен System.
Методы класса Convert поддерживают общий способ выполнения преобразований между типами. Класс Convert содержит 15 статических методов вида (ToInt16(),ToInt32(), ToInt64(), ..., ToDouble, ToDecimal, ..., ). Единственным исключением является тип object - метода ToObject нет по понятным причинам, поскольку для всех типов существует неявное преобразование к типу object. Каждый из этих 15 методов перегружен, и его аргумент может принадлежать к любому из упомянутых типов. С учетом перегрузки с помощью методов этого класса можно осуществить любое из возможных преобразований одного типа в другой.
Пример 3.
// Заполнение массива с помощью генератора случайных
// чисел using System;
namespace Example5
{
class Example5_3
{
static void Main()
{
int j, num1, num2;
string str;
double db1, db2;
Random rnd = new Random();
int[ ] iArray1 = new int[10];
int[ ] iArray2 = new int[10];
double[ ] dArray1 = new double[10];
double[ ] dArray2 = new double[10];
for (j = 0; j < 10; j++)
{
iArray1[j] = rnd.Next(1, 101);
iArray2[j] = 50 - rnd.Next(1,101);
}
for (j = 0; j < 10; j++)
{
num1 = rnd.Next(1, 101);
db1 = Convert.ToDouble(num1);
dArray1[j] = db1 + Convert.ToDouble(rnd.Next(1, 101)) / 100;
num2 = 50 - rnd.Next(1, 101);
db2 = Convert.ToDouble(num2);
dArray2[j] = db2 - Convert.ToDouble(rnd.Next(1, 101)) / 100;
}
Console.WriteLine("\n -------------------------- -------");
Console.WriteLine("\n Массивы типа int Массивы типа double");
Console.WriteLine("\n ----------------------------------");
for (j = 0; j < 10; j++)
{
str = string.Format("\n {0, 4:D} {1, 6:D} {2, 6:D} {3, 8:D} {4, 8:F2} {5, 8:F2}",
j, iArray1[j], iArray2[j], j, dArray1[j], dArray2[j],];
Console.WniteLine(str);
Console.WriteLine("\n ----------------------------------");
Console.WniteLine();
}
}
}
В данном примере для заполнения массива используется генератор случайных чисел. Для генерирования последовательного ряда случайных чисел служит класс Random. Такие последовательности чисел оказываются полезными в самых разных ситуациях включая имитационное моделирование. Начало последовательности случайных чисел определяется некоторым начальным числом, которое может задаваться автоматически или указываться явным образом.
В классе Random определяются два конструктора:
public Random ()
public Random(int seed)
Первый конструктор создает объект типа Random, использующий системное время определения начального числа. А во втором конструкторе используется начальное значение seed, задаваемое явным образом.
В первом цикле заполняются массивы iArray1 и iArray2, причем массив iArray1 заполняется числами от 0 до 100, массив iArray2 заполняется числами от -50 до 50. В этих же интервалах находятся и числа num1 и num2, которые в следующих строках преобразуются к типу double. Оператор Convert.ToDouble(rnd.Next(1, 101)) / 100; генерирует случайные числа, находящиеся в интервале от 0.0 до 1.0. Таким образом, массивы dArray1 и dArray2 будут содержать числа типа double. Основные методы класса Random представлены в таблице:
Метод |
Назначение |
|
Public virtual int Next(int UpperBound) |
Возвращает следующее случайное целое число, которое будет находиться в пределах от 0 до UpperBound-l включительно |
|
Public virtual int Next (int LowerBound, int UpperBound) |
Возвращает следующее случайное целое число, которое будет находиться в пределах от LowerBound до UpperBound-1 включительно |
|
Public virtual double NextDouble (int UpperBound) |
Возвращает следующее случайное число с плавающей точкой, больше или равно 0,0 и меньше 1,0 |
Пример 4.
// Ввод массива в файл и вывод массива из файла
using System;
using System.IO;
namespace Example5
{
class Example5_4
{
static void Main()
{
int j;
string strValue;
int[ ] iArray1 = new int[10];
int[ ]iArray2 = new int[10];
StreamReader sRead = new StreamReader("C:\\dat.txt");
StreamWriter sWrite = new StreamWriter ("C:\\res.txt");
for (j = 0; j < 10; j++)
{
strValue = sRead.ReadLine();
iArray1 [j] = Conveгt.ToInt32(stгValue);
iArray2[j] = 10 * iArray1 [j];
stгValue = stгing.Foгmat("\n {0, 4:D} {1, 6:D} {2, 6:D}", j, iArray1[j],
iArray2 [j]);
Console.WriteLine(strValue);
Console.WгiteLine();
sWгite.WгiteLine(iArray2[j]);
}
sRead.Close();
sWгite.Close();
}
}
}
В этом примере происходит считывание из файла и запись в файл. Имя файла включает полный путь и, следовательно, содержит служебный знак \ (обратный слеш). Если используемые символы являются служебными, то на экран они не выводятся. Однако, в случае необходимости использовать эти символы в выводимом тексте, следует перед каждым таким символом поставить дополнительный символ \.
Все действия, т. е. считывание из файла и запись в файл, а также вывод на экран организованы в одном цикле. В переменной strValue формируется текстовая строка вывода на экран, содержащая форматы, заключенные в фигурные скобки
"\n {0, 4:D} {1, 6:D} {2, 6:D}",
где в первой позиции расположены цифры 0, 1 и 2, которые являются соответственно указателями на j, iArray1, iArray2. Код форматирования 4:D определяет число позиций (4), отведенных в строке вывода для данного целого числа (D - формат типа decimal).
Пример 5.
// Вычислить сумму и среднеарифметическое всех
// элементов одномерного массива,
// состоящего из 15 элементов.
// Заполнение массива происходит при
// помощи генератора случайных чисел
using System;
namespace Example5
{
class Example5_5
{
static void Main()
{
int j, num;
string str;
string str1 = "Сумма", str2 = "Сумма";
string str3 = "СрАрф", str4 = "СрАрф";
double db1, db2;
double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
Random rnd = new Random();
int[ ] iArray1 = new int[15];
int[ ] iArray2 = new int[15];
double[ ] dArray1 = new double[15];
double[ ] dArray2 = new double[15];
for (j = 0; j < 15; j++)
{
iArray1 [j] = rnd.Next(1, 101);
iArray2 [j] = 50 - rnd.Next(1, 101);
sum1 += iArray1 [j];
sum2 += iArray2 [j] ;
}
for (j = 0; j < 15; j++)
{
num = rnd.Next(1, 101);
db1 = Conveгt.ToDouble(num);
dArray1[j] = db1 + Conveгt.ToDouble(гnd.Next(1, 101)) / 100;
num = 50 - rnd.Next(1, 101);
db2 = Conveгt.ToDouble(num);
dArray2[j] = db2 - Conveгt.ToDouble(гnd.Next(1, 101)) / 100;
sum3 += dArray1[j];
sum4 += dArray2[j];
}
Console.WriteLine(''\n ------------------------------------------------------------------------'');
Console.WriteLine(''\n Массивы типа int
Массивы типа double '');
Console.WriteLine(''\n ------------------------------------------------------------------------'');
for (j = 0; j < 15; j++)
{
str = string.Format(''\n {0, 10:D} {1, 10:D} {2, 10:D} {3, 10:D} {4, 10:F2}
{S, 10:F2}'', j, iArray1[j], iArray2[j], j, dArray[j], dArray2[j]);
Console.WriteLine(str);
}
Console.WriteLine(''\n ------------------------------------------------------------------------'');
Console.WriteLine(''\n {0, 10} {1, 10} {2, 10} {3, 10} {4, 10:F2} {S, 10:F2}'', str1,
sum1, sum2, str2, sum3, sum4);
Console.WriteLine(''\n {0, 10} {1, 10:F2} {2, 10:F2} {3, 10} {4, 10:F2}
{S, 10:F2}'', str3, sum1/15, sum2/15, str4, sum3/15, sum4/15);
Console.WriteLine();
}
}
}
Массивы типа int iArray1, iArray2, а также типа double dArray1, dArray2 заполняются генератором случайных чисел. В первом цикле случайными числами инициализируется массивы целого типа и одновременно подсчитывается сумма элементов обоих массивов - sum1 и sum2. Переменная этого цикла одновременно является индексом массива. На каждом шаге цикла к сумме элементов каждого массива добавляется очередной элемент. По окончании цикла переменные sum1 и sum2 будут содержать полную сумму всех элементов массивов iArray1, iArray2.
В втором цикле инициализируется массивы чисел с плавающей точкой и одновременно по аналогичной схеме подсчитывается сумма элементов массивов dArray1, dArray2 - sum3 і sum4.
Далее формируется заголовок таблицы вывода, которая заполняется в третьем цикле. Для массивов типа int использован формат D, а для массивов типа double - формат F (fixed point).
Пример 6.
// Вычислить сумму всех четных элементов
// одномерного массива, состоящих из 10 элементов
// Заполнение одномерного массива происходит при
// помощи генератора случайных чисел
using System;
namespace Example5
{
class Example5_6
{
static void Main()
{
int j, num, sum = 0;
Random rnd = new Random();
int[ ] iArray = new int[10];
for (j = 0; j < 10; j++)
{
iArray[j] = rnd.Next(1, 101);
}
for (j = 0; j < 10; j++)
{
num = Convert.ToInt32(iArray[j] % 2);
if (num == 0) sum += iArray[j];
}
foreach (int jj in iArray)
{ Console.Write(" " + jj); }
Console.WriteLine("\n\n");
Console.WriteLine("\n Сумма четных элементов = " + sum);
Console.WriteLine();
Console.Write(" ");
}
}
}
Отличие данного примера от предыдущего заключается в том, что требуется подсчитать сумму не всех элементов массива, а только четных
num = Convert.ToInt32(iArray[j] % 2);
if (num == 0) sum += iArray[j];
Сначала определяется остаток отделения элемента массива на 2 с помощью выражения iArray[j] % 2, результат которого преобразуется к целому типу. Если выполняется условие num == 0 , то значение элемента iArray[j] является величиной четной и происходит суммирование данного элемента с переменной sum.
Пример 7.
// Определить индексы второго положительного
// и третьего отрицательного элементов
// одномерного массива, состоящих из 20 элементов
// Заполнение массива происходит
// при помощи генератора случайных чисел
using System;
namespace Example5
{
class Example5_7
{
static void Main()
{
int j, jnum = 0;
Random rnd = new Random();
int[ ] iArray = new int[20];
for (j = 0; j < 20; j++)
{
iArray[j] = 50 - rnd.Next(1, 101);
}
for (j = 0; j < 20; j++)
{
if (iArray[j] > 0) jnum += 1;
if (jnum == 2) break;
}
foreach (int jj in iArray)
{ Console.Write(" " + jj); }
Console.WriteLine("\n\n");
Console.WriteLine("\n индекс второго положительного
элемента = " + j);
Console.WriteLine("\n iArray[" + j + "] = " + iArray[j]);
jnum = 0;
for (j = 0; j < 20; j++)
{
if (iArray[j] < 0) jnum += 1;
if (jnum == 3) break;
}
Console.WriteLine("\n индекс третьего отрицательного
элемента = " + j);
Console.WriteLine("\n iArray[" + j + "] = " + iArray[j]);
Console.WriteLine();
Console.Write(" ");
}
Поиск второго положительного элемента массива iArray происходит в цикле. Переменная jnum определяет количество положительных элементов, которые встретились при выполнении цикла. Как только значение выражения jnum == 2 будет равно true оператор break прерывает выполнение цикла.
Аналогичный алгоритм используется при нахождении третьего отрицательного элемента.
Пример 8.
// Задан одномерный массив размером N.
// Сформировать два массива, включив
// в первый - четные элементы исходного
// массива, а во второй - нечетные элементы.
// Отсортировать массивы в порядке возрастания.
// Заполнение массива происходит при помощи
// генератора случайных чисел
using System;
namespace Example5
{
class Example5_8
{
static void Main()
{
int jnum = 0, N = 20;
int jAA = 0, jBB = 0;
int j, k, temp;
Random rnd = new Random();
int[ ] iArray = new int[N];
int[ ] jA = new int[N];
int[ ] jB = new int[N];
for (j = 0; j < N; j++)
{
iArray[j] = rnd.Next(1, 101);
}
Console.WriteLine("\n исходный массив \n\n");
foreach (int jj in iArray)
{ Console.Write(" " + jj); }
Console.WriteLine("\n\n");
for (j = 0; j < N; j++)
{
jnum = iArray[j] / 2;
iArray[j] = Convert.ToInt32(iArray[j]);
if (iArray[j] == jnum * 2)
{
jA[jAA] = iArray[j];
jAA += 1;
}
else
{
jB[jBB] = iArray[j];
jBB += 1;
}
}
Console.WriteLine("\n массив A[ ] \n\n");
foreach (int jj in jA)
{ Console.Write(" " + jj); }
Console.WriteLine("\n\n");
Console.WriteLine("\n массив B[ ] \n\n");
foreach (int jj in jB)
{ Console.Write(" " + jj); }
Console.WriteLine("\n\n");
// Сортировка массива А
jAA - = 1;
for (k = 0; k < jAA; k++)
{
for (j = 0; j < jAA; j++)
{
if (jA[j + 1] < jA[j])
{
temp = jA[j];
jA[j] = jA[j + 1];
jA[j + 1] = temp;
}
}
}
// Сортировка массива B jBB -= 1;
for (k = 0; k < jBB; k++)
{
for (j = 0; j < jBB; j++)
{
if (jB[j + 1] < jB[j])
{
temp = jB[j];
jB[j] = jB[j + 1];
jB[j + 1] = temp;
}
}
Console.WriteLine("\n отсортированный массив A[ ] \n\n");
foreach (int jj in jA)
{ Console.Write(" " + jj); }
Console.WriteLine("n\n");
Console.WriteLine("\n отсортированный массив B[ ] \n\n");
foreach (int jj in jB)
{ Console.Write(" " + jj); }
Console.WriteLine(" \n\n");
}
}
}
Для определения четности или нечетности очередного элемента массива. Если результат данного преобразования равен исходному значению, то данный элемент массива содержит четное число, в противном случае - число нечетное. По окончании данной процедуры значения всех элементов массива jA - четные числа, массива jA - нечетные числа.
Далее происходит сортировка элементов массивов jA и jВ по возрастанию. Процесс сортировки происходит следующим образом: если элемент с индексом j больше элемента с индексом j+1, то выполняется процедура перестановки
temp = jB[j];
jB[j] = jB[j + 1];
jB[j + 1] = temp;
и завершении цикла массивы jA и jB будут отсортированы по возрастанию.
2. Практическая часть
Задание к лабораторной работе
Для заданного условия составить процедуру и придумать несколько наборов тестовых данных для отладки. Возможно использование как статических массивов, так и динамических Ввод исходных данных осуществить из файла или с клавиатуры.
1. Задан одномерный массив размером N. Определить количество отрицательных чисел, количество положительных чисел и среднее арифметическое всех чисел.
2. Задан одномерный массив размером N. Сформировать два массива размером N/2, включая в первый элементы исходного массива с четными индексами, а во второй - с нечетными. Вычислить суммы элементов каждого из массивов.
3. Определить среднее арифметическое значение первого отрицательного и последнего положительного элементов одномерного массива, размер которого равен М.
4. Определить число отрицательных элементов, расположенных перед наибольшим положительным элементом одномерного массива, размер которого равен М.
5. В заданном одномерном массиве размером N поменять местами первый и последний положительные элементы.
6. Написать программу для вычисления суммы и среднего арифметического значения всех элементов заданного одномерного массива А, состоящего из 10-ти элементов.
7. Написать программу для вычисления суммы положительных элементов, заданного массива А, состоящего из 20-ти элементов.
8. Написать программу для вычисления суммы четных элементов заданного массива А, состоящего из 20-ти элементов.
9. Написать программу для определения количества положительных элементов, заданного массива А, состоящего из 20-ти элементов.
10. Написать программу для определения индексов положительных элементов, заданного массива А, состоящего из 20-ти элементов.
11. Написать программу для вычисления среднего арифметического значения всех элементов заданного массива D. Для отрицательных элементов использовать их абсолютные значения.
12. Написать программу для поиска в заданном массиве В, состоящем из 10-ти элементов, третьего положительного элемента и его индекса. Известно, что хотя бы один положительный элемент в массиве В имеется.
13. Написать программу поиска в заданном массиве В, состоящем из 20-ти элементов, третьего положительного элемента и его индекса.
14. Написать программу для поиска в заданном массиве А(15) наибольшего значения элемента и его индекса.
15. Написать программу, в которой производится перестановка четных и нечетных элементов, заданного массива С.
16. Для заданного массива А, состоящего не более чем из 50-ти элементов, найти наименьший элемент и переставить его со вторым по порядку отрицательным элементом массива.
17. Написать программу по упорядочению элементов заданного массива В в следующем порядке: сначала идут положительные числа, потом - нули и в конце - отрицательные.
18. Написать программу сортировки по возрастанию заданного массива В, состоящего из 10-ти элементов.
19. Написать программу. Для заданного массива В, состоящего из 10-ти элементов, изменить порядок следования его элементов на обратный.
20. Написать программу, в которой для заданного массива В, состоящего из 10-ти элементов, его элементы перемещались бы например на 7 позиций вправо. При этом 7 элементов из конца массива перемещаются в начало.
21. Задан массив А. Поместить положительные элементы этого массива в массив В, а отрицательные элементы - в массив С.
22. В заданном векторе (одномерном массиве) найти сумму первого и последнего отрицательного элемента
23. В заданном векторе (одномерном массиве) найти: разность первого и последнего нечетного элементов
24. В заданном векторе (одномерном массиве) найти: индексы наименьшего и наибольшего из элементов
25. В заданном векторе (одномерном массиве) найти: произведение трех наименьших элементов вектора
26. В заданном векторе (одномерном массиве) найти: сумму элементов вектора с четными индексами
27. В заданном векторе (одномерном массиве) найти: разность первого положительного и последнего отрицательного элемента
28. В заданном векторе (одномерном массиве) найти: число отрицательных элементов с нечетными индексами
29. В заданном векторе (одномерном массиве) найти: число элементов, расположенных после его наибольшего отрицательного элемента.
30. В заданном векторе (одномерном массиве) найти: наибольший отрицательный и наименьший положительные элементы.
ЛАБОРАТОРНАЯ РАБОТА № 6
Многомерные массивы
Краткие теоретические сведения
В языке С++ все массивы являются статическими; более того, все массивы являются 0-базируемыми. Это означает, что нижняя граница всех индексов массива фиксирована и равна нулю.
В языке С# снято существенное ограничение языка C++ на статичность массивов. Массивы в языке С# являются настоящими динамическими массивами. Они относятся к ссылочным типам и память им отводится динамически в "куче". Однако, не снято ограничение 0-базируемости, хотя во многих задачах гораздо удобнее работать с массивами, у которых нижняя граница не равна нулю.
В языке C++ "классических" многомерных массивов нет. Вместо них введены одномерные массивы и массивы массивов, которые являются более общей структурой данных и позволяют задать не только многомерный куб, но и изрезанную, ступенчатую структуру.
В языке С#, соблюдая преемственность, сохранены одномерные массивы и массивы массивов. В дополнение к ним в язык добавлены многомерные массивы.
Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такой массив можно представить в виде таблицы, первый индекс которого указывает на строки данной таблицы, а второй - на ее столбцы.
В следующей строке кода объявляется двумерный массив integer размерами 10x15:
int[,] table = new int[10, 15];
При объявлении этого массива оба его размера разделяются запятой. В первой части этого объявления синтаксическое обозначение означает, что создается переменная типа ссылки на двумерный массив. Если же память распределяется для массива с помощью оператора new, то используется следующее синтаксическое обозначение:
int[10, 15]
Данное объявлении создает массив размерами 10x15. Для доступа к элементу двумерного массива следует указывать оба индекса, разделив их запятой.
В следующей строке кода элементу массива myArray с координатами положения, т. е. индексами (3,5) присваивается значение 10:
myArray [3, 5] = 10;
В С# допускаются массивы трех и более измерений.
Общая форма объявления многомерного массива.
тип[,***,] имя_массива = new тип[размер13 размер23 ... размеры];
Например, в приведенном ниже объявлении создается трехмерный целочисленный массив размерами 4x10x3.
int [,,] multiArray = new int[4, 10, 3];
А в следующем операторе элементу массива multiArray, положение которого определяется индексами (2,4,1) присваивается значение 100:
multidim[2, 4, 1] = 100;
Ниже приведен пример программы, в которой сначала организуется трехмерный массив, содержащий матрицу значении 3x3x3, а затем вычисляется сумма значений диагональных элементов этого массива.
// Суммировать значения по одной из диагоналей
// матрицы 3x3x3.
using System;
class Example
{
static void Main()
{
int [,,] m = new int[3,-3,3];
int sum = 0;
int n = 1;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
m[i, j, k] = n++;
sum = m[0, 0, 0] + m[l, 1, 1] + m[2, 2, 2];
Console.WriteLine("Cyммa значений по диагонали: " + sum);
}
}
Результат выполнения этой программы:
Сумма значений по диагонали: 42
Инициализация многомерных массивов
Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера. Общая форма инициализации двумерного массива имеет следующий вид:
тип[,] имя_массива =
{
{vaL, vaL, vaL, ..., val},
{val, vaL, vaL, ..., vaL},
{vaL, vaL, vaL, ... , vaL} };
где vaL обозначает инициализирующее значение, а каждый внутренний блок - отдельный ряд. Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение - на второй позиции и т. д. Блоки инициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой.
Следующие два примера иллюстрируют возможность инициализации массива непосредственным вводом с клавиатуры и считыванием информации из текстового файла.
Пример 1.
// Заполнить двумерный массив
// непосредственно вводом с клавиатуры
using System;
namespace Example6
{
class Example6_1
{
static void Main()
{
int i, j;
string strValue;
int[,] iArray = new int[3, 4];
int[,] jArray = new int[3, 4];
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 4; ++j)
{
// ввод и присваивание значений
strValue = Console.ReadLine();
iArray[i, j] = Convert.ToInt32(strValue);
}
}
// вывод значений массива iArray на экран
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 4; ++j)
{
Console.Write(" iArray[" + i + " + j + "] = " + iArray[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
// вывод значений массива jArray на экран
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 4; ++j)
{
jArray[i, j] = iArray[i, j] * 10;
Console.Write(" jArray[" + i + ", " + j + "] = " + jArray[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
}
}
}
Основным методом, используемым для чтения данных с консоли, является метод ReadLine. Он читает с консоли строку текста, завершаемую признаком конца строки. Эта строка и является результатом, возвращаемым методом ReadLine. Введенная строка с помощью метода ToInt32 конвертируется в значение типа int и это значение присваивается элементу iArray[i, j]. Далее в двойном цикле заполняется массив
jArray jArray[i, j] = iArray[i, j] * 10;
и затем оба массива выводятся на экран.
Для ввода данных из файла используется конструктор класса StreamReader. В классе StreamReader определено несколько конструкторов. Наиболее часто используемый
StreamReader(string имя_файла),
где имя_файла - это имя открываемого файла, включая полный путь к нему. Здесь необходимо отметить, что в имени файла присутствует служебный символ \, который обычно на экран не выводится. Если все же необходимо использовать служебные символы в выводимом тексте, следует перед таким символом поставить дополнительный символ \ (обратный слеш).
Пример 2.
// Двухмерный массив
// Ввод массива в файл и
// вывод массива из файла
using System;
using System.IO;
namespace Example6
{
class Example6_2
{
static void Main()
{
int i, j;
string strValue;
int[,] iArray1 = new int[3, 4];
int[,] iArray2 = new int[3, 4];
StreamReader sRead = new StreamReader(''С:\\C#\\dat.txt'');
StreamWriter sWrite = new StreamWriter(''С:\\C#\\res.txt'');
for (i = О; i < З; i++)
{
for (j = О; j < 4; j++)
{
strValue = sRead.ReadLine();
iArray1[i, j] = Convert.ToInt32(strValue);
iArray2[i, j] = iArray1[i, j] * 100;
strValue = string.Format(''\n {0, 4:D} {1, 4:D} {2, 6:D} {З, 6:D}'',
i, j, iArray1[i, j], iArray2[i, j]);
Console.WriteLine(strValue); Console.WriteLine();
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
sWrite.WriteLine(iArray2[i, j]);
}
}
sWrite.Close();
}
}
}
Смысл этого примера достаточно прозрачен и отличается только тем, что вместо класса Console (Example6_1) используются классы StreamReader и StreamWriter (Example6_2).
Следующая программа содержит пример ввода и вывода массива из файла. Массив iArray1 содержит три столбца, первый из которых заполнен случайными числами типа int, второй - случайными числами типа double и третий значениями функции Sin(x). Далее формируется строковая переменная strValue, которая форматируется и используется для вывода массива iArrayl на экран. Следующий оператор
iArray2[i, j] = iArray1[i, j] * 100;
инициализирует массив iArray2 и производит запись символьного потока в текстовой файл res3.txt.
Класс Array - это класс, обслуживающий массивы в пространстве имен System. Его свойства и методы можно использовать для массивов любого из встроенных типов.
Свойство Length доступно только для чтения, имеет тип int и содержит количество элементов массива.
Метод Copy (Array source, Array dest, count) копирует число элементов, задаваемых параметром count, из исходного массива source в целевой массив dest, начиная с первого элемента массива. Далее происходит вывод массива iArray1на экран.
Пример 3.
// Заполнить двухмерный массив
// и организовать вывод на экран.
// Ввод массива в файл и
// вывод массива из файла
using System;
using System.IO;
namespace Example6
{
class Example6_3
{
static void Main()
{
int i, j, num;
double x = 0;
string strValue;
double[,] iArray1 = new double[10, 3];
double[,] iArray2 = new double[10, 3];
Random rnd = new Random();
StreamWriter sWrite = new StreamWriter("C:\\C#\\res3.txt");
Console.WriteLine("\n ---");
for (i = 0; i < 10; i++)
{
num = rnd.Next(1, 51);
iArray1[i, 0] = Convert.ToDouble(num);
num = (rnd.Next(1, 101) - 50) / 10;
iArray1[i, 1] = Convert.ToDouble(num);
iArray1[i, 2] = Math.Sin(x);
x = x + 0.314159;
strValue = string.Format("\n {0, 4:D} {1, 10:F0} {2, 10:F2} {3, 10:F2}",
i, iArray1[i, 0], iArray1[i, 1], iArray1[i, 2]);
Console.WriteLine(strValue);
}
Console.WriteLine("\n --------------------------------------------------------------------");
for (i = 0; i < 10; i++)
{
for (j = 0; j < 3; j++)
{
iArray2[i, j] = iArray1[i, j] * 100;
sWrite.WriteLine(iArray2[i, j]);
}
}
num = iArray2.Length;
Array.Copy(iArray2, iArray1, num);
for (i = 0; i < 10; i++)
{
strValue = string.Format("\n {0, 4:D} {1, 10:F0} {2, 10:F2} {3, 10:F2}",
i, iArray2[i, 0], iArray2[i, 1], iArray2[i, 2]);
Console.WriteLine(strValue);
sWrite.WriteLine(iArray2[i, j]);
}
Console.WriteLine("\n --------------------------------------------------------------------");
sWrite.Close();
}
}
}
Пример Example6_4 демонстрирует метод вычисления суммы и среднеарифметического всех элементов массива, который заполняется случайными числами. Эти вычисления аналогичны тем, которые проводились для одномерного массива. Разница лишь в том, что в случае одномерного массива использовался одинарный цикл, а для двумерного массива - двойной.
Пример 4.
// Заполнить двухмерный массив случайными числами.
// Вычислить сумму и среднеарифметическое всех
// элементов
using System;
using System.IO;
namespace Example6
{
class Example6_4
{
static void Main()
{
int i, j;
int num, sum = 0;
int[,] iArray = new int[5, 6];
int[ ] iA = new int[6];
Random rnd = new Random();
string strValue = "\n ";
Console.Write("\n ");
// номера столбцов
for (j = 0; j < 6; j++)
Console.Write("{0, 5}", j);
Console.WriteLine(strValue);
// заполнение массива; сумма и
// среднеарифметическое всех элементов
for (i = 0; i < 5; i++)
{
for (j = 0; j < 6; j++)
{
num = rnd.Next(1, 101);
iArray[i, j] = Convert.ToInt32(num);
iA[j] = iArray[i, j];
sum = sum + iArray[i, j];
}
}
// вывод массива
for (i = 0; i < 5; i++)
{
// номер строки
Console.Write("\n " + i);
for (j = 0; j < 6; j++)
{
// элементы строки
Console.Write("{0, 5}", iArray[i, j]);
}
Console.WriteLine(strValue);
Console.WriteLine();
Console.WriteLine(" Сумма элементов массива: " + sum);
Console.WriteLine(" Среднеарифметическое: " + sum / 30);
Console.WriteLine();
}
}
}
Следующий пример демонстрирует перестановку двух произвольных строк в двумерном массиве А, который инициализируется случайными числами. Все происходит аналогично перестановке любых двух элементов одномерного массива. Разница, как и раньше, лишь в том, что в случае одномерного массива использовался одинарный цикл, а для двумерного массива - двойной.
Пример 5.
// Заполнить двухмерный массив A(M, N)
// случайными числами.
// Переставить в этом массиве строки 2 иМ - 2
using System;
namespace Example6
{
class Example6_5
{
static void Main()
{
int M = 6, N = 8;
int i, j, temp;
int[,] iArray1 = new int[M, N];
int[,] iArray2 = new int[M, N];
int[ ] iArray3 = new int[N];
Random rnd = new Random();
string strValue = "\n ";
Console.Write("\n ");
Console.WriteLine("\n Исходный массив: ");
Console.WriteLine(strValue);
// заполнение массива
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
temp = rnd.Next(1, 101);
iArray1[i, j] = Convert.ToInt32(temp);
iArray2[i, j] = Convert.ToInt32(temp);
iArray3[j] = iArray1[i, j];
}
foreach (int jj in iArray3)
{
Console.Write("{0, 5}", jj);
}
Console.Write("\n");
}
Console.WriteLine(strValue);
Console.WriteLine("\n Массив после перестановки: ");
Console.WriteLine(strValue);
for (j = 0; j < N; j++)
{
temp = iArray2[2, j];
iArray2[2, j] = iArray2[M - 2, j];
iArray2[M - 1, j] = temp;
}
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
iArray3[ j] = iArray2[i, j]
}
foneach (int jj іn iArray3)
{
Console.Write("{0, 5}", jj');
}
Console.Write("\n");
}
Console.WriteLine(strValue);
Console.WriteLine();
Console.WriteLine();
}
}
}
Пример 6.
// Заполнить двухмерный массив A(5, 6) случайными числами.
// Найти в этом массиве строку, сумма элементов которой
// является максимальной, а в ней минимальный по величине элемент
using System;
namespace Example6
{
class Example6_6
{
static void Main()
{
int im = 0, jm = 0, i, j;
int num, sum = 0;
int max = -100, min = 100;
int[,] iArray = new int[5, 6];
int[ ] iA = new int[6];
Random rnd = new Random();
string strValue = "\n ------------------------------------------------------------------------------";
Console.Write("\n ");
// номера столбцов
for (j = 0; j < 6; j++)
Console.Write("{0, 5}", j);
Console.WriteLine(strValue);
// заполнение массива; сумма строк
for (i = 0; i < 5; i++)
{
sum = 0;
for (j = 0; j < 6; j++)
{
num = rnd.Next(1, 101);
iArray[i, j] = Convert.ToInt32(num);
iA[j] = iArray[i, j];
sum = sum + iArray[i, j];
}
if (sum > max)
{
max = sum;
im = i;
}
}
for (j = 0; j < 5; j++)
{
if (iArray[im, j] < min)
{
min = iArray[im, j];
jm = j;
}
}
// вывод массива
for (i = 0; i < 5; i++)
{
// номер строки
Console.Write("\n " + i);
for (j = 0; j < 6; j++)
{
// элементы строки
Console.Write("{0, 5}", iArray[i, j]);
}
}
Console.WriteLine(strValue);
Console.WriteLine();
Console.WriteLine("\n i = " + im);
Console.WriteLine("\n j = " + jm);
Console.WriteLine();
}
}
}
Сумма элементов строки вычисляется во внутреннем цикле по j . На каждом шаге цикла к сумме элементов строки i добавляется очередной элемент. По окончании цикла переменная sum будет содержать полную сумму всех элементов данной строки. Максимальная сумма определяется во внешнем цикле. Для этого используется следующая группа операторов
if (sum > max)
{
max = sum;
im = i;
}
которая определяет максимальную сумму и номер строки im. Другая группа операторов
if (iArray[im, j] < min)
{
min = iArray[im, j];
jm = j;
}
используется для поиска минимального элемента и его номера jm в найденной строке.
Генерация таблицы умножения достаточно тривиальная задача. Каждый элемент таблицы определяется произведением номера строки на номер столбца k = i * j. Единственная трудность заключается в организации вывода таблицы на экран.
Конструкция выбора
if (k < 10) Console.Write(" ");
else Console.Write(" ");
вставляет перед числом k < 10 два пробела, а во всех остальных случаях - один пробел. На нижеследующем рисунке представлен результат вывода, полученный при выполнении данной программы.
Пример 7.
// Рассчитать и вывести на экран таблицу умножения.
// Подсчитать общее количество чисел в данной таблице
using System;
namespace Example6
{
class Example6_7
{
static void Main()
{
int i, j, k, m = 0;
for (i = 1; i < 10; i++)
{
Console.WriteLine("\n");
for (j = 1; j < 10; j++)
{
k = i * j;
m++;
if (к < 10) Console.Write(" ");
else Console.Write(" ");
Console.Write(k);
}
}
Console.WriteLine(" \n\n всего чисел: " + m);
Console. WriteLine ("\n",);
}
}
}
Программа данного примера выводит на экран верхнюю и нижнюю треугольные матрицы. Для управления выводом используются операторы break и continue. Оператор break прерывает выполнение цикла при выполнении заданного условия. Оператор continue также при выполнении заданного условия приводит к пропуску следующих за ним операторов блока, но без выхода из блока.
Пример 8.
// Рассчитать таблицу (матрицу) умножения.
// Вывести на экран верхнюю треугольную и нижнюю
// треугольную матрицы. Подсчитать общее
// количество чисел (элементов) в каждой из матриц.
using System;
namespace Example6
{
class Example6_8
{
static void Main()
{
// верхняя треугольная матрица
int i, j, k, m = 0;
for (i = 1; i < 10; i++)
{
Console.WriteLine("\n");
for (j = 1;j < 10; j++)
{
k = i *j;
if (j >10 - i) break;
m++;
if (k < 10) Console.Write(" ");
else Console.Write(" ");
Console.Write(k);
}
}
Console.WriteLine("\n\n всего чисел: " + m);
Console.WriteLine("\n");
m = 0;
for (i = 1; i < 10; i++)
{
Console.WriteLine("\n");
for (j = 1; j < 10; j++)
{
k = i * j;
if (k < i * (10 - i))
Console.Write(" ");
else
{
if (k < 10) Console.Write (" " + k);
else Console.Write(" " + k);
m++;
}
}
}
Console.WriteLine("\n\n всего чисел: " + m);
Console.Write(" \n");
}
}
}
В приведенных выше примерах применения двумерного массива, по существу создавался так называемый прямоугольный массив. Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему массиву. Но в С# можно также создавать специальный тип двумерного массива, называемый ступенчатым массивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быть разной. Следовательно, ступенчатый массив можно использовать для составления таблицы из строк разной длины.
Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма:
тип[ ][ ] имя_массива = new тип[размер][];
где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной. Память сначала распределяется для его первого измерения автоматически, а затем для второго измерения вручную. После создания ступенчатого массива доступ к его элементам осуществляется по индексу, указываемому в отдельных квадратных скобках. Например, в следующей строке кода элементу массива jagged, находящемуся на позиции с координатами (2,1), присваивается значение 10:
jagged[2][1] = 10;
Обратите внимание на синтаксические отличия в доступе к элементу ступенчатого и прямоугольного массива.
В приведенном ниже примере программы демонстрируется создание двумерного ступенчатого массива. Здесь следует обратить внимание, что язык C# позволяет использовать в качестве имен переменных и массивов русские имена.
Пример 9.
// Инициализировать и вывести на экран
// ступенчатый массив.
using System;
namespace Example6
{
class Example6_9
{
static void Main()
{
int j, max = 0;
int[ ] Массив = new int[5];
for (j = 0; j < 5; j++)
{
Массив[j] = j + 2;
if (Массив[j] > max) max = Массив[j];
}
// вспомогательный массив, определяющий
// границы каждой из строк ступенчатого массива
int размер0 = 5;
int размер1 = max;
int размер2 = Convert.ToInt32((4 * max - 1) / 3);
int[ ] размер = { размер0, размер1, размер2 };
int[ ][ ] стМассив = new int[3][ ];
стМассив[0] = new int[paзмep[0]];
стМассив[1] = new int[pa3Mep[1]];
стМассив[2] = new int[pa3Mep[2]];
Console.WriteLine();
Console.Write(" ");
for (j = 0; j < размер2; j++)
Console.Write("{0,5}", j);
Console.WriteLine("\n\t\t ------------------------------------------------------------------ ");
Console.Write(" стМассив[0][5]");
for (j = 0; j < размер0; j++)
стМассив[0][ j] = j + 1;
foreach (int jj in стМассив[0])
Console.Write("{0,5}", jj);
Console.WriteLine();
Console.Write(" cтМассив [1][6] ");
for (j = 0; j < размер1; j++)
стМассив [1][ j] = j + 11;
foreach (int jj in стМассив[1])
Console.Write("{0,5}", jj);
Console.WriteLine();
Console.Write(" стМассив[2][7]");
for (j = 0; j < размер2; j++)
стМассив[2][ j] = j + 111;
foreach (int jj in стМассив[2])
Console.Write("{0,5}", jj);
Console.WriteLine("\n\t\t -------------------------------------------------------------- ");
Console.WriteLine();
}
}
}
Ступенчатые массивы находят полезное применение не во всех, а лишь в некоторых случаях. Так, если требуется очень длинный двумерный массив, который заполняется не полностью, т.е. такой массив, в котором используются не все, а лишь отдельные его элементы, то для этой цели идеально подходит ступенчатый массив.
Следует отметить, что ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов. Так в приведенной ниже строке кода создается массив двумерных массивов.
int[ ][,] jArray = new int[5][,];
2. Практическая часть
Задания к лабораторной работе
Подобные документы
Средства интегрированной среды Microsoft Visual Studio, предоставляемые программисту для реализации программ на языке С++. Особенности стиля написания программ. Типовые приемы и методы создания и отладки программ. Листинги программ и их тестирование.
лабораторная работа [814,3 K], добавлен 26.05.2013Разработка игры "Угадай персонажа", ее суть и содержание. Запоминание новых персонажей и вопросов, коррекция базы данных. Использование языка программирования С++ и среды разработки Microsoft Visual Studio 2010. Алгоритмы и методы, структура программы.
курсовая работа [571,9 K], добавлен 14.07.2012Создание программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С# средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Определение математического аппарата, применение его в задаче.
курсовая работа [500,4 K], добавлен 13.01.2015Microsoft Visual C++ и среда программирования Microsoft Developer Studio 6.0. Решение интеллектуальной задачи на компьютере. Построение алгоритма кодирования на Visual C++. Алгоритм решения задачи. Описание программы "Sort". Инструкции пользователя.
курсовая работа [46,0 K], добавлен 27.11.2007Введение в Microsoft Visual Studio. Диалоговое окно "Восстановленные файлы" интегрированной среды разработки. Веб-обозреватель интегрированной среды разработки. Диалоговое окно "Проверка подлинности прокси-сервера". Сохранение и восстановление файлов.
реферат [22,0 K], добавлен 29.05.2013Требования к MS Office 2007. Набор средств разработки Visual Studio Tools for Office как альтернатива VBA. Разработка СУБД на базе MS Access. Разработка надстройки "Электронные компоненты" для PowerPoint на языке C# в среде MS Visual Studio 2010.
дипломная работа [5,2 M], добавлен 03.05.2013Изучение особенностей проектирования прикладных программ с помощь средств Visual Studio 2010 на языке C#. Расчет конического соединения, конусного градиента, усилия для разрыва соединения и требуемой силы сжатия. Реализация и тестирование программы.
курсовая работа [1,7 M], добавлен 19.02.2013Разработка программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Класс программы, инструкция по использованию программы.
курсовая работа [1,0 M], добавлен 26.12.2013Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012