9

Программирование с нуля

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

Использовать будем си-подобный синтаксис, то есть подобный языку си, но не будем вникать в заголовочные файлы, указатели и другие особенности относительно низкоуровневых языков, перейдём на синтаксис более высокоуровневых языков, которые сделают рутинную работу за нас. А конкретно, будем использовать синтаксис языка Java.


Двоичная система счисления

Числа в двоичной системе счисления состоят всего из двух знаков. Нуля и единицы. 00000001 – число один. 00000010 – число два. 00000100 – число 4. Как вы можете заметить, когда единица смещается влево, число увеличивается в два раза. Чтобы получилось число 3, необходимо написать 00000011. Таким образом можно составить все необходимые числа. В данном примере мы использовали двоичное число с восемью знаками, иначе говоря число восьмиразрядное. Чем больше у числа разрядов, тем большее оно может вместить значение. Например, восьмиразрядное число вмещает максимальное значение 255, если считать ноль, тогда 256, а в программировании ноль считается всегда. Если увеличить разряд на один, получится девятиразрядное число и его вместимость увеличится в два раза, то есть станет 512. Но так в программировании никогда не делается и обычно каждая следующая разрядность увеличивается вдвое. Один разряд, потом 2 разряда, потом 4 разряда, потом 8 разрядов, потом 16 разрядов, потом 32 разряда и далее.


Шестнадцатеричная система счисления

Всё аналогично двоичной, только вместо нулей и единиц участвуют цифры от 0 до 15. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, где A – 10, B – 11, C – 12, D – 13, E – 14, F – 15.


Знак минус в программировании

Знак минус в двоичной системе счисления обозначается единицей в самом старшем разряде. Конечно же если число может быть минусовым (да, да, в программировании типы цифр бывают неминусовыми и включающим числа со знаком минус). 10000000 – число -1. Это не число -0, потому что минус нулей не бывает, то есть отрицательные числа смещаются влево на один. А вообще, в разных языках программирования может быть разное представление отрицательных чисел, но вам это знание вряд ли пригодится, поэтому пока что думайте, что всё так, как я объяснил.


Буквы и знаки

Буквы, знаки, смайлики и так далее обозначаются также числами. Буква А может быть числом 00000001 или любым другим, или даже комбинацией чисел в зависимости от кодировки символов. Кодировок много.


Типы данных

В программировании есть типы данных. Числовые, такие как 233, которые разобрали выше. Называются почти везде int, от слова integer. С плавающей запятой, такие как 198,76, называются почти везде float. У букв тип char, у строк тип String. Тип bool имеет два значения – истина (true) и ложь (false). У этого типа реализация в разных языках разная, но самая простая, когда ноль — значит ложь, а любое другое число истину. Нестандартные типы данных, такие как числа с фиксированной запятой, рассматривать не будем.


Применение

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


int value;


Это стандартное объявление примитивного типа.

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

Теперь мы можем использовать переменную по её имени.


value = 112;


Здесь мы присвоили переменной значение. В отличии от математики в программировании = значит взять значение справа и присвоить переменной слева. = — это знак/оператор присвоения.

Можно объединить объявление и присвоение, то есть сразу инициализировать переменную.


int value0 = 113;

char a = ‘a’;

String line = “line”;


Буквы выделяются одинарными кавычками, строки выделяются двойными кавычками. Числа типа int не выделяются.


float b = 3.14f;


К числам с плавающей запятой одинарной точности в конце добавляется f.


double c = 1.2;


К числам с плавающей запятой двойной точности ничего не добавляется.


Операторы

С помощью операторов можно складывать, вычитать и делать много других операций с переменными. Операторами являются +, -, *, / и другие. Да даже ; является оператором, говорящим, что выражение завершено.


После того как мы записали наше выражение, например сложения,


int a = 127;

int b = -12;

a + b;


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

Повторим ещё раз. Он берёт значение со своей правой стороны и присваивает его переменной в левой стороне. Это оператор =, и он не имеет ничего общего со знаком равно из математики.


int c = 12;

int d = 14;

int e = c + d;


Также у нас есть логические операторы, такие как < (меньше), > (больше), <= (меньше либо равно), == (равно), && (и), || (или) и другие.

Они сравнивают значения или выражения слева и справа, а после выдают истинность в виде типа bool, то есть true или false, и это значение также можно присвоить.


int f = 1;

int g = 4;

bool isTrue = g > f;


Оператор && (и) сравнивает два значения типа bool. Если слева true и справа true, тогда этот оператор возвращает значение true. В других случаях false.

Оператор || (или) возвращает истинность, если хоть одно значение истинно (true).


Комментарии

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

Однострочные комментарии открываются знаками // и заканчиваются в конце строки.


//Комментарий.

int maxCount;


Вторая строка уже не комментарий.


Есть также многострочные комментарии и другие, которые я рассматривать не буду.


Операторы ветвления

Оператор ветвления if


if(a < 154) {

a = a + 1;

}


Если переменная a меньше 154, то есть выражение истинно, выполняет код в фигурных скобках, потом программа выполняется дальше. Код в фигурных скобках называется блоком кода. Он нужен для того, чтобы сказать программе, что этот код принадлежит оператору и именно его нужно выполнить.

Оператор ветвления if можно расширить.


if(isTrue && isFalse){

b = b – 1;

} else {

b = b + 1

}


Если условие оператора истинно, выполняет первый блок кода, а если нет, тогда второй блок кода после else.


Оператор ветвления switch


switch(value){

case 0:

a = a + 1;

break;

case 1:

a = a + b;

break;

case 6:

b = b – a;

b = b – 1;

break;

default:

b = b + 1;

break;

}


Этот оператор сравнивает значение в круглых скобках со значениями после case. Если значения совпадают, выполняет выражение или выражения после case, доходит до оператора break, после выходит из цикла и продолжает программу дальше. Если ни одно значение не совпадает, выполняет выражение после default. default можно и не писать.


switch(value){

case 0:

a = a + 1;

break;

case 1:

a = a + b;

break;

}


Циклы

Цикл for

Циклы выполняют блок кода по кругу, пока определённое действие их не остановит.


for(int i = 32; i >=0; i = i – 1){

a = b + c + d;

}


За круглыми скобками в порядке очереди идут инициализация переменной, которая будет счётчиком, условие, при котором цикл выполняется вновь и вновь при истинности условия, выражение, которое выполняется после того, как выполнится блок кода цикла. То есть этот цикл будет выполняться снова и снова, пока переменная i больше либо равна нулю, и, начиная со второго выполнения цикла, значение переменной i будет уменьшаться на единицу. После того, как условие станет ложным, программа начнёт выполняться дальше.


Цикл while


while(i > 3){

i = i – 2;

}


Цикл while выполняется до тех пор, пока условие в круглых скобках истинно.

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


do{

i = i – 2;

} while(false);


Область видимости


int a = 4;

{

int b = 0;

b = a + b;

}


Также фигурными скобками определяется область видимости. Все переменные, объявленные внутри фигурных скобок, невидимы во внешней области, но внешняя область видна внутри фигурных скобок. Поэтому мы можем использовать внутри фигурных скобок внешние переменные, но не можем во внешней области использовать переменные, объявленные внутри внутренней области.


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

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


Массивы

Массивы – это набор значений одного типа. Они удобны, когда нам нужно что-то перечислить.


int[] items = new int[7];


Так выглядит обычное объявление массива. Сначала указываем нужный тип. Потом ставим квадратные скобки, этим говорим языку программирования, что объявляем массив. Далее вписываем его имя. После знака присвоения вписываем выражение инициализации, то есть создания массива. Там мы видим новый оператор new, который используется при создании массива. Если сказать проще, мы создаём семь переменных типа int и присваиваем их нашему массиву под именем items.

Мы создали массив с семью элементами, но обращаться к первому начинаем с 0. Поэтому последний элемент будет под индексом 6. Не забывайте об этом смещении.

Обращение к элементу массива и присвоение его переменной выглядит так


int a = items[0];


Вход в программу

Мы рассмотрели все основные моменты, чтобы хоть что-то понимать, поэтому теперь перейдём к написанию простой программы.

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


int addAndMultiplyByTwo(int a, int b){

return (a + b) * 2;

}


А это простейший метод, который сейчас разберём. В круглых скобках указываются входные параметры. Можете их представить, как уже объявленные переменные в блоке кода, которым мы можем присвоить значения извне. Внутри фигурных скобок первый оператор, который мы видим, это return. Он берёт значение справа, которое получается из выражения, и передаёт его вовне. Тип передаваемого вовне значения должен быть таким же, как указанный перед именем метода, то есть int.


int g = 6;

int z = addAndMultiplyByTwo(7, g);


Так метод вызывается и результат его выполнения передаётся в переменную z.


class HelloWorld {

public static void main(String args []) {

System.out.println("Hello World");

}

}


В этом примере сначала создаётся класс HelloWorld. Пока что думайте, что класс – это файл, в который мы записываем текст программы.

Далее идёт объявление метода main. По словам слева от его имени мы можем понять, что метод публичный (слово public), то есть мы можем вызвать его не только из этого класса, но и извне. По слову static мы можем понять, что метод статичный, то есть можно его вызвать без разных манипуляций, которые мы рассмотрим позже. Слово void говорит, что метод ничего не возвращает. В круглых скобках есть аргумент args[]. Этот аргумент является пустым массивом строк. Можно добавить забитый чем-то массив строк, но нам это не нужно, потому что использовать его мы не будем, а программа запустится и так.

Следующим мы видим вызов метода println, в параметр которого помещена строка Hello World. Перед ним мы видим перечисление через точки System.out. Если кратко, слово System означает, что метод println находится в классе System, а слово out – это выходной поток PrintStream, который нужен, чтобы выдать информацию вовне. В этом примере вовне — это консоль. Выходной поток out мы рассматривать не будем. Разбор потоков может вылиться в отдельную статью. Нам важно только знать, что out (объект класса PrintStream) находится в классе System, а метод println находится в объекте out. Все эти перечисления через точку просто указывают путь языку программированию к методу println, чтобы он знал откуда его вызывать.

Этот метод выводит строку Hello World в консоль и переводит курсор на новую строку. На этом программа заканчивается.


Компиляция и выполнение

Синтаксис простой программы мы рассмотрели, но не запустили её. Этим мы сейчас и займёмся.

Для начала скачайте JDK и установите его. Потом в переменных средах вашей операционной системы пропишите в переменной Path путь к папке bin вашего установленного JDK. Это нужно, чтобы операционная система могла найти из консоли программы JDK для компиляции и запуска. Теперь поместите текст программы в текстовый файл с именем HelloWorld. С именем HelloWorld, потому что имя файла и класса должны совпадать. Сохраните и измените расширение файла на java. Перейдите в консоли в папку с файлом и введите javac HelloWorld.java. Программа скомпилируется и поместится в файл HelloWorld.class. Чтобы запустить её напишите java HelloWorld. В выводе вы увидите Hello World. Что мы и хотели.


Импорт

Чтобы использовать другие классы и методы из стандартной библиотеки используем слово import.


import java.util.Random;


После слова import идёт название пакета java.util. Он назван так из-за назначения и, собственно, из-за папок java и util, в которых находится класс Random. Путь java\util\Random.class

Вместо java.util.Random можно вписать любой необходимый нам класс.


Классы и объекты. Статические и динамические реализации

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

Есть ещё множество способов, чтобы классы могли найти друг друга. Это пакеты, внешние библиотеки, внутрипакетное взаимодействие и другое. Здесь разбирать это не будем. Просто знайте, что есть специальные конструкции и ключевые слова, чтобы использовать эти механизмы.


class MyClass {

public static void main(String [] args){

AnotherClass object0 = new AnotherClass();

System.out.println(object0.a);

System.out.println(object0.addition(8, 10));

}

}


public class AnotherClass{

int a = 9;

int addition(int b, int c){

return b + c;

}

}


Разберём их. Начнём с класса AnotherClass. Перед его именем мы видим слово public, которое говорит, что класс публичный и его могут использовать другие классы. В нём мы создаём переменную a со значением 9 и метод addition. Можно сказать, что класс AnotherClass – это новый тип.

В классе MyClass мы создаём объект object0 класса AnotherClass. Это очень похоже на создание обычной переменной и также используется ключевое слово new, как при создании массива. Оператор new говорит языку программирования, что нужно создать копию этого класса в оперативной памяти. Мы можем создать множество копий и забить ими всю память. Далее мы передаём переменную a этого объекта в метод println. Вызываем динамические метод addition в параметре метода println. Метод addition вернёт результат, а метод println выведет его.

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

Чтобы создать статический метод, перед его именем нужно написать static.


Конструкторы


class MyClass2 {

public static void main(String [] args){

AnotherClass2 object0 = new AnotherClass2();

AnotherClass2 object1 = new AnotherClass2(6);

System.out.println(object0.a);

System.out.println(object0.a);

}

}


public class AnotherClass2{

public AnotherClass2(){

a = 7;

}


public AnotherClass2(int x){

a = x;

}


int a;

}


В этих классах почти всё идентично предыдущим, но создаётся два объекта класса AnotherClass2. object0 и object1. Но создаются они по-разному.

Разберём класс AnotherClass2. В нём появился новый механизм, который называется конструктор. Конструкторов в классе может быть несколько, начинаются они со слова public, а далее идёт имя класса. В круглых скобках перечисляются параметры, а в теле конструктора описывается инициализация объекта класса. Конструкторы схожи с методами.

Перейдём к разбору конструкторов в классе MyClass2. В этом классе при создании объектов класса AnotherClass2 мы можем указать параметры в круглых скобках. Язык программирования выберет подходящий под параметры конструктор и проинициализирует объект подходящим образом. Так при создании объектов мы можем создать его разновидность нужную нам.


post scriptum

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

Дубликаты не найдены

+12

Зачем тому, кто ничего не понимает в программировании, двоичная и щестнадцатиричная системы счисления? И уж тем более представление отрицательных чисел в двоичке. И уж тем более в контексте жавы.

Ну и в остальном статья хоть и объёмная, но... Если нихрена не понимаешь в этом - то и после статьи не поймешь)

+7

Зачем копировать то, что что в любой книжке для начинающих?


Да ещё и в такой ужасной форме подачи. На кого это рассчитано?

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

Все верно, но для обучения статья бесполезна.

раскрыть ветку 8
-4

Написал б сам

раскрыть ветку 2
+6

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

+1
Зачем? Есть туча книг
-6

Как знать. Мне бы она в своё время сохранила кучу времени и нервов

раскрыть ветку 4
+5

Не сохранила бы.

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

раскрыть ветку 3
ещё комментарии
+5

Больше похоже на заметки для себя у новичка

+4

Отсутствие возможности форматировать код в статье как бы намекает, что автор ошибся ресурсом.

+6

Начать с систем счисления и закончить ООП. Это конечно мощно.

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

раскрыть ветку 10
+3

даже странно что до реверса или хотябы дебага не добрался.

-4

Этот текст ещё не так сложен для понимания, можно в разы сложнее, но и подробнее написать. Но такое в следующем посте будет

раскрыть ветку 8
+4

Не надо. Идите на Хабр :)

раскрыть ветку 3
+3

Как по-вашему, на кого рассчитана эта "статья"? Школьники, студенты, домохозяйки, пенсионеры?


Вспоминая информатику в школе. Системы счисления - отдельная тема. Hello world - отдельная тема. Переменные и арифметические - отдельная тема (на самом деле несколько тем, по одной на каждый тип переменных). Условные операторы - отдельная тема. Циклы - отдельная тема. Массивы - отдельная тема. И если все предыдущее еще как-то умещалось в школьную программу или факультативы по информатике, то ООП это целый предмет в универе, причем даже не на первом курсе. Создание простого класса с парой конструкторов и несколькими методами это как раз первая лабораторная.

раскрыть ветку 3
+2

Афтырь, не позорьтесь. Статью читать невозможно. Намешано всего в кучу, темы для недельного изучения умещаются в одном абзаце. Практическая ценность - нулевая. "Практикующий" прогер ничего из статьи не узнает, новички ни фига не поймут. Да и написано коряво. "типы цифр бывают неминусовыми", "Прежде чем использовать числа в программировании их нужно объявить" и так далее. Вырви глаз!

+2

Спасибо! Весьма познавательно.

раскрыть ветку 2
0

Рад, что вам зашло

раскрыть ветку 1
0

Скорее - вышло...

+3
Как погромировать на Фотошоп? Я хочу уметь, чтобы бдыщ, блюдыщ, файлеопен.
раскрыть ветку 4
+7

Photoshop myPhotoshop = new Photoshop;

myPhotoshop.bdish().bludish().fileOpen();

раскрыть ветку 3
0

import {Photoshop} from "./src/photoshop";


let myPhotoshop = new Photoshop.Photoshop('bdysh', 'blyadysh');

myPhotoshop.fileOpen();

0
лол. спагетти-код
+где удаление?
хотя если у тебя язык с GC...
раскрыть ветку 1
+1

Бедные начинающие. Такими вводными их только отпугивать.

+1
Преподавание — это явно не то, чем тебе стоит заниматься.
Смирись.
раскрыть ветку 1
-2

Так кто ж спорит

0

Стоп. -1 это 11111111. Потому что если к нему прибавить 1 будет 00000000. А в вашем случае будет 10000001, но не 0.

раскрыть ветку 6
0

Если рассматривать дополнительный код и стандарты, то 11..11 - это NaN.


И я не помню почему и как это работает.

раскрыть ветку 3
0

Это ваши выкладки притянуты за уши. Есть двоичная математика, которая выполняется процессором. Если от 0 отнять 1 будет 1 во всех разрядах. И процу в целом пофиг, считаете ли вы старший разряд знаком минус, или нет. Оно само так получается. И вся двоичная математика не разрушается. Все ваши озвученные варианты не работают, т.к. при сложении дадут неверный результат.

раскрыть ветку 2
-3

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

раскрыть ветку 1
+1

Ну C подобные языки хороши тем, что можно использовать низкоуровневое программирование. Я нередко куски кода пишу вставками на ассемблере. Для него двоичные операции основа основ. Многие сложные вычисления элементарно выполняются двоичными операциями. И если уж вы их упоминаете, то пишите правильно. Без фундаментальных косяков.

0
Но у статических методов есть ограничения. Внутри их тела невозможно создать объекты других классов.

...

раскрыть ветку 1
-2

Спасибо, исправил

-2

круто! ты уже в эппл или в майкрософт главный по прогламилованию?

раскрыть ветку 1
0

В Ubisoft. Watch Dogs 7 скоро выпустим

Похожие посты
Возможно, вас заинтересуют другие посты по тегам: