Програмиране. Основни типове данни
Въведение
Започваме този раздел с мотото „Program or Be Programmed" на съвременния визионер Douglas Rushkoff и ще ви предложим да се научите да програмирате, вместо да се оставите да ви програмират.
Типове данни
По отношение на типовете данни езиците за програмиране се делят на типизирани (има типове) и нетипизирани. От обучението за работа с таблични данни по предмета информационни технологии вече сте запознати с факта, че данните имат типове.
В избраните от нас езици за програмиране в този учебник два са типизирани (Java, C#), а другите два – съответно нетипизирани (JavaScript, Python).
Най-използваните типове данни са: числови, символни, текстови и логически. Числовите са основно за цели и реални числа. Решението какъв да е използваният тип, вземаме, след като съобразим какви операции искаме да изпълняваме с тези стойности.
Примери:
1. Ако има число, което след това ще използваме в аритметични изрази, за да пресмятаме стойности, използваме числов тип (цена; цена с ДДС).
2. Ако има цифри, които са в някакъв надпис, и ще извличаме части от този надпис, използваме стринг (номер на автомобил – държава, в която е регистриран автомобилът; телефонен номер – код за държава или населено място).
📹 Вижте видеото в папка dataTypes с някои специфични примери от електронните ресурси към учебника.
Константи и променливи
Какви константи по физика, химия, математика познавате? За какво се използват? Защо са наречени константи? Знаете ли как са открити тези стойности?
Константите са стойности, които не се променят.
В езиците за програмиране има константи за всеки от изучаваните типове. Това са стойности, които не се променят по време на изпълнение на програмата:
● числови (100, 3.4);
● символни ('h', 't');
● низови (стрингови) ("hi");
● известни математически константи π = 3.1415 (math.pi, Math.PI).
Пример за константи в езика за програмиране, който изучавате, са и граничните (крайните) стойности на типовете. Например в JavaScript Number.MAX_VALUE е константа, която показва най-голямата числова стойност на числовия тип Number.
Открийте от кой език (от четирите, разглеждани от нас езици) са константите в следните примери: math.pi, Math.PI, Number.MAX_V.
Всеки тип данни има множество от допустими стойности, което винаги е ограничено (има начало и край). За разлика от математиката, където се дефинира и изучава понятието „безкрайност", при представянето на данни с компютри винаги има ограничения и реално няма безкрайност. Стойностите, които могат да се изброят, наричаме дискретни.
В Java, C#, JavaScript има ограничения на границите на типовете. Това множество от възможни стойности на един тип се нарича допустими стойности на типа. Интересно е да се отбележи, че в някои езици като Python няма ограничение в конкретен числов интервал, но има ограничение от големината на оперативната памет на компютъра, който използваме.
Можете ли да предположите какво е ограничението на паметта, когато използваме онлайн среди за компилиране и изпълнение на програма на Python?
Променливата е запазена област от паметта, която има име. Всяка променлива има стойност. Стойността на една променлива може да се променя! Както и при общуването с хора, когато искаме да се обърнем към променливи, използваме имената им.
На променлива можем да зададем стойност чрез оператор за присвояване. Във всички разглеждани от нас езици за програмиране за оператор за присвояване се използва знакът '='.
Начинът, по който се записва един оператор за присвояване, се нарича синтаксис. Смисълът (значението) на един оператор се нарича негова семантика.
Можем да направим аналогия с обучението по чужди езици, където при изучаването на нова дума първо изучаваме как се пише (как се произнася), а после – как се употребява. Езиците за програмиране са също езици. Чуждите езици, на който общуваме с другите хора, се наричат естествени езици.
Когато направим грешка при писане на оператор в език за програмиране, интерпретаторът „разбира" и се извежда съобщение за грешка, която се нарича синтактична грешка, защото е грешка в начина на писане (в синтаксиса).
Ако сме пропуснали една буква в името на променлива, компилаторът не може да я компилира и се извежда грешка.
Например в Java грешката можем да забележим по два начина. Първо вляво на оператора се появява червен символ x, който подсказва на програмиста, че има грешка.
И освен това в допълнителен прозорец се появяват множество червени редове с подсказващи съобщения за грешки.
Обърнете внимание къде се вижда грешката, ако пишете на друг език за програмиране.
Има следните основни употреби на оператора за присвояване:
Променлива = стойност на променлива (присвояваме стойност);
Променлива = израз на променлива (присвояваме израз).
Изразът може да бъде: константа, аритметичен израз, стойност на друга променлива, резултат от функция, резултат от метод.
Грешно е присвояване от вида константа (стойност) = променлива.
Например:
В примера в съобщението за грешка е припомнено правилото, което не е спазено: „лявата част на оператора за присвояване трябва да бъде променлива".
Ще изучаваме различните употреби на операторите за присвояване. А за да използваме променливи в програмите, трябва да научим правила, по които да ги именуваме.
В папка p71/audio отворете файла ass1.mp3. В него има запис на обяснение, което трябва да запишете като програмен код. Запишете и изпълнете програмата. Какъв резултат получихте?
В папка p71/audio отворете файла ass2.mp3. В него има кратък аудиозапис на обяснение, което трябва да чуете. Следвайте инструкциите и определете точния резултат за променливата p.
В папка p71/audio отворете файла ass3.mp3. В него има аудиозапис на обяснение, което трябва да чуете. Следвайте инструкциите и определете първоначалната стойност на променливата z.
Правила за именуване (константи и променливи)
Всяко име в език за програмиране наричаме идентификатор. Това може да бъде име на константа, на променлива, на функция, на метод и др.
При именуването на константи и променливи се използват множество от допустими символи и правила за тяхното комбиниране. Това са латински букви, цифри и специални знаци. Макар че някои езици позволяват именуване със символи от Unicode кодовата таблица, препоръчваме да спазвате по-строгите правила и да се придържате само към латински букви (малки и главни), цифри и някои специални символи.
За всяко именуване на идентификатор е важно в програмния език, който използвате, да знаете дали именуването е case-sensitive (чувствителни към регистъра), или caseinsensitive (не са чувствителни към регистъра). Всички разглеждани от нас езици за програмиране в този учебник са case-sensitive, т.е. има значение дали използваме малки, или главни букви. Не е позволено идентификаторът да бъде служебна дума. В някои езици (Java, C#, C/C++, Python) идентификаторът трябва да започва с латинска буква, като може да съдържа само букви, цифри и знакът '_'
Как се разбира, че един идентификатор е служебна дума?
При именуването на константи и променливи има и други специфични правила.
Съществуват няколко общоприети правила (конвенции) за означаване (именуване) на константи и променливи в програмирането, когато идентификаторът се състои от една, а също и от две или повече думи.
С кой от посочените стилове е изписано името на програмния език JavaScript?
Правилата за именуване се използват, защото:
– улесняват четенето на програмата;
– служат неявно за документиране на програмата;
– прилагат единен стил на програмиране (когато работят няколко програмисти по един проект);
– прилагат очакван стил на програмиране (при създаване на библиотеки от програмисти, които не се познават);
– улесняват разчитането (разбирането) на непознат програмен код.
Правилата за именуване са част от стила на програмиране за всеки програмист или софтуерен инженер. Освен личния е важен и фирменият стил, с който се съобразяваме.
При създаването на програмен код понякога е нужно да се задават и използват имена на константи, променливи, методи, класове и обекти, което създава предпоставка за конфликти на имената.
За да се реши този проблем, може да се използва т.нар. пространство от имена (namespace). Например в C# се задава област, която се именува, а в JavaScript се използва var.
Синтаксисът на описание на пространство от имената в C# е:
Namespace <име_на_пространството_от_имена>
{<програмен код за това пространство от имена>}
За да използваме вече дефинирано пространство от имената, се използва using <пространство_от_имена>. Така в един програмен код може да се използват еднакви имена, стига да се укаже от кое namespace е всяко от тях.
За транслирането на една програма няма значение броят на оставените интервали в кода на програмата. В стила на програмиране се включва и оставянето на интервали, вмъкването на вложени структури по-навътре и други често използвани практики.
Интересно изключение от използването на интервали и табулации за прегледност има в езика Python, в който има т.нар. синтаксис с отместване (indent syntax) – отместването подсказва вложеността на самите оператори (без използване на скоби, както е в останалите езици).
Задача 1
Свържете описаните в лявата колона променливи с вярната група от подходящи имена в дясната колона на таблицата.
В Python, променлива от тип float може да се дефинира по следния начин: a = 20.0. Ако е необходимо, променлива от тип float може да се конвертира в целочислена: b = int(a). Може да се направи и обратното, целочислена (int) променлива да се конвертира в тип float: c = float(b). След горните дефиниции, print(a, b, c) дава следното: 20.0 20 20.0.
Преобразуването на типове (type casting) е операция, която може да намерите и в другите разглеждани от нас езици. Разликата при Python е, че можем да променяме типа на една променлива динамично в програмата. Аналогията за тази употреба има със C++, където от стандарт от C++11 има въведен тип auto (автоматичен тип). Типът се разпознава от записаните в променливите в момента стойности.
Пример
В този пример е използвана онлайн среда за компилиране и изпълнение на Python, в която се използва интерпретатор на Python (iPython).
От примера се вижда, че една и съща променлива а по време на изпълнението на програмата динамично сменя типа си съобразно стойностите, записани в нея.
Тази особеност е характерна и за JavaScript:
var foo = 42; // тук foo е от тип Number;
var foo = "bar"; // тук foo е от тип String.
Коя е функцията в Python, с която можете да определите типа на променлива?
Коментарите в една програма са текстове, които не се транслират. Те са за информация на програмиста.
Коментари до края на реда се поставят с //. Ще използваме това, за да разясняваме някои програмни фрагменти.
В обектно ориентираните езици за програмиране една променлива може да бъде обект или да не бъде обект. Когато една променлива не е обект, казваме (например в Java, C#), че е от примитивен тип.
От практическа гледна точка е важно дали една променлива е обект, или не, за да знаем какви операции можем да изпълняваме с тази променлива и как да се обръщаме към нея.
СТИЛЪТ НА ПРОГРАМИРАНЕ включва спазването на правилата за оформянето на програмния код. Последното е най-често свързано с оставянето на интервали (наречени отстъпи) в началото на операторите.
Понятието „стил на програмиране" включва още и именуването на константи, и на променливи, и поставянето на коментари.
Проучете за един от четирите езика за програмиране (или за всички) може ли да се създаде една променлива динамично (по време на работа на програмата) и да се изтрие (освободи заета от нея памет) пак динамично.
Във всички съвременни езици за програмиране има λ (lambda) функции. Проучете какво означава това. А какво символизира този знак?
Кодови таблици
Стойностите на константи и променливи от типа char са знаците от таблицата Unicode. Това е набор от символи, които се използват при писане на различни езици, както и други символи от математиката и инженерните науки. Всеки знак/символ съответства на определен номер (това е число, което наричаме код) в кодовата таблица. Тъй като символите са няколко десетки хиляди, не е възможно да се представят в един байт.
Кое е най-голямото число, което може да се представи в един байт?
Буквите от латинската азбука, цифрите и основните препинателни знаци се изобразяват с един байт. Кирилицата, гръцката, арабската и други азбуки се представят в два байта. Други азбуки и някои специални знаци се кодират с три или четири байта. Използването на Unicode вече е стандарт за всички създатели на хардуерни устройства и софтуер, поради което така написаният текст ще се визуализира по един и същи начин на различни устройства по целия свят. Например ASCII кодовата таблица съдържа само 256 (28) символа, които могат да се кодират по различен начин. Макар един символ от ASCII да заема 1B от паметта, съобщение, написано на едно електронно устройство, може да изглежда по различен начин, когато се отвори от друго.
Символи
Стойностите от знаков тип се изписват, като съответният знак от клавиатурата се загради със знака апостроф. Например: 'a', 'z', 'F', '@' и т.н. Ако искаме да използваме знак, който не е на клавиатурата, изписваме неговия код от съответната кодова таблица.
Например '\1002'.
Разгледайте Unicode таблицата https://unicode-table.com.
Забелязахте ли как се образува кодът U+0413 на този символ?
Задача 2
Кодирайте първото си име чрез Unicode символи. Използвайте Unicode таблицатa, за да вземете съответните кодове.
Тип данни стринг (низ)
Целочислени типове данни
Реални типове данни
РЕЧНИК
identifier | идентификатор | constant | константа |
variable | променлива | assignment | присвояване |
expression | израз | data type | тип данни |
naming conventions | правила за именуване | camelCase = Lower Camel Case | стил камила |
Underscore_case = Upper Camel Case | стил подчертаващо_тире | hungarian notation | унгарска нотация |
underscore | подчертаващо тире '_' | hyphen | тире '–' |
case-sensitive | чувствителност към регистъра на буквите | case-insensitive | без чувствителност към регистъра на буквите |
сompatibility | съвместимост (отнася се за съвместимост на типовете) |