Шпаргалка по "Программированию"

Автор работы: Пользователь скрыл имя, 25 Декабря 2013 в 18:28, шпаргалка

Описание работы

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

Содержание работы

1. Понятие алгоритма. Способы записи алгоритмов.
2. Свойства алгоритма.
3. Ветвящийся алгоритм.
4. Циклический алгоритм с предусловием (схема).
5. Циклический алгоритм с постусловием (схема).
28.Событийное программирование.
29. События связанные с объектом Form.

Файлы: 1 файл

ответы.docx

— 76.44 Кб (Скачать файл)

икла завершается выполнение самого внутреннего цикла.

25.Целочисленные  массивы.

Численные массивы

Рассмотрим несколько  примеров. Ниже объявлено 3 целочисленных массива с отложенной инициализацией:

int [] a, b, c;

Возможна инициализация  массива при его объявлении. Ниже инициализация является явной и  задается константным массивом: 

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

int [ , ] matrix = { { 1, 2 }, { 3, 4 } };

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

Инициализация возможна также  с помощью операции new. Назначение этой операции в том и состоит, чтобы выделять место в динамической памяти. Например:

int [] d= new int [ 5 ];

Здесь объявлен динамический вещественный массив, в котором будут  храниться 5 целых чисел. Массив создается  в динамической памяти, его элементы получают начальные нулевые значения, и ссылка связывается с этим массивом.

Как обычно задаются элементы массива, если они не заданы при инициализации? Они либо вычисляются, либо вводятся пользователем. Рассмотрим пример использования  массивов.

//объявляются три одномерных массива A, B, C

int [ ] A = new int [ 5 ], B = new int [ 5 ], C = new int [ 5 ];

// заполняется данными массив A

for ( int i = 0; i < 5; i++) A [ i ]=i * i + 10;

// вычисляются элементы массива C

for ( int i = 0; i < 5; i++) C[ i ] = A[ i ] + B [ i ];

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

int [ ] x ={ 5, 56 ,6 ,7, 7 };

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

int [ ] u, v;

u = new int [ 3 ]; // инициализация массива u

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

// v = { 1, 2, 3 }; //присваивание константного массива недопустимо!

v = new int [ 4 ]; 

v = u; // допустимое присваивание – массивы одного класса

int [ , ] w = new int [ 3, 5 ];

// v = w; // недопустимое присваивание: объекты разных классов

На что следует обратить внимание, анализируя приведенный текст  примера? Показаны разные способы объявления массивов. Вначале объявляются одномерные массивы A, B и C. Значения элементов этих трех массивов имеют один и тот же тип int. То, что они имеют одинаковое число элементов, произошло по воле программиста, а не диктовалось требованиями языка. Значения в массив А вводились, а в массив B – нет, но сложение элементов корректно, потому что при объявлении элементы массива B получили нулевые значения.

Массив x объявлен с явной инициализацией. Число и значения его элементов определяется константным массивом. Массивы u и v объявлены с отложенной инициализацией. В последующих операторах массив u инициализируется в объектном стиле (через new), а его элементы получают значения в цикле.

Обратите внимание на закомментированный оператор присваивания. В отличие  от инициализации, использовать константный  массив в правой части оператора  присваивания недопустимо. Эта попытка  приводит к ошибке, поскольку v - это ссылка, и ей нельзя присвоить константный массив. А вот ссылку присвоить можно. Что происходит в операторе присваивания v = u? Это корректное ссылочное присваивание: хотя u и v имеют разное число элементов, но они являются объектами одного класса – оба массива целочисленные с одной и той же размерностью. В результате присваивания память, отведенная массиву v, освободится и будет в дальнейшем освобождена сборщиком мусора. Обе ссылки u и v будут теперь указывать на один и тот же массив, так что изменение элемента одного массива немедленно отразится на другом массиве. Имена u и v становятся синонимами (или псевдонимами друг друга).

Далее определяется двумерный  массив w и делается попытка выполнить оператор присваивания v = w. Это ссылочное присваивание некорректно, поскольку объекты w и v – разных классов: оба они целочисленные, но имею разную размерность. Для них не выполняется требуемое для присваивания согласование по типу.

В вышеприведенном примере  объявлялись статические массивы, поскольку нижняя граница равна  нулю по определению, а верхняя всегда задавалась в этих примерах константой. Вспомним, что в C# все массивы, независимо от того, каким выражением описывается  граница, рассматриваются как динамические, и память для них распределяется в "куче". Чисто синтаксически  нет существенной разницы в объявлении статических и динамических массивов. Выражение, задающее границу изменения  индексов, в динамическом случае содержит переменные. Единственное требование – значения переменных должны быть определены в момент объявления. Например:

