Очно-дистанційні курси інформатиків

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Тема 2

Сообщений 1 страница 30 из 39

1

2. Основні поняття мови C# (1 год.+1 год.) Стукалова Ірина Володимирівна
Ключові слова, ідентифікатори
Знаки операцій і роздільники
Літерали
Коментарі
Типи даних
Класифікація типів
Вбудовані типи
Типи літералів
Типи-значення і посилкові типи
Упакування і розпакування

0

2

Саша прав, надо в первую очередь определиться с понятиями, которые вводятся в теме, чтобы не повторяться в следующих темах. В теме 2 буду вводить следующие понятия:
1. Алфавит языка, ключевые слова языка. Тут только хочу советоваться: стоит ли давать таблицу ключевых слов? Во многих книгах она напечатана, я ее ни разу не читала. Может быть не стоит тратить время?
2. понятие литерала(константы)
3. понятие переменной
4. Разделители, знаки операций, коментарии.
5. Определение типа.
6. Классификация типов.

0

3

Тепер потрібно деталізувати, які операції та типи будуть тут розглянуті.

Таблицю ключових слів можна помістити у додатку в кінці посібника. Між іншим, вони в С# називаються "ключові", чи якось по іншому?

0

4

Стукалова И.В. написал(а):

4. Разделители, знаки операций, коментарии.

Надіюсь, крапка з комою не потрапить у категорію "Розділювачі". У C#, на відміну від Паскаля, цей знак - обов'язкова частина оператора, а не розділювач. Навіть якщо цей оператор - останній, в кінці мусить стояти ";"

0

5

Основные термины не зависят от языка. В С# ключевые слова тоже называются ключевыми. А операции - операциями. И нельзя сказать, что в Паскале операторы, а в С# - инструкции. Просто, возможно, раньше инструкции(или вказівки) неправильно называли операторами. И почему разделитель не может быть обязательной частью оператора? Для детализации понятий - присылать текст старосте и научному руководителю или выставлять на сайте для общего обсуждения?

0

6

Стукалова И.В. написал(а):

Основные термины не зависят от языка.

Терміни можуть залежати від мови програмування, і ОПЕРАЦІЯ присвоювання у C-подібних мовах - яскравий приклад.

Щоб не винаходити велосипед, пропоную переглянути доступну україномовну літературу про С/С++/С# та взагалі з інформатики. Можливо, вже є прийнятний переклад термінології. Які книги маєте?

Стукалова И.В. написал(а):

И почему разделитель не может быть обязательной частью оператора?

Тому що він стоїть МІЖ об'єктами, які розділює. У Паскалі крапка з комою ставиться МІЖ частинами програми та МІЖ операторами. Наприклад, в такому випадку вона не потібна:
...
begin
   readln(a)
end.

бо немає ДВОХ об'єктів, які потрібно розділити. У С++ потрібно писати:

{
  cin>>a;
}

Що тут розділює ";" ?

0

7

Стукалова И.В. написал(а):

Основные термины не зависят от языка. В С# ключевые слова тоже называются ключевыми. А операции - операциями. И нельзя сказать, что в Паскале операторы, а в С# - инструкции.

Згоден. "ключові слова" ще називають "зарезервовані слова".

Пилипчук О.П. написал(а):

Терміни можуть залежати від мови програмування, і ОПЕРАЦІЯ присвоювання у C-подібних мовах - яскравий приклад.

Не згоден. Терміни не залежать від мови програмування. В Паскалі присвоювання -- інструкція, в С -- операція. Але терміни від цього не змінюються.

Стукалова И.В. написал(а):

И почему разделитель не может быть обязательной частью оператора?

Пилипчук О.П. написал(а):

Тому що він стоїть МІЖ об'єктами, які розділює.

Пропоную привести визначення "розділювача" для завершення суперечки. Я не згоден ні з однією точкою зору. Незрозуміло, що мається на увазі під "розділювачем". Якщо це пробіли, табуляції, переводи рядків, то крапка з комою не відноситься до них ні в Паскалі, ні в С. Якщо це крапка з комою, то незрозуміло, чому слово написане в множині: "розділювачі". В Паскалі є ще якісь розділювачі?

0

8

Кухар Андрій написал(а):

"ключові слова" ще називають "зарезервовані слова".

Є ще непоганий варіант "службові слова", але пропоную зупинитись на "зарезервовані", бо це краще відбиває суть: мова резервує їх для себе, тобто забороняє довільне використання.

Кухар Андрій написал(а):

Не згоден. Терміни не залежать від мови програмування. В Паскалі присвоювання -- інструкція, в С -- операція. Але терміни від цього не змінюються.

Згоден. Хоча краще все назвати просто операторами, оскільки всі вони реалізують якісь операції. Якщо операція не зовсім очевидна, то треба трохи "пофантазувати".

Кухар Андрій написал(а):

В Паскалі є ще якісь розділювачі?

Є. Кома є розділювачем аргументів при виклику функції та імен змінних в описах. Двокрапка відокремлює перелік змінних від ідентифікатора або опису типу.

0

9

Очевидно, що кома як розділювач ідентифікаторів залишається і у C#.
Щодо крапки з комою, оператора чи інструкції, то як трактувати таке
if (x<0) y=-x;
else y=x;
Питання до Пилипчука. Тут один оператор чи два?
Я схиляюся до точки зору Кухара.
Давайте вводити термін інструкція.
Стереотипи, сформовані раніше, нам дуже заважають. Для навчання з нуля різниці не буде.

А такі дискусії дуже потрібні. Термінологію потрібно формувати і не слід враховувати неправильні традиції.

Прохання і в інших темах розпочинати роботу.

0

10

Rebryna V написал(а):

if (x<0) y=-x;
else y=x;
Питання до Пилипчука. Тут один оператор чи два?

Якщо користуватися лише поняттям "оператор", то тут наведено ОДИН умовний оператор, в структурі якого використано ДВА оператори-вирази, в структурі яких, в свою чергу використано ТРИ оператори: для реалізації двох операцій присвоювання та математичної операції унарний мінус.

Просто, як правда! Операція - це якийсь процес, а оператор - спосіб відображення цього процесу у тексті програми. Томі у програмі - тільки оператори.

0

11

Пилипчук О.П. написал(а):

Є ще непоганий варіант "службові слова", але пропоную зупинитись на "зарезервовані", бо це краще відбиває суть: мова резервує їх для себе, тобто забороняє довільне використання.

Згоден.

Пилипчук О.П. написал(а):

Є. Кома є розділювачем аргументів при виклику функції та імен змінних в описах. Двокрапка відокремлює перелік змінних від ідентифікатора або опису типу.

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

0

12

Здається сформувалося дві думки про оператори.

1. Все оператори.
2. Інструкції та операції.

"Все оператори" мені теж подобається. Дуже вже логічно звучить "оператори виконують операції". І немає заборони operator називати оператором.

Доречі ці дві позиції не протирічать одна одній. Тому замість вибирати давайте підемо далі. :)

ОПЕРАЦІЯ -- дія.

ОПЕРАТОР -- це позначення (визначення) ОПЕРАЦІЇ. Будь-якої -- if, while, +, -. Оператор if (розгалуження) виконує операцію розгалуження. Оператор while (повторення) виконує операцію повторення. Оператор + виконує операцію додавання.

ВИРАЗ -- будь-яка комбінація ОПЕРАТОРІВ та їх аргументів. Тільки вирази можуть набувати значення. Але можуть і не набувати їх. Вираз a+b набуває значення. Вираз if (x > y) y = x; не набуває значення.

ІНСТРУКЦІЯ -- структурна імперативна одиниця програми. Елемент, що спонукає до дії. Бувають прості та складені інструкції. Проста ІНСТРУКЦІЯ за своєю суттю є ВИРАЗОМ, що закінчується крапкою з комою. Складена ІНСТРУКЦІЯ є послідовністю ОПИСІВ та ІНСТРУКЦІЙ записана в фігурних дужках.

ОПИС -- описова (не імперативна) одиниця програми. Опис змінних, класів тощо. ОПИС не спонукає до дії. За виключенням описів, що містять обчислення початкового значення у вигляді ВИРАЗУ.

Таким чином:

Rebryna V написал(а):

if (x<0) y=-x;
else y=x;

Це ІНСТРУКЦІЯ. Це ВИРАЗ, що складається з оператора if, який в свою чергу містить ВИРАЗ, та дві ІНСТРУКЦІЇ (аргументи оператора if з математичної точки зору). Обидві ІНСТРУКЦІЇ в свою чергу є ВИРАЗАМИ, що містять ОПЕРАТОР =.

Програма на C# по суті є послідовністю ОПИСІВ класів. ОПИС класу є послідовністю ОПИСІВ полів та методів. Метод містить ІНСТРУКЦІЇ. Складена ІНСТРУКЦІЯ містить ОПИСИ та ІНСТРУКЦІЇ. Проста ІНСТРУКЦІЯ містить ВИРАЗ. ВИРАЗ містить ОПЕРАТОРИ та аргументи, які в свою чергу можуть бути ВИРАЗАМИ та ІНСТРУКЦІЯМИ.

Або знизу. Найменшими одиницями програми є ОПЕРАТОРИ та їх аргументи. Вони утворюють ВИРАЗИ. ВИРАЗИ утворюють ІНСТРУКЦІЇ.

Таким чином все оператори і if, і +. Єдиним наслідком для нашої дискусії про оператори є те, що не буває складених ОПЕРАТОРІВ, є складені ІНСТРУКЦІЇ. "Складений оператор" це скоріше ВИРАЗ -- комбінація ОПЕРАТОРІВ.

0

13

Ого!

Для початківців з цього треба зробити "вижимку". Так як дітям у 1 класі кажуть про числа і вони цілком успішно працюють десь до 6 класу, не знаючи, що бувають ВІД'ЄМНІ числа.

Крім того, у Страустрапа про С++ написано: "Описание - это ОПЕРАТОР, который вводит имя в программе." І мені це подобається, бо дозволяє спростити структуру базових понять.

Кухар Андрій написал(а):

не буває складених ОПЕРАТОРІВ

Не бачу причини відмовлятися від "складеного оператора". Можна вважати, що він реалізує якусь складну (або дуже складну :) ) операцію. Тому він дійсно є ВИРАЗОМ.

Кухар Андрій написал(а):

ВИРАЗ -- будь-яка комбінація ОПЕРАТОРІВ та їх аргументів. Тільки вирази можуть набувати значення. Але можуть і не набувати їх.

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

І ще треба знайти місце одинарному знаку ";". їх можна ставити кілька підряд. У Паскалі казали "порожній оператор".
Але:

Кухар Андрій написал(а):

ОПЕРАЦІЯ -- дія.
ОПЕРАТОР -- це позначення (визначення) ОПЕРАЦІЇ.

А у випадку окремого ";" дія відсутня. Чи все-таки назвемо цей знак "розділювачем"?

0

14

Схоже, відпадає потреба у понятті ІНСТРУКЦІЯ.

0

15

Пилипчук О.П. написал(а):

Схоже, відпадає потреба у понятті ІНСТРУКЦІЯ.

Я так не вважаю. Мені дуже імпонує поняття "Інструкції керування ходом виконання програми". І розглянути такі:
1. Інструкції вибору.
2. Ітераційні інструкції.
3. Інструкції переходу.

Щодо операторів, то їх також треба класифікувати. Один із авторів запропонував таку класифікацію, яка також мені сподобалася:
1. Арифметичні оператори.
2. Логічні оператори.
3. Оператори відношень.
4. Оператор присвоєння.
5. Складені оператори присвоєння ( +=, -+, *=, ...).
6. Оператор ?.
7. Оператор . (крапка - зв'язує ім'я об'єкта з іменем його члена).
8. Оператор new і т.д.

0

16

Rebryna V написал(а):

if (x<0) y=-x;
else y=x;

Моє тлумачення таке. Це інструкція розгалуження, яка сладається із зарезервованих слів "if", "else", логічного виразу з оператором відношення "(x<0)" та операторів присвоєння "y=-x" i "y=x". Крапка з комою - це знак, який входить до синтаксичної структури інструкції розгалуження.

0

17

Бачу, що в С#, порівняно з С++, є ще такі зміни:

- у виразі останньою має виконуватися операція присвоювання ( int a=7,c;  a*(c=6); - не компілюється з помилкою "Only assignment, call, increment, decrement, and new object expressions can be used as a statement (CS0201));
- логічний тип не ототожнюється з цілими типами ( int a=7; if (a) a+=5; else a-=5; - не компілюється з помилкою "Cannot implicitly convert type 'int' to 'bool' (CS0029))

Rebryna V написал(а):

Це інструкція розгалуження,...
Крапка з комою - це знак, який входить до синтаксичної структури інструкції розгалуження.

Структура інструкції розгалуження така:

if (логічний вираз) інструкція else інструкція

Ніякої крапки з комою тут немає.

Виходить, що найпростішою є ІНСТРУКЦІЯ ВИРАЗ. Тільки вираз містить в кінці ";" і все, що містить в кінці ";" - вираз. Зокрема, допускається порожній вираз - тільки ";".

Rebryna V написал(а):

1. Інструкції вибору.
2. Ітераційні інструкції.
3. Інструкції переходу.

4. Інструкція вираз

0

18

Вам не кажется, что от такой терминологии у детей возникнет каша в голове? Дети кроме английского изучают еще и математику, а там сложение, умножение т.д., включая сравнение - это операции. Зачем входить в конфликт с используемыми терминами на другом предмете? Я разговаривала с нашей учительницей математики. У меня сейчас три книги по С#. Во всех эти понятия трактуются по-разному. Шилдт называет операции операторами, как предлагает Андрей, а у Павловской и Микелсена операции остались операциями, а операторы - операторами. Я не понимаю, что, суть присваивания изменилась от названия? Это уже не заполнение переменной значением? А переменная - не физический участок памяти? Или ветвление имеет какой-то другой смысл? Почему профессор, доктор наук оставляет название операции сложению и умножению, а нам надо обязательно запутать всех, только чтобы было как у Страустрапа? Кстати, переводили-то переводчики. Перевести тоже можно по разному. И что в Паскале ветвление - не составная команда, которая тоже может содержать несколько других команд? А константа перестала быть константой от того, что ее назвали литералом? Как говорил Козьма Прутков давайте зрить в корень. И не усложнять и без того нелегкую задачу. Кстати, во всех трех книгах, включая Шилдта точка с запятой относится к разделителям. Специально отсканирую страничку и вышлю тебе Саша почтой. Ребята, вы умничаете.

0

19

Стукалова И.В. написал(а):

Ребята, вы умничаете.

Ми намагаємось вибрати єдиний підхід для всіх розділів. Бажано щоб він був логічно виваженим. І, схоже, нам це вдається. Нагромадження ідей поступово переходить у формування прийнятної системи. Ніхто з нас не заперечував, що додавання і множення - операції. Математики використовують те, що вони називають ЗНАКАМИ МАТЕМАТИЧНИХ ОПЕРАЦІЙ, а ми, напевно, назвемо ОПЕРАТОРАМИ (+,*). Бо у нас крім математичних операторів будуть інші (логічні, крапка тощо). За допомогою операторів ми будуватимемо ВИРАЗИ. На послідовність обчислення виразів впливатимуть ІНСТРУКЦІЇ (опис, вираз, вибір, повторення тощо).
Якщо ми зможемо зробити базову систему понять стрункою і зрозумілою, програмування може перетворитися зі "страшилки" для більшості учнів у, хай не просту, але зрозумілу річ. І англійська тут ні до чого, бо в Гаврилівці вивчають німецьку! :)

Шилдт сам писав книгу і проблема різнобою термінології в різних розділах йому не загрожувала. А у нас - збірна команда. Якщо кожен напише зі своєї точки зору, то редактор загнеться :), поки зведе все до спільного знаменника! А може так і не зведе...

Стукалова И.В. написал(а):

Кстати, во всех трех книгах, включая Шилдта точка с запятой относится к разделителям.

Ти ж знаєш, Іра, як я відношуся до тиску авторитетів. Навіть якщо найрозумніша людина скаже дурницю, то вона (дурниця) від цього не стане абсолютною істиною.

0

20

Ладно, в конце концов какая разница, как называть понятия, которыми уже пользовались. Итак, сложение, умножение, сравнение - операция. Выполняет операцию - оператор (+, *, <,> т.д.).
Выражение состоит из операций, одной или нескольких.
Инструкция - команда программы. (if, for, т.д.) Инструкция состоит из ключевых слов и выражений и может включать другие инструкции. Если я неправильно поняла Андрея, пусть он поправит. Кроме того, Андрей, объясни мне еще раз связь понятий инструкция и выражение.
if (x<0) y=-x;
else y=x;
Здесь if -оператор, а все вместе -  инструкция? А выражения x<0;y=-x?

0

21

Стукалова И.В. написал(а):

Ладно, в конце концов какая разница, как называть понятия, которыми уже пользовались. Итак, сложение, умножение, сравнение - операция. Выполняет операцию - оператор (+, *, <,> т.д.).
Выражение состоит из операций, одной или нескольких.
Инструкция - команда программы. (if, for, т.д.) Инструкция состоит из ключевых слов и выражений и может включать другие инструкции. Если я неправильно поняла Андрея, пусть он поправит. Кроме того, Андрей, объясни мне еще раз связь понятий инструкция и выражение.
if (x<0) y=-x;
else y=x;
Здесь if -оператор, а все вместе -  инструкция? А выражения x<0;y=-x?

Я ще раз подумав над цією системою. Дійсно так буде логічно.

Трохи здаю назад. Не потрібно занадто розширювати поняття оператора та виразу. Бо ми з термінологічної суперечки перейшли в ідеологічну. А це вже занадто. Давайте орієнтуватися на англійскі терміни, і просто вводити свої, що відповідають їм один до одного. Що б у нас співпадали поняття позначені відповідними термінами. Бачу з цим погоджується і Віталій Арсеновий і Іра.

І так, повернемо if статус інструкції. І заберемо у нього статус виразу. Тоді все буде відповідати англійским термінам.

operator -- оператор (+, -, ...)
statement -- інструкція (if, while, проста інструкція, складена інструкція, ...)
expression -- вираз (конструкція з операторів та їх аргументів)

на прикладах:

x < 0 -- вираз, < -- оператор
y = -x -- вираз, =, - -- оператори
y = -x; -- інструкція (проста інструкція)

if (x<0) y=-x;
else y=x; -- інструкція (інструкція розгалуження, що складається з зарезервованих слів if, else, виразу x < 0, та інструкції y = -x; y = x;

Інструкція розгалуження має вигляд if (<вираз>) <інструкція> else <інструкція>

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

0

22

Стукалова И.В. написал(а):

Я не понимаю, что, суть присваивания изменилась от названия? Это уже не заполнение переменной значением?

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

Стукалова И.В. написал(а):

А константа перестала быть константой от того, что ее назвали литералом?

Слово "літерал" (англ. literal -- буквальний) ввели для того, що відрізнити "константи" від "констант". :)

const int c = 5;

c -- константа
5 -- літерал

"літерали" в нас ще часто називають значеннями, або теж константами. (5, 7.4, 1.0F, true, false, null, "hello")

0

23

Можна пошукати хіба що більш вдалі слова для перекладу відповідних англійських термінів. Як то "інструкція" -- "вказівка", "літерал" -- ?.

0

24

Кухар Андрій написал(а):

if (x<0) y=-x;
else y=x; -- інструкція (інструкція розгалуження, що складається з зарезервованих слів if, else, виразу x < 0, та інструкції y = -x; y = x;

Обов'язково акцентувати, що вираз може бути самостійною інструкцією (в кінці ставиться крапка з комою - інструкція-вираз), а може бути частиною інструкції (x<0 у цьому прикладі). По суті, крапка з комою перетворює вираз у інструкцію-вираз.

0

25

Стукалова И.В. написал(а):

Для детализации понятий - присылать текст старосте и научному руководителю или выставлять на сайте для общего обсуждения?

или выставлять на сайте для общего обсуждения

Пилипчук О.П. написал(а):

І ще треба знайти місце одинарному знаку ";". їх можна ставити кілька підряд. У Паскалі казали "порожній оператор".

Пилипчук О.П. написал(а):

А у випадку окремого ";" дія відсутня. Чи все-таки назвемо цей знак "розділювачем"?

Ми його назвемо порожньою інструкцією.

0

26

І ще одне за необхідність відповідати англійським термінам і не називати if оператором.

operator overloading -- можливість визначати дію операторів над об'єктами. Є таблиця, які оператори можна перевантажувати (+, -, ...), а які не можна (=, ?:, ...). Якщо ми назвемо if оператром, то нам потрібно буде додати, що (if, while, ...) перевантажувати неможна. Це звучить досить дивно. Ще більш дивно звучить "перевантаження складеного оператора {}". :)

0

27

Кухар Андрій написал(а):

І так, повернемо if статус інструкції. І заберемо у нього статус виразу. Тоді все буде відповідати англійским термінам.

operator -- оператор (+, -, ...)
statement -- інструкція (if, while, проста інструкція, складена інструкція, ...)
expression -- вираз (конструкція з операторів та їх аргументів)

на прикладах:

x < 0 -- вираз, < -- оператор
y = -x -- вираз, =, - -- оператори
y = -x; -- інструкція (проста інструкція)

Я запуталась снова: Если y=-x  и вираз и інструкція, то чем они отличаются? Я поняла, что присваивание - оператор, значит это операция или выражение. А if, for - инструкции.

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

0

28

Кухар Андрій написал(а):

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

Тут я согласна с Андреем. Отдельно разделители описывать не буду. Будем обращать внимание на них при описании синтаксиса инструкции. Более-менее с терминологией определились. Пока в объеме моего раздела. Андрей, спасибо за консультацию. Поняла особенности понятия литерал. В книге просто написано, что это константа.

0

29

Стукалова И.В. написал(а):

Я запуталась снова: Если y=-x  и вираз и інструкція, то чем они отличаются?

Нет. "y=-x" -- выражение. "y=-x;" -- инструкция.

c = a * a + b * b;

"a * a", "b * b", "a * a + b * b", "c = a * a + b * b" -- выражения

"c = a * a + b * b;" -- инструкция

";" -- пустая инструкция

{
  a = b;
  c = d;
} -- составная инструкция

0

30

Стукалова И.В. написал(а):

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

Спорные или сомнительные моменты на форуме.

Полный текст конечно почтой рассылать всем "редакторам". Это позже.

0