Методичка по C (Методичка по C#), страница 2
Описание файла
Документ из архива "Методичка по C#", который расположен в категории "". Всё это находится в предмете "системное и прикладное программное обеспечение (сппо)" из 6 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "системное и прикладное программное обеспечение (сппо)" в общих файлах.
Онлайн просмотр документа "Методичка по C"
Текст 2 страницы из документа "Методичка по C"
Имеются операции i++ i-- ++i --i. При i = 14 в результате выполнения операции k=(++i)+4; переменные получат следующие значения: i=15 и k=19; а после операции k=(i++)+4 – i=15 и k=18.
Разрешена и запись x+=z; которая эквивалентна записи x=x+z; вместо + можно использовать знаки и других операций.
Операции «сдвиг налево» (направо) могут применяться только к целым числам. При i = 1478; результатами операций сдвига будут:
k = i >> 3; //k=184
i = i << 3; //i=11824
Над целыми могут выполняться и побитовые операции: & – поразрядное умножение, | – поразрядное сложение, ^ – поразрядное исключающее ИЛИ. Пусть имеется объявление int i, j, m; и переменные имеют следующие значения i=1634; k=7654; Тогда m=i&k; дает результат 1634; m=i|k;– результат 8166 и m=i^k; – результат 7044.
Над переменными логического типа могут выполняться операции &, |, ^ (исключающее ИЛИ), ! (отрицание). Переменной типа bool может быть присвоен результат сравнения:
b1= i>k; b1=!(i>k);
К арифметическим данным могут применяться математические функции, которые содержатся в библиотеке Math. Например, корень четвертой степени может быть найден следующим образом:
x=4598.3f;
z = Math.Pow(x, 0.25);
а натуральный логарифм через
z = Math.Log(x);
Какие именно функции имеются в библиотеке Math, узнать предельно легко: после набора имени библиотеки и точки на экране появится подсказка. Не забудьте только, что значения большинства математических функций имеют тип double и названия функций пишут с большой буквы.
1.4. Условный оператор и оператор выбора
Условный оператор, вариант 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 : ###.##} : запись формата состоит из номера аргумента и собственно формата.
1.6. Комментарии
В C# имеется три разновидности комментариев:
// это однострочный комментарий
/* это
многострочный комментарий */
/// это документирующий XML-комментарий
Компилятор C# может читать содержимое XML-комментариев и генерировать из них XML-документацию. Такую документацию можно извлечь в отдельный XML-файл. Для составления XML-комментариев необходимо использовать теги.
1.7. Массивы
В языке 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("m=" + m);
m = a.Length; //возвращает количество элементов в массиве
Console.WriteLine("m=" + m);
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 получат значение 0. В дальнейшем массивы mas1 и mas2 независимы.
Кроме этих, привычных во всех языках программирования, массивов в C# имеется еще одна их разновидность: ступенчатые (свободные, невыравненные, рваные) массивы: у них количество элементов в разных строках может быть различным.
Их объявление: double [ ] [ ] q;
Для их инициализации требуется сначала указать количество строк, а затем в цикле – количество элементов в каждой строке. Мы вернемся к этому вопросу после ознакомления с операторами цикла.
1.8. Операторы цикла
В языке C# имеются следующие разновидности операторов цикла:
-
цикл с предусловием while;
-
цикл с постусловием do . . . while;
-
цикл for;
-
цикл foreach.
Цикл с предусловием:
while( условие_выполнения_тела_цикла )
{
// тело цикла
}
Цикл с постусловием:
do
{
// тело цикла
} while( условие_выполнения_тела_цикла);
Цикл for имеет традиционную структуру:
for (установки_начальных значений; условие_продолжения_цикла ; приращения)
{
// тело цикла
}
Цикл 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 {