Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




 

Условный оператор, вариант 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();

   }

 

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

 

Для ввода/вывода в консольном режиме используют следующие методы класса 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 равен нулю.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 443.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...