Ваш браузер устарел. Рекомендуем обновить его до последней версии.




 



 


Delphi

 

 


Случайные числа. Создание и обработка одномерных массивов

Мы часто говорим о случайности, о случайном событии, о случае. На самом деле в мире нет места случайности, все, что в нем происходит, непременно является следствием предшествующих каких-либо закономерных событий, так как любому событию предшествует малый или большой ряд событий, вызывающих его. А каждое событие из вышеупомянутого ряда тоже в свою очередь является закономерным. Для человека событие является закономерным, если он может объяснить или хотя бы перечислить причинные события, предшествующие следствию – закономерному событию. То есть, если происшедшее событие укладывается в голове, мы его называем закономерным. Если событие не укладывается в нашем сознании, потрясает нас своей непредсказуемостью, мы начинаем говорить о том, что это событие совершенно случайное. В действительности же человек не обладает достаточной информацией или просто не способен проследить за очень сложной и длинной логической цепочкой причинных событий.

Компьютер генерирует случайные числа по программе, которая начинает свою работу с вполне определенного числа. Затем программа в результате большого числа математических действий над этим числом, изменяет его до неузнаваемости. С конечным результатом производится точно такая же последовательность действий и так далее. Так примерно вырабатываются случайные числа. Такие числа необходимы, например, для создания игровых программ. Для того чтобы каждый раз в начале работы программы выпадала новая последовательность можно за начальное число брать, например, текущее время. Эти числа правильнее называть псевдослучайными (как бы случайными для человека). Но если программа-генератор попадет в руки человеку, то он сможет предсказывать вылетающие случайные числа, и они превратятся для него в числа строго закономерные.

В среде C++ Builder случайные целые числа выбрасывает функция random(n) в пределах от 0 до n – 1. Запустите C++ Builder и на стартовой форме установите электронную кнопку Button1, с помощью которой пользователь будет управлять генератором случайных чисел. Кнопку снабдите надписью «Случай». На форме следует также установить компонент: поле вывода текста Label1 для просмотра результата работы программы. Кликнув по кнопке Button1 два раза, в функцию обработки Button1Click впишите программный код:

 

     Label1->Caption = random(100);     //случайное число

 

Запустите проект приложения на выполнение. Убедитесь в том, что при нажатии на электронную кнопку в поле вывода текста будут появляться псевдослучайные числа в пределах от 0 до 99. Но при повторном запуске приложения вы обнаружите существенный недостаток в его работе, а именно: выбрасываемые числа в точности повторятся. А это недопустимо в работе практически любой программы, использующей псевдослучайные числа. Избавьте ваше приложение от этого неприятного казуса с помощью функции randomize(). Данная функция инициализирует генератор псевдослучайных чисел, а, следовательно, ее необходимо вызвать перед использованием генератора random(n). В функцию обработки FormCreate (событие наступает при запуске формы) поместите инструкцию:

 

     randomize();     //инициализация генератора псевдослучайных чисел

 

Посмотрите, что изменилось в работе вашего приложения, запустив и остановив его несколько раз. В заголовок окна Form1 впишите название программы: «Генератор случайных чисел». Сохраните приложение.

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

Примером одномерного массива могут послужить данные о температуре воздуха в полдень на протяжении недели. Запустите C++ Builder. На стартовой форме разместите электронную кнопку Button1. Здесь же установите компонент поле вывода текста Label1. В окне свойств объектов, свойству Caption компонента Label1 придайте значение «Температура воздуха = ». Кликнув по кнопке Button1 два раза, в функцию обработки Button1Click впишите программный код:

 

     int a[7];     //резервирование памяти для массива а состоящем из семи целых чисел

     //ряд ежедневных температур воздуха

     a[0] = 8;

     a[1] = 12;

     a[2] = 5;

     a[3] = 2;

     a[4] = 0;

     a[5] = -3;

     a[6] = -7;

     for (int i=0; i<7; i=i+1)     //цикл со счетчиком

     Label1->Caption = Label1->Caption + a[i] + " ";

 

В первой строке объявляется массив a для семи целых чисел. Эта инструкция резервирует область памяти для размещения массива. При объявлении массива будьте внимательны. При указании заниженного числа элементов массива C++ Builder к сожалению не выдаст сообщения об ошибке и программа будет работать неправильно. При резервировании с запасом вы будете нерационально использовать память.

Предпоследняя строка является циклом for (Для), который заставит семь раз повторить выполнение последней строки, где каждый раз к содержимому поля вывода текста будет добавляться значение новой температуры с пробелом. Пробел необходим для удобочитаемости выводимых данных. Наращивание переменной i на единицу происходит с помощью счетчика i=i+1, который можно записывать и так: i++. Шаг цикла по-прежнему останется равным единице.

На кнопке поместите надпись «Старт». Заголовок окна Form1 снабдите надписью «Ежедневная температура в полдень». Запустите программу на выполнение. После останова сохраните проект.

А теперь сформируем одномерный массив, состоящий из тридцати элементов, которыми будут являться случайные целые числа в диапазоне от 1 до 100. Постройте приложение по схеме двух вышерассмотренных примеров. Программный код будет следующим:

 

     int a[30];     //резервирование памяти под массив

     randomize();     //рандомизация

 

     for (int i=0; i<30; i++)     //цикл со счетчиком

     {

     a[i] = random(100) + 1;     //формирование массива

     Label1->Caption = Label1->Caption + a[i] + " ";

     }

 

Здесь цикл со счетчиком «Для» выполнит две инструкции (тело цикла), заключенные в фигурные скобки, тридцать раз. Подумайте: что дает в строке «формирование массива» добавка «+1»? Проверьте, как работает программа. Сохраните проект.

Сформируем одномерный массив из пятнадцати случайных целых чисел в диапазоне от – 5 до 5. Пусть программа вычислит сумму всех элементов этого целочисленного массива. Для решения этой задачи потребуется программный код:

 

     int a[15], s;     //резервирование памяти

     randomize();     //рандомизация

     s = 0;     //очистка переменной для суммы

 

     for (int i=0; i<15; i++)     //цикл со счетчиком

     {

     a[i] = random(11) - 5;     //формирование массива

     s = s + a[i];     //суммирование элементов массива

     Label1->Caption = Label1->Caption + a[i] + " ";

     }

 

     Label2->Caption = "Сумма = " + IntToStr(s);

 

Три строки, образующие тело цикла и заключенные в фигурные скобки выполнятся пятнадцать раз. Переменная s необходима для последовательного накопления суммы элементов массива. В последней строке использована функция преобразования IntToStr, которая переменную целого типа преобразует в переменную строкового типа. Убедитесь в правильности работы программы.

Рассмотрим один из видов обработки массива – поиск элементов по заданному признаку. Пусть программа отыщет все «четверки» в массиве и посчитает их общее число. Для этого необходимо в тело цикла предыдущей программы добавить четвертую строку:

 

     if (a[i]==4) n = n + 1;     //наращивание переменной n на единицу при появлении в массиве четверки

 

Обратите внимание на «двойное равно» в условии if (если). Так записываются знаки отношений в C++ Builder.

Не забудьте предварительно объявить переменную n для подсчета числа «четверок» и обнулить ее. Теперь первая строка будет выглядеть так:

 

     int a[15], s, n;     //объявление переменных

 

А третью строку следует дописать:

 

     s = 0; n = 0;     //очистка переменных

 

Для вывода результата поиска «четверок» можно на форме дополнительно установить поле вывода текста Label3 и в качестве последней строки функции обработки Button1Click использовать инструкцию:

 

     Label3->Caption = "Число четверок = " + IntToStr(n);

 

Проверьте, правильно ли работает программа, и сохраните ее проект.

Одним из самых распространенных видов обработки массива является его сортировка. Если необходимо отсортировать одномерный массив из произвольных чисел, например, по возрастанию, можно воспользоваться нижеприведенным алгоритмом. Сначала сравниваются первый и второй элементы массива. Если первый элемент оказывается больше последующего, то их переставляют местами, в противном случае элементы остаются на своих местах. Затем последовательно сравнивается следующая соседняя пара и так до последнего элемента заданного массива. Но одного такого просмотра массива до его полной сортировки будет недостаточно. Необходимо будет просмотреть массив с необходимыми перестановками соседних элементов несколько раз, до тех пор, пока все элементы не выстроятся по возрастанию. Для достижения этой цели можно воспользоваться, например, следующим алгоритмом, который можно разместить в функции обработки Button1Click. Кроме электронной кнопки Button1 на стартовой форме понадобятся еще и два поля вывода текста: Label1 и Label2.

 

     int a[20], b, n, f;     //объявление переменных

     Label1->Caption = "";     //очистка 1-го текстового поля

     Label2->Caption = "";     //очистка 2-го текстового поля

     randomize();     //рандомизация

     for (n=0; n<20; n++)     //случайные числа в массив

     {

     a[n] = random(10);

     Label1->Caption = Label1->Caption + a[n] + " ";

     }

     sortirovka:     //метка начала сортировки

     f=0;     //флажок для остановки сортировки

     for (n=0; n<19; n++)     //разовая сортировка

     {

     if (a[n] > a[n+1])     //условие для перестановки соседних элементов

     {

     b = a[n];     //временно запомнить больший элемент

     a[n] = a[n+1];     //меньший сместить влево

     a[n+1] = b;     //больший сместить вправо

     f=1;     //флажок для остановки сортировки

     }

     }

     if (f==1) goto sortirovka;     //условие необходимости повторной сортировки

     for (n=0; n<20; n++)     //вывод результата сортировки

     Label2->Caption = Label2->Caption + a[n] + " ";

     }

 

Переменная f использует для остановки сортировки, когда в ней отпадет необходимость. При выходе из разовой сортировки проверяется значение этой переменной. Если ее значение равно «1», то сортировка в массиве повторяется, если значение переменной f становится равным «0», процесс сортировки прекращается. Обратите внимание, что в цикле сортировки повторений на одно меньше, нежели в цикле формирования массива – в противном случае идет сравнение последнего элемента со следующим несуществующим элементом, что приводит к зацикливанию работы алгоритма. Проверьте, правильно ли идет сортировка.

Flag Counter
Яндекс.Метрика
200stran.ru: показано число посетителей за сегодня, онлайн, из каждой страны и за всё время
Besucherzahler russain brides
счетчик посещений

Выбери лучшее!

allbest