Программирование

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

Генрих вот я хочу узнать о

Генрих вот я хочу узнать о программировании всё! Хочу научится программировать по Паскалью помогите ребята! Кто хорошо знает Паскаль после занятий у кого есть время научите пожалуста)))

Генрих вот я хочу узнать о

Генрих вот я хочу узнать о программировании всё! Хочу научится программировать по Паскалью помогите ребята! Кто хорошо знает Паскаль после занятий у кого есть время научите пожалуста)))

Ислам, поддерживаю Ваш

Ислам, поддерживаю Ваш настрой, как впрочем, и настрой Генриха! Более того, мне бы хотелось, чтобы эта площадка в основном служила для предметных обсуждений в русле лекционно-лабораторной тематики. Тем более, что именно этот материал войдёт в экзаменационную сессию. Спрашивайте обо всём что не понятно.
Для начала, предлагаю небольшой ликбез по вставке в комменты красивого Паскаль- кода. Попробуйте сделать так, чтобы у вас получилось вот так:

  1. Program One;
  2. Begin
  3.   Writeln('Hello, World of students!')
  4. End.

Повторите кто сможет! А кто не сможет, подождите объяснений.

И замечание, Ислам! Посылка

И замечание, Ислам!
Посылка дублированных постов называется флудом (flood) и в приличном обществе в СЕТИ не приветствуется. Допускаю, что Вы этого не знали.

Program Two; Begin   While

  1. Program Two;
  2. Begin
  3.   While 1=1 do
  4.   Begin
  5.     Writeln('Hello World of students!');
  6.     Writeln('-------------------------------');
  7.   end;
  8. end;

Хм, так подойдёт? Я только с табуляцией не разобрался... Лепил пробелы... Тег табуляции стандартный работает?

Хочу узнать про

Хочу узнать про программирование на Android о SDK и App Inventor for Android.

Малхожева Оксана аватар

Ислам Макаов,обращаюсь к тебе))

У меня есть классная презентация по основам Паскаля,где все подробно и понятно написано начиная с самых азов. Еще есть,опять же в электронном виде учебник по Паскалю,скажем так "для чайников" и для начинающих))))))я Скину всю эту информацию на флэшку,подойди ко мне и я тебе дам скинуть все что есть у меня по Паскалю))))00

Малхожева Оксана аватар

А тебе Генрих респект))))

Молодец,что создал "скорую помощь" по программированию для первокурсников))))

Хорошо я подойду

Хорошо я подойду

Красивый код ...

Алексей, спасибо за код - всё так. Табуляцию оставим. Продолжу...
Каждому, кто хочет научиться вставлять в комменты код (а уметь это делать должны все, без исключения), предлагаю набрать буквально следующее:
< pre>
<Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
<точка> ::= .
< /pre>

ВНИМАНИЕ! После знака "<" в тегах < pre> и < /pre> пробелов быть не должно (хотя здесь у меня они есть).
Иначе, эти теги как надо не сработают!
У вас, после сохранения должно отобразиться следующее (кстати, запомните этот код!):

  1. <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .

Вместо тегов < pre> и < /pre> можно использовать, соответственно, < code> и < /code> .
О том, что такое тег, Вы можете прочесть в указанной мною на этом сайте статье о web-технологиях.
А ещё, чтобы понять, что мы здесь оформили как код, обязательно почитайте статью о БНФ на этом сайте.

<Паскаль-программа> ::=

  1. <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .

как то вроде так...

<МиП-программа>

Понятно, что в примере "Красивый код..." (см. чуть выше) дано начало формальному описанию языка Паскаль в БНФ.
Т.к. полное описание грамматики Паскаля было бы слишком громоздким, для иллюстрации
применения БНФ и, одновременно, знакомства с важнейшими языковыми понятиями, ограничимся
узким подмножеством Паскаля, которое назовём языком МиП ("МиниПаскаль").

То, что МиП - это подмножество Паскаля, означает следующий важный факт: любая МиП-программа, является одновременно, синтаксически правильно построенной Паскаль-программой. Так, что знакомясь с МиП ничего лишнего изучать и не придётся.
Итак, продолжим БНФ-описание, теперь уже языка МиП:

  1. <МиП-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .
  3. <заголовок_программы> ::= program <имя_программы>
  4. <имя_программы> ::= <идентификатор>
  5. <идентификатор> ::= <буква> | <идентификатор> <буква> | <идентификатор> <цифра>
  6. <буква> ::= а | b | ... | y | z | A | B | ... | Y | Z | _
  7. <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Обратите внимание, в число букв мы включили и символ "_" .
И ещё. Дальнейшее уточнение возможной структуры объектов <МиП-программа> требует, очевидно, детализации того, что представляют собой языковые объекты важнейшей в теории языков категории <блок>.

Зиновьев Александр аватар

Тож попробую. =)

  1. <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .

Вроде получилось) Я плохо помню Паскаль, надо вспоминать...

Хорошо, Саша. Ислам,

Хорошо, Саша. Ислам, пробуйте!

БЛОК, описание переменных.

Продолжу БНФ-описание МиПа...

  1. <блок> ::= <декларативная_часть>
  2.                    <составной_оператор>
  3. <декларативная_часть> ::= <пусто> | <список_секций> ;
  4. <пусто> ::=
  5. <список_секций> ::= <секция> | <список_секций> ; <секция>
  6. <секция> ::= <секция_переменных> | <секция_констант>
  7.  
  8. <секция_переменных> ::=  var <список_описаний_переменных>
  9. <список_описаний_переменных> ::= <описание_переменных> |
  10.                        <список_описаний_переменных>;<описание_переменных>
  11. <описание_переменных> ::= <список_переменных> : <тип>
  12. <список_переменных> ::= <переменная> | <список_переменных> , <переменная>
  13. <переменная> ::= <идентификатор>
  14. <тип> ::= Byte | Word | ShortInt | Integer | LongInt

Отложив пока рассмотрение секции констант, теперь можно перейти к уточнению операторной, т.е. собственно, алгоритмической составляющей блока, - объекту <составной_оператор>.

ВНИМАНИЕ! То, что мы здесь пишем, это не программа на каком-либо языке, а описание того, как устроены все программы на этом языке (в данном случае, на языке МиП).

БЛОК, составной оператор

Если говорить неформально, то составной оператор - это последовательность операторов (определяющих в той же последовательности соответствующие действия исполнителя), заключённая в операторные скобки (begin и end).

А вот формальное определение того, что такое <составной_оператор> в ЯП МиП:

  1. <составной_оператор> ::= begin <оп_последовательность> end
  2. <оп_последовательность> ::= <оператор> | <оп_последовательность>;<оператор>
  3. <оператор> ::= <оп_ввода> | <оп_вывода> | <оп_присваивания> | <пустой_оп>
  4.  
  5. <оп_ввода> ::= readln | readln(<список_ввода>)
  6. <список_ввода> ::= <список_переменных>
  7.  
  8. <оп_вывода> ::= writeln(<список_вывода>)
  9. <список_вывода> ::= <список_выражений>
  10.  
  11. <список_выражений> ::= <выр> | <список_выражений>,<выр>
  12. <выр> ::= <арифм_выр> | <текст_выр>
  13. <арифм_выр> ::= <целая_константа> | <переменная> | <арифм_выр> <знак_ар_оп> <арифм_выр>
  14. <знак_ар_оп> ::= + | - | * | div | mod
  15. <текст_выр> ::= <текст_константа>
  16.  
  17. <оп_присваивания> ::= <переменная> := <выр>
  18. <пустой_оп> ::= <пусто>

Понятие текстовой константы, содержащееся в этих определениях, определяется здесь.

БЛОК, определение констант

И наконец, наш должок - определение констант:

  1. <секция_констант> ::= const <список_объявлений_констант>
  2. <список_объявлений_констант> ::= <объявление_константы> |
  3.                   <список_объявлений_констант> ; <объявление_константы>
  4. <объявление_константы> ::= <имя_константы> = <константа>
  5. <имя_константы> ::= <идентификатор>
  6. <константа> ::= <целая_константа> | <текст_константа>
  7.  
  8. <целая_константа> ::= <цел_без_знака> | <знак> <цел_без_знака>
  9. <цел_без_знака> ::= <цифра> |  <цел_без_знака> <цифра>
  10. <знак> ::= +|-
  11.  
  12. <текст_константа> ::= '<ascii-последовательность>'
  13. <ascii-последовательность> ::= <пусто> | <ascii-символ> |
  14.                      <ascii-последовательность> <ascii-символ>

Вот и всё, БНФ-определение ядра МиП можно считать завершённым. Добавляя новые языковые конструкции, ядро это можно расширять (вплоть до полной версии Паскаля).
Обратите внимание на одну деталь, понятие < ascii-символ> мы так и не уточнили. Причины тому чисто технические - слишком длинный список ascii-символов (всего, 256 знаков, включая все те, которые Вы видите на клавиатуре).

И ещё, запомните. Лишние пробелы и переходы на новые строки между лексемами в Паскале (и в МиП, конечно) не учитываются и могут использоваться произвольно для придания тексту любого рельефа. А вот, например, идентификаторы, обозначения констант и ключевых слов разрывать нельзя (т.к. они и есть примеры лексем).

Хочу поблагодарить всех кто

Хочу поблагодарить всех кто принимает участие. Я сам узнал нечто новое для себя. Думаю дальше наша "скорая помощь" будет только развиваться.

Умиротворённости Генриха

Умиротворённости Генриха я ни в коей мере не разделяю! Никакая "cкорая помощь" здесь, на сайте, пока, очевидно, не работает.
Ни одного (!) предметного вопроса, комментария или замечания по представленному в моих постах и рекомендованному всем для изучения материалу не поступило.
Даже на чисто техническое моё задание о вставке кода в комментарии, отреагировали всего лишь пара человек. Полнейший игнор...
Смешно сказать, но чуть-ли не 10% так и висят, будучи не в состоянии уже почти в течение месяца зарегистрироваться на сайте.
Честно сказать, мне жаль своего труда ...

Тем не менее, статистику вашей хотя бы относительной активности, я веду. И для дальнейшего её накопления, раз нет вопросов у вас, будут они к вам у меня. Причём, сегодня же, по БНФ и МиП.

БНФ. Вопрос 1.

Дан текст:

  1. program a;
  2. begin
  3.  
  4. end.

Является ли он правильно построенной МиП-программой? Ответ обосновать (просто ответы типа да/нет не принимаются). Участвует только 1-й курс. Первый, кто ответил правильно и полно получает 3 рейтинговых балла.

БНФ. Вопрос 2

Текст такой:

  1. program bbb;
  2. const   one:=1;
  3. begin;
  4.     writeln('one=',one)
  5. end.

Если текст является правильно построенной МиП-программой, доказать это. Если же нет - воспроизвести в своём комменте в виде "красивого" кода те строки, которые содержат, на Ваш взгляд, ошибку. Ответ обосновать. Три балла и за эту задачу.

БНФ. Вопрос 3.

Дан текст:

  1. program c5
  2. ;begin writeln
  3. (5--2,'=') end
  4. .

Является ли он МиП-программой? Ответ обосновать. Только 1-й курс. Три рейтинговых балла.

Зиновьев Александр аватар

!

Сейчас попробуем ответить на что-нибудь. =)

Ответ на вопрос №2

Текст не является правильно построенной МиП-программой, т.к. в нём присутствует ошибка - const one не может присваивать себе значение подобно переменной.
Пример правильно написанной программы:

  1. program bbb;
  2. const   <strong><strong><em>one=1</em></strong></strong>;
  3. begin;
  4.     writeln('one=',one)
  5. end.

