Методы на языке C#

Основной метод языка С# Main (), его роль в работе программы, варианты написания и ключевые слова. Особенности перегрузки методов, их рекурсивный вызов. Понятие модификаторов доступа, их ключевые функции. Разработка алгоритмов для тематических программ.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 30.05.2015
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Аннотация

Данная работа состоит из двух частей. Первая часть посвящена теме "Методы на языке С#". В ней будет описано об основном методе Main (), без которого не начнется работа программы, о вариантах его написания, о ключевых словах ref и out, и this. А так же уделено внимание перегрузке методов и рекурсивному вызову метода. Каждая тема, для лучшего понимая, сопровождается примером с комментариями. К тому же будет описано, что такое модификаторы доступа и для чего они нужны. Во второй части представлены программы по темам: "Двумерные массивы", "Строки", "Поля и методы", "Работа с цифрами числа", "Наследование" "Массивы, методы". Каждый пример темы сопровождается кодом программы, объяснением алгоритма и скриншотом, на котором виден результат выполнения. Для некоторых программ приведена таблица входных и выходных данных, а для тех, которые содержат условный оператор, построена часть блок-схемы.

Содержание

  • Часть 1. Теоретическая часть
  • Описание метода. Модификаторы
  • Немного о методе Main ()
  • Варианты написания метода Main ()
  • Перегрузка методов
  • Ключевые слова ref и out. Примеры использования
  • Рекурсивный вызов метода
  • Пример программы "Рекурсивный вызов"
  • Ключевое слова this
  • Часть 2. Практическая часть
  • Задача 1 по теме "работа с цифрами числа"
  • Задача 2 по теме "Наследование"
  • Задача 3 по теме "Поля и методы"
  • Задача 4 по теме "Строки"
  • Задача 5 по теме "Массивы, методы"
  • Список используемой литературы

Часть 1. Теоретическая часть

Описание метода. Модификаторы

"В общем виде объявление метода выглядит так:

Модификатор тип_возв_значения Имя (параметры)

{

Код (действия);

return значение; // в случае, если тип функции НЕ void

}

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

Тип_возв_значения - тип данных результата работы метода.

Параметры - список формальных параметров (один или несколько), с указанием их типов.

Модификатором может выступать public, protected, internal и private, с помощью них определяется доступен ли метод внешним классам или наследникам. ” [2]

Private - методы можно вызывать только в методах самого класса.

Protected - методы будут доступны для методов класса и классов, которые связаны с исходным отношением "родитель - потомок".

К public - методам можно обращаться из любого места программы.

Модификатор доступа internal используется для методов, доступных всем классам, определенным в конкретной сборке. Если модификатор доступа не указан, по умолчанию методы считаются закрытыми (private).

Обращение к методу происходит посредством его вызова из метода Main, при котором на место формальных подставляются фактические параметры (их типы должны совпадать).

Немного о методе Main ()

public static void Main ()

