Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec

.pdf
Скачиваний:
24
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

Пример:

Вычислить значение переменной, заданной соотношением

x2, если х<0

y=

х+10, если х≥0

Фрагмент программы с использованием ветвления: double x, y;

x = double.Parse(Console.ReadLine()); if (x < 0)

y = x * x;

else

y = x + 10;

Фрагмент программы с использованием ветвления: double x, y;

x = double.Parse(Console.ReadLine()); y = 0.0;

if (x < 0)

y = x * x; if (x>=0)

y = x + 10;

3. Циклы

Цикл с предусловием

 

 

Р

false

 

 

while (P) оператор

 

 

 

true

 

 

 

 

 

 

 

 

 

 

 

 

 

 

оператор

 

 

 

 

 

 

 

 

 

 

 

 

 

Цикл с постусловием

 

 

 

 

 

 

 

 

do

 

 

 

 

 

 

оператор

 

 

 

оператор

 

 

 

 

 

 

 

 

while (P);

 

true

 

 

 

Р

 

 

 

81

 

 

false

 

 

 

 

 

 

 

 

 

 

 

 

Универсальный цикл

for(выражение1; выражение2; выражение3) оператор

Схема выполнения универсального цикла:

1.вычисляется выражение1, которое играет роль начальной установки параметров цикла

2.вычисляется выражение2, которое играет роль условия повтора цикла. Если значение этого выражения false, выполнение цикла завершается, в противном случае переходим к шагу 3.

3.Выполняется оператор, образующий тело цикла

4.вычисляется выражение3, которое играет роль модификатора параметров цикла

5.переход на шаг 2

Любое из выражений в заголовке цикла может отсутствовать, при этом разделяющие их скобки должны сохраняться. Отсутствующее выражение2 означает, что условие повтора цикла имеет значение true.

Примеры использования циклов

int i=0; //Счетчик

 

 

 

while (i<2)

 

 

 

 

{

 

 

 

 

Console.WriteLine (“Снег”); //1

 

 

i++;

 

//2

 

 

}

 

 

 

 

Шаг

i в начале шага

Экран

i в конце шага

1

0

Снег

 

1

2

1

Снег

 

2

3

2

 

 

 

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

int i=0; do

{

Console.WriteLine (“Снег”); i++;

}

82

while (i<2);

 

 

 

 

Шаг

i в начале шага

Экран

i в конце шага

1

0

Снег

 

1

2

1

Снег

 

2

int i;

 

 

 

 

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

 

 

 

Console.WriteLine (“Снег”);

 

 

 

Шаг

i в начале шага

Экран

i в конце шага

1

0

Снег

 

1

2

1

Снег

 

2

3

2

 

 

 

for (;;)

Console.WriteLine (“Снег”);.//Бесконечный вывод этого сообщения

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

Выражение инициализации может содержать несколько выражений, разделенных “,”, а объявлений – не более одного

Пример

Вычислить сумму n элементов следующего ряда. Сумму выводить после прибавления каждого слагаемого.

N

S=∑ i/(i2+1) = 1/2 + 2/5 + 3/10 + … + N/N2+1

i=1

int N;

string str; // рабочая строка для вывода на экран int i;

double s; // переменная, в которой будет накапливается сумма

N=5;

for (i=1, s=0; i<=N; i++, Console.WriteLine(str))

{

s+=(double)i/(i*i+1.0);

str=s.ToString();

}

Второй вариант решения задачи int N;

string str; double s; N=5; s=0;

for (int i=0; i<=N; i++, Console.WriteLine(str))

83

{

s+=(double)i/(i*i+1.0);

str=s.ToString();\

}

4. Дополнительные операторы управления

-Принудительное завершение цикла break;

-Принудительное завершение текущего шага цикла и переход на

следующий шаг цикла continue;

- Безусловный переход в заданную точку программы goto_метка;

метка: оператор;

- Возврат из метода return;

Пример

