Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред1 С#.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

Пример обработки одномерного массива чисел

Вначале мы рассмотрим самый простой прием циклической обработки одномерного массива, основанный на применении оператора for. Этот прием используется во многих языках программирования, в частности в языках С, C++ и C#.

using System;

namespace ArrayLoop

{

class ArrayLoopApp

{

static void Main(string[] args)

{

int[] Numbers;

Numbers = new int[10];

int i ;

for(i = 0; i < 10; i++)

Numbers[i] = i;

Console.Write("Numbers: [{0}", Numbers[0]);

for(i = 1 ; i < Numbers.Length; i++)

Console.Write(",{0}", Numbers[i]);

Console.WriteLine("]");

Console.ReadLine();

}

}

}

Внутри метода Main мы объявили массив Numbers, содержащий переменные типа int:

int[] Numbers;

Здесь мы не указываем размер массива, так как при объявлении массива память для него не резервируется. В следующей строке мы резервируем память для хранения 10 переменных типа int. Ссылку на эту память мы записываем в переменную Numbers, завершая создание массива:

Numbers = new int[10];

Дополнительно мы объявляем переменную i, которая будет применяться для индексации массива:

int i;

Запись значений в ячейки массива (т. е. инициализация массива) выполняется простым присваиванием в цикле:

for(i = 0; i < 10; i++)

Numbers[i] = i;

После завершения этого процесса программа отображает на консоли значения, хранящиеся в массиве:

Console.Write("Numbers: [{0}", Numbers[0] );

for(i = 1 ; i < Numbers.Length; i++)

Console.Write(",{0}", Numbers[i]) ;

Console.WriteLine("]");

Здесь мы вначале выводим на консоль содержимое первого элемента массива (это делается отдельно перед циклом, потому что перед первым элементом открывается квадратная скобка), а затем и всех остальных (это уже внутри цикла, перед каждым элементом выводится запятая). После завершения цикла закрывается квадратная скобка и переводится строка:

Обратите внимание на то, как мы проверяем условие выхода за пределы массива. Параметр цикла i сравнивается со значением Numbers. Length. Такая возможность обеспечивается тем, что все массивы в С# являются объектами стандартного класса System.Array. Свойство Length этого класса содержит размер массива.

Использование генератора случайных данных

Рассмотрим пример программы. Пусть необходимо подсчитать, сколько раз на курсе из 250 студентов встречается каждая из возможных оценок (от двойки до пятерки). Например, может оказаться, что оценка 3 встретилась среди всех 250 оценок 60 раз. Мы строим массив с индексами от 0 до 3 (что соответствует количеству возможных оценок) и сохраняем в каждом элементе массива суммарное число студентов с соответствующей оценкой. Такой массив может иметь вид:

Оценка

2

3

4

5

Количество студентов

41

60

75

74

Индекс

0

1

2

3

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

Для упрощения программы, а также для облегчения ее отладки, мы будем генерировать оценки с помощью датчика случайных чисел, а не вводить их с клавиатуры. Для генерации случайных чисел удобно использовать стандартный класс Random, определенный в пространстве имен System. Сначала нужно создать объект этого класса:

Random r = new Random() ;

После этого можно получить необходимое количество целых чисел со случайными значениями в диапазоне от нуля до заданной границы limit:

int number = r.Next(limit) ;

Если задать значение равное пяти, то мы получим шесть значений – от нуля до пяти включительно. Это не совсем то, что нам нужно, поэтому в программе необходимо еще обеспечить, чтобы случайные значения были только от двух до пяти включительно. Текст программы приведен ниже.

using System;

class Ocenki

{

///<summary>

///Программа Ocenki

///====================

///Подсчитывает частоты оценок между 2 и 5.

///Проверка программы выполняется с помощью датчика

///случайных чисел

///Демонстрирует простую обработку массивов

///</summary>

static void Main(string[] args)

{

int limit = 6; // Граница для генератора оценок(не больше 5)

int classSize = 250; // Количество студентов

// Массив для подсчета количества оценок

int[] markCount = new int[limit-2];

int score; // Текущая оценка

Random r = new Random(); // Объект генератора случайных чисел

//Генерируем 250 оценок

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

{

//генерируем числа от 0 до 3, соответствующие оценкам от 2 до 5

score = r.Next(limit-2) ;

markCount[score]++; // Подсчитываем количество оценок

}

Console.WriteLine("Таблица оценок студентов");

int students = 0;

for (int i = 0; i < limit-2; i++)

{

Console.WriteLine(" {0,4} {1,6}", i+2, markCount[i]);

students += markCount[i];

}

Console.WriteLine("Всего {0} студентов", students);

Console.ReadLine();

}

}

В данном тексте программы обратите внимание на использование средств форматирования вывода в следующем операторе:

Console.WriteLine(" {0,4} {1,6}", i+2, markCount[i]);

Здесь в фигурных скобках для каждого выводимого числа указано два параметра. Первый, как обычно, определяет номер выводимого значения в списке (это 0 и 1), зато второй позволяет указать, сколько позиций на экране будет занимать каждое выводимое число (значения 4 и 6, пишутся после номера через запятую). Это позволяет получить на экране очень приличную таблицу, даже если выводимые значения будут сильно различаться по величине:

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