{

Console. WriteLine ("Hello World”);

}

"В данном случае тип значения, которое возвращает метод, равен public static void (открытый, статичный, пустой). ” [2]

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

В фигурных скобках (обозначающих начало и конец метода) идет код, т.е. действия, которые выполняет метод. В моем случае это вывод на консоль сообщения - Console. WriteLine ("Hello World);. Эта строка - вызов метода другого класса. Вызов осуществляется следующим образом:

Имя_объекта. Имя_метода (Параметры);

Если метод находится в объекте, из которого вызываем, то можно вызвать так Имя_метода (Параметры);

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

Благодаря тому, что описание и реализация находятся в одном файле, код становится более компактным и мобильнее, "что является одной из основных особенностей технологии.net” [2].

Варианты написания метода Main ()

static void Main ()

{

}

static int Main ()

{

return Целое_число;

}

static void Main (string [] args)

{

}

static public int Main (string [] args)

{

return Целое_число;

}

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

Таким образом, метод может возвращать пустое значение или число, или не принимать никаких параметров вообще либо принимать массив строк.

"Почему в качестве параметра передается именно массив строк? Потому что, когда операционная система вызывает программу, может передать ей в качестве параметров одну строку. Это уже сама программа разбивает монолитную строку на массив, а разделителем выступает пробел" [2].

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

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

Перегрузка методов

Когда возникает ситуация, что нужно создать схожий по функциональности метод, и чтобы не придумывать новые имена можно создать такой же метод, только чтобы система различала их, помогут параметры (их тип и количество). Использование нескольких методов с одним и тем же именем, но с различными параметрами - это перегрузка методов.

Например, "в классе Console для печати какого - либо сообщения существует 19 перегруженных методов WriteLine ():

WriteLine () - записывает текущий признак конца строки в стандартный выходной поток;

WriteLine (double) - записывает текстовое представление вещественного числа в стандартный выходной поток;

WriteLine (String) - записывает заданную строку в стандартный выходной поток;

WriteLine (String, object []) - записывает текстовые представления заданного массива объектов в стандартный выходной поток с использованием заданных сведений о форматировании и т.д." [2]

Пример программы:

public void user ()

{

Console. WriteLine ("Пустой метод\n");

}

public void useru (string Name)

{

Console. WriteLine ("Имя пользователя: {0}",Name);

}

public void useru (string Name, string Sername)

{

Console. WriteLine ("Имя пользователя: {0}\nФамилия пользователя: {1}",Name, Sername);

}

public void useru (string Name, string Sername, byte Age)

{

Console. WriteLine ("Имя пользователя: {0}\nФамилия пользователя: {1}\nВозраст: {2}", Name, Sername, Age);

}

class Program

{

static void Main (string [] args)

{

UserInfo user1 = new UserInfo ();

// Разные реализации вызова перегружаемого метода

user1. useru ();

user1. useru ("Сидоров", "Петр", 14);

Console. ReadLine ();

}

}

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

Чтобы на экран вывело имя и фамилию, то нужно использовать третий способ перегрузки. И последнему методу соответствуют 3 параметра: имя, фамилия и возраст.

Ключевые слова ref и out. Примеры использования

Для того чтобы в функцию передать не значение, а саму переменную, (чтобы ее можно было изменять) в объявлении этого метода перед именем параметра нужно указать ключевое слово ref. Передавать нужно именно переменную, проинициализированную, т.к. "внутрь метода будет передана ссылка на память переменной, а не ее значение, метод будет работать с его значением напрямую, а не через свою локальную переменную” [2]. Причем, ref необходимо ставить перед каждой переменной.

"Массив theArray объявлен в вызывающем (метод Main) и инициализирован в методе FillArray. Затем элементы массива возвращаются вызывающему и отображаются. ”

class TestOut

{

static void FillArray (out int [] arr)

{

arr = new int [5] { 1, 2, 3, 4, 5 }; // Инициализация массива

}

static void Main ()

{

int [] theArray; // Инициализация не требуется

// Передача массива вызывающему, используя out

FillArray (out theArray);

// Вывод на консоль

System. Console. WriteLine ("Array elements are: ");

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

{

System. Console. Write (theArray [i] + " ");

}

System. Console. ReadLine ();

}

}

// Array elements are: 1 2 3 4 5

Массив theArray инициализирован в вызывающем (метод Main) и подставляется в метод FillArray при помощи параметра ref. Некоторые из элементов массива обновляются в методе FillArray. Затем элементы массива возвращаются вызывающему и отображаются.

class TestRef

{

static void FillArray (ref int [] arr)

{

// Создание массива

if (arr == null)

{

arr = new int [10];

}

// Заполнение

arr [0] = 1111;

arr [4] = 5555;

}

static void Main ()

{

// Инициализация массива

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

// Передача массива, используя ref

FillArray (ref theArray);

// Вывод на консоль

System. Console. WriteLine ("Array elements are: ");

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

{

System. Console. Write (theArray [i] + " ");

}

System. Console. ReadLine ();

}

}

// Array elements are: 1111 2 3 4 5555

Пример использования методов:

static void Zapol (ref int [,] a)

{

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

{

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

a [i, j] = 0; // заполняем массив нулями

}

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

static void Tabl (int [,] a)

{

Console. WriteLine ("Массив - ");

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

{

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

{

Console. Write ("{0, 2}",a [i,j]); // выводим массив

if (j == a. GetLength (1) - 1)

{

Console. WriteLine ();

}

}

} Console. WriteLine ();

}

Этот метод дан в качестве примера, поскольку он выводит полученную матрицу.

static void Main (string [] args)

{

Console. WriteLine ("Размерность строк = ");

int n = int. Parse (Console. ReadLine ());

Console. WriteLine ("Размерность столбцов = ");

int m = int. Parse (Console. ReadLine ());

int [,] mas = new int [n, m];

Zapol (ref mas);

Tabl (mas); }

Вызывающий метод.

Рекурсивный вызов метода

Рекурсивный вызов метода - это когда метод вызывает сам себя.

void MethodName ()

{

MethodName ();

}

"Такой метод корректен с точки зрения программирования на языке C#, но не корректен для выполнения” [2]. Т.к. он будет бесконечно вызывать сам себя, и программа зависнет. Необходим выход, т.е. такое состояние, при котором рекурсия прервется. Обычно его используют в ситуациях, когда легко свести и сходную задачу к задаче того же вида, но с другими исходными данными, например, уменьшение размерности задачи, переход в новую точку и пр.

При написании рекурсивных методов следует непременно указать в соответствующем месте условный оператор, например, if, чтобы организовать возврат из метода без рекурсии. В противном случае возврата из вызванного однажды рекурсивного метода может вообще не произойти. Подобного рода ошибка весьма характерна для реализации рекурсии в практике программирования. В этом случае рекомендуется пользоваться операторами, содержащими вызовы метода WriteLine (), чтобы следить за происходящим в рекурсивном методе и прервать его выполнение, если в нем обнаружится ошибка.

Пример программы "Рекурсивный вызов"

Class Program

{

// метод поиска факториала целого числа

static int Factorial (int n)

{

// условие выхода из рекурсии

if (n==1 || n==0) return 1;

return n*Factorial (n-1); // рекурсивный вызов

}

static void Main (string [] args)

{

int n;

Console. WriteLine ("Введите n: ");

int k=Factorial (n); // первый вызов функции

Console. WriteLine ("{0}! ={1}",n,k);

}

Рис. Схема рекурсии

Ключевое слова this

При вызове метода ему автоматически передается неявно заданный аргумент, который представляет ссылку на объект, для которого вызывается метод. Эта ссылка называется ключевым словом this. "Рассмотрим пример программы, создающий класс Rect, который инкапсулирует, т.е. делает доступными только внутри класса, значения ширины и длины прямоугольника и включает метод area (), вычисляющий площадь фигуры” [1].

Оно обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы исключить неоднозначность контекста, которая может возникнуть, когда входящий параметр (int w) назван так же, как поле данных данного типа (int width). Разумеется, в идеале необходимо просто придерживаться соглашения об именовании, которое не может привести к такой неоднозначности.

class Rect {

public int width;

public int height;

public Rect (int w, int h) {

this. width = w; // здесь можно было бы и не использовать this

this. height = h; }

public int area () {

return this. width * this. height; } // перемножаются копии переменных, связанные с вызывающим объектом

}

class UseRect {

public static void Main () {

Rect r1 = new Rect (4,5);

Rect r2 = new Rect (7,9);

Console. WriteLine ("Площадь прямоугольника r1: ” + r1. area ());

Console. WriteLine ("Площадь прямоугольника r2: ” + r2. area ()); }

}

Т.к. синтаксис позволяет, чтобы имя параметра и локальной переменной совпадало с именем переменной экземпляра. Например,

public Rect (int width, int height) {

this. width = width;

this. height = height; }

В этом случае локальное имя будет скрывать переменную экземпляра. И для доступа к скрытой переменной используют ссылку this.

метод язык алгоритм программа

Часть 2. Практическая часть

Задача 1 по теме "Работа с цифрами числа"

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

Нужно найти первую и третью цифру в дробной части числа. Для этого само число умножим на 10, отбросим дробную части с помощью явного преобразования и найдем остаток от деления ( ( (int) dd) % 10). Этот остаток и будет первой цифрой в дробной части. Аналогично найдем третью, только умножим изначальное число на 1000.

Console. Write ("Введите вещественное число: ");

double d = double. Parse (Console. ReadLine ());

double dd = d*10; // чтобы найти первую после,

double ddd = d * 1000; // чтобы найти третью после,

int p1 = ( (int) dd) % 10; // переменная запоминающая ту самую первую цифру

int p2 = ( (int) ddd) % 10; // переменная запоминающая третью цифру

double a1 = d - p1/10.0 + p2/10.0; // меняем 1 и 3 после запятой

double a2 = a1 - p2/1000.0 + p1/1000.0; // меняем третью на первую

Console. WriteLine (a2);

Console. ReadLine ();

d

dd

ddd

P1

P2

A1

A2

123,456

1234,56

123456

4

6

123,656

123,654

98,765

987,65

98765

7

5

98,565

98,567

234,987

2349,87

234987

9

7

234,787

234,789

6,561

65,61

6561

5

1

6,161

6,165

Задача 2 по теме "Двумерные массивы"

Fill (a) - заполняет массив А по правилу (на примере массива 4х5):

Создаем массив определенной размерности, при помощи цикла по "i" перебираем строки, а циклом по "j" - столбцы. И заполняем массив элементами, используя формулу Math. Abs (j - i) + 1.

static void Fill (out double [,] a)

{

a = new double [4,5];

for (int i = 0; i < a. GetLength (0); i++) // пробегаем по строкам

{

for (int j = 0; j < a. GetLength (1); j++) // пробегаем по столбцам

{

a [i, j] = Math. Abs (j - i) + 1; // заполняет как в таблице

}

}

}

Рис.2.1 Результат работы программы

Transp (a, m) - выполняет транспонирование элементов массива.

Если матрица квадратная (т.е. число строк равно числу столбцов), то, используя, 2 цикла for, пробегающие по строкам и столбцам. В дополнительную переменную записываем строку (начиная с первой), а в координаты прошлой строки записываем столбец. На место этого столбца записываем строку из дополнительной переменной. Так и происходит замена строк на столбцы и наоборот.

static void Transp (double [,] a, int n, int m)

{

if (a. GetLength (0) == a. GetLength (1))

{

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

{

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

{

double t = a [i, j];

a [i, j] = a [j, i];

a [j, i] = t;

}

}

}

else Console. WriteLine ("Транспонирование не выполнено");

}

До

После транспортирования

12345

12345

12345

12345

12345

11111

22222

33333

44444

55555

156

123

Транспонирование не выполнено

98765

54321

12345

67890

00000

95160

84270

73380

62490

51500

111111

000000

777777

Транспонирование не выполнено

5555

6655

7777

8877

5678

5678

5577

5577

13579

24680

97531

08642

12345

12901

34782

56563

78344

90125

Рис. 2.2 Таблица входных и выходных данных

нет

да

Рис.2.2 Часть блок-схемы

Рис.2.3 Результат работы программы

static void Main (string [] args)

{

double [,] a;

Console. Write ("Введите размер строки: ");

int n = int. Parse (Console. ReadLine ());

Console. Write ("Введите размер столбца: ");

int m = int. Parse (Console. ReadLine ());

Fill (out a);

Print (a, "a");

Transp (a,n, m);

Print (a, "a");

Console. ReadLine ();

}

Задача 2 по теме "Наследование"

Написать программу, в которой создается иерархия классов.

а. Определить иерархию классов.

б. Реализовать классы.

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

Класс Experiment базовый (предок) его потомками будут классы Test и Exam. Они унаследуют имя преподавателя (string), имя дисциплины (string) и оценку (int). Собственное у Test будет кол-во (int) и тип вопросов (bool). У Exam будет проходной бал (int). Конструктор для инициализации первоначальных данных.

class Experiment

{

public string name_prep;

public string name_discpl;

public int val;

public Experiment (string name_prep, string name_discpl, int val)

{

this. name_prep = name_prep;

this. name_discpl = name_discpl;

this. val = val;

}

public void SetPrep (string FIO) { name_prep = FIO; }

public int GetVal () { return val; }

public void SetDiscpl (string Disc) { name_discpl = Disc; }

public string GetPrep () { return name_prep; }

public string GetDiscpl () { return name_discpl; }

public string Info ()

{

return string. Format ("Экзамен по предмету {0} под руководством {1}", name_discpl, name_prep);

}

public void Show () { Console. WriteLine (Info ()); }

Для классов - потомков приведу их конструкторы, т.к. методы аналогичны методам базового класса (изменить или получить какое - либо название или величину). Ключевое слово base служит для доступа к элементам базового типа из дочернего класса. В описании конструктора потомка вместо this. name_discpl, можно применить base (name_discpl) и в скобках через запятую перечислить наследованные поля.

class Exam: Experiment

{

protected int bal;

public Exam (string name_discpl, string name_prep, int val, int count_ask, bool close_ask, int bal)

: base (name_discpl, name_prep, val) // поля базового типа

{

if (bal >= 0 || bal <= 100) this. bal = bal;

else this. bal = 0;

}

class Test: Experiment

{

protected int count_ask;

protected bool close_ask;

public Test (string name_discpl, string name_prep, int val, int count_ask, bool close_ask)

: base (name_discpl, name_prep, val) { }

Рис. 3.1 Часть блок-схемы для условного оператора " if ”

Рис. 3.2 Диаграмма классов

Рис. 3.3 Результат работы программы

Задача 3 по теме "Поля и методы"

Расширить содержание класса "Круг"

Для этого:

1. Изменить диаграмму класса.

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

3. Добавить к тексту программы операторы, вызывающие новые методы и проверяющие корректность их работы.

Периметр изменится, если изменить радиус по формуле Rad = P / (2 * Math. PI). Для вычисления расстояния до начала координат по т. Пифагора находим расстояние от центра до н. к. и вычитаем радиус, чтобы найти необходимое расстояние (result = Math. Sqrt (Xc * Xc + Yc * Yc) - Rad). Для изменения координат центра необходимо просто ввести другие х и у. Определить периметр можно используя классическую формулу 2 * Math. PI * Rad.

class Circle

{

string Name;

public double Xc, Yc;

double Rad;

public void ToZero () {. }

public void SetRadius (double R) // изменить значение радиуса

{

if (R >= 0) Rad = R; // новую переменную (значение радиуса) присваиваем Rad'у

}

public void SetSquare (double Value) {.);

}

public void SetPerimeter (double P) // изменить значение периметра

{

if (P>0) Rad = P / (2 * Math. PI);

}

public void SetCenter (double X, double Y) // изменить координаты центра

{

Xc = X; Yc = Y;

}

public void MoveX (double dx) {. }

public void MoveY (double dy) // перенести круг по оси OY

{

Yc += dy; // к значению по у прибавляем смещение

}

public void Assign (Circle c) {. }

public void AssignTo (Circle с) // скопировать свои характеристики на другой круг

{

с. Xc = Xc; с. Yc = Yc; с. Rad = Rad;

}

public double GetSquare () {. }

public double GetPerimeter () // определение периметра окружности

{

return 2 * Math. PI * Rad; // периметр по формуле

}

public double RoFromZero () // определение расстояния до нач. коорд.

{

double result = Math. Sqrt (Xc * Xc + Yc * Yc) - Rad;

if (result < 0) result = 0;

return result;

}

public bool isEqual (Circle c) {. }

public double RoFromOX () {. }

public string Info () {. }

public Circle (string aName) {. }

public Circle (string aName, double aRad) {. }

public Circle (string aName, double aRad, double aXc, double aYc) {. }

static void Main (string [] args)

{

Console. WriteLine ("Работа с классом Circle");

Circle a = new Circle ("A"); Console. WriteLine (a. Info ());

Circle b = new Circle ("B"); Console. WriteLine (b. Info ());

Circle c = new Circle ("C", 5, 2,3); Console. WriteLine (c. Info ());

Console. WriteLine (c. Info ());

b. MoveX (10.2);

Console. WriteLine (b. Info ());

c. SetSquare (14); c. Yc = 9.8;

Console. WriteLine (c. Info ());

b. Assign (c);

Console. WriteLine (b. Info ());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Площадь В: {0: F3} см^2", b. GetSquare ());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Расстояние от В до ОХ: {0: F3} см", b. RoFromOX

());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Круги В и С равны: {0}", b. isEqual (c));

b. ToZero ();

Console. WriteLine (b. Info ());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Круги B и C равны: {0}", b. isEqual (c));

Console. WriteLine (c. Info ());

Console. WriteLine (b. Info ());

b. SetRadius (41);

Console. WriteLine (b. Info ());

b. SetPerimeter (512);

Console. WriteLine (b. Info ());

b. SetCenter (47, 65);

Console. WriteLine (b. Info ());

a. MoveY (84.6);

Console. WriteLine (a. Info ());

b. AssignTo (b);

Console. WriteLine (b. Info ());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Периметр B: {0: F3} см", b. GetPerimeter ());

Console. WriteLine

("___________________________________________________");

Console. WriteLine ("Расстояние от В до НАЧАЛА КООРДИНАТ: {0: F3} см",

b. RoFromZero ());

Console. ReadLine ();

}

Рис.4.1 Диаграмма класса.

Рис. 4.2 Результат работы программы

Задача 4 по теме "Строки"

Заданы два предложения (в виде 2-х строк), слова которых разделены одним или несколькими пробелами. Распечатать "в столбик" все слова первого предложения, которые не встречаются во втором предложении.

Объявляем массив разделителей, указываем, что слова в строках разделены одним пробелом. Split возвращает строковый массив, содержащий подстроки данных строк, разделенных пробелом. Для каждой некой строки ss в строке mss крутим цикл, и если слова не одинаковые, то выводим их.

static void T9 (string st21, string st22)

{

char [] razd = new char [] { ' ' };

string [] mss = st21. Split (razd);

string [] mss1 = st22. Split (razd);

foreach (string ss in mss)

{

bool b = true;

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

{

if (ss == mss1 [i]) b = false;

}

if (b) Console. WriteLine (ss);

}

}

static void Main (string [] args)

{

Console. WriteLine ("Введите строку ");

string st21 = Console. ReadLine ();

Console. WriteLine ("Введите еще строку ");

string st22 = Console. ReadLine ();

Console. WriteLine ("Cлова первого предложения, которые не встречаются во втором предложении: ");

T9 (st21, st22);

Console. ReadLine ();

}

Рис. 5.1 Результат работы программы

Строка 1

Строка 2

Результат

Имеют обмен внешними ресурсами

Не имеют обмен с ресурсами

внешними

Элементы массива положительные

Отрицательные элементы множества

Массива положительные

Указанные ниже

Указанные изменения

ниже

Солнце греет сильнее

Чем батарея греет

Солнце сильнее

Курсовая работа

Домашняя работа

курсовая

Привет мир

Пока мир

привет

Рис. 5.2 Таблица входных и выходных данных

Задача 5 по теме "Массивы, методы"

Написать программу, которая заполняет элементы массива X, состоящего из n элементов (n?10 вводится) случайными вещественными числами от - 8 до 8. Требуется распечатать данный вектор в строчку, выполнить в нём указанные ниже изменения, и в строчку распечатать вектор, получаемый в результате каждый i-ый элемент заменить его соседом, если сосед один, или наиболее близким к нему по значению соседом, если соседних элементов два.

Создадим новый массив, в который скопируем исходный массив, чтобы не испортить его. Первый и последний элементы заменяем следующим и предыдущим. Т.к. они имеют только по одному соседу. Для остальных сравниваем его соседей и заменяем наиболее близким. Для того чтобы узнать какой сосед ближе по значение применим формулу Math. Abs (m [i] - m [i - 1]) < Math. Abs (m [i] - m [i + 1], в которой сравниваем разности числа с предыдущим и со следующим, и берем их модули. Выводим результат.

static void Work (ref int [] m, int n

{ int [] y = new int [m. Length];

m. CopyTo (y, 0); // доп массив

y [0] = m [1]; y [n - 1] = m [n - 2]; // заменяем соседом если один сосед

for (int i = 1; i < m. Length - 1; i++)

if (Math. Abs (m [i] - m [i - 1]) < Math. Abs (m [i] - m [i + 1])) y [i] = m [i - 1];

else y [i] = m [i + 1];

m = y;

}

static void Print (string name, int [] m)

{

Console. WriteLine ("***** ВЫВОД МАССИВА в столбик******");

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

Console. WriteLine ("{0} [{1,2}] = {2,3}", name, i, m [i]);

}

static void Fill (out int [] m, int n)

{

m = new int [n];

Random rnd = new Random (); // заполняем случайными числами от - 8 до 8

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

m [i] = rnd. Next ( (-8),8);

}

static void Main (string [] args)

{

int [] mas;

Console. Write ("Ограничение - ");

int n = int. Parse (Console. ReadLine ());

if (n > 10) Console. WriteLine ("Привышено число элементов");

else

{

Console. WriteLine ("Случайный массив от - 8 до 8");

Fill (out mas, n); // метод заполнения

Print ("mas", mas); // метод вывести на экран

Work (ref mas, n); // метод выполняющий изменения

Print ("mas", mas); // метод выводит на экран измененный массив

}

Рис. 6.1 Результат работы программы

Ограничение

На входе

Результат

4

-5 - 5 2 1

-5 - 5 1 2

6

-3 1 5 7 - 3 - 5

1 5 7 5 - 5 - 3

8

-2 4 1 7 - 8 - 7 4 1

4 1 4 1 - 7 - 8 1 4

3

-5 3 - 1

3 - 1 3

7

-1 - 4 - 3 3 - 4 - 1 4

-4 - 3 - 4 - 3 - 1 - 4 - 1

5

1 7 - 3 5 2

7 1 5 2 5

Рис. 6.2 Таблица входных и выходных данных

Список используемой литературы

1. Шилдт, Г. С# 4.0: полное руководство: Пер. с англ. / Герберт Шилдт. - М.: ООО "И.Д. Вильям с", 2011. - 1056с.

2. Фленов, М.Е. Библия С#. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2011. - 560с.: ил. + CD-ROM

3. Электронный ресурс. Александр Ерохин "Перегрузка методов." http://professorweb.ru/my/csharp/charp_theory.

4. Андрианова, А.А. Объектно-ориентированное программирование на С#: Учебное пособие / А.А. Андрианова, Л.Н. Исмагилов, Т.М. Мухтарова. - Казань: Казанский (Приволжский) федеральный университет, 2012. - 134с.

5. Электронный ресурс. Microsoft "Передача массивов при помощи параметров ref и out (Руководство по программированию на С#)" http://msdn. microsoft.com/ru-ru/library/szasx730. aspx

Размещено на Allbest.ru


Подобные документы

  • Ознакомление со структурой, комментариями, переменными и типами данных, константами, перечислениями, преобразованием типов языка программирования высокого уровня С++. Ключевые понятия языка, идентификаторы, ключевые слова, функции, операторы, выражения.

    контрольная работа [31,2 K], добавлен 12.12.2009

  • Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.

    курсовая работа [742,6 K], добавлен 03.07.2011

  • Язык программирования как формальная знаковая система, предназначенная для записи программ, его отличие от естественных языков. Прописные и строчные буквы латинского алфавита. Ключевые слова языка программирования. Классическая схема создания программы.

    презентация [1,2 M], добавлен 19.02.2014

  • Понятие алгоритма. Цикл программы. Структурная схема алгоритма. Элементы языка Тurbo Рascal. Алфавит. Идентификаторы. Комментарии. Лексика языка С++. ESC-последовательности. Операции. Ключевые слова. Комментарии.

    контрольная работа [43,0 K], добавлен 24.04.2006

  • Характеристика предприятия ТОО "Com Sales Group". Составление программ на языке программирования. Составление алгоритмов, разработка численных методов решения задач. Методы откладки программ. Анализ технологии машинной обработки экономической информации.

    отчет по практике [1,3 M], добавлен 19.04.2016

  • Переменные и операции языка СИ: используемые символы, константы, идентификаторы и ключевые слова. Использование комментариев в тексте программы. Типы данных и их объявление. Приоритеты операций и порядок вычислений. Функции, переменные, макроподстановки.

    учебное пособие [135,0 K], добавлен 17.02.2012

  • Фильтр Калмана как эффективный рекурсивный метод, оценивающий вектор состояния динамической системы, используя ряд неполных и зашумленных измерений. Сравнительная характеристика алгоритмов компьютерного моделирования случайных последовательностей.

    дипломная работа [1,9 M], добавлен 17.06.2017

  • Программирование на алгоритмическом языке Turbo Pascal на примере разработки алгоритма и программы расчета временной функции. Выбор, обоснование методов решения. Схемы алгоритмов основной программы и подпрограмм. Распечатка исходных и вычисленных величин.

    реферат [154,8 K], добавлен 15.03.2012

  • Особенности разработки и реализации обучающей программы и схемы алгоритмов на языке программирования С++. Понятие равномерной и неравномерной дискретизации. Представление информации (составление кода) в виде таблицы перекодировки или многочлена.

    курсовая работа [704,6 K], добавлен 06.03.2013

  • Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.

    курсовая работа [461,0 K], добавлен 03.07.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.