Сгенерируем сочетание из двух десятичных цифр, первая – от 1 до 4, вторая – от 0 до 9. Первая цифра рассматривается как старшая цифра числа, вторая – как младшая. Вывести на экран числа кратные 5.

10

11 12 …

19 младшая цифра b

число

 

 

20 21 22 … 29

30 31 32 … 39

40 41 42 … 49

старшая цифра a

public static void Main()

{

int a, b, c;// старшая цифра, младшая цифра, число for (a=1; a<=4; a++)

for (b=0; b<=9; b++)

{

c=a*10+b;

if (c%5 !=0) continue; Console.Write (c.ToString()+” “); //break;

//goto_EXIT; //return;

}

EXIT: Console.WriteLine (“\nВсе!”);

}

Результат вывода в исходном варианте программы

84

10 15 20…25 30 35 40 45

ВСЕ!

Убираем комментарий около break;

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

Результат вывода

10 20 30 40

ВСЕ!

Комментируем оператор break и снимаем комментарий с оператора goto_EXIT. При обнаружении первого же числа, кратного 5, произойдет выход на метку EXIT:

Результат вывода

10

ВСЕ!

Оператор безусловного перехода целесообразно применять в единственном случае - для выхода из вложенного цикла за пределы внешнего цикла.

Убираем комментарий c оператора return и восстанавливаем комментарий около оператора goto EXIT. При обнаружении первого же числа, кратного 5, будет выполнен оператор return. Поскольку в данном случае оператор возврата применен к методу Main(), это приведет к завершению программы.

Результат вывода

10

5. Множественное ветвление

Конструкция предназначена для выбора одной из нескольких вет-

вей.

switch (выражение – переключатель)

целочисленное значение, строка, char

{

case_Маркер: операторы; break;

константа

case_Маркер: операторы; break;

<default: операторы; break;> //необязательная часть

}

Схема выполнения:

1.Вычисляется значение переключателя.

2.Значение переключателя последовательно сравнивается с маркером ветвей.

3.Выполняется та ветвь, маркер которой совпал со значением переключателя.

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

85

ВВЕДЕНИЕ В МАССИВЫ И СТРОКИ

1.Понятие массива

Вобщем случае массив представляет собой набор элементов одного типа, расположенных в непрерывной области памяти.

Массив имеет тип, каждый элемент имеет уникальный номер. Доступ к элементу массива выполняется путем указания порядкового номера и имени массива.

0

1

2

3

<= номера элементов массива

 

 

 

 

 

 

а имя массива =>

10

15

30

8

<= значения элементов массива

 

 

 

 

 

 

 

a[0]

a[1]

а[2]

a[3]

<= доступ к элементам массива

В языке С# массив определен как класс с именем Array. Следовательно, массив относится к ссылочным типам данных. Различают:

-Одномерный массив

-Многомерный массив

-Массив массивов

2.Объявление массива и его инициализация

Тип элементов[] ИмяМассива;

ИмяМассива = new Тип элементов[кол-во элементов];

int[] a;

 

 

 

 

a=new int[3];

 

 

имя массива

Адрес

 

 

 

 

 

 

адрес

Область под

 

 

элементы мас-

 

 

сива

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

int[] a;

a=new int[]{10, 20, 300};

0

1

2

 

 

 

 

а =>

10

20

300

 

 

 

 

86

3. Операции

Операции с элементами – любые операции, определенные для того типа, к которому относятся элементы массива.

 

 

0

1

2

a[2]=a[0]+a[1]

а =>

 

 

 

10

20

300

 

 

 

 

 

 

 

 

 

30

Операции с массивом:

¾присваивание (копируется значение ссылки)

¾отношение (сравниваются значения ссылок)

int[] a, b, c; bool f1, f2;

a=new int[]{10, 20}; b=new int[]{10, 20};

f1= a==b; //false 100≠200

c=a;

f2= c==a; //true 100=100 b=a;

а

100

b