// объявление  динамического массива A1

int size = Convert.ToInt32( textBox1.Text );

int [ ] A1 = new int [ size ];

В особых комментариях приведенный  код не нуждается. Здесь верхняя  граница массива определяется пользователем, вводящим значение в объект textBox1.

Теперь можно рассмотреть  особый вид оператора цикла –  оператор foreach, о котором было упомянуто ранее. Его синтаксис:

foreach ( тип идентификатор in  массив) оператор

Цикл работает в полном соответствии со своим названием  – тело цикла выполняется для  каждого элемента в массиве. Тип  идентификатора должен быть согласован с типом элементов, хранящихся в  массиве данных. Предполагается также, что элементы массива упорядочены. На каждом шаге цикла идентификатор, задающий текущий элемент массива, получает значение очередного элемента в соответствии с порядком, установленным  на элементах массива. С этим текущим  элементом и выполняется тело цикла. Шаг цикла выполняется  столько раз, сколько элементов  находится в массиве. Цикл заканчивается, когда полностью выбраны все  элементы массива.

В приведенном ниже примере  показана работа с трехмерным массивом. Массив создается с использованием циклов типа for, а при нахождении суммы его элементов, минимального и максимального значения используется цикл foreach:

int [ , , ] arr3d = new int [ 10, 10, 10 ];

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

      for ( int j = 0; j < 10; j++)

         for ( int k = 0; k < 10; k++)

            arr3d [ i, j, k ] = i + j + k;

long sum = 0; int min = arr3d [ 0, 0, 0 ], max = arr3d [ 0, 0, 0 ];

 foreach ( int item in arr3d ) //для каждого элемента в массиве

 {

      sum += item;

      if  ( item > max ) max = item;

      else if  ( item < min ) min = item;

}

 MessageBox.Show (string.Format("sum = { 0 }, min = { 1 }, max = { 2 }", sum, min, max));

Серьезным недостатком циклов foreach в языке C# является то, что цикл работает только на чтение, но не на запись элементов. Так что наполнять массив элементами приходится с

помощью других операторов цикла.

26.Класс String

Основным типом при  работе со строками является тип string, задающий строки переменной длины. Класс String в языке C# относится к ссылочным типам. Над строками - объектами этого класса - определен широкий набор операций, соответствующий современному представлению о том, как должен быть устроен строковый тип.

Объявление строк. Конструкторы класса String

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

- символа, повторенного  заданное число раз; 

- массива символов char[ ];

- части массива символов.

Некоторым конструкторам  в качестве параметра инициализации  можно передать строку, заданную типом char*. Но все это небезопасно, и подобные примеры приводиться и обсуждаться не будут. Приведем примеры объявления строк с вызовом разных конструкторов:

public void TestDeclStrings() {  
          //конструкторы  
          string world = "Мир";  
          //string s1 = new string("s1");  
          //string s2 = new string();  
          string sssss = new string('s', 5);  
          char[ ] yes = "Yes".ToCharArray();  
          string stryes = new string(yes);  
          string strye = new string(yes, 0, 2);  
          Console.WriteLine("world = {0}; sssss={1}; stryes={2};" + " strye= {3}", world, sssss, stryes, strye);  
}

Объект world создан без явного вызова конструктора, а объекты sssss, stryes, strye созданы разными конструкторами класса String.

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

27. Класс Random.

Умение генерировать случайные  числа требуется во многих приложениях. Класс Random содержит все необходимые для этого средства. Класс Random имеет конструктор класса: для того, чтобы вызывать методы класса, нужно вначале создавать экземпляр (объект) класса. Созданный объект обеспечивает получение псевдослучайных (почти случайных…J) чисел. Этим Random отличается от класса Math, у которого все поля и методы – статические, что позволяет обойтись без создания экземпляров класса Math.

Как всякий "настоящий" класс, класс Random является наследником класса Object, а, следовательно, имеет в своем составе и методы родителя. Рассмотрим часть оригинальных методов класса Random, используемых для генерирования последовательностей случайных чисел.

Начнем рассмотрение с конструктора класса. Конструктор обеспечивает создание объектов класса. Он имеет две реализации. Одна из них позволяет генерировать неповторяющиеся при каждом запуске серии случайных чисел. Начальный элемент такой серии строится на основе текущей даты и времени, что гарантирует уникальность серии. Этот конструктор вызывается без параметров. Он описан как Random(). Другой конструктор с параметром целого типа – Random (int) обеспечивает важную возможность генерирования повторяющейся серии случайных чисел. Параметр конструктора используется для построения начального элемента серии, поэтому при задании одного и того же значения параметра серия будет повторяться.

