Розробка уроку

Тема: мова програмування C# і середовище програмування мовою C#.

Мета:

По завершенню вивчення учень:

Обладнання: ПК зі встановленою ОС і стійким сполученням до мережі Інтернет для роботи з онлайн-середовищем Coding Ground, (дана) інструкція.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Закріплення вивченого матеріалу.
  5. Підведення підсумків уроку.
  6. Домашнє завдання.

Хід уроку
1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.

2. Актуалізація опорних знань

Дати означення понять, назви яких виділеноі жирним шрифтом. Порівняти з очікуваним.

Алгоритмце запис скінченої послідовності вказівок, виконання яких призводить до розв'язання певної задачі.

Вказівка (алгоритму) — це спонукальне речення, що вказує, яку дію має виконати виконавець алгоритму.

Виконавець (алгоритму) — це жива істота (людина або тварина) або автоматичний пристрій (робот, електронна обчислювальна машина тощо), спроможна діяти відповідно з алгоритмом.

Система вказівок виконавцяце множина (сукупність) всіх вказівок, які може виконувати даний виконавець.

Середовище виконання алгоритму — об'єкти, з якими працює виконавець у процесі виконання алгоритму.

Властивості алгоритму: дискретність, визначеність, виконуваність, скінченність, результативність, масовість, ефективність.

Дискретність (латинською discretus — розділений, розривний) алгоритму означає, що виконання алгоритму зводиться до виконання окремих дій (кроків) у певній послідовності. Причому, кожну вказівку алгоритму виконують за скінченний проміжок часу.

Визначеність (однозначність) означає, що алгоритм однозначно визначає порядок дій виконавця, результат цих дій і не потребує додаткового тлумачення..

Виконуваність означає, що алгоритм, призначений для певного виконавця, може містити лише вказівки, які входять до системи вказівок цього виконавця.

Скінченність означає, що виконання алгоритму закінчиться після скінченної (можливо, досить великої) кількості кроків і за скінченний час для довільних вхідних даних.

Результативність алгоритму означає, що після закінчення виконання алгоритму обов’язково:

Масовість алгоритму означає, що алгоритм можна застосувати до цілого класу однотипних задач, для яких спільними є умова та хід розв’язування та які відрізняються лише початковими (вхідними) даними. Наприклад, алгоритмом дій, складеним для одного касира, можуть успішно скористатися всі касири супермаркету. А програмою пошуку коду й підрахунку суми вартостей товарів, придбаних покупцем, — усі комп'ютери супермаркету

Ефективність алгоритму описує час виконання і об'єм ресурсів, необхідних для виконання алгоритму: чим менше часу (часова ефективність) і ресурсів (просторова ефективність), тим ефективність вища.

3. Вивчення нового матеріалу

Робота комп'ютера полягає у виконанні програми — запису певних вказівок у певному порядку. Програма є алгоритмом дій комп’ютера, записаним зрозумілою для нього мовою.

Щоб задати комп'ютеру послідовність дій, потрібно задати послідовність двійкових кодів відповідних вказівок. Писати такі програми — дуже складна й марудна справа.

Простіше писати програму деякою мовою, наближеною до природної людської мови, а переклад у машинні коди доручити комп'ютеру. Так з'явилися мови, призначені спеціально для написання програм — мови програмування, що на відміну від розмовної мови не допускають двозначностей чи вільного тлумачення.

Мова програмування (англійською programming language) — це система позначень для опису алгоритмів та структур даних.

C# (вимовляти Сі-шарп) — об'єктно-орієнтована мова програмування з безпечною системою типізації для платформи .NET.

