Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



Условный оператор и оператор выбора



 

Условный оператор, вариант 1:

if (логическое_выражение) оператор ;

или

if (логическое_выражение)

{оператор1; оператор2; . . . .}

 

Условный оператор, вариант 2:

if ( логическое_выражение )

оператор1;

else оператор2 ;

или

if (логическое_выражение)

{ оператор1; оператор2; }

else

{операторА; операторБ; . . . .}

Как видно из примеров, правила написания условного оператора совпадают с правилами их написания на С++. Отличие лишь в том, что в скобках после if должно быть логическое выражение (переменная). Использование там арифметических выражений (переменных) является ошибкой. Для написания условий необходимо использовать те же знаки, как и на С++: == && || ! .

Оператор выбора позволяет сделать выбор среди многих вариантов. Он имеет следующий вид:

switch (целочисленное или строковое выражение)

{

case первое_значение:

операторы

break;

case второе_значение:

операторы

break;

. . . . . . . . . . .

 

default:

операторы

break;

}

В отличие от С++ после switch допускаются строковые значения. Оператор break; является во всех приведенных выше случаях обязательным. Пример.

static void Main(string[] args)

{

string s1;

s1 = "ABC";

switch (s1)

{

case"ABC":

Console.WriteLine("Variant 1");

break;

case "DEF":

Console.WriteLine("Variant 2");

break;

default:

Console.WriteLine("Unknown ");

break;

}

Console.ReadLine();

}

 

1.5. Ввод/вывод в консольном режиме

 

Для ввода/вывода в консольном режиме используют следующие методы класса Console: Write( выводимая строка ), WriteLine( выводимая строка ), ReadLine() – возвращает введенную строку. Важное обстоятельство: метод ReadLine всегда возвращает данные типа string, в случае необходимости преобразования должны быть запрограммированы. Аргументом методов Write, WriteLine тоже должна быть символьная строка. Правда, здесь можно часто обойтись без явных преобразований. Разница между Write и WriteLine заключается в том, что после вывода строки WriteLine осуществляет автоматически переход на следующую строку на экране, Write этого не делает.

Для преобразования типов данных можно использовать методы класса Convert. Например, ToInt32 выполняет перевод в int; ToDouble выполняет перевод в double; ToString выполняет перевод в string. Какие методы имеются в классе Convert можно узнать очень легко: достаточно набрать это слово, поставить точку и на экране появится весь перечень его методов.

Рассмотрим простейший пример: вводим два числа и выполняем простейшие вычисления:

namespace ConsApp

{

class Program

{

static void Main(string[] args)

{

int i;

double x,y,z;

string s;

Console.Write("i="); //подсказка при вводе

s = Console.ReadLine(); //ввод строки

i = Convert.ToInt32(s); //преобразование

//строки в целое

Console.Write("x=");

x = Convert.ToDouble(Console.ReadLine());

//ввод, совмещенный с преобразованием

y = i * x;

z = 2 * i - x;

Console.WriteLine("y=" + y);

//вывод с автоматическим преобразованием

Console.WriteLine(Convert.ToString(z));

//вывод с явным преобразованием

Console.ReadLine();

} } }

 

Если аргумент метода WriteLine содержит символьную строку и число, то выполняется автоматическое преобразование. Достаточно писать даже пустую строку, например, “”+y. На внешний вид выводимых данных можно влиять форматами. Проиллюстрируем это следующим примером на обработку данных типа decimal.

namespace Console5

{

class Class1

{

static void Main(string[] args)

{

decimal d1,d2,d3;

string s;

s=Console.ReadLine();

d1=Convert.ToDecimal(s);

d2=4.5m; //m или M признак константы decimal

d3=d1*d2;

Console.WriteLine("Answer is :{0:###.##}",d3);

Console.ReadLine();

} } }

 

Формат {0 : ###.##} : запись формата состоит из номера аргумента и собственно формата.

Последняя строка Console.ReadLine(); необходима для остановки экрана пользователя после выполнения программы. В противном случае этот экран на мгновенье мелькнет на экране и погаснет

 

Комментарии

 

В C# имеется три разновидности комментариев:

//это однострочный комментарий

/* это

многострочный комментарий */

/// Это документирующий XML-комментарий

Компилятор C# может читать содержимое XML-комментариев и генерировать из них XML-документацию. Такую документацию можно извлечь в отдельный XML-файл. Для составления XML-комментариев необходимо использовать теги.

Массивы

 

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

Объявление одномерного массива

Тип-данных [] имя_массива

Объявление двумерного массива

Тип_данных [,] имя_массива

Перед использованием массива он должен быть инициализирован, т.е. под него должна быть выделена память.

Примеры на одномерные массивы:

static void Main(string[] args)

{ int[] arr1; // 1

int[] arr2=new int[66]; // 2

int[] arr3 = {2, 5, 55, -6, 8}; // 3

string s;

int n;

Console.Write("Count of Elements ");

s=Console.ReadLine();

n=Convert.ToInt32(s);

arr1=new int[n]; . . . . // 4

В // 1 объявление массива без выделения памяти, выделение происходит в // 4, до этого осуществляется ввод количества элементов n. В // 2 совмещены объявление и инициализация. В // 3 элементам массива сразу будут присвоены значения, это означает и инициализацию. Обращаем внимание на то, что int[]a,b,c; означает объявление сразу трех массивов, поэтому объявления массивов и переменных должны быть в разных операторах (ставить квадратные скобки в середине объявления не разрешается). В C# минимальное значение индекса всегда равно нулю, поэтому максимальное равно количеству элементов минус 1.

В C# массивы рассматривают как классы. Это дает возможность использовать при их обработке свойства. Для работы с одномерными массивами полезными окажется свойство arr1.Length – возвращает количество элементов массива arr1.

 

Пример на двумерные массивы:

static void Main(string[] args)

{

int[,] a;

int[,] b ={ { 1, 2, 3 }, { 4, 5, 6 } };

//объявление с присвоением значений по строкам

int n, m;

a = new int[6, 12]; //инициализация

n = b.GetLength(0); //возвращает количество элементов

//по первому индексу

Console.WriteLine("n=" + n);

m = b.GetLength(1); //возвращает количество элементов

//по второму индексу

Console.WriteLine("n=" + m);

n = a.GetUpperBound(0); // возвращает

//максимальное значение первого индекса

Console.WriteLine("n=" + n);

m = a.GetUpperBound(1); // возвращает

//максимальное значение второго индекса

Console.WriteLine("n=" + m);

m = a.Length; //возвращает количесвто элементов в массиве

Console.ReadLine(); . . . .

}

Обратите внимание на разные результаты функций GetLength(1) и GetUpperBound(1)!

Перечень функций для работы с массивами намного шире. Можете узнать их традиционным способом: наберите имя массива и точку и весь перечень функций пред Вами. Обратим внимание еще на одну функцию. Допустим, что в программе объявлены два массива:

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

int[]mas1=new int[4];

При объявлении mas1=mas2 мы, по сути, создаем два указателя на один и тот же массив, поэтому после этого присвоения все изменения, внесенные в один их этих массивов автоматически передаются в другой. Если необходимо копировать массив таким образом, чтобы два массива после этого «жили самостоятельно», то необходимо использовать функцию копирования массивов mas2.CopyTo(mas1, i); элементы массива mas2 будут переданы в массив mas1 и размещены там начиная с элемента с индексом i; размер массива mas1 должен быть достаточен для принятия копируемых элементов. Остальные элементы mas1 получат значение нуль. В дальнейшем массивы mas1 и mas2 независимы.

Кроме этих, привычных во всех языках программирования массивов, в C# имеется еще одна их разновидность: ступенчатые (свободные, невыравненные, рваные) массивы: у них количество элементов в разных строках может быть различным.

Их объявление: double [ ] [ ] q;

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

 

Операторы цикла

 

В языке C# имеются следующие разновидности операторов цикла:

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

- Цикл с постусловием do . . . while,

- Цикл for,

- Цикл foreach.

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

while( условие_выполнения_тела_цикла )

{

// тело цикла

}

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

do

{

//тело цикла

} while( условие_выполнения_тела_цикла);

 

Цикл foreach позволяет выполнять тело цикла для элементов массива (в общем случае – для коллекции):

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

{

//тело цикла

}

В циклах можно использовать операторы break; (прервать выполнение цикла) и а в цикле for оператор Continue; (перейти к следующему шагу).

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

static void Main(string[] args)

{

double[,] a;

int n, m,kolpol=0;

Console.Write("Rows ? ");

n = Convert.ToInt32(Console.ReadLine());

Console.Write("Columns ? ");

m = Convert.ToInt32(Console.ReadLine());

a = new double[n, m];

for(int i=0;i<=a.GetUpperBound(0);i++)

for (int j = 0; j <= a.GetUpperBound(1); j++)

{

Console.Write("a[" + i + "," + j + "]=");

a[i, j] = Convert.ToDouble(Console.ReadLine());

}

for(int i=0;i<a.GetLength(0);i++)

for(int j=0;j<a.GetLength(1);j++)

if( a[i,j]>0) kolpol++;

double[] pol = new double[kolpol];

int k = 0;

if (pol.Length == 0) Console.WriteLine("No positives");

else {

for (int i = 0; i < a.GetLength(0); i++)

for (int j = 0; j < a.GetLength(1); j++)

if (a[i, j] > 0) pol[k++]=a[i,j];

foreach (double x in pol)// цикл выполняется для всех

// элементов массива pol

Console.WriteLine("x=" + x + " f(x)={0:##.####}",

Math.Sqrt(x));

}

Console.ReadLine();

}

 

 

Обратим внимание на следующие моменты:

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

- Функции a.GetLength(0)и a.GetUpperBound(0)возвращают количество элементов по измерению и максимальное значение индекса соответственно, учтите это при определении границ параметра цикла.

- В операторе цикла foreach (double x in pol)объявление типа переменной х должно быть только в самом операторе, но не в числе других объявлений.

- При отсутствии положительных элементов под массив pol память не выделяется и pol.Length равен нулю.

 



Просмотров 2110

Эта страница нарушает авторские права




allrefrs.su - 2024 год. Все права принадлежат их авторам!