200

c

100

 

100

10

 

20

 

200

10

 

20

Область памяти, на которую потеряна ссылка (в данном случае область памяти по адресу 200), ставится в очередь на освобождение. Эта память будет автоматически освобождена программой MSDN «Сборщик мусора».

4. Понятие строки

Строка предназначена для хранения текста в виде множества символов (кодировка Unicode: 1 символ – 2 байта).

0

1

2

3

4

5

<= номера

 

 

 

 

 

 

 

 

а имя строки =>

Г

У

-

В

Ш

Э

<= значения

 

a[0]

a[1]

а[2]

a[3]

a[4]

a[5]

<= доступ к элемен-

Отличия от массива Хотя строка структурно подобна массиву, но формально строка не

является массивом и имеет собственный тип данных string (String – синоним в MSDN) со своим набором свойств и методов.

Тип строка объявлен как класс, т.е. строка – это ссылочный тип. Тип строка относится к стандартным типам данных, т.е. все свойства заранее определены.

Операции с объектами типа строка содержательно выполняются не так, как операции с массивами.

87

5. Объявление и инициализация строк

string ИмяСтроки;

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

string s=”ГУ-ВШЭ”;

литерал

 

100

 

100

ГУ-ВШЭ

6. Операции со строками

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

int Код; string s=”ABBA”;

Код=s[0]; // Код => код символа ‘A’=65 s[0]=’Z’; // ошибка!

Альтернативой непосредственному изменению элемента строки является формирование новой строки с нужным значением элемента.

Операции над строками

Присваивание:

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

string s1=”ВАСЯ”, s2; s2=s1;

 

адрес

s1

100

s2

200

 

100

ВАСЯ

 

копирование

200

ВАСЯ

Отношения:

Операции равно(==) и неравно(!=) равносильны сравнению значений строк.

s2==s1; //true ВАСЯ=ВАСЯ

88

В этом заключается отличие строки от массива - для массивов сравниваются ссылки.

Операции больше(>), больше или равно(>=), меньше(<), меньше или равно(<=) равносильны сравнению ссылок.

s2>=s1; //false 100>=200

При выполнении указанных операций отличий между массивом и строкой нет – в обоих случаях сравниваются ссылки.

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

Сцепление строк:

строка1+строка2=>новая строка - объединение исходных

В операции сцепления могут использоваться помимо строки операнды других типов. При этом старшим считается тип строки.

int a=10, b=20; string s1, s2, s3;

s1=”Итого:”+a; // Итого:10

s2=” Итого:”+a+b; // Итого:1020 s3=a+b+”= Итого”; //30= Итого

7. Форматирование строки

Класс string содержит статический метод Format(), с помощью которого можно сформировать строку на основе заданных значений в заданной программистом форме.

Метод Format имеет две группы параметрова:

String -Вид фор-

 

string

матирования

Format

 

 

Список значений

 

 

 

 

Вид форматирования:

-обычные символы (копируются в строку)

-спецификаторы

{номер значения<,ширина поля><:Вид Кол-во знаков>}

необязательные поля

Вид спецификации:

D или d - целое число

89

F или f – вещественное число в форме F (ЦЧ и ДЧ)

E или e – веществ. число в форме E (мантисса и порядок)

N или n – вещественное число с выделением тысячи

X или x – целое 16-ричное число

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

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

double a=1234.5678; long b=3456;

short c=65; string s1, s2, s3;

s1=string.Format(“{0,8:f2}#{1,8:n2},a,a);

 

1

2

3

4

,

5

7

#

1

 

2

3

4

,

5

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

лишние пози-

округление

выделение

ции

заполня-

 

тысяч

ются

пробе-

 

 

 

лами

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

s1=string.Format(“{0,-8:d}#{1,8:d6},b,b);

3

4

5

6

 

 

 

 

#

 

 

0

0

3

4

5

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выравнивание

незначащие

по левому краю

нули

 

90

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]