Урок #10 – Создание функций (методов класса)
Для сокращения кода в программировании используются функции. Они позволяют вынести повторяющийся код в отдельное место. За урок мы научимся работать с функциями в языке C#.
Видеоурок
Функции можно назвать небольшими подпрограммами, куда можно вынести повторяющийся код и обращаться к нему, когда это будет нужно. Функции значительно облегчают построение программ, так как нам не надо копировать однотипный код множество раз, а можно просто воспользоваться одной общей функцией.
Многие путают функции и методы и не понимают отличий между ними. На самом деле отличий нет, так как что методы, что функции являются одним и тем же. Функции что записаны вне классов называют функциями, а функции что записаны внутри классов называются методами. Поскольку C# это объектно ориентированный язык, то лучше говорить методы, хотя это не имеет никакого значения.
Точно такая же ситуация обстоит с переменным. В классах переменные называются полями, а вне классов — переменными.
Для создания функций необходимо указать возвращаемый тип данных, указать название и параметры. В случае когда функция ничего не возвращает, то указывается тип данных void .
Перед типом данных всегда прописывается модификатор доступа. Сейчас мы их детально рассматривать не будем, так как это тема ООП. В уроке мы будем постоянно устанавливать модификатор public, тем самым будем говорить что функция доступна всем внутри класса.
Зачем static?
Поскольку мы хотим обращаться к функциям напрямую без создания объекта, то мы прописываем ключевое слово static . Оно говорит компилятору что функция принадлежит всему классу, а не конкретным объектам.
В будущем мы более детально ознакомимся с данным модифактором, но пока будем представлять его как удобное слово для обращения к функциям.
Создание функции
На основе всех данных наша функция будет выглядеть следующим образом:
public static void test ()
Функция выше не принимает никаких параметров и ничего не возвращает. Она просто пишет слово в консоль. Давайте разнообразим функцию и добавим параметр:
public static void test (string word)
Теперь функция принимает параметр, который будет отображен в консоли.
Если функция должна что-либо вернуть, то прописываем тип данных который будет возвращен. Для возвращения данных используем ключевое слово return :
public static double test (double some_number)
Создание функций
using System; namespace project < class Program < static void Main() < // Print("Hello"); // string words = "Hello world"; // Print(words); // Print(); int res1 = Summa(5, 9); int a = 4, b = 7; int res2 = Summa(a, b); Print(res1.ToString()); Print(res2.ToString()); >public static void Print(string word) < Console.WriteLine(word); >public static int Summa(int x, int y) < return x + y; >> >
Посмотреть остальной код можно после подписки на проект!
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Реализуем метод print
Всем здравствуйте. Хоть убейте, но не пойму этой задачи. Помогите пожалуйста разжевать (объяснить на пальцах) что нужно сделать и почему ! Благодарю.
Дерево классов
Допиши код в методе print , чтобы он выводил на экран каждую переданную в него строку 4 раза. Каждый раз с новой строки.
На экран должно быть выведено:
Java is easy to learn!
Java is easy to learn!
Java is easy to learn!
Java is easy to learn!
Java is object-oriented!
Java is object-oriented!
Java is object-oriented!
Java is object-oriented!
Java is platform-independent!
Java is platform-independent!
Java is platform-independent!
Java is platform-independent!
Требования:
Программа должна выводить текст на экран.
Метод main не должен вызывать System.out.println или System.out.print.
Метод print должен выводить текст на экран.
Метод main должен вызвать метод print класса Solution ровно три раза.
Метод print должен выводить на экран переданную строку 4 раза. Каждый раз с новой строки.
Solution.java
- Solution.java
Комментарии (22)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
4 мая 2020, 19:46
никого не смущает что в условии задачи указано что :» Метод mаin должен вызвать метод print класса Solution poвно три раза»??
17 апреля 2020, 21:13
Удали всё что в принте у тебя и пропиши или ctrl+c что у меня и дерзай. Сам намучился public static void print(String s) < System.out.println(s); System.out.println(s); System.out.println(s); System.out.println(s);
8 января 2019, 16:28
Въехал только когда перешёл на след. лекцию и задачу под ней. Благодарю всех за помощь !
Уровень 41
7 января 2019, 16:50
Выведи то что передано. Передана String s вот ее и передай в System.out.println() — 4 раза. Вообще ты или троллишь или может стоит поискать более мирную профессию?
8 января 2019, 16:09
Ну нужно познавать новое, всё таки в 21м веке живём ) Нужно понимать что тебя окружает )
8 января 2019, 16:10
Просто пытаюсь понять почему так, а не как по другому ) Скорее всего нужно перечитать лекции )
Уровень 10
24 января 2019, 13:22
Еще в вузе я учился на специальность, где процентов 60-70 это программирование. Но не понял и одной строки и сейчас пытаюсь въехать . Программирование оно может и дается кому-то очень легко, но другим это темный темный лес и мне в том числе. У каждого есть свои причины, почему он хочет стать программистом и советы типа поискать другой род деятельности. Знаете как будто тебе пытаются внушить что ты тупой и не осилишь.. И это явно наихудший совет тем, кто и так сидит и не понимает как ему начать понимать и решать даже такие простые задачки
Уровень 41
24 января 2019, 16:25
Ну может так и есть. Это был не добрый совет. И даже не совет а прямое оскорбление. Может со мной конечно, что то не так но я думаю, что ни один программист не радуется приходу в специальность все новых и новых адептов. Как и в любой другой профессии. Чем больше программистов тем им меньше можно платить. И тем сложнее найти работу. Ну а слушать эти советы и сдуваться или стиснуть зубы и идти дальше это уж каждый сам решает. Никита вот так на 2 уровне и сидит.
18 апреля 2020, 17:28
вы заходите в раздел помощи что бы оскорблять людей? если вам нечего делать, найдите себе какое-нибудь другое мирное занятие.
Уровень 17
6 января 2019, 21:43 решение
Nikita, тут все просто. внимательно читайте задание. «В методе print выведи на экран ПЕРЕДАННУЮ строку 4 раза.». Т.е. в самом методе print не надо писать строки в кавычках. В метод print вы передаете параметр s из метода main. Т.е. в методе main вызывается метод print. Туда передается строка вот таким образом print(«bla-bla-bla»). А уже в самом методе print выводится на печать параметр s, который и является переданной строкой. Вот так: System.out.println (s); Только два раза. Таким образом у вас каждая строка выведется по 2 раза. (в сумме 4)
7 января 2019, 15:56
Скажите а почему именно имя s ? Ведь в методе мейн нет ни 1й переменной с именем s. Я понимаю если бы метод main был бы прописан так : public static void main(String s args) И я бы в методe print прописал команду с выводом текста System.out.println (s);
Уровень 41
7 января 2019, 16:54
main тут не при чем. main() и print() это равноправные методы, с той лишь разницей что main вызывается при запуске приложения первым. Затем main вызывает два раза print со строкой в качестве параметра. И вот твоя задача реализовать метод print(String s) что бы он выводил переданную ему строку четыре раза в консоль. Как назвать параметр s или еще как не важно.
Уровень 17
8 января 2019, 10:34
В методе main и не должно быть параметра s. Параметр s — это то, что принадлежит методу print. Его назвали s только потому, что так нагляднее. Вы можете обозвать его как хотите. Это ваше право, какие давать имена параметрам. Хоть etoMoyaStroka. Просто в данном случае так нагляднее. s — созвучно со словом string (строка. мы передаем строку внутрь метода print). Мы знаем, что метод print принимает на вход параметр, который должен быть тип «Строка». Поэтому в методе main мы мы сразу напрямую пишем в метод print любую строку: print(«Java easy to learn!») Т.е. то, что нам надо передать в метод print, то мы сразу напрямую и пишем в методе main. То что находится в скобках метода, это то, что мы В ЭТОТ передаем, а не из него. Поэтому нету смысла писать main(String s args)
6 января 2019, 17:15
не print а s
Уровень 41
6 января 2019, 17:10
Представь что ты играешь в игру где есть консоль. Метод main — это то что ты пишешь в консоль, print() — это новая команда для консоли. В кавычках ты пишешь (String s). Таким образом ты даёшь понятие что для того что бы написать в консоль команду print() в кавычках тебе нужно указать текст. Текст который поступит командой будет обозначен как s. Таким образом в методе print() тебе надо написать
System.out.println(s); System.out.println(s);
7 января 2019, 14:55
Я конечно понимаю, что все здесь самые умные, но я не просил писать ответ. И в правилах написано что не нужно писать готовый ответ (лучше бы ссылку на лекцию которая поможет в решении скинул бы). Мне всего лишь нужно было разъяснить как трудно-доходящему, в красках. Один фиг я пока сам не дойду до решения, не пойму суть задачи и как её решить (что бы отложилось в голове), я всё ровно не буду писать ответ.
Уровень 22
6 января 2019, 15:06
В теле метода надо написать код, который выведет заданную строку 4 раза
Уровень 40
6 января 2019, 15:03
ну надо решить задачу, реализовать метод print, постарайтесь задать более конкретный вопрос(ы)
6 января 2019, 16:17
В методе print выведи на экран переданную строку 4 раза. Каждый раз с новой строки. Какая там строка переданная ? Застрял на этой задаче. Написал код, но сомневаюсь в правильности понятия поставленной задачи.
Уровень 40
6 января 2019, 16:18
ту которая в параметрах приходит. Метод штука многоразовая. Т.е. он должен выводить на экран любую переданную строку 4 раза
7 января 2019, 16:13
скажите в методе main мне нужно правки вносить ? Требования: Программа должна выводить текст на экран. ( прописываю команду System.out.println(); Верно ?) Метод main не должен вызывать System.out.println или System.out.print. (тоже вроде как понятно, команду System.out.println(); прописываю в поле метода print. Верно ?) Метод print должен выводить текст на экран. (тоже вроде как понятно, команду System.out.println(); прописываю в поле метода print. Верно ?) Метод main должен вызвать метод print класса Solution ровно два раза. (На счёт количества раз — понятно. А вот на счёт вызова одним методом ( в данном примере printОМ метода main) не догоняю, объясните пожалуйста. ) Метод print должен выводить на экран строку 4 раза. Каждый раз с новой строки. (тоже понимаю как технически прописать. Тут вопросов не будет если догоню предыдущее требование). Благодарю.
Уровень 40
7 января 2019, 16:19 решение
все верно. А вот на счёт вызова одним методом ( в данном примере printОМ метода main) не догоняю, объясните пожалуйста. ) в методе print вы 4 раза вызываете System.out.println. Примерно тоже самое надо сделать в main. Только вызывать надо метод print и 2 раза. По факту у вас это уже сделано
- Курсы программирования
- Регистрация
- Курс Java
- Помощь по задачам
- Цены
- Задачи-игры
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Помогите пожалуйста как это сделать?
Вы создаете шифратор текста. Он должен использовать несколько слов и вывести в результат скомбинированную версию, где каждое слово отделено знаком $. Например, для слов «hello», «how», «are», «you», результат должен выглядеть следующим образом «$hello$how$are$you
quot;. Данный код объявляет класс Add, с конструктором, который берет один rest параметр. Завершите код, добавив к классу метод print(), который должен создать необходимый результат. class Add < constructor(. words) < this.words = words; >//ваш код > var x = new Add(«hehe», «hoho», «haha», «hihi», «huhu»); var y = new Add(«this», «is», «awesome»); var z = new Add(«lorem», «ipsum», «dolor», «sit», «amet», «consectetur», «adipiscing», «elit»); x.print(); y.print(); z.print();
Array.prototype.forEach()
Метод forEach() выполняет указанную функцию один раз для каждого элемента в массиве.
Интерактивный пример
Синтаксис
arr.forEach(function callback(currentValue, index, array) < //your iterator >[, thisArg]);
Параметры
Функция, которая будет вызвана для каждого элемента массива. Она принимает от одного до трёх аргументов:
Текущий обрабатываемый элемент в массиве.
Индекс текущего обрабатываемого элемента в массиве.
Массив, по которому осуществляется проход.
Необязательный параметр. Значение, используемое в качестве this при вызове функции callback .
Возвращаемое значение
Описание
Метод forEach() выполняет функцию callback один раз для каждого элемента, находящегося в массиве в порядке возрастания. Она не будет вызвана для удалённых или пропущенных элементов массива. Однако, она будет вызвана для элементов, которые присутствуют в массиве и имеют значение undefined .
Функция callback будет вызвана с тремя аргументами:
- значение элемента (value)
- индекс элемента (index)
- массив, по которому осуществляется проход (array)
Если в метод forEach() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае, в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this , видимого из функции .
Диапазон элементов, обрабатываемых методом forEach() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода forEach() , не будут посещены функцией callback . Если существующие элементы массива изменятся, значения, переданные в функцию callback , будут значениями на тот момент времени, когда метод forEach() посетит их; удалённые элементы посещены не будут. Если уже посещённые элементы удаляются во время итерации (например, с помощью shift() ), последующие элементы будут пропущены. ( Смотри пример ниже )
Примечание: Не существует способа остановить или прервать цикл forEach() кроме как выбрасыванием исключения. Если вам необходимо такое поведение, метод forEach() неправильный выбор.
Досрочное прекращение может быть достигнуто с:
- Простой цикл for
- Циклы for. of / for. in
- Array.prototype.every()
- Array.prototype.some()
- Array.prototype.find()
- Array.prototype.findIndex()
Если нужно протестировать элементы массива на условие и нужно вернуть булево значение, вы можете воспользоваться методами every() , some() , find() или findIndex() .
Метод forEach() выполняет функцию callback один раз для каждого элемента массива; в отличие от методов every() и some() , он всегда возвращает значение undefined .
Примеры
Нет операции для неинициализированных значений (разреженные массивы)
const arraySparse = [1, 3, , 7]; let numCallbackRuns = 0; arraySparse.forEach((element) => console.log(element); numCallbackRuns++; >); console.log("numCallbackRuns: ", numCallbackRuns); // 1 // 3 // 7 // numCallbackRuns: 3 // комментарий: как вы видите пропущенное значение между 3 и 7 не вызывало функцию callback.
Конвертируем цикл for в forEach
const items = ["item1", "item2", "item3"]; const copy = []; // до for (let i = 0; i items.length; i++) copy.push(items[i]); > // после items.forEach(function (item) copy.push(item); >);
Печать содержимого массива
Примечание: Для отображения содержимого массива в консоли вы можете использовать console.table() , который выводит отформатированную версию массива.
Следующий пример иллюстрирует альтернативный подход, использующий forEach() .
Следующий код выводит каждый элемент массива на новой строке журнала:
function logArrayElements(element, index, array) console.log("a[" + index + "] token operator">+ element); > // Обратите внимание на пропуск по индексу 2, там нет элемента, поэтому он не посещается [2, 5, , 9].forEach(logArrayElements); // логи: // a[0] = 2 // a[1] = 5 // a[3] = 9
Использование thisArg
Следующий (надуманный) пример обновляет свойства объекта, когда перебирает записи массива:
function Counter() this.sum = 0; this.count = 0; > Counter.prototype.add = function (array) array.forEach((entry) => this.sum += entry; ++this.count; >, this); // ^---- Note >; const obj = new Counter(); obj.add([2, 5, 9]); obj.count; // 3 obj.sum; // 16
Поскольку в forEach() передан параметр thisArg ( this ), он затем передаётся в callback при каждом вызове. И callback использует его в качестве собственного значения this .
Примечание: Если при передаче callback функции используется выражение стрелочной функции , параметр thisArg может быть опущен, так как все стрелочные функции лексически привязываются к значению this .
Прерывание цикла
Следующий код использует Array.prototype.every() для логирования содержимого массива и останавливается при превышении значением заданного порогового значения THRESHOLD .
var THRESHOLD = 12; var v = [5, 2, 16, 4, 3, 18, 20]; var res; res = v.every(function (element, index, array) console.log("element:", element); if (element >= THRESHOLD) return false; > return true; >); console.log("res:", res); // логи: // element: 5 // element: 2 // element: 16 // res: false res = v.some(function (element, index, array) console.log("element:", element); if (element >= THRESHOLD) return true; > return false; >); console.log("res:", res); // логи: // element: 5 // element: 2 // element: 16 // res: true
Функция копирования объекта
Следующий код создаёт копию переданного объекта. Существует несколько способов создания копии объекта, и это один из них. Он позволяет понять, каким образом работает Array.prototype.forEach() , используя функции мета-свойств Object.* из ECMAScript 5.
function copy(o) var copy = Object.create(Object.getPrototypeOf(o)); var propNames = Object.getOwnPropertyNames(o); propNames.forEach(function (name) var desc = Object.getOwnPropertyDescriptor(o, name); Object.defineProperty(copy, name, desc); >); return copy; > var o1 = a: 1, b: 2 >; var o2 = copy(o1); // теперь o2 выглядит также, как и o1
Модификация массива во время итерации
В следующем примере в лог выводится «one» , «two» , «four» .
При достижении записи, содержащей значение ‘two’ , первая запись всего массива удаляется, в результате чего все оставшиеся записи перемещаются на одну позицию вверх. Поскольку элемент ‘four’ теперь находится на более ранней позиции в массиве, ‘three’ будет пропущен.
forEach() не делает копию массива перед итерацией.
let words = ["one", "two", "three", "four"]; words.forEach((word) => console.log(word); if (word === "two") words.shift(); > >); // one // two // four
Выравнивание (уплощение) массива
Следующий пример приведён только для целей обучения. Если вы хотите выравнять массив с помощью встроенных методов, вы можете использовать Array.prototype.flat()
function flatten(arr) const result = []; arr.forEach((i) => if (Array.isArray(i)) result.push(. flatten(i)); > else result.push(i); > >); return result; > // Usage const nested = [1, 2, 3, [4, 5, [6, 7], 8, 9]]; flatten(nested); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
Полифил
Метод forEach() был добавлен к стандарту ECMA-262 в 5-м издании; поэтому он может отсутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать forEach() в реализациях, которые не поддерживают этот метод. Этот алгоритм является точно тем, что описан в ECMA-262 5-го издания; он предполагает, что Object и TypeError имеют свои первоначальные значения и что callback.call вычисляется в оригинальное значение Function.prototype.call() .
// Шаги алгоритма ECMA-262, 5-е издание, 15.4.4.18 // Ссылка (en): http://es5.github.io/#x15.4.4.18 // Ссылка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.18 if (!Array.prototype.forEach) Array.prototype.forEach = function (callback, thisArg) var T, k; if (this == null) throw new TypeError(" this is null or not defined"); > // 1. Положим O равным результату вызова ToObject passing the |this| value as the argument. var O = Object(this); // 2. Положим lenValue равным результату вызова внутреннего метода Get объекта O с аргументом "length". // 3. Положим len равным ToUint32(lenValue). var len = O.length >>> 0; // 4. Если IsCallable(callback) равен false, выкинем исключение TypeError. // Смотрите: http://es5.github.com/#x9.11 if (typeof callback !== "function") throw new TypeError(callback + " is not a function"); > // 5. Если thisArg присутствует, положим T равным thisArg; иначе положим T равным undefined. if (arguments.length > 1) T = thisArg; > // 6. Положим k равным 0 k = 0; // 7. Пока k < len, будем повторятьwhile (k len) var kValue; // a. Положим Pk равным ToString(k). // Это неявное преобразование для левостороннего операнда в операторе in // b. Положим kPresent равным результату вызова внутреннего метода HasProperty объекта O с аргументом Pk. // Этот шаг может быть объединён с шагом c // c. Если kPresent равен true, то if (k in O) // i. Положим kValue равным результату вызова внутреннего метода Get объекта O с аргументом Pk. kValue = O[k]; // ii. Вызовем внутренний метод Call функции callback с объектом T в качестве значения this и // списком аргументов, содержащим kValue, k и O. callback.call(T, kValue, k, O); > // d. Увеличим k на 1. k++; > // 8. Вернём undefined. >; >
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.foreach |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.find()
- Array.prototype.findIndex()
- Array.prototype.map()
- Array.prototype.every()
- Array.prototype.some()
- Map.prototype.forEach() (en-US)
- Set.prototype.forEach()