Список задач по Java для начинающих
Если вы начинающий Java программист то вам обязательно нужно ознакомится и выполнить все задания из этого списка.
Условные операторы
1. Найти наибольшее значение из двух переменных, трех, четырех, описать общий принцип для большего числа
2. Если а – четное посчитать а*б , иначе а+б
3. Определить какой четверти принадлежит точка с координатами (х,у)
4. Найти суммы только положительных из трех чисел
5. Посчитать выражение макс(а*б*с, а+б+с)+3
6. Есть два конверта со сторонами (а,б) и (с,д) определить, можно ли один конверт вложить в другой
7. Отсортировать значения двух, трех, четырех переменных используя только условные операторы
8. Написать программу определения оценки студента по его рейтингу, на основе следующих правил:
рейтинг Оценка
9. Проанализируйте следующий фрагмент кода. Какой результат будет при a =2 и b= 4 ?
Путем минимальных изменений модифицируйте код таким образом, чтобы на экране было напечатано
134 (при a =2 и b= 4)
4 (при a =2 и b= 44)
14 (при a =2 и b= 4)
1 (при a =2 и b= 4)
Циклы
1. найти сумму четных чисел и их количество в диапазоне от 1 до 99
2. Проверить простое ли число? (число называется простым, если оно делится только само на себя и на 1)
3. Вывести на экран квадрат, со стороной а
4. Вывести шахматную доску с заданными размерами, по принципу:
5. Напишите программу, которая определяет, является ли введенное число палиндромом? (Палиндром – число или текст, которые одинаково читаются слева направо и справа налево)
6. Вывести все простые числа в диапазоне от 2 до n
7. Вывести все натуральные числа, квадрат которых больше меньше заданного числа n
8. Вывести все делители числа
9. Найти корень натурального числа с точностью до целого (рассмотреть переборный вариант, и метод бинарного поиска)
10. Теорема Пифагора: вывести все прямоугольные треугольники, стороны которых – натуральные числа меньше 1000, посчитать их количество(по теореме Пифагора у прямоугольного треугольника сумма квадратов катетов равна квадрату гипотенузы). Подсказка: использовать полный перебор с трижды вложенными циклами.
11. Вычислить факториал числа n. n! = 1*2*…*n-1*n;
12. Вычислить среднее значение чисел, не являющихся простыми, в диапазоне от 1 до n.
13. Посчитать сумму цифр заданного числа
14. Вывести число, которое является зеркальным отображением последовательности цифр заданного числа, например, задано число 123, вывести 321.
15. Вставить цифру в число не прибегая к строковым преобразованиям.
Одномерные массивы
- Найти минимальный элемент массива
- Найти индекс максимального элемента массива
- Посчитать сумму элементов массива с нечетными индексами
- Найти наиболее часто встречающееся значение
- Сделать реверс массива (массив в обратном направлении)
- Найти все элементы, которые меньше среднего значения
- Обработать массив таким образом, чтобы сначала были элементы меньше среднего, потом больше
- Проверить является ли массив палиндромом?
- Посчитать количество нечетных элементов массива
- Найти все элементы массива, для которых делителем является хотя бы один из элементов массива.
- Поменять местами первую и вторую половину массива, например, для массива 1 2 3 4, результат 3 4 1 2
- Вывести элементы массива в следующем порядке: первый, последний, второй, предпоследний и т.д. Какие особые случаи необходимо обработать?
- Вывести элементы массива в следующем порядке: первый, средний, второй, средний + 1 и т.д.
- Заполнить массив из 100 элементов числами по следующей формуле Ai = (Ai-1*d)%m (A0,d,m – произвольные константы
- Отсортировать массив (пузырьком, выбором, вставками)
- Заполнить массив из 3*n элементов числами от 1 до n. Создать массив из n элементов, каждый из которых будет содержать количество вхождений (частоту) чисел от 1 до n в исходном массиве.
Функции
- Написать функцию, которая будет возвращать номер четверти, в которой находится точка с координатами (x,y). (координаты – аргументы функции)
- Написать функцию, которая возвращает факториал числа N (аргумент функции)
- Написать функцию, которая возвращает строковое название дня недели по номеру дня.
- Написать программу, которая выведет число N (от 0 до 1000), написанное прописью.
- Написать функцию, которая находит расстояние между двумя точками в двумерном декартовом пространстве.
- Написать функцию, которая возвратит строковое представление числа N(dec) в двоичном, шестнадцатеричном форматах.
- Написать, функцию, которая вернет число по строке с записью числа в двоичной форме.
Рекурсия
- Написать функцию рекурсивного расчета факториала числа.
N! = N * (N-1)!
Написать рекурсивную функцию расчета чисел Фибоначчи. Числа Фибоначчи рассчитываются по формуле:
F(i) = F(i-1) + F(i-2), F(0) = 1, F(1) = 1.
Построить диаграмму вызовов функции F.
Написать рекурсивную функцию, которая вычисляет a^n , где a,n – целые числа. (Подсказка: a^2n = (a^n)^2
Найти наибольшее значение из двух переменных, трех, четырех, описать общий принцип для большего числа
Хорошая задача, но она мало чем отличается от задачи №7 из темы «Условные операторы», описанной выше.
Если вас интересует ее решение — то «для большего числа» целесообразно использовать любой метод сортировки массива.
Источник
Задачи для начинающих Java программистов
В продолжение моего поста «Начинающим Java программистам» публикую очередную свою шпаргалку, а именно список задач, которые я обычно даю новичкам. Опытным разработчикам они покажутся тривиальными, а только начинающим изучать Java, причём самостоятельно, надеюсь будут в самый раз. Так же если Вы используете какие-то ещё задачи для обучения, то поделитесь ими, пожалуйста.:) Так как мне, иногда, как-то не по себе в . -цатый раз рассказывать стажёрам одну и ту же задачу — пусть даже они её слышат впервые:)
Задачи выстроены в порядке увеличения сложности. Каждая задача так же имеет несколько степеней «развития», каждая из которых нацелена на привлечение новых пакетов и т.д.
Задача: Аналог grep
Необходимо реализовать консольную программу, которая бы фильтровала поток текстовой информации подаваемой на вход и на выходе показывала лишь те строчки, которые содержат слово передаваемое программе на вход в качестве аргумента.
Варианты усложнения:
- Программа не должна учитывать регистр
- В аргументах может быть передано не одно слово, а несколько
- В качестве аргумента может быть задано не конкретное слово, а регулярное выражение
Задача: Аналог Sort
Написать консольную программу, которая бы сортировала текст поданный ей на стандартный вход по алфавиту.
Варианты усложнения:
- Программа должна игнорировать регистр при сортировке
- Программа должна сортировать не по алфавиту, а по количеству символов в строке
- Программа в качестве аргумента может получать порядковый номер слова в строке, по которому надо сортировать строки
Задача: чат
Задача состоит из этапов, в конце которых должен получиться стандартный консольный чат.
- Реализовать консольную программу, которая бы открывала серверный сокет на порту 1234. При подключении клиента программа должна выводить все то, что передал клиент. Удостовериться в работоспособности можно попробовав подключиться с помощью системной программы telnet. В дальнейшем будем эту программу называть серверной частью
- Усложнить программу и сделать так, чтобы можно было подключиться одновременно нескольким клиентам посредством telnet
- Реализовать другую консольную программу, которая по сути была бы аналогом telnet — т.е. подключалась к заданному IP на порт 1234 и отправляла бы на сервер строчку введённую пользователем по нажатию enter. В дальнейшем будем эту программу называть клиентской частью или просто клиентом
- Усложнить серверную часть программы таким образом, чтобы пришедшее сообщение от одного пользователя отправлялось сразу всем пользователям, которые подключены в данный момент к серверу
- Усложнить серверную часть программы так, чтобы при подключении нового пользователя ему показывались последние 10 сообщений
- При запуске клиентская часть должна спрашивать у пользователя его имя. В дальнейшем при отсылке сообщений на сервер должен использоваться следующий шаблон: «Имя пользователя: текст»
- До этого момента сообщения между сервером и клиентом — обычный текст. Это с трудом позволяет передавать так же сопроводительную информацию например: имя пользователя, дату приёма сообщения сервером и т.д. В этом задании необходимо перевести обмен информации на использование Serialization. Т.е. обмен информацией между клиентом и сервером должно производится посредством сериализованного класса Message, который в свою очередь содержит помимо текста дополнительную атрибутику: дата создания сообщения, имя пользователя, IP отправителя, режим в котором находится отправитель (как в аське: сплю, ем, работаю:) )
- Дописать серверную часть таким образом, чтобы она следила за количеством подключённых пользователей и не позволяла подключаться большему количеству пользователей нежели 10
- На данный момент многие параметры сервера прописаны в коде самой программы, например: порт на котором открывать сервер, количество сообщений выдаваемых при подключении, максимальное количество подключённых пользователей и т.д. Перенести все эти конфигурационные параметры в XML файл.
- Сервер должен позволять подключаться только тем пользователям, которые знают соответствующий пароль для их имени пользователя. Для этого при запуске клиент должен спрашивать так же и пароль. А сервер при подключении нового пользователя должен сверять имя пользователя/пароль с имеющимися данными в конфигурационном файле. Если пароль не подходит, или такой пользователь не существует, то сервер должен отключить клиента с соответствующим сообщением.
Задача: Java Command Line (JCL)
Данная задача обычно дается мной в качестве зачетной по всему курсу J2SDK.
Реализовать консольную программу на Java, которая бы представляла некую реализацию командной строки, то есть могла бы выполнять команды вводимые построчно пользователем. Под командой понимается следующая строка:
«имя команды» «аргумент №1» «аргумент №2» . «аргумент №N»
Код, который выполняет необходимую команду пользователя, должен оформляться как отдельный Java класс. Соответствие между классом и именем команды должно задаваться в конфигурационном (XML) файле программы. Команда во время выполнения может так же взаимодействовать с пользователем используя стандартный ввод/вывод.
Программа должна поддерживать следующие команды:
- dir — выводит список файлов в текущей директории
- cd «путь» — перейти в директорию, путь к которой задан первым аргументом
- pwd — вывести полный путь до текущей директории
Варианты усложнения:
- Программа должна поддерживать команду «! имя_системной_программы аргумент№1… аргумент№N», которая запускает системную программу с соответствующими аргументами — так же ввод JCL должен подаваться на вход системной программы и тоже самое с ее выводом
- Программа должна поддерживать следующий синтаксис: «команда1 аргументы && команда2 аргументы» и «команда1 аргументы || команда2 аргументы». В первом случае «команда2» запускается только если «команда1» выполнилась успешно. Во втором случае «команда2» запускается только тогда, когда выполнение «команда1» завершилось не успешно
- Программа должна поддерживать возможность запускать команды в фоновом режиме. Для этого достаточно в конце командной строчки ввести знак «&». Так же программа должна поддерживать команду «jobs», которая выводит список задач, которые выполняются в фоне
- Реализовать возможность запускать программу в сетевом варианте: т.е. программа открывает порт и работать с ней можно используя обычный telnet с отдалённой машины. Программа должна поддерживать подключение сразу нескольких пользователей, а так же команды who и write, которые показывают кто подключён и посылают сообщение всем соответственно.
Источник
Хитрые задачи по Java
Совсем недавно я сдал OCA Java SE 7 Programmer I. За время подготовки успел решить огромное количество задач и извлечь из них много тонких моментов языка. Самые интересные и ловкие — сохранял на будущее. И вот у меня накопилась небольшая личная коллекция, лучшую часть которой я здесь и опишу.
В замечательной статье Знаешь ли ты JAVA, %username% и её второй части автор тоже поделился опытом после подготовки. Однако я пришёл к выводу, что могу добавить что-то своё. Так и зародилась эта статья.
Задачи
Итак, начнём. Я разбил все хитрости на маленькие задачки, которые составил специально для вас. Тонкости языка выделяются в чистом виде — без лишних наворотов и заблуждений, как это было в тестах. Также я рекомендую вам сначала ответить на вопрос с точностью до символа и записать куда-нибудь, а потом уже смотреть правильный ответ. Интересно, сколько пользователей, решивших этот тест, ответит больше чем на половину? И не забывайте, что все эти примеры ориентированы на Java 7.
1)Скомпилируется ли данный код и если да — то каким будет вывод?
Я специально выключил подсветку — чтобы не было заметно подвоха. Иначе последняя буква визуально выделялась бы — а в ней вся соль вопроса.
В английском языке строчная буква l очень похожа на цифру 1. И этим примером я хочу вас предостеречь — никогда не используйте l маленькую для обозначения long-литералов, хотя Java это позволяет. И вообще не используете её там, где потенциально может быть единица. Просто возьмите за правило использовать прописную L, как это и делает большинство программистов.
Если посмотреть внимательно, то можно заметить, что единицы визуально чуточку отличаются. Совсем капельку. Но мы же с вами хотим продумать всё до мелочей, не так ли?
Вывод будет — 201, а не 2011, как может показаться на первый взгляд.
Заблуждение обычно вызывают две «лишних» запятых в конце.
Когда я первый раз увидел такой код в одном из тестов, я твёрдо решил, что код не скомпилируется — и оказался не прав. Некоторые из вас могут предположить, что не указанные элементы будут заполнены значением по-умолчанию — и это будет тоже неверно.
А вывод будет простой — [[1, 2, 3], [0, 0, 0]]. Получается, что компилятор просто игнорирует одну лишнюю запятую в конце массива. Причём именно одну — две подряд уже вызовут ошибку компиляции.
Описание этой ситуации я без проблем нашёл в спецификации языка — A trailing comma may appear after the last expression in an array initializer and is ignored.
А на практике — сделано для удобства при ручном копировании из одного массива в другой. Если бы компилятор не позволял ставить лишнюю запятую — то в некоторых случаях приходилось бы добавлять запятую в конце, когда мы копируем и вставляем значения из одного массива в конец другого — или удалять лишнюю в конце.
Вы наверно будете уверены в том, что этот код не скомпилируется. А вот и нет! он вполне рабочий.
Когда я изучал Java, я сразу взял на заметку, что из подчёркиваний и экспоненциальной формы для HEX можно сделать что-то дикое. Этот пример, конечно же, не для использования в реальных проектах — а для тренировки ваших знаний. Я думаю, это самый сложный пример и изюминка статьи. Первые два были лёгкой разминкой. Кто-нибудь ответил правильно с первого раза?
В этом примере заключены два интересных момента. Первое — это название переменной. Называть переменную долларом весьма забавно. Но никогда, никогда так не делайте в реальных проектах. Хотя компилятор не запрещает такой подход — он не рекомендован, так как доллар используется в технических целях. Например, для наименования анонимных и вложенных классов. MyClass$MyInnerClass, или же MyClass$1. И можно без труда устроить коллапс имён — один класс назвать просто MyClass$MyInnerClass, а другой — MyClass с вложенным MyInnerClass — и они будут иметь одинаковое имя. Так что включать в свои переменные доллар — не рекомендуется.
Также вполне корректен такой код
А теперь давайте разберём второй момент — непосредственно сам литерал. Я наворотил его, как только мог. Для начала легко заметить, что это число записано в шестнадцатеричной форме. Но ведь она допускает только A,B,C,D,E,F в качестве букв — кажете вы. Откуда тогда P? И причём тут знак подчёркивания?
Обо всём по-порядку. F в конце означает, что этот литерал — типа float. И у нас он автоматически приводится к типу double. Далее очень интересный момент — P2. Если мы хотим записать шестнадцатеричное число в экспоненциальной форме — мы не сможем использовать E+N, потому что E у нас может использоваться в самом числе и может возникнуть неоднозначность. Зато никто не мешает нам использовать BinaryExponentIndicator — указываем p и степень. Число будет умножено на 2 в указанной степени. В данном случае — на 4.
А вот символ подчёркивания — очень удобное нововведение Java 7. Мы просто можем вставлять его в число и разделять им, например, разряды, или группировать цифры. Компилятор его просто вырежет — он нужен для более удобного чтения, не более.
Итак, чтобы точно ответить на вопрос, нам нужно вспомнить, что System.out.print выводит переменную типа double в обычной, десятичной форме. Следственно, нам нужно перевести из шестнадцатеричного вида в десятичный. Это уже совсем тривиальная задача. DE16 = 22210. Далее, умножаем 222 на 2 2 и получаем 888. Наконец не забываем, что для типа double при отсутствии дробной части дописывается точка и ноль. Вот и ответ — 888.0.
Первое, что бросается в глаза — это использование точек с запятой там, где их можно не использовать. Например после объявления класса (как в С++). Или же между членами класса. Зачем компилятор дал возможность ставить их там — я так и не выяснил. Но это вполне допустимо.
Имя метода — вполне допустимый идентификатор. А вот возвращаемый тип здесь не short а массив из short. Компилятор разрешает 2 формы объявления массива — квадратные скобки до идентификатора и после. Причём первый случай предназначен как-раз для метода. А что если попробовать второй случай для метода? Он тоже корректен, но выглядит ужасно, поэтому никогда не используйте его в реальных проектах. Но такая возможность есть.
Далее — внутри метода просто два вложенных блока кода, которые можно безболезненно убрать. И в итоге — метод просто возвращает массив из short длинной в 7 элементов, который инициализируется нулями и элемент с индексом 2 равен 0. Ах да, 007 — это восьмеричный литерал. Но это тоже ни на что не влияет.
Внимательные читатели заметят, что в названии метода присутствует русская буква б. Мало того, что Java позволяет полностью писать название идентификаторов на языках, отличных от английского, так мы ещё можем перемешивать буквы из разных языков.
Важный момент, который я хотел донести до вас — можно случайно напечатать не тот символ из другого языка и потом долго и мучительно искать ошибку. Например, английская a и русская а визуально неотличимы (по крайней мере, в этом шрифте). Если единицу можно отличить от l хоть как-то, то тут всё значительно хуже. Представьте себе ситуацию — вы по каким-либо причинам случайно в конце в названии класса или метода набрали русскую букву вместо английской. Или что более вероятно — редактировали уже существующее латинское название с русской раскладкой. Похожих букв между этими языками довольно много, так что шанс ошибиться вполне есть. Автозаполнение будет вставлять интернациональный идентификатор и всё будет отлично работать. Но вот если вы попробуете вызвать метод или получить класс через рефлексию — получите ошибку, которую будет не так просто обнаружить. Скорее, вы будете искать её в другом, так как названия будут визуально совпадать — потеряете время и силы.
Я хотел добавить ещё один пример, в котором два на внешний вид одинаковых идентификатора будут содержать внешне идентичные буквы из разных алфавитов, но по коду разные и посему идентификаторы будут также разные. И заставить объяснить, почему код вызывает ошибку компиляции. Но это было бы слишком жестоко — на вид подвох никак не заметить.
Далее — мы вызываем статический метод довольно оригинально — приводим null к типу Main. И это не вызовет ошибки времени выполнения! Дело в том, что вызов статических методов разрешается на этапе компиляции и зависит только от типа объекта.
В комментариях к данной статье пользователь Yurevich1 привёл пример из реального проекта:
Как-то в проекте поставил в классе переменную «с» по-русски. Где-то час убил, чтобы понять, в чём ошибка и проект в другой части кода ругается на как бы ту же самую переменную c, которая уже на английском.
Итак, вот вам ещё один пример кода, который на первый взгляд вводит в заблуждение. Для начала вас должно смутить казалось бы следующее два раза друг за другом объявление массива из оболочек для байтов. Однако если вы внимательно изучали язык, вы должны знать, что есть два способа объявления массива — с квадратными скобками до имени и после. Более того, никто не мешает нам использовать эти два способа одновременно — перед вами просто двумерный массив.
Далее вас должно смутить имя массива, которое полностью совпадает с именем класса. Java позволяет называть локальные переменные классами стандартной библиотеки, при этом они будут перекрывать классы. Однако компилятор у Джавы умный. Очень умный. Он сообразит, что после оператора new может следовать только класс, да и перед .class — тоже. И в том контексте будет подразумеваться именно класс Byte, хотя имя экземпляра должно его перекрывать.
Итоги
Мне нравится Java за её жёсткую стандартизованность. Спецификация определяет практически все тонкости с очень большой точностью. А значит — изучив эти тонкости один раз — вы сможете работать с ними везде.
Хочу добавить, что скрин кода над катом взят из IDEA. Схему подсветки я сам разработал и использую её преимущества по максимуму. Если кому понравилась — могу скинуть.
Я готовился по нескольким разным системам тестирования. Для начала, хорошим сайтом будет Quizful. Тесты «Java-Основы» и «Java-средний уровень» содержат очень большое количество полезных задач. Далее — очень хороши тесты от ExamLab — гонял по ним SCJP 6. И наконец — для самого экзамена — Enthuware.
После прохождения многочисленных тестов и решения задач «в уме» я стал приятно удивлён, каким комфортным и эффективным стало написание кода. Тесты очень хорошо систематизируют и организуют знания. Я стал предвидеть в уме многие ошибки, а также выбирать лучшие решения. И не пожалел, что выучил некоторую часть API, хотя сначала считал что не следует помнить названия методов и классов наизусть. Я считаю Java одним из лучших языков в мире и рекомендую тесты для его углублённого изучения. А Java SE 7 Programmer I был совсем не сложным — без труда набрал 96 из 100 баллов. Кто собирается сдавать — могу дать пару советов — напишите в личку.
Источник