Главная » Просмотр файлов » Методичка по C

Методичка по C (987695), страница 3

Файл №987695 Методичка по C (Методичка по C#) 3 страницаМетодичка по C (987695) страница 32015-08-02СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

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)и .GetUpperBound(0)возвращают количество элементов по измерению и максимальное значение индекса соответственно, учтите это при определении границ параметра цикла;

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

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

1.9. Работа со ступенчатыми массивами

Как было уже сказано выше, в C# можно создать массивы, в которых количество элементов в строках разное – ступенчатые массивы. В таком случае необходимо выполнять инициализацию каждой строки в отдельности.

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

static void Main(string[] args)

{

float[][] b; //объявим неровный массив

int n, m;

Console.Write("Строк ");

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

b = new float[n][]; //определим количество строк

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

{

Console.Write("Элементов в строке"+i+" ");

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

b[i] = new float[m]; // определим количество

// элементов в i-ой строке

}

for(int i=0;i<b.Length;i++)

for (int j = 0; j < b[i].Length; j++)

{

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

b[i][j] = Convert.ToSingle(Console.ReadLine());

}

float []dol=new float[n]; // массив для долей

// положительных элементов в строке

int kol;

float maxdol=0; //максимальная доля

for(int i=0;i<b.Length;i++)

{

kol=0;

for (int j = 0; j < b[i].Length; j++)

if(b[i][j]>0)kol++;

if (b[i].Length!=0)

dol[i]=(float)kol/b[i].Length;

else

dol[i]=0;

if(maxdol<dol[i])maxdol=dol[i];

}

if (maxdol == 0)

Console.WriteLine

("Нет положительных элементов в массиве");

else

{

string s=""; //в эту переменную соберем номера строк

for(int i=0;i<b.Length;i++)

if (dol[i]==maxdol) s+=" "+i;

Console.WriteLine

("Максимальная доля в строках "+s);

}

Console.ReadLine();

}

Примечания.

  1. Если b – неровный массив, то b.Length возвращает количество строк, а b[i].Length – количество элементов в i–й строке.

  2. Нулевое количество элементов в строке не является ошибкой, в таком случае b[i].Length=0.

  3. Присваивание string s=""; обязательно даже для пустой строки.

Контрольные вопросы

1. Допустим, что в программе имеются объявления:

int i = 10, j = 9;

float x;

и оператор x = i / j; Какое знгачение получит х? Почему?

2. В каких случаях целесообразно использовать ступенчатые массивы?

3. Когда целесообразно использовать оператор цикла foreach ?

4. Чему равно значение свойства массива Length (для одномерных,

двумерных и ступенчатых массивов)?

5. Какое значение возвращает функция GetUpperBound(i) в

зависимости от значения i ?

2. Работа с функциями

2.1. Общие принципы

В C#, как и в других языках, функции используют для двух целей:

  • для написания алгоритмов, которые должны выполняться многократно с разными исходными данными;

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

В C# функция может иметь тип возвращаемого значения или не иметь его (иметь тип void). Формальные параметры-переменные могут быть переданы как по значению, так и по ссылке. По умолчанию – по значению.

Для организации передачи по ссылке используют ключевые слова:

  • ref позволяет изменить в функции переданный параметр, но параметр должен иметь значение при обращении к функции.

  • оut позволяет получить в функции новое значение для параметра.

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

Проиллюстрируем сказанное несколькими примерами.

Пример 1.

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

void Nom1(out int k, int []mas)

{

int i;

k=-8;

for(i=0;i<mas.Length;i++)

if(mas[i]<0){k=i;break;}

}

Параметр k получает значение в результате выполнения функции.

Второй вариант:

int Nom2(int []mas)

{

int i;

k=-8;

for(i=0;i<mas.Length;i++)

if(mas[i]<0){k=i;break;}

return k;

}

Пример 2.

Найти номер первого элемента одномерного массива в заданном интервале после заданного элемента. При его отсутствии – вернуть в качестве ответа заданный номер.

void Number(ref int k,double c1,double c2,double[]mas)

{

for(int i=k;i<mas.Length;i++)

if (mas[i] > c1 && mas[i] < c2) { k = i; break; }

}

Параметр k должен иметь значение до обращения к функции (отсутствие значения – синтаксическая ошибка!) и может менять свое значение в результате выполнения функции. Параметры с1 и с2 передаются по значению и могут быть лишь исходными данными в функции.

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

2.2. Процедурное программирование в C#

Рассмотрим в этом разделе компоновку программы с функциями. Вспомните структуру программы, описанной в 1.1. Рассмотрим сначала, как можно использовать приведенные выше функции.

Функция из примера 1.

namespace ConApp3

{

class Program

{

static void Nom1(out int k, int[] mas)

{

int i;

k = -8;

for (i = 0; i < mas.Length; i++)

if (mas[i] < 0) { k = i; break; }

}

static void Main(string[] args)

{

int[] m ={5,9,2,6,7,56,-100};

int p;

Nom1(out p, m);

if (p < 0) Console.WriteLine("Нет отрицательных");

else

Console.WriteLine("Номер элемента "+p);

Console.ReadLine();

}

} }

Главная функция Main находится внутри класса Program , поэтому имеет полное право обращаться к его функциям с любым атрибутом доступа. Чтобы можно было вызывать функцию без создания экземпляра класса необходимо объявить функцию статической static. Обратите внимание на то, что и при вызове функции присутствует атрибут out.

Функция из примера 2.

namespace ConApp3

{

class Program

{

void Number(ref int k, double c1, double c2,

double[] mas)

{

for (int i = k; i < mas.Length; i++)

if (mas[i] > c1 && mas[i] < c2)

{ k = i; break; }

}

static void Main(string[] args)

{

double[] m ={5.1,9.4,2.7,6.8,7.1,56.8,100.0};

int q=2;

Program myclass = new Program(); // 1

myclass.Number(ref q, 8.0, 15.0, m); // 2

Console.WriteLine("Номер элемента "+q);

Console.ReadLine();

} } }

В этом примере описатель static отсутствует, поэтому перед вызовом функции необходимо создать экземпляр класса (строка // 1). После этого вызовы всех функций из класса Program выполняют через квалификатор (строка // 2). Обратите внимание на то, что и при вызове функции присутствует атрибут ref.

В завершение раздела приведем пример, содержащий функции:

  • ввода массива;

  • обработки массива – нахождения среднего арифметического.

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

namespace ConApp4

{

class Program

{

static int t1 = 0;

//объявление переменной класса для функций

static void Inpt(int[][] k)

{ //ввод массива

int n, m;

t1++; //работа с глобальной переменной

for (int i = 0; i < k.Length; i++)

for (int j = 0; j < k[i].Length; j++)

{

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

k[i][j] = Convert.ToInt32(Console.ReadLine());

}

}

static float Proc(int[][] d)

{ // обработка массива

float sr = 0;

int kol = 0;

t1+=5; //работа с глобальной переменной

for(int i=0;i<d.Length;i++)

for (int j = 0; j < d[i].Length; j++)

{

sr += d[i][j];

kol++;

}

return sr / kol;

}

static void Main(string[] args)

{

int[][] mas;

int n, m;

Console.Write("Строк ");

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

mas = new int[n][]; //определим количество строк

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

{

Console.Write("Элементов в строке " + i + " ");

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

mas[i] = new int[m]; // определим количество

// элементов в i-ой строке

}

Inpt(mas);

Console.WriteLine("Среднее арифметическое " +

Proc(mas)+

+” t1=”+t1); //работа с глобальной переменной

Console.ReadLine();

} } }

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

namespace ConApp6

{

class Program

{

static int[] fun1(int[] k)

{ // результат функции - массив

int kol = 0;

for (int i = 0; i < k.Length; i++)

if (k[i] > 0) kol++;

int []res=new int[kol]; //объявление результата - массива

kol = 0;

for (int i = 0; i < k.Length; i++)

if (k[i] > 0) res[kol++] = k[i];

return res; //возвращение массива в качестве результата

}

static void Main(string[] args)

{

int[] mas,arr; // mas исходный массив arr - результат

int n;

Console.Write("Count of Elements ");

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

mas = new int[n];

for (int i = 0; i < mas.Length; i++)

{

Console.Write("mas[" + i + "]=");

mas[i] = Convert.ToInt32(Console.ReadLine());

}

arr = fun1(mas); // инициализация массива - результата

// не требуется

for (int i = 0; i < arr.Length; i++)

Console.WriteLine("arr[" + i + "]="+arr[i]);

Console.ReadLine();

}

}

}

Контрольные вопросы

  1. Для чего используют функции?

  2. Для чего используют атрибуты out и ref?

  3. Что означает атрибут static?

  4. Для чего целесообразно использовать глобальные переменные?

3. Объектно-ориентированное программирование на C#

3.1. Общие принципы

Базовыми понятиями объектно-ориентированного программирования являются объект и класс. Объект – это какой-то реально существующий предмет со всеми его индивидуальными характеристиками. Класс – это множество объектов с одинаковыми характеристиками и одинаковым поведением. При определении значений характеристик класс превращается в объект. Характеристики класса задают данными, а поведение – методами. В C# методы представляют собой функции, среди методов выделяют конструктор и деструктор – функции особого назначения и с особыми правилами оформления.

Свойства объектно-ориентированного программирования:

  • инкапсуляция (объединение в одной структуре данных (классе) объявления данных и методов их обработки);

  • наследование (класс может иметь одного предка, данные предка автоматически включаются в его состав, можно использовать методы предка);

  • полиморфизм (можно иметь несколько реализаций одного метода с автоматическим выбором подходящего).

Рассмотрим в этой главе работу с классами в C#.

3.2. Объявление и работа с классами

Объявление класса:

class имя_класса

{

// объявление данных

Характеристики

Тип файла
Документ
Размер
2,27 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее