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

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

Что же оставим её

Что же оставим её остальным...до завтрашнего вечера...:))

Что такое метки?

Что такое метки? как их использовать в программировании....очень нужно, а вместе с тем интересно)

Придёт время - всё честно расскажу!

Метки - это, в целом, зло, пережиток, неприличный элемент современных ЯП, о котором я стараюсь обычно стыдливо умалчивать...

Думаю, и Вам не следует начинать с не нормативной лексики. Хотя, понимаю, все дети (и даже, хорошо воспитанные), рано или поздно задают вопрос "про это".
Ну, что же, придёт время - всё честно расскажу!

спасибо))так даже интереснее,

спасибо))так даже интереснее, придется подождать))

Хм...а тема форума специально с ошибкой?

Хм...а тема форума специально с ошибкой написана? странно видеть на сайте людей "в теме", и при этом, делающих ошибки в слове "програмМирование"....

№1

Первый пример. Дано:

  1. program abc;
  2. begin
  3.    a:=b
  4. end.

Теперь разберем по шагам:
  1. <МиП-программа> => <заголовок_программы>; <блок> <точка> =>  
  2. program <имя_программы> ; <блок> <точка>  => program <идентификатор> ; <блок> <точка> =>
  3. {<идентификатор> ::= <буква> | <идентификатор> <буква> => <идентификатор> ::= <идентификатор><буква><буква> => <идентификатор> ::= <буква><буква><буква>}  
  4. program <буква><буква><буква> ; <блок> <точка> => program abc; <блок> <точка> =>
  5. program abc ; <декларативная_часть> <составной_оператор> <точка> =>
  6. program abc ; <пусто> <составной_оператор> <точка> =>
  7. program abc ; <составной_оператор> <точка> =>
  8. program abc ; begin <оп_последовательность> end <точка> =>
  9. program abc ; begin <оператор> end <точка> =>
  10. program abc ; begin <оп_присваивания> end <точка> =>
  11. program abc ; begin <переменная> := <выр> end <точка> =>
  12. program abc ; begin <переменная> := <арифм_выр> end <точка> =>
  13. program abc ; begin <переменная> := <переменная> end <точка> =>
  14. program abc ; begin a := <переменная> end <точка> =>
  15. program abc ; begin a := b end <точка> =>  
  16. program abc ; begin a := b end.

Вроде бы всё правильно, но полученные переменные должны быть обозначены в декларативной части, поэтому она примет такой вид, а не <пусто>, как в условии:
  1. <декларативная_часть> ::= <список_секций> ;
  2. <декларативная_часть> ::= <секция_переменных>;
  3. <декларативная_часть> ::= var <список_описаний_переменных>;
  4. <декларативная_часть> ::= var <описание_переменных>;
  5. <декларативная_часть> ::= var <список_переменных> : <тип>;
  6. <декларативная_часть> ::= var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt;

Тогда имеем:

  1. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; <составной_оператор> <точка> =>
  2. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; <составной_оператор> <точка> =>
  3. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <оп_последовательность> end <точка> =>
  4. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <оператор> end <точка> =>
  5. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <оп_присваивания> end <точка> =>
  6. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <переменная> := <выр> end <точка> =>
  7. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <переменная> := <арифм_выр> end <точка> =>
  8. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin <переменная> := <переменная> end <точка> =>
  9. program abc ; var <список_переменных> : Byte | Word | ShortInt | Integer | LongInt; begin a := <переменная> end <точка> =>
  10. program abc ; var a,b: integer; begin a := b end <точка> =>  
  11. program abc ; var a,b: integer; begin a := b end.

Теперь вроде правильно.

пример №1

program abc; //заголовок
//где объявление переменных a,b?
begin
a:= b // ; - отделение одной операции от другой, в этом случае это пустая трата ресурсов, т.е. перед end ; не нужна
end.
следовательно как как МиП-программа пример 1 не корректна и это видно уже на 2 шаге программы

"М" вставил. Думаю, автор

"М" вставил. Думаю, автор темы не обидится...
А Вы, Мария умеете видеть, когда захотите ;)

Не понял ничего из поста Чт,

Не понял ничего из поста Чт, 30/09/2010 - 17:24 — Зиновьев Александр.

Но попробую переписать правильно обе:

//Пример 1
program abc;
var a,b:integer;
begin
a:=b;
end.
a,b - целые

