|
Вопросы по информатике. Программа это последовательность инструкций, предназначенных для выполнения компьютером
№ 1. Алгоритм - точная последовательность команд, выполняемая за конечное время.
Свойства алгоритма:
1. Дискретность - отдельные шаги, которые последовательно выполняются;
2. Понятность для исполнителя;
3. Детерменированность - одинаковый результат при одинаковых данных
4. Конечность - алгоритм закончится через определенное количество шагов.
5. Многократность - программа подходит для разных данных
6. Определенность - каждый шаг алгоритма должен быть четко и недвусмысленно определен не должен допускать произвольной
7. Корректность - дает верное решение, результативность. Программа - это последовательность инструкций, предназначенных для выполнения компьютером.
Алгоритм на формальном языке Команда - это указание компьютерной программе действовать как некий интерпретатор для решения задачи. (Описание действий) Правила написания кода:
1. Понятные имена для переменных, переменные не должны начинаться с чисел и знаков;
2. Комментарии кода;
3. Нет - повторам кода, для повторного использования уже имеющихся строк есть функции и структуры.
4. Проверяйте код на ошибки и правильность оформления. № 2. Способы записи алгоритма программы -
1. Графический (блок-схемы)
2. Словесный (запись на естественном языке)
3. На формальном языке (языки программирования) - Компьютерный программы.
Этапы разработки программы:
1. Создание идеи
2. Определение входных и выходных данных и требований к программе.
Язык (требования к железу и т.д.)
3. Разработка алгоритма.
4. Кодирование программы - перевод алгоритма программы на язык компьютера (скорее на промежуточный язык. Т.к. язык компьютера - это байт код)
5. Компиляция и отладка
Компиляция - преобразовании кода программы в машинный код (по итогу получается exe файл)
Отладка - поиск и решение синтаксических, алгоритмических ошибок и ошибок времени исполнения.
Данный этап тесно связан с компиляцией и тестированием.
6. Тестирование. Так же тестирование может выполняться во время отладки программы.
7. Документирование. № 3. Языки программирования низкого и высокого уровня Языки бывают: Компилируемыми (когда программа компилируется в машинный код), и интерпретируемыми (js, python. Интерпретатор выполняет эти программы без естественного перевода в байт код) Встраиваемые языки.
Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime. Языки низкого уровня: Первые компьютеры приходилось программировать двоичными машинными кодами. Однако программировать таким образом — довольно трудоемкая и тяжелая задача. Для упрощения этой задачи начали появляться языки программирования низкого уровня, которые позволяли задавать машинные команды в понятном для человека виде. Для преобразования их в двоичный код были созданы специальные программы — трансляторы.
Трансляторы делятся на: компиляторы — превращают текст программы в машинный код, который можно сохранить и после этого использовать уже без компилятора (примером является исполняемые файлы с расширением *.exe).
интерпретаторы — превращают часть программы в машинный код, выполняют его и после этого переходят к следующей части. При этом каждый раз при выполнении программы используется интерпретатор. Примером языка низкого уровня является ассемблер. Языки низкого уровня ориентированы на конкретный тип процессора и учитывают его особенности, поэтому для переноса программы на ассемблере на другую аппаратную платформу её нужно почти полностью переписать. Определенные различия есть и в синтаксисе программ под разные компиляторы. Правда, центральные процессоры для компьютеров фирм AMD и Intel практически совместимы и отличаются лишь некоторыми специфическими командами. А вот специализированные процессоры для других устройств, например, видеокарт и телефонов содержат существенные различия.
Языки низкого уровня, как правило, используют для написания небольших системных программ, драйверов устройств, модулей стыков с нестандартным оборудованием, программирование специализированных микропроцессоров, когда важнейшими требованиями являются компактность, быстродействие и возможность прямого доступа к аппаратным ресурсам. Ассемблер — язык низкого уровня, широко применяется до сих пор. Языки программирования высокого уровня Особенности конкретных компьютерных архитектур в них не учитываются, поэтому созданные приложения легко переносятся с компьютера на компьютер. В большинстве случаев достаточно просто перекомпилировать программу под определенную компьютерную архитектурную и операционную систему. Разрабатывать программы на таких языках значительно проще и ошибок допускается меньше. Значительно сокращается время разработки программы, что особенно важно при работе над большими
программными проектами.
Сейчас в среде разработчиков считается, что языки программирования, которые имеют прямой доступ к памяти и регистров или имеют ассемблерные вставки, нужно считать языками программирования с низким уровнем абстракции. Поэтому большинство языков, считавшихся языками высокого уровня до 2000 года сейчас уже таковыми не считаются. Java — сильно типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре с помощью виртуальной Java-машины. Сборка мусора в java заключается в том, что программисту не нужно следить за тем как распределяется память программы. Т.к. сборщик мусора автоматически решает многие проблемы, например очищает неиспользуемые переменные. Отладка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится: узнавать текущие значения переменных;
выяснять, по какому пути выполнялась программа. Существуют две взаимодополняющие технологии отладки. Использование отладчиков — программ, которые включают в себя пользовательский интерфейс для пошагового выполнения программы.
Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода. Методы отладки программы: Метод ручного тестирования.
При обнаружении ошибки необходимо выполнить тестируемую программу вручную, используя тестовый набор, при работе с которым была обнаружена ошибка. Метод индукции.
Анализ ошибки исходя из последних действий совершенных пользователем. Из полученных данных мы можем составить список предполагаемых ошибок и проверить их. Метод дедукции.
По методу дедукции вначале формируют множество причин, которые могли бы вызвать данное проявление ошибки. Затем анализируя причины, исключают те, которые противоречат имеющимся данным. Если все причины исключены, то следует выполнить дополнительное тестирование исследуемого фрагмента. Метод обратного прослеживания.
Для небольших программ эффективно применение метода обратного прослеживания. Начинают с точки вывода неправильного результата. Для этой точки строится гипотеза о значениях основных переменных, которые могли бы привести к получению имеющегося результата. Далее, исходя из этой гипотезы, делают предложения о значениях переменных в предыдущей точке. Процесс продолжают, пока не обнаружат причину ошибки. Виды ошибок: Логическая, синтаксическая, компиляции, среды выполнения, арифметическая, ошибка ресурса, взаимодействия № 4. Понятие переменной.
Переменна - поименованная, либо адресуемая иным способом область памяти, адрес которой используется для доступа к данным.
Ключевые и зарезервированный слова (java) - это те слова, которые использует ЯП (или планирует использовать).
# Название операторов, переменных и т.д.
Некоторые слова могут быть зарезервированны, но при этом они не используются ЯП
# goto, const, enum. Простые типы данных:
1. Целые числа: byte, short, int, long - представляют собой числа со знаком.
2. Числа с плавающей точкой - эта группа включает себе float и double - эти типы хранят числа с точностью до определенного знака после запятой
3. Символы - в эту группу входит типа char
4. Булевы значения -boolean - хранит значения типа "истина/лож" Объявление переменных
имя_типа идентификатор [=значение] [, идентификатор [=значение] ] ;
# int a = 12, b = 456, c, d = 345_345_117;
c = 12; // присвоим значение уже после = - оператор присваивания Порядок операторов: 1 ()
2 !
3 * / %
4 + -
5 >> >>> <<
6 > >= < <=
7 == !=
8 &
9 ^
10 |
11 &&
12 || № 5. Целые типы данных - integer, long, byte, short
Ширина типа данных - это диапазон чисел, который включает в себя тот или иной тип данных.
Операции над примитивными типами:
# a = 3; операция присваивания
a = -3; операция смены знака на -
a++; a--; инкремент и декремент. Бывают постфиксные и префиксные. Постфиксный выполняется до операции, а префиксный после операцией
Сокращенная запись операций:
a *= 3; <==> a = a *3; То же можно проделать с остальными арифметическими действиями.
Определить выделить какую-то цифру в числе можно при помощи взятие остатка или целой части от числа:
# 1234 % 10; Ответ - 4, остаток от деления
1234 / 1000; Ответ - 1, целая часть от деления Константы Кроме переменных, в Java для хранения данных можно использовать константы. В отличие от переменных константам можно присвоить значение только один раз. Константа объявляется также, как и переменная, только вначале идет ключевое слово final:
# final int LIMIT = 5;
System.out.println(LIMIT); // 5
№ 6. Обмен значений переменных
Прямой обмен при помощи 3ех переменных
int a = 2;
int b = 3;
int tmp;
tmp = a;
a = b;`
b = tmp;
Обмен при помощи 2ух переменных
a = a + b;
b = a - b;
a = a - b;
Обмен при помощи исключающего или (XOR)
#
int x = 5, y = 7; x = x^y; // x == 2
y = x^y; // y == 5
x = x^y; // x == 7
#
public static void swap_opt(int a, int b) {
//Пример для a = 101 (в двоичной системе) и b = 110
a = a ^ b; // a = 101^110 = 011
b = a ^ b; // b = 011^110 = 101
a = a ^ b; // a = 011^101 = 110 System.out.println("a: " + a);
System.out.println("b: " + b);
}
или в более короткой записи: y ^= (x ^= y);
x ^= y; Инкремент и декремент Операторы инкремента и декремента это унарные операторы, которые увеличивают или уменьшают на единицу значение операнда при использовании инкремента и декремента соответственно Различают префиксную и постфиксную форму для обоих операторов. Префиксная форма сначала изменяет значение операнда на 1 и использует новое значение для дальнейших вычислений. Постфиксная форма сначала использует старое значение операнда, а затем изменяет его на 1
Префиксный оператор инкремента:
int i = 1;
int m = 2 * ++i; // результат m = 4 Постфиксный оператор инкремента:
int i = 1;
int m = 2 * i++; // результат m = 2 Префиксный оператор декремента:
int i = 2;
int m = 2 * --i; // результат m = 2 Постфиксный оператор декремента:
int i = 2;
int m = 2 * i--; // результат m = 4
Переполнение стека System.out.println("[" + Byte.MIN_VALUE +" , " + Byte.MAX_VALUE + "]");
System.out.println("Byte.SIZE = " + Byte.SIZE);
byte b = 120;
b += 19;
System.out.println(b); Вывод на консоль:
[-128 , 127] - Границы типа byte
Byte.SIZE = 8
-117 После прохождения границ числу присваивается максимальное отрицательное/положительное число.
То есть отчет происходит по новой. Целые типы (byte, int) знаковые, т.е. могут быть, положительными и отрицательными. ПК не может запомнить минус => изменяется старший бит (1 — число отрицательное, 0 — положительное).
Пример:
Переведем числа 120, 19 и -117 в двоичную систему:
120(10) = 0111 1000
19(10) = 0001 0011
-117(10)= 1000 1011 Т.к. у нас старший бит отвечает за знак, то остается 27 — 1 символов для положительной части, и 28 для отрицательной.
Складывая 120 и 19 мы получаем для 8 разрядом число -117 №7. Типы данных с плавающей точкой. Java использует два типа чисел с плавающей запятой: float и double. Тип double в два раза больше чем float. Поэтому double известен как число с двойной точностью, а float – как число с одинарной точностью. Обычно вам следует использовать тип double, поскольку он более точен чем тип float. float -32 бита
double 64 бита Константы с плавающей точкой Это могут быть константы равные математическим велечинам - например число ПИ или E.
Константы типа float будут иметь пониженную точность Литералы с плавающей точкой по умолчанию являются значениями типа double. При включении значения типа float в программу за числом следует поставить символ f или F: double d = 6.02E23;
float f = 6.02e23f; В принципе литералы типа double можно тоже обозначать суффиксом d или D, но это особо не имеет смысла, так как вещественные литералы всегда по умолчанию double. Понятие бесконечности положительная бесконечность, выражаемая константой POSITIVE_INFINITY и возникающая при переполнении положительного значения, например в результате операции умножения 3.0*6e307 или при делении на нуль;
отрицательная бесконечность NEGATIVE_INFINITY, возникающая при переполнении отрицательного значения, например в результате операции умножения -3.0*6e307 или при делении на нуль отрицательного числа; Операции с бесконечностями выполняются по обычным математическим правилам. Во всем остальном вещественные типы — это обычные вещественные значения, к которым применимы все арифметические операции и операции сравнения. Бесконечности - это константы типа double NaN
"не число", записываемое константой NaN (Not a Number) и возникающее, например, при умножении нуля на бесконечность.
1) Строку конвертируем в число, а в ней есть буквы. Ответ – NaN
2) Бесконечность минус бесконечность. Ответ — NaN
3) Многие другие ситуации, где в ответе ждут число, а получается неизвестно что. — А какие операции можно производить с Infinity и NaN? — С NaN все очень просто. Любая операция, где есть NaN, дает в результате NaN. Точность вычислений - ?! Константы класса Math. Класс Math содержит методы, связанные с геометрией и тригонометрией и прочей математики. Методы реализованы как static, поэтому можно сразу вызывать через Math.methodName() без создания экземпляра класса. В классе определены две константы типа double: E и PI. Math.PI
Math.exp Методы класса Math: прямые трансцендентные, обратные трансцендентные, экспоненциальные. Пример Трансцендентные числа, то есть числа (вещественные или комплексные), которые не могут быть корнями никакого многочлена с целыми коэффициентами. Например,такие важнейшие константы анализа, как pi и e, являются трансцендентными
double sin(double arg)
| Возвращает синус угла arg, переданного в радианах
| double cos(double arg)
| Возвращает косинус угла arg, переданного в радианах
| double tan(double arg)
| Возвращает тангенс угла arg, переданного в радианах
|
sin(), cos(), sqrt() - тоже трансцендентные
Обратные трансцендентные функции
Метод
| Описание
| double asin(double arg)
| Возвращает угол, синус которого равен arg.
| double acos(double arg)
| Возвращает угол, косинус которого равен arg.
| double atan(double arg)
| Возвращает угол, тангенс которого равен arg.
| double atan2(double x, double y)
| Возвращает угол, тангенс которого равен x/y.
|
Экспоненциальные функции
Метод
| Описание
| double ехр(double arg)
| Возвращает экспоненту arg.
| double log(double arg)
| Возвращает натуральный логарифм arg.
| double log10(double arg)
| Возвращает логарифм по основанию 10 от arg.
| double pow(double y, double x)
| Возвращает y в степени x
| double sqrt(double arg)
| Возвращает квадратный корень из arg.
|
№8 функции округления. Генерация псевдослучайных чисел. Генерация целых и вещественных
чисел в заданном интервале. Int abs(число) — вернет абсолютное число
double ceil(число) — округляет в верхнюю сторону
double floor(число) — округляет в нижнюю сторону
double round(число) — округляет в ближайшую сторону
int max(a,b) — вернет большее из чисел
int min(a,b) — вернет меньшее из чисел Псевдослучайные числа Метод Math.random() - вернет псевдослучайное вещественное число из промежутка [0:1)
Целые числа в заданном интервале — 1 Целые числа в интервале [0, N-1] x = (int)(Math.random() * 100); // [0, 99] (int) говорит о том, что числа будут целыми
x = (int)(Math.random() * n); // [0, n-1]
x = (int)(Math.random() * z) + a; // [a, z-1+a]
x = (int)(Math.random() * (b — a + 1)) // [a, b] |
|
|