К сожалению у меня нет

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

Зиновьев Александр аватар

Вопрос 3.

Данная программа является МиП-программой, т.к. составлена без ошибок и не нарушена структура построения программы. Единственное, что может вызвать вопрос - это стиль записи данной программы, поэтому её лучше написать и изобразить следующим образом:

  1. program c5;
  2. begin
  3.      writeln(5--2,'=')
  4. end.

ответ на вопрос №1

Да является. Но именно в таком виде кода. Если добавить var и прописать там переменные, в частности переменную а, то программа будет работать не корректно или вообще не будет работать т.к. по правилам написания программ на языке Turbo Pascal запрещается давать имя программе символами, которые будут использоватся далее в этой же программе.

ответ на вопрос №1

Всё, успел ответить на первые два вопроса.

Нет. Георгий.

Нет, Георгий.
1. Фактически не выполнено условие задания.
2. "Обоснование", если оно вообще верно, не является логически убедительным.
Да, и текст Ваш, Георгий, выглядит странновато ...

Конкурс по задаче 2 считаю не завершённым!
P.s. А последние две фотки ребят просто cool. Главное - внятные!

Нет, Александр.

Строгого обоснования не прозвучало и здесь.
Конкурс продолжается и по задаче 3.

И снова, нет, Георгий.

Ответ на вопрос 1 я также отвергаю. Обоснование и здесь не убедительно!

Проблема всех трёх неудач одна - авторы ответов пытаются исходить из своего знания Паскаля.
А оно не предполагается и даже вредно! Опираться необходимо на БНФ-описание МиП.

Красивый код...

  1. <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::=.

Малхожева Оксана аватар

хотела написать ответ на

хотела написать ответ на задачу 3,но когда прочитала комменты я поняла,что мой ответ полностью совпадает с ответом Александра...не понимаю,что у него неправильного в ответе?)))

Наконец-то, Ислам!

А теперь внимательно вникните в то, что написали. Программа состоит из заголовка, завершающегося символом ";" , из блока и т.п. Все эти понятия разъясняются в других моих комментариях.

Я, Оксана, не сказал

Я, Оксана, не сказал "неправильно". Читайте и делайте всё предельно внимательно!

Задача 2

Сразу кидается в глаза то, что в разделе описания констант после имени идентификатора должен быть знак =, а не :=

Во-первых, Анастасия

Во-первых, Анастасия, не флудите!
А во вторых, признавая замеченную Вами ошибку, её заметил и Георгий, я прошу внимательно (!) прочесть мою критику его ответа на этот вопрос

Пример строгого обоснования

Вот строгое обоснование (если хотите, доказательство) того, что текст:

  1. program a;
  2. begin
  3.  
  4. end.

является правильной МиП-программой.

Согласно замечания о том, что в МиП лишние пробелы и переходы на новую строчку не учитываются (концовка этого коммента), перепишем наш текст в эквивалентной форме:
program a ; begin end .
В этом виде, наш текст можно рассматривать как СЛОВО, состоящее из шести символов (лексем). Следовательно, требуется выяснить, принадлежит ли это слово языку МиП, определяемому заданными БНФ-описаниями.

В соответствии с концовкой статьи о БНФ, ответ на этот вопрос утвердителен тогда и только тогда, когда выше приведённая строка может быть выведена из исходного нетерминального символа <МиП-программа> рассматриваемого БНФ-определения языка МиП.

Действительно, указанный вывод мог бы быть следующим:

  1. <МиП-программа> => <заголовок_программы>; <блок> <точка> =>  
  2. program <имя_программы> ; <блок> <точка>  => program <идентификатор> ; <блок> <точка>
  3.  => program <буква> ; <блок> <точка> => program a ; <блок> <точка> =>
  4. program a ; <декларативная_часть> <составной_оператор> <точка> =>
  5. program a ; <пусто> <составной_оператор> <точка> =>
  6. program a ; <составной_оператор> <точка> =>
  7. program a ; begin <оп_последовательность> end <точка> =>
  8. program a ; begin <оператор> end <точка> => program a ; begin <пустой_оп> end <точка> =>
  9. program a ; begin <пусто> end <точка> => program a ; begin  end <точка> =>
  10. program a ; begin  end .

Итак, в 1-й строке - исходный нетерминальный символ, в 10-строке - выведенное из него наше слово, состоящее только из терминальных символов. Между ними - цепочка вывода, т.е. пошагового применения правил рассматриваемой грамматики. Символом "=>" мы обозначили слово "непосредственно выводится". Какие именно правила применялись на каждом шаге вывода - выясните сами.

Задача 1... Задача 1

Задача 1...
Задача 1 соответствует форме - <заголовок_программы>; <блок> <точка>
Заголовок соответствует форме - <заголовок_программы> ::= program <имя_программы>
Имя программы соответствует форме - <идентификатор> ::= <буква>
Блок соответствует - <составной_оператор> ::= begin <оп_последовательность> end
Оп_последовательность соответствует форме <оп_последовательность> ::= <оператор> | <оп_последовательность>;<оператор>
Оператором является пустой оператор - это возможно.
На основании данных пунктов, Задача 1 - является правильно построенной МиП-программой.

Валерий Шахамболетович!!!!Так

Валерий Шахамболетович!!!!Так не честно, я только набрал ответ!!!Только он чуть-чуть отличается...но всё таки может выложить, посмотрите??? Мне просто интересно приняли бы вы такой ответ или нет???

Эх... Минут бы на 10 раньше

Эх... Минут бы на 10 раньше отправил... Свой ответ...

да.данный текст является

да.данный текст является правильно построенной МиП-программой.
Так как он удовлетворяет удовлетворяет БНФ оисанию.

  1. <МиП-программа> ::= <заголовок_программы>;
  2. <блок> <точка>
  3. <точка> ::= .
  4.  
  5. <заголовок_программы> ::= program <имя_программы>
  6. <имя_программы> ::= <идентификатор>
  7. <идентификатор> ::= <буква>
  8. <буква> ::= а | b | ... | y | z | A | B | ... | Y | Z | _
  9.  
  10. <блок> ::= <декларативная_часть>
  11.             <составной_оператор>
  12.  
  13. <декларативная_часть> ::= <пусто>;
  14. <пусто> ::=
  15.  
  16. <составной_оператор> ::= begin <оп_последовательность> end
  17. <оп_последовательность> ::= <оператор>;<оператор>
  18. <оператор> ::= <пустой_оп>
  19. <пустой_оп> ::= <пусто>

Как-то воде так...Как ещё объянить я даже и не знаю:(

Поздравляю!

Алексей Зубко и Иващенко Сергей получают-таки свои бонусные баллы по задаче 1.
Но дело не столько в этом, а в том, что они пока реальные лидеры!

Ответ на вопрос 2

Согласно замечания о том, что в МиП лишние пробелы и переходы на новую строчку не учитываются, перепишем наш текст в эквивалентной форме:
program bbb;const one:=1;begin;writeln('one=',one) end.
В соответствии с концовкой статьи о БНФ, ответ на этот вопрос утвердителен тогда и только тогда, когда выше приведённая строка может быть выведена из исходного нетерминального символа <МиП-программа> рассматриваемого БНФ-определения языка МиП,попробуем это сделать. Если на каком-то шаге это будет не возможно, то следовательно данный текст Мип-программой являться не будет!

  1. <МиП-программа> => <заголовок_программы>; <блок> <точка> =>  
  2. program <имя_программы> ; <блок> <точка>  =>
  3. program <идентификатор> ; <блок> <точка> =>
  4. program <буква> ; <блок> <точка>  =>
  5. program <идентификатор><буква> ; <блок> <точка>  =>
  6. program bbb ; <блок> <точка> =>
  7. program bbb ; <декларативная_часть> <составной_оператор> <точка> =>
  8. program bbb ; <список_секций> <составной_оператор> <точка> =>
  9. program bbb ; <секция_констант> <составной_оператор> <точка> =>
  10. program bbb ; const <список_объявлений_констант> <составной_оператор> <точка> =>
  11. program bbb ; const <объявление_константы> <составной_оператор> <точка> =>
  12. program bbb ; const <имя_константы> = <константа> <составной_оператор> <точка>

на этом шаге мы и нашли ошибку так как в тексте вместо one=1; написано one:=1;
следовательно данный текст Мип-программой не являтся.
правильный на мой взгляд текст программы:

  1. program bbb;
  2. const   one=1;
  3. begin
  4.     writeln('one=',one)
  5. end.

Задача 3

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

  1. program c5;begin writeln(5--2,'=') end.
  2.  
  3. <МиП-программа> => <заголовок_программы>; <блок> <точка> =>  
  4. program <имя_программы> ; <блок> <точка>  => program <идентификатор> ; <блок> <точка> =>
  5. {<идентификатор> ::= <буква> | <идентификатор> <цифра> => <идентификатор> ::= <буква><цифра>}  
  6. program <буква><цифра> ; <блок> <точка> => program c5; <блок> <точка> =>
  7. program c5 ; <декларативная_часть> <составной_оператор> <точка> =>
  8. program c5 ; <пусто> <составной_оператор> <точка> =>
  9. program c5 ; <составной_оператор> <точка> =>
  10. program c5 ; begin <оп_последовательность> end <точка> =>
  11. program c5 ; begin <оператор> end <точка> =>
  12. program c5 ; begin <оператор вывода> end <точка> =>
  13. program c5 ; begin writeln(<список_вывода>) end <точка> =>
  14. program c5 ; begin writeln(<список_выражений>) end <точка> =>
  15. program c5 ; begin writeln(<список_выражений>,<выр>) end <точка> =>
  16. program c5 ; begin writeln(<выр>,<текст_выр>) end <точка> =>
  17. program c5 ; begin writeln(<арифм_выр>,<текст_константа>) end <точка> =>  
  18. program c5 ; begin writeln(<арифм_выр><знак_ар_оп><арифм_выр>,'<ascii-последовательность>') end <точка> =>
  19. program c5 ; begin writeln(<целая_константа>-<целая_константа>,'=') end <точка> =>
  20. program c5 ; begin writeln(<цел_без_знака>-<знак> <цел_без_знака>,'=') end <точка> =>
  21. program c5 ; begin writeln(<цифра>--<цифра>,'=') end <точка> =>
  22. program c5 ; begin writeln(5--2,'=') end <точка> =>
  23. program c5 ; begin writeln(5--2,'=') end.

Мы пришли к исходной задаче. Задача3 - является МиП-программой.

Да, Сергей. И здесь Вы всё

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

P.s. А третью задачу, пожалуйста оставьте другим ...

Тем более, что Алексей её

Тем более, что Алексей её перехватил!

Прошу прощения, это моё

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

И Алексей не отстал!

Правильно, Алексей. Это была самая тонкая задача и Вы с ней с честью справились!
Правда, пришлось кое-где в выводе перепрыгивать через некоторые шаги. Считаю это вполне допустимым, когда пропускаемое очевидно - вывод-то длинный. Единственно, чтобы соблюсти логическую корректность, можно бы ввести в обращение скажем, такой знак "=>>" имея ввиду "выводится" (не обязательно непосредственно).

Ну, вот ещё, например...

Ну, вот ещё, например, для остальных ребят, имея ввиду извечный вопрос о точке с запятой перед end...

  1. //Пример 1
  2. program abc;
  3. begin
  4.   a:=b
  5. end.

  1. //Пример 2
  2. program a;
  3.   var a:Byte;
  4. begin
  5.   a:=1;
  6. end.

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