Перегруженный метод Next() при каждом вызове возвращает положительное целое, равномерно распределенное в некотором диапазоне. Диапазон задается параметрами метода. Три реализации метода отличаются набором параметров:

Next () – метод без параметров выдает целые положительные числа во всем положительном диапазоне типа int;

Next ( max) – выдает целые положительные числа в диапазоне [0,max];

Next (min, max) - выдает целые положительные числа в диапазоне [min,max].

Метод NextDouble () имеет одну реализацию. При каждом вызове этого метода выдается новое случайное число, равномерно распределенное в интервале (0,1).

Еще один полезный метод  класса Random позволяет при одном обращении получать целую серию случайных чисел. Метод имеет параметр – массив, который и будет заполнен случайными числами. Метод описан как NextBytes (buffer). Так как параметр buffer представляет массив байтов, то, естественно, генерированные случайные числа находятся в диапазоне [0, 255].

Рассмотрим схематический  пример.

  const int  initRnd = 77;

   Random realRnd = new Random();

   Random repeatRnd = new Random(initRnd);

   // случайные числа в диапазоне (0,1)

   for(int i =1; i <= 5; i++)

   {

      listBox1.Items.Add(string.Format("{0} ", realRnd.NextDouble() );

   }

   // случайные числа в диапазоне[min,max]

   int min = -100, max=-10;

    for(int i =1; i <= 5; i++)

   {

      listBox1.Items.Add(string.Format("{0} ", realRnd.Next(min,max) );

   }

   // случайный массив байтов

   byte[] bar = new byte[10];

   repeatRnd.NextBytes(bar);

Краткий комментарий к  тексту программы. Вначале создаются  два объекта класса Random. У этих объектов разные конструкторы. Объект с именем realRnd позволяет генерировать неповторяющиеся серии случайных чисел. Объект repeatRnd дает возможность повторить при необходимости серию. Метод NextDouble создает серию случайных чисел в диапазоне (0, 1). Вызываемый в цикле метод Next с двумя параметрами создает серию случайных отрицательных целых, равномерно распределенных в диапазоне [-100, -10]. Метод NextBytes объекта repeatRnd позволяет получить при одном вызове массив случайных чисел из диапазона [0, 255].

28.Событийное программирование.

Проектирование внешнего интерфейса программ на основе событий  называют событийным программированием.

Все события, связанные со встроенными объектами, можно условно  считать системными. Однако, у программиста есть возможность создать собственное  событие (event). В этом случае и создание обработчиков, и подключения он должен программировать сам.

29. События связанные с объектом Form.

Не всегда и не все события  вызываются какими-то действиями пользователя. Рассмотрим характерный пример.

Приложение, разрабатываемое  на языке C#, создается с использованием возможностей (свойств, методов и событий) встроенного класса Form. Этот системный класс позволяет строить объекты-формы. В нем уже описан ряд событий, которые связаны с формами как объектами, но не связаны непосредственно с действиями пользователя. Все события, разумеется, имеют имена.

Например, в этом классе описано  событие с именем Load. Оно событие наступает до момента загрузки окна – перед загрузкой формы, т.е., образно говоря, «за секунду» до появления окна на экране. С этим событием можно связать какой-нибудь фрагмент программного кода, в котором описать действия, выполняемые непосредственно перед открытием окна. Таким действием может быть запрет отображения каких-либо объектов. Например, кнопок, которые при открытии окна еще не могут быть использованы – их использование станет возможным после некоторых действий пользователя. Особенность этого события в том, что если программист решит работать с ним и напишет обработчик, то подключать обработчик к событию не требуется – система сделает это автоматически.

Другое событие, связанное  с окном, называется FormClosing. Это событие наступает непосредственно перед закрытием формы.  С этим событием также можно какой-то программный код, обеспечивающий, например, сохранение в файле каких-то данных из формы – они еще доступны, поскольку форма не закрыта. Иной смысл у события FormClosed. Оно наступает после закрытия формы. В соответствующем программно коде можно выполнить действия, которые допустимы именно после закрытия формы – например, закрыть файл, связанный с обслуживанием этой формы. Особенность названных событий в том, что автоматического подключения обработчиков к событию здесь не происходит – это должен сделать программист.

Информация о работе Шпаргалка по "Программированию"