//Пример 2
program b;
var a:Byte;
begin
a:=1;
end.

Очень интересно!

Очень интересно! А что думают по поводу рассуждений Александра и Ярослава другие?

а другие...

А другие еще спят...

Умейте точно читать!

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

Извините, впредь буду

Извините, впредь буду стараться писать чёткие ответы на заданные вопросы.

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

Генрих я не понимаю как делать эти программы , поможешь мне???

Подсказка Роману и др. - пост Саши Зиновьева!

Именно решение Саши Зиновьева не просто содержит рациональное зерно, но и содержит прямой ответ на поставленный в примере 1 вопрос. Так извлеките же этот ответ из поста!

Настоятельный совет всем "опытным" (повторно!): Решая задачи примеров 1 и 2, Не опирайтесь на свои "знания" Паскаля!

Обращение ко всем "неопытным", которые не поленились изучить рекомендованные мною материалы по БНФ и МиПу: У ВАС МАКСИМУМ ШАНСОВ РЕШИТЬ ЗАДАЧИ примеров 1 и 2.

Осознал свою ошибку =)

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

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

№2

  1. <МиП-программа> ::= <заголовок_программы>; <блок> <точка> =>
  2. program <имя_программы>; <блок> <точка> =>
  3. program <идентификатор>; <блок> <точка> =>
  4. program <буква>; <блок> <точка> =>
  5. program a; <блок> <точка> =>
  6. program a; <декларативная_часть> <составной_оператор> <точка> =>
  7. program a; <список_секций> ; <составной_оператор> <точка> =>
  8. program a; <секция> ; <составной_оператор> <точка> =>
  9. program a; <секция_переменных> ; <составной_оператор> <точка> =>
  10. program a; var <список_описаний_переменных> ; <составной_оператор> <точка> =>
  11. program a; var <описание_переменных> ; <составной_оператор> <точка> =>
  12. program a; var <список_переменных> : <тип> ; <составной_оператор> <точка> =>
  13. program a; var <переменная>, : <тип> ; <составной_оператор> <точка> =>
  14. program a; var <идентификатор> : <тип> ; <составной_оператор> <точка> =>
  15. program a; var <буква> : <тип> ; <составной_оператор> <точка> =>
  16. program a; var a : <тип> ; <составной_оператор> <точка> =>
  17. program a; var a: Byte; <составной_оператор> <точка> =>
  18. program a; var a: Byte; begin <оп_последовательность> end <точка> =>
  19. program a; var a: Byte; begin <оп_последовательность>;<оператор> end <точка> =>
  20. program a; var a: Byte; begin <оператор>;<оператор> end <точка> =>
  21. program a; var a: Byte; begin <оп_присваивания>;<пустой_оп> end <точка> =>
  22. program a; var a: Byte; begin <переменная> := <выр>;<пустой_оп> end <точка> =>
  23. program a; var a: Byte; begin <идентификатор> := <выр>;<пустой_оп> end <точка> =>
  24. program a; var a: Byte; begin <буква> := <выр>;<пустой_оп> end <точка> =>
  25. program a; var a: Byte; begin a := <арифм_выр>;<пустой_оп> end <точка> =>
  26. program a; var a: Byte; begin a := <целая_константа>;<пустой_оп> end <точка> =>
  27. program a; var a: Byte; begin a := <цел_без_знака>;<пустой_оп> end <точка> =>
  28. program a; var a: Byte; begin a := <цифра>;<пустой_оп> end <точка> =>
  29. program a; var a: Byte; begin a:=1;<пустой_оп> end <точка> =>
  30. program a; var a: Byte; begin a:=1; end <точка> =>
  31. program a; var a: Byte; begin a:=1; end.

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

Зиновьев Александр, можешь

Зиновьев Александр, можешь написать мне в аську 440860070 или в контакт. ? По поводу задач
P.S. сори за флуд.

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

Да, Александр, теперь всё в порядке. Вы заслужили, безусловно, бонус и за активность и за профессионализм. Поздравляю!

Спасибо большое.

Приятно осозновать, что что-то начинает получаться. =) Я хотел бы выкинуть свою идею по поводу задачки без условных операторов:

  1. Program delilinedel;
  2. var a,m:integer;
  3. begin
  4. readln(m);
  5. a:=((m mod 10)+0.2) div ((m mod 10)+0.1);
  6. a:=a-1;
  7. writeln(a)
  8. end.

Соответственно, если число будет делиться, то получим 1, а если нет, то 0. Вроде бы нигде не напортачил.

Приведу для всех

Приведу уже для всех желающих попробовать свои силы условие задачи, которую пытается решить Саша Зиновьев
(предложенное им выше решение, хотя, действительно содержит продуктивную идею, к сожалению, не верно. Кто объяснит почему?).

Дано целое, неотрицательное число N меньшее 10. Написать линейную (т.е. не содержащую условных и циклических операторов) Паскаль-программу, которая печатала бы 1, если N делится на 10 и печатала бы 0, если не делится.

Добавлю, что задача это частично уже решена Малхожевой Оксаной.

И, Александр, техническое замечание. Если не хотите терять в оценках степени Вашей квалификации и обучаемости, структурируйте текст программного кода!

Александр, div не работает с

Александр, div не работает с real величинами...

Не могу понять условие. N <

Не могу понять условие. N < 10. Как N может делиться на 10?
N div 10 = 0

Возможные значения N: 0, ..., 9

Возможные значения N: 0, 1, ..., 9. Ноль делится на 10, т.к. "делится" означает N mod 10 = 0.
Впрочем, условие N < 10 не принципиально и его можно снять, тогда не только ноль делится на 10.

Точно :) Попробовала решить

Точно :)
Попробовала решить по аналогии с тем, как я решала эту задачу:

  1. type
  2.   T = Integer;
  3. var
  4.   n, m: T;
  5. begin
  6.   Readln(n);
  7.   m := -(n mod 10);
  8.   m := m shr (Sizeof(T)*8 - 1); //если n=0, то m=0; если n>0, то m=1
  9.   Writeln(1 - m);
  10.   Readln;
  11. end.

Sizeof(T) - возвращает длину типа в байтах. Умножаем на 8 для того, чтобы получить длину в битах. В нашем случае (Sizeof(T)*8 - 1) = 31
shr делаем для того, чтобы узнать старший бит в двоичном представлении числа m. Мы знаем, что если число отрицательное, то старший бит равен 1. А если число положительное, то старший бит равен 0.
Решение работает и для n>=10.

Да, Наташа, но ...

Да, Наташа, верно, но давайте поищем решения, адаптированные для начинающих:
Уберём type, sizeof, shr.

Можно ли просто указать на

Можно ли просто указать на ошибки, допущенные Александром при составлении решения?

Да, Джамболет, можно. Хотя

Да, Джамболет, можно. Хотя Алексей вроде бы указал главную ошибку ...

111

  1. Program delilinedel;
  2. var a,m:integer;
  3. begin
  4.    readln(m);
  5.    a:=(((m mod 10)+0.2)*10) div (((m mod 10)+0.1)*10);
  6.    a:=a-1;
  7.    writeln(a)
  8. end.

Извините, в спешке набирал. Сам не увидел простейшего. =) Теперь вроде правильно.

Эх, Саша! Опять мимо ...

Эх, Саша! Опять мимо ...
Но Вы, безусловно, молодец. Большинство даже и не пытается что-то делать, считая задачу безнадёжной.
Правда, вот Наташа Стаценко решила (но это, 2-й курс, да и решение с "заморочками", на знание которых я пока не рассчитываю). И ещё, Оксана Малхожева - была ведь в волоске от победы! Но куда-то делась ...
Совет, Саша - обязательно проверяйте всё на ПК.

   a := ((n mod 10) + 2) div

  1.    a := ((n mod 10) + 2) div ((n mod 10) + 1);
  2.    Writeln(a - 1);

Логичный шаг Натальи

Логичный шаг Натальи, который всецело подготовлен Александром!
Но есть ещё решения.

#2

  1. Program delilinedel;
  2. var a,m:integer;
  3. begin
  4.    readln(m);
  5.    a:=((m mod 10)+9) div 10;
  6.    a:=1-a;
  7.    writeln(a)
  8. end.

Обдумывал задачу и нашел еще один вариант. =)

Это лучший, из всех вариантов, Саша!

Это лучший, из всех вариантов, Саша!
(По крайней мере тех, о которых думал и я). Вы реально выходите в лидеры.

Но есть ещё решениЯ!

я вернулась!!))

вот еще вариант:
program a;
var a:integer;
begin
read(a);
a:=a mod 10;
writeln(1-(round(a*(1/(a+0.1)))))
end.

Здравствуйте, Оксана!

Наконец-то Вы завершили своё подвисшее было решение.
(1-x) - вот винтик, которого как раз Вам и не хватало. Но есть ещё решения!

и второй вариант решения этой задачи))

program a2;
var a,k,s:integer;
begin
readln(a,k,s);
a:=a mod 10;
s:=sqr(a);
k:=a+1;
writeln(1-(s-(s div k)*k));
end.
верно?))

Как то мудрённо, Оксана ...

Мы, конечно, не должны ничего вводить кроме заданного числа a, это во-первых. А во-вторых, cуть того, что Вы написали, наверное эквивалентна одному оператору:

  1.       ...
  2.       writeln ( 1- sqr((a mod 10)) mod (a+1) )

В-третьих, взываю к Вашему эстетическому чувству - оформляйте код "красиво"!

А по существу, ...

Эта формула даёт сбой уже при a=3

Sorry!

Я был не точен в формуле, уже поправил!

а эта вторая программа

а эта вторая программа написана для а>=10))

Кажется, я поспешил ... откат.

Мне показалось, что работает для всех. А теперь сомневаюсь ...
Кто сможет развеять мои сомнения, ДОКАЗАВ или ОПРОВЕРГНУВ формулу Оксаны?
Вот эта формула:  1- sqr((a mod 10)) mod (a+1)

Работает все-таки не для всех

Работает все-таки не для всех а.
Я перебрала все остатки, получаемые при (a mod 10) в формуле

  1. 1- sqr((a mod 10)) mod (a+1)

и вот, что получилось:
  1. a = 0, 1 - (0 mod 1) = 1
  2. a = 1, 1 - (1 mod 2) = 0
  3. a = 2, 1 - (4 mod 3) = 0
  4. a = 3, 1 - (9 mod 4) = 0
  5. a = 5, 1 - (25 mod 6) = 0
  6. a = 6, 1 - (36 mod 7) = 0
  7. a = 7, 1 - (49 mod 8) = 0
  8. a = 8, 1 - (64 mod 9) = 0
  9. a = 9, 1 - (81 mod 10) = 0

Глядя на этот список тут же возникает коварный вопрос: А что если, к примеру, а = 29?
  1. a = 29, 1 - (81 mod 30) = 1 - 21 = -20

Таких примеров можно найти уйму начиная с а = 12. Но в пределах 11-ти работает :)

Cпасибо, Наташа, за подробный анализ

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

С возрастанием a, делитель (a+1) cтановится сколь угодно большим и начиная с какого-то значения а, результат внешней операции mod становится равным самим возможным делителям, число и значения которых ограничены. Потому и возможны вычитания из 1 таких чисел как 4, 9, 16, ..., 81.

просмотрите мою программу внимательно

а не может быть равно 29,т.к.а:=а mod 10!))все там прекрасно работает

Посмотрел внимательно ...

Да, Оксана, в приведённую мною выше формулу (против которой Вы почему-то не возразили):
writeln ( 1- sqr((a mod 10)) mod (a+1) )
вкралась ошибка - вместо второго вхождения а правильно было бы вставить a mod 10.

Т.е. теперь получится: writeln ( 1- sqr((a mod 10)) mod (a mod 10+1) ) и картина существенно изменится. Но ДОКАЗАТЕЛЬСТВА того, что это работает всегда, я всё же жду...

Формула 1- sqr((a mod 10))

Формула

  1. 1- sqr((a mod 10)) mod (a mod 10+1)

работает для любых целых неотрицательных а (В том числе а изначально может быть равно 29), т.к. при увеличении а остатки от деления на 10 остаются теми же, в пределах 0..9. Все случаи с остатками я привела выше.

C доводами Наташи полностью соглашаюсь.

C доводами Наташи полностью соглашаюсь.
А Оксане с удовольствием выставляю 4 рейтинговых балла за самое математичное решение.
Но возможны ещё решения!

Петров Саша!

Спасибо за подсказку. Это был просто пробный пост, по существу, мусор, о котором я забыл. Уже удалил.

VTlyusten

Уважаемый VTlyusten, не могли бы пожалуйста скинуть мою фотографию на эмейл. Просто флешка сломалась((