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

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

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

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

// описание методов

}

Рассмотрим это на простом примере.

namespace Klass1

{

class kl1

{

int n; // данные класса

int []a;

public kl1(int k1) // конструктор

{

n=k1;

a=new int[k1];

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

{

Console.Write("Input "+i+" ");

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

}

}

~kl1() // деструктор

{

Console.WriteLine("I am the destructor");

}

// методы класса

public void param(out int s)

{

s=0;

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

s+=a[i];

}

public void val(ref int p)

{

//нахождение суммы элементов, начиная с заданного элемента

int sum=0;

if(p>=n)p=-5;

else{

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

sum+=a[i];

p= sum;}

}

public void out_a()

{

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

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

}

public int get_n()

{

return n;

}

}

class Class1

{

static void Main(string[] args)

{

kl1 kk1; //объявление указателя на класс

int l,m;

Console.Write("Input the count of Elem ");

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

kk1=new kl1(m); //создание класса

l=kk1.get_n(); // вызов метода класса

Console.WriteLine("Элементов: "+l);

kk1.out_a();

kk1.param(out l);

Console.WriteLine("Сумма = "+l);

l=m-3; // присвоение значения l обязательно

kk1.val(ref l);

Console.WriteLine("Вторая сумма = "+l);

Console.ReadLine();

} } }

Структура класса. Все компоненты класса имеют атрибуты доступа:

  • private (закрытый): этот атрибут доступа выбирается по умолчанию, к компонентам класса с атрибутом доступа private могут обращаться только методы этого же класса;

  • protected (защищенный): к компонентам класса с атрибутом доступа protected могут обращаться только методы этого же класса и методы классов – наследников;

  • public (открытый): к компонентам класса с атрибутом доступа public можно обращаться с любого места.

В отличие от С++ в C# атрибут доступа действует только до знака разделителя ; После этого будет опять установлен атрибут доступа по умолчанию private.

Наш класс кl1 имеет в качестве данных переменную n и массив a, оба они имеют атрибут доступа private.

Функция, имя которой совпадает с именем класса, является конструктором. Естественно, что конструктор должен иметь атрибут доступа public, иначе невозможно создать экземпляры класса (объекты). Конструктор может иметь формальные параметры по общим правилам, но он не может иметь возвращаемого значения и указывать тип возвращаемого значения запрещено. Допускается наличие в одном классе более одного конструктора, но у них должен быть разный состав формальных параметров. Выбор конструктора в таком случае осуществляется на основе фактических параметров. В конструкторе обычно пишут операции инициализации и ввод исходных данных. Конструкторы, как и другие функции в составе класса, могут работать со всеми переменными и массивами своего класса, которые являются как бы глобальными переменными для них. В C# тексты методов пишут прямо в самом классе, сразу за их заголовком. Это не является недостатком и не засоряет определение класса, потому что предусмотрена возможность свертывания методов до одной строки. Обратите на это внимание при работе за компьютером!

Функция, имя которой имеет структуру ~имя_класса() называется деструктором. В C# самому вызвать деструктор невозможно. Деструктор вызывается автоматически программой, называемой «сборщик мусора». Как Вы, наверно, уже заметили, в C# нет операторов освобождения памяти, это выполняет та же программа «сборщик мусора», которая удаляет ставшие ненужными объекты. Деструктор должен обеспечить корректную ликвидацию объекта.

Далее следуют другие функции – члены класса. Их оформление ничем не отличается от рассмотренных в предыдущем разделе правил работы с функциями. Они могут работать со всеми данными своего класса.

В C# разрешена перегрузка метода: два или более методов в одном классе (в том числе и конструктор) могут иметь одно и то же имя при условии, что у них разный состав (их количество и/или типы) формальных параметров. Такие методы называют перегруженными. Отличие только в типе возвращаемого значения недостаточно для перегрузки, и такие методы не считаются перегруженными.

Переходим к рассмотрению главной функции Main(). Сначала объявим указатель на класс kl1 kk1; в C# нет явных указателей, но таким образом объявляем именно указатель. Класс будет создан оператором kk1=new kl1(m); Это означает запуск конструктора класса и в нашем случае выделение памяти под массив и ввод этого массива. Далее следуют вызовы методов класса традиционным способом. Обратите внимание на использование модификаторов out, ref.

3.3. Перегрузка операторов

Цель перегрузки операторов: определение новых правил выполнения существующих операций применительно к созданному пользователем классу. При этом приоритет операций не меняется. Перегрузить можно как бинарные, так и унарные операции, а также операции отношений. Для перегрузки операции необходимо в составе класса задать функцию с новыми правилами выполнения существующей операции; из наиболее известных операторов нельзя перегрузить оператор присваивания (=), а также составные операторы присваивания ( += и т.п.).

Общий формат перегрузки:

public static тип_возвращаемого_значения operator Знак_операции ( операнды )

{

// текст функции перегрузки }

Пример. Напишем функцию перегрузки, которая будет выполнять операции над одномерным массивом: поэлементное сложение двух массивов, прибавление константы всем элементам массива, увеличение всех элементов массива на единицу, сравнение двух массивов (считаем, что один массив меньше другого, если все его элементы меньше элементов другого массива). В C#, если имеется перегрузка операции <, то должна быть и перегрузка противоположной операции >. Ее отсутствие – синтаксическая ошибка. Для простоты пусть оба массива имеют равное количество элементов.

namespace ConApp5

{

class array

{

int[] a;

int n;

public array(int k)

{

n = k;

a=new int [k];

}

public array(array z)

{

// вспомогательный конструктор, он может быть использован

// только после вызова основного

int m = z.a.Length;

a = new int[m];

}

public void inpt()

{

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

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

{

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

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

}

}

public void outp()

{

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

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

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

}

public static array operator +(array op1, array op2)

{

// перегрузка операции сложения элементов двух

// одинаковых массивов

array temp = new array(op1.n);

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

{

temp.a[i] = op1.a[i] + op2.a[i];

}

return temp;

}

public static array operator +(array op1, int op2)

{

// перегрузка операции добавления константы элементам массива,

// константа на втором месте

array temp = new array(op1.n);

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

{

temp.a[i] = op1.a[i] + op2;

}

return temp;

}

public static bool operator <(array op1, array op2)

{

// перегрузка операции сравнения двух массивов (операция >)

bool b1 = true;

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

{

if (op1.a[i] > op2.a[i]) b1 = false;

}

return b1;

}

public static bool operator >(array op1, array op2)

{

// перегрузка операции сравнения двух массивов (операция <)

bool b1 = true;

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

{

if (op1.a[i] < op2.a[i]) b1 = false;

}

return b1;

}

public static array operator -(array op1, array op2)

{

// перегрузка операции вычитания элементов двух

// одинаковых массивов

array temp = new array(op1.n);

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

{

temp.a[i] = op1.a[i] - op2.a[i];

}

return temp;

}

public static array operator ++(array op)

{

// перегрузка операции инкремента

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

op.a[i]++;

return op;

}

}

class Program

{

static void Main(string[] args)

{

array a1, a2, a3;

bool q1, q2;

a1 = new array(4);

a1.inpt();

a2 = new array(4);

a2.inpt();

a3 = new array(4);

a3 = a1 + a2; //сложение двух массивов

a3.outp();

a1++; // инкремент

a1.outp();

a3 = a1 + 10; // сложение массива и константы

a3.outp();

q1 = a1 < a2; //сравнение

q2 = a1 > a2;

Console.WriteLine("BOOL " + q1 + " " + q2);

Console.ReadLine();

} } }

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

3.4. Индексаторы

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

Тип_данных_элементов массива this [int индекс]

{

get

{

//возврат значения }

set

{

// присвоение значения

}

}

Индексатор может иметь и атрибут доступа (по умолчанию как всегда private), индексатор public может обращаться и к массивам private.

Пример. Имеем класс Array и в нем массив a

namespace Index_1

{

class Array

{

int []a;

public int len;

public bool err;

public Array(int n)

{ // конструктор

a=new int[n];

len = n;

}

//начинается описание индекса

public int this[int index]

{

get // возвращение значения элемента массива

{

if(ok(index))

{

err=false;

return a[index];

}

else

{

err=true;

return 0;

}

}

Set // присвоение значения элементу массива

{

if(ok(index))

{

a[index]=value;

err=false;

}

else

{

err=true;

}

}

}

bool ok(int index)

{

// вспомогательная функция, проверяет правильность индекса

if((index>=0)&&(index<len))return true;

else return false;

}

}

class Class1

{

static void Main(string[] args)

{

Array c1=new Array(5);

for(int i=0;i<c1.len;i++)

c1[i]=2*i; // работает метод set

for(int i=0;i<c1.len;i++)

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

// работает метод get

Console.ReadLine();

} } }

Благодаря индексатору можно писать c1[i] вместо c1.a[i]. Кроме того, индексатор у нас имеет атрибут доступа public; если мы хотим обра­титься к массиву без индексатора c1.a[i] то необходимо изменить и атрибут доступа массива.

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

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

namespace Katse

{

class Class1

{

struct mas1

//class mas1

//Работают оба варианта, структура (класс) для представления массива

{

public double []d1;

public mas1(int n)

{

d1=new double[n];

}

public double this[int index]

{ // индексатор

get{return d1[index];}

set{d1[index]=value;}

}

}

static mas1 sum11(double [,]x)

{mas1 my=new mas1(x.GetUpperBound(0)+1);

// создаем экземпляр структуры mas1

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

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

my[i]+=x[i,j];

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

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

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

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