C# є дуже близьким родичем мови програмування Java. Мову Java було створено компанією Sun Microsystems, коли глобальний розвиток інтернету поставив задачу роззосереджених обчислень. Взявши за основу популярну мову C++, Java виключила з неї потенційно небезпечні речі. Для роззосереджених обчислень була створено концепцію віртуальної машини та машинно-незалежного байт-коду, свого роду посередника між вихідним текстом програм і апаратними інструкціями комп'ютера чи іншого інтелектуального пристрою. Java набула чималої популярності, і була ліцензована також і компанією Microsoft. Але з плином часу Sun почала винуватити Microsoft, що та при створенні свого клону Java робить її сумісною виключно з платформою Windows, чим суперечить самій концепції машинно-незалежного середовища виконання і порушує ліцензійну угоду. Microsoft відмовилася піти назустріч вимогам Sun, і тому з'ясування стосунків набуло статусу судового процесу. Суд визнав позицію Sun справедливою, і зобов'язав Microsoft відмовитися від позаліцензійного використання Java. У цій ситуації в Microsoft вирішили, користуючись своєю вагою на ринку, створити свій власний аналог Java — мову, в якій корпорація стане повновладним господарем. Ця новостворена мова отримала назву C#. Вона успадкувала від Java концепції віртуальної машини (середовище .NET), байт-коду (MSIL) і для більшої безпеки вихідного коду програм врахувала досвід використання програм на Java.

Нововведення C# — можливість легшої взаємодії, порівняно з мовами-поперед­никами, з кодами програм, написаних іншими мовами, що є важливим при створенні великих проектів.

Символ # (октоторп) у назві мови можна інтерпретувати і як дві пари плюсів ++, що натякають на новий крок у розвитку мови порівняно з C++, і як музичний символ дієз, разом з буквою C, що становить в англійській мові назву ноти до-дієз.

Мову С# розробив Андерс Гейлсберг — данський програміст, який прославився роботою над комерційно успішними мовами програмування та інструментарієм для розробки програмного забезпечення: Turbo Pascal, Delphi, J++, C#, TypeScript та інше.

Будь-яка мова програмування має такі 3 основні складові: абетку, синтаксис (правила написання) і семантику (правила тлумачення й виконання).

Алфавіт мови C# містить:

Програма мовою С# складається з синтаксичних конструкцій, які називають вказівками (операторами, командами), які будують з лексем — неподільних елементів мови. Розрізняють 5 типів лексем:

Майже всі типи лексем (крім ключових слів і ідентифікаторів) мають власні правила словотворення, включаючи власні підмножини алфавіту. Лексеми відокремлюють роздільниками. Цій самій меті служать пробіл, табуляція, ознака кінця рядка і коментар.

Коментар частина коду програми, яку компілятор ігнорує. Коментарі у програмі мовою C# записують таким чином:

// Коментар до кінця рядка, починаючи з двох похилих рисок
/* Коментар
   (можливо)
   на кілька рядків */

Ідентифікатор це назва, яку користувач надає об’єкту (змінній, сталій, функції).

Ідентифікатор записують літерами латиниці, цифрами і знаком підкреслення. Розпочинають ідентифікатори з літер та знаку підкреслення:

Ідентифікатор не може розпочинатися з цифри! При написаннні ідентифікатора мовою С# враховують регіср: myvar і MyVar — два різні ідентифікатори. Довжину ідентифікатора не обмежено. Пропуски усередині ідентифікатора не припустимі.

Ключові словаце попередньо визначені зарезервовані ідентифікатори, які мають спеціальні значення для компілятора: abstract, as, base, bool, break, byte, case, catch, char, checked, class, constcontinue, decimal, default, delegate, do, double, else, enum, event, explicit, extern, false, finally, fixed, float, for, forea, ch, goto, if, implicit, in, int, interface, internal, is, lock, long, namespace, new, null, object, operator, out, out, override, params, private, protected, publ, readonly, ref, return, sbyte, sealed, short, sizeof, stackalloc, static, string, struct, switch, this, throw, true, try, typeof, uint, ulong, unchecked, unsafe, ushort, using, using, static, virtual, void, volatile, while.

Контекстні ключові слова використовують для надання коду конкретного значення, але вони не є зарезервованими словами в C#:add, alias,ascending, async, await,descending, dynamic, from, getglobal, group, into, join, let, nameo, forderby, partial (тип), partial(метод),remove, select, set,value, var, when, where, yield.

Перепроцесорце програма, яка опрацьовує директиви — вказівки компілятора, які записують на початку програми.

Директива перепроцесора визначає порядок інтерпретації тексту програми перед її перетворенням у машинний код. Даний термін використавують в описі мов С та C++. В С# не має окремого кроку перепроцесора, тому директиви С# є складовою частиною процесу лексичного аналізу компілятора.

Директиви мови С# (так само як і мовою C++) розпочинають символом #:

Структура програми мовою С#
Істотною особливістю мови С++ є те, що програма складається з функцій, які відповідають підпрограмам (процедурам) в інших мовах програмування.

Головна функція, яка має бути в кожній програмі, — це функція такого вигляду:

static void Main()
{ тіло функції;
}

Найпростіша програма мовою С# має такий загальний вигляд:

using System.IO;
using System;
class Program
{ static void Main()
  { Console.WriteLine("Hello, World!");
  }
}

Зазвичай програми мають інші об'єкти: величини (змінні та сталі), функції (стандартні та створені користувачем) тощо. Всі дані, які використовують у програмі, необхідно зазделегідь описати для розподілу оперативної пам'яті згідно з описами.

Для зручності роботи користувача створено інтерактивне інтегроване середовище програмування, у якому об'єднано можливості:

і в якому передбачено можливість запуску програми на виконання в разі успішної компіляції. Інтерактивним середовище називають тому, що воно працює в режимі постійного спілкування з користувачем, а інтегрованим тому, що об'єднує в собі одночасно всі згадані вище можливості. При першому знайомстві з мовою програмування (особливо ще до того, як прийнято рішення щодо доцільності занурення у конкретну мову програмування) зручно скористатися online-середовищем програмування. Наприклад, Coding Ground, яким можна скористатися на наступних уроках. Роботу усіх поданих нижче програм чи навіть лише частин програм бажано перевірити у цьому середовищі (чи іншому).





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

Поняття величини є одним з найважливіших понять математики та фізики. Більшість з них є числовими. У програмуванні користуються таким визначенням.

Величинаодиниця даних, якими оперує програма. Вона має такі властивості:

З кожною величиною (або її складовою для структурованої величини) пов'язана ділянка оперативної пам’яті, куди її під час роботи програми заносять та у якій зберегають. Цю ділянку визначено її адресою. Тут під адресою розуміють адресу першого байту з послідовновних щодо адресації байтів, відведених для збереження величини. Назва змінної слугує назвою цієї послідовності байтів під час виконання програми.

Тип даних характеризує допустимі величини для цих даних і сукупністю операцій над ними.

В мові С# розрізнять прості та складні типи даних. До простих відносять числові, логічні та символьні типи даних.

Числові дані поділяють на цілі та дійсні.

Цілі типи

Назва типуОбсяг
(бітів)
Діапазон значень
byte 8 0..255
sbyte 8 –128..127
short 16 –32768..32767
ushort 16 0..65535
int 32 –2147483648..2147483647
uint 32 0..4294967295
long 64–9223372036854775808
..9223372036854775807
ulong 64 0..184467440073709551615

Об'єм пам'яті, яка виділяють під величини певного типу, залежать від розрядності операційної системи: 2 байти в 32-х розрядній і 4 байти в 64-х розрядній системі.

Дійсні типи

Назва
типу
Обсяг
(бітів)
Діапазон значень
decimal 128 1·10–28..7.9·10+28
double 64 5·10–324..1.7·10+308
float 32 1.5·10–45..3.4·10+38

Для дійсних чисел вказано діапазони зміни абсолютнної величини (модуля). Дійсні числа можна записувати у форматі з фіксованою крапкою (2.56, –0.3) або у науковому форматі (з рухомою крапкою: –0.23e3=–230, 1.45e–2=0.0145)

Бінарні арифметичні операції:
+ — додавання;
- — віднімання;
* — множення;
% — залишок від цілочисельного ділення;
/ — ділення.

Якщо обидва операнди ділення є цілими числами, то результатом ділення буде ціле число:

double x = 10/4;    // результат 2
double y = 10.0/4.0;// результат 2.5

Унарні арифметичні операції:

++ інкремент (зростання значення на 1):
int x1 = 5;
int z1 = ++x1; // z1 = 6; x1 = 6
int x2 = 5;
int z2 = x2++; // z2 = 5; x2 = 6

-- декремент (зменшення значення на 1):
int x1 = 5;
int z1 = --x1; // z1 = 4; x1 = 4
int x2 = 5;
int z2 = x2--; // z2 = 5; x2 = 4

Пріоритет операцій (від вищого до нижчого):

Для зміни порядку виконання операцій застосовуються дужки.

Логічний тип bool. Змінні цього типу можуть набувати лише два значення:

Вони займають 1 байт у пам'яті.

Операції з логічним типом величин

Значення
операндів
(аргументів)
Результат операції
XYnot XX and YX or YX xor X
001000
011011
100011
110110


В С# немає автоматичного приведення числових типів до логічного типу.

Символьний тип char призначено для роботи із символами Unicode. На зберігання величини такого типу компілятор C# виділяє 16-бітів (2 байти) пам'яті. Сталі цього типу можна записати в одному з таких виглядів (спочатку подано приклад для одного й того самого значення):

Зауважимо: 102 — це десятковий код символу 'f', тому після виконання таких вказівок:

char s='f'; int n=s;

змінна n набуде величини 102.

Оголошення змінноївиділення пам'яті для неї — описують таким чином:

тип назва_змінної;

Можливості використання змінної визначено її типом. Наприклад, змінну типу bool не можна використовувати для зберігання числових значень з рухомою точкою. Крім того, тип змінної не можна змінювати протягом терміну роботи програми. Зокрема, змінну типу int не можна перетворити у змінну типу char.

Всі змінні в С# потрібно оголосити до застосування. Це потрібно для того, щоб повідомити компілятор про тип даних, що зберігають у змінній, перш ніж він спробує правильно скомпілювати будь-який оператор, в якому використано цю змінну. Це дозволяє також здійснювати строгий контроль типів у мові С #.

Задати значення змінної можна, зокрема, за допомогою оператора надання значення =. Крім того, задати початкове значення змінної можна при її оголошенні. Для цього після назви змінної вказують знак рівності (=) і значення змінної.

Ініціалізація змінноївиділення пам'яті для неї і надання їй початкового значення. Її описують таким чином:

тип назва_змінної = значення;

де значення має відповідати вказаному типу змінної — див. приклади ініціалізації змінних:

int i = 10;
char c = 'X';
float f = 1.2;

Якщо кілька змінних одного й того самого типу оголошено списком, члени якого розділено комами, то цим змінним можна надати початкове значення див. приклад, у якому ініціалізовано лише змінні b і с:

int а, b = 8, с = 19, d;

Загальні правила оголошення та ініціалізації змінних в С#:

Динамічна ініціалізація

У поданих вище прикладах при ініціалізації змінних використано лише сталі. Але в С# припустимою динамічна ініціалізація змінних за допомогою будь-якого виразу, обчислюваного момент оголошення змінної — див. приклад програми обчислення гіпотенузи прямокутного трикутника за довжинами його катетів (сторін, протолежих до гострих кутів прямокутного трикутника:

using System;
class DynInit
{ static void Main() 
  { double a = 4.0,
           b = 5.0,
           c = Math.Sqrt((a*a)+(b*b));
    Console.WriteLine ("Гіпотенуза трикутника зі катетами "
    + a + " і " + b + " дорівнює {0:#.###}.", c);
  }
}

з таким результатом:

Гіпотенуза трикутника зі катетами 4 і 5 дорівнює 6.403.

4. Закріплення вивченного матеріалу

  1. З чого складається алфавіт мови С#?
  2. Що таке ідентифікатор?
  3. Які правила запису ідентифікатора?
  4. Що таке перепроцесор?
  5. Як записують директиви перепроцесора?
  6. Як записують коментарі мовою С#?
  7. Назвіть типи даних використовують у мові С#?
  8. Яка структура програми мовою C#?
  9. Виберіть правильно записані ідентифікатори:
    1. a, aa, _a, 1s, max znach;
    2. q, f_1? A..a, a*s;
    3. s1, Max_znach, x1,_y;
  10. Вкажіть істинні твердження:
    1. тип int займає 4 байти;
    2. тип byte займає 8 біт;
    3. тип char займає 2 байти;
    4. тип double займає 64 бітів;
    5. тип long займає 8 байтів;

5. Підбиття підсумків уроку
Виставлення оцінок.

6. Домашнє завдання

Завдання 1. Вивчити навчальний матеріал уроку.

Завдання 2. Дано натуральне число n. Скласти логічний вираз, який справджується тоді й лише тоді, коли це двозначне число.

Завдання 3. Дано порядковий номер року. Скласти логічний вираз, який справджується тоді й лише тоді, коли цей рік високосний. Врахувати, що серед років, які кратні 4 не всі роки високосні. Високосними не є роки кратні 100 крім тих, що кратні 400.

Завдання 4. Поміняти величини двох змінних цілого типу без використання додаткових змінних і операцій введення-виведення. Скласти алгоритм та написати текст програми мовою С#.

Завдання 5. Вивчити навчальний матеріал уроку. Ознайомитися з наступними структурами мови С# (подано структуру опису), щоб виробити уявлення про можливості мови програмування. У разі потреби використати довідникову літературу або ресурси Інтернету.


Лінійний (одновимірний) масивце набір однотипних даних, які розташовано у пам'яті послідовно одне за одним. Доступ до елементів масиву здійснюють за індексом (номером) елемента. Масив може містити елементи будь-якого типу даних, можна навіть створювати масив масивів.

Розмір масивукількість елементів у масиві.

Оголошення масиву мовою С# має таку структуру:

тип [] назва_масиву = new тип [розмір масиву]


Наприклад:

int[]    a = new int[5]; // створено масиву a цілих чисел

// оголошення та ініціалізація масиву рядків b
string[] b = new string[4] {"зима","весна","літо","осінь"};

Доступ до елементів здійснюють за його номером (індексом). Нумерацію елементів починається з нуля: перший елемент масиву має індекс 0, а останній — (N – 1), де N — кількість елементів масиву.

Двовимірний масив відповідає поняттю прямокутної таблиці елементів. Оголошення двовимірного масиву має такий вигляд:

тип [,] назва_масиву = new тип [кількість рядків; кількість стовпчиків]

Кількістю індексів, які використовуються для доступу до елементів масиву називається розмірність масиву.

int[,]  a = new int[2, 2];    // оголошення 2-вимірного масиву
int[,,] b = new int[2, 2 ,3]; // оголошення 3-вимірного масиву
int[,]  c = new int[3, 2]{{6,0},{5,7},{8,9}}; // ініціалізація 2-вимірного масиву

Розгалудження реалізують з допомогою умовних операторів:

Наприклад, для перевірки введеного числа на парність:

using System;
using System.IO;

namespace My
{ class Program
  { static void Main (string [] args)
    { int a =54;
      Console.WriteLine (a% 2 == 0? "Число парне": "Число непарне");
    }
  }    
}

Мова С# має простір імен System.IO, в якому реалізовано всі класи, необхідні для роботи з файлами. Щоб підключити цей простір імен, необхідно на самому початку програми написати рядок:

using System.IO;

Для використання кодувань потрібно ще дописати: using System.Text;

Робота з файлами (клас File)

Режим доступу (FileAccess) — послідовність символів, що вказує режим відкриття файла і тип файла:

Режими відкриття (FileMode):

Потікспеціальний клас, передбачений у С# для роботи з файлами:

Алгоритм зчитування з (текстового) файлу:

У класі StreamReader реалізовано багато методів для зручного зчитування даних. Серед них:

Алгоритм запису у (текстовий) файл:

  1. Описати змінну типу StreamWriter.
  2. Відкрити файл з допомогою функції open.
  3. Вивести інформацію у файл.
  4. Закрити файл.

У класі StreamWriter реалізовано багато методів для зручного запису даних. Серед них:

Close() — метод закриття потоку з метою звільнити ресурси — обов'язково застосувати після роботи з потоком.

Якщо відомо лише тип, але не кількість величин у файлі, потрібно перед кожним зчитуванням перевіряти, чи досягнуто кінець файлу за допомогою булевої функції F.eof(), де F — назва потоку. Функція повертає true або false залежно від до того, досягнуто кiнця файлу чи ні.

Подамо прокоментований приклад програми роботи з файлами:

using System;
using System.IO;
using System.Text;

class Test
{ public static void Main()
  { string path = @"c:\temp\MyTest.txt";
    try { if (File.Exists(path)) // Якщо файл path існує,
          {   File.Delete(path); // видалити його
          }
          using (FileStream fs = File.Create(path)) // Створити файл
          { Byte[] info = new UTF8Encoding(true).GetBytes("Деякий текст у файлі.");
            fs.Write(info, 0, info.Length);         // Запис у файл
          }

          using (StreamReader sr = File.OpenText(path)) // Відкрити потік для зчитування
          { string s = "";
            while ((s = sr.ReadLine()) != null)
            { Console.WriteLine(s);
            }
          }
        }
    catch (Exception ex)
    { Console.WriteLine(ex.ToString());
    }
  }
}

Цикли служать для багаторазового повторення виконання деякої частини коду. У С# є 4 види циклів:

Цикл for використовують тоді, коли наперед відомо, скільки повторень потрібно зробити. Він має такий синтаксис:

for (дія до почату циклу;
     умова продовження циклу;;
     дія в кінці кожної ітерації циклу;
{
  вказівка1;
  вказівка2;
  …
  вказівкаn;
}

Наприклад, цикл:

for (int i = 0; i <5; i ++) {Console.Write (i + " ");}

виводить на екран 5 (кількість повторень) цілих чисел: 0, 1, 2, 3, 4.

Цикл while використовують для запису повторення, поки справджується деяка умова. Синтаксис має такий вигляд:

В останньому випадку гарантовано щонайменше один прохід циклу.

Цикл foreach слугує для циклічного звернення до елементів колекції (групи об'єктів). У C # визначено кілька видів колекцій, кожна з яких є масивом. Загальна форма запису такого оператора циклу така:

foreach (тип назва_змінної_циклу in назва_колекціївказівка;

Тут тип змінна циклу отримує значення наступного елемента колекції на кожному кроці виконання циклу. Отже, тип змінної циклу має збігатися з типом елемента масиву. Крім цього, тип можна позначати службовим словом var. В цьому випадку компілятор визначає тип змінної циклу, виходячи з типу елемента масиву. Але зазвичай тип вказують явно.

Приклад використання циклу foreach:

using System;
using System.Linq;
using System.Text;

namespace My
{ class Program
  { static void Main(string[] args)
    { int[]  a = new int[5] {3,5,7,9,11};
      foreach (int j in a)
      Console.WriteLine("{0}*{1}={2}",j,j,j*j);
    }
  }
}

Оператор break використовують для дострокового виходу циклу (як правило, у поєднанні з умовним оператором, інакше цикл буде завершено після першого проходження циклу.

Наприклад, при перевірці того, чи містить масив число, кратне 13, знайшовши таке число, немає сенсу перевіряти наступні інші елементи масиву — див. фрагмент коду:

int [] a = {4, 7, 26, 20, 33, 23, 54};
bool   b = false;
for (int i = 0; i < a.Length; i ++)
{ if (a[i] % 13 == 0)
  { b = true;
    break;
  }
}
Console.WriteLine (b? "У масиві є число кратне 13":
                      "У масиві немає числа кратного 13");

Оператор continue дозволяє перейти до наступної ітерації, не завершивши до кінця поточну.


Текст упорядкувала Войтенко Наталія Анатоліївна, вчитель СЗШ № 214 Оболон­ського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 27.11.2017 по 01.12.2017.