Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > "Глупые" вопросы от Unknown


Автор: Unknown 11.7.2004, 02:22
наткнулся на некоторые "глупые" вопросы в литературе ("глупыми" я считаю вопросы, которые либо не понимаю, либо ответ на них очевиден)
.
Их у меня пока всего два :
.
1. Почему знак умножения всегда выписывается явно?
2. Почему запись формул на языке Паскаль линейна?
.
(взято из О.Ф Усковой, "Программирование на языке Паскаль" задачник)
.
и вот такая задача
"Не прибегая к помощи компьютера определите результат выполнения программы :"
.
var j, n : word;
a, b, c : LongInt;

begin
n := 25: a := 1; b := 1;
for j:= 3 to n do
begin
c := b; b := a + b; a := c;
end;
WriteLn('F_', n, ' = ', b);
ReadLn;
end.
(С.А. Немнюгин, "Turbo Pascal", учебник, стр.49, упр.1.4)
***********************
прошу комментарии, варианты ответов.

Автор: dvamaster 11.7.2004, 15:30
Код
WriteLn('F_', n, ' = ', b);

Неужели задача про числа фибоначи.

Автор: Pakshin A. S. 11.7.2004, 21:36
Похоже на то. Надо с листком бумаги посидеть несколько минут... ответ и выйдет.

По вопросам:
интересно, а что имелось в виду в первом вопросе?!
По второму: читаться компилятором не будет biggrin.gif

Автор: Unknown 11.7.2004, 21:57
to dvamaster : На первый - да и я так думаю, синтаксис языка таков, что непозволяет такую запись. вот я и думаю что имелось ввиду во втором вопросе? Вообще эти воросы любят задавть преподаватели в институтах, потому как любой ответ можно считать неправильным(неизвестно что конкретно имеется ввиду.)
.
to Pakshin A. S. :
несколько минут?! да там 22 прохода!!!
*******************************************
задаю эти вопросы здесь, потому как знаю за собой такой грешок : когда задача трудная, стараюсь обойти ее всевозможными способами, например, говорю себе, что воросы "глупые, неточные, неконкретные". В (0) самообман? или же действительно тупняк?

Автор: Pakshin A. S. 11.7.2004, 22:04
Такие проходы делаются за пять-десять минут (максимально) с калькулятором. А если догадаться про Фибоначи, то можно этот ряд ещё быстрее записать.

Автор: Unknown 12.7.2004, 00:39
да, но это задание дано после ПЕРВОГО урока в Немнюгине. Короче чтобы изучать Пас по Немнюгину, надо знать Пас.
.
еще вопрос :
"Почему запись формул на языке Паскаль линейна?" и
"Чему равен результат вычисления выражения (a div b)*b + (a mod b)?"
оба они из Усковой.

Автор: Pakshin A. S. 12.7.2004, 09:43
выражениt (a div b)*b скорее всего равно a

Автор: dvamaster 12.7.2004, 12:38
Pakshin A. S.

Ты не знаешь целочисленную двоичную математику, если думаешь что точно так будет.

Но ты сомневался, и это правильно.

Автор: Unknown 12.7.2004, 14:03
если бы там "*b" не было, то выражение равно а/b. а так?
.
вопрос про "9!" снят, задача снята. остальные вопросы остаются.

Автор: Zaman 12.7.2004, 14:20
Pakshin A. S.
Цитата
выражениt (a div b)*b скорее всего равно a


Если B>A то не будит A, мне так кажеться.

Добавлено @ 14:22
так же есть другие варианты, когда A>B но А не кратно В, тоже будит другой результат

Автор: Calypso 12.7.2004, 14:24
Цитата
(a div b)*с

Таких вещей я избегаю. т.к.Лучше применить (a*c) div b (этому меня Немнюгин в книге научил)
(a div b)*b <> a
(a div b)*b + (a mod b) = a rolleyes.gif

Автор: Vit 12.7.2004, 16:31
Цитата
1. Почему знак умножения всегда выписывается явно?



Потому что встретив "ab" не возможно определить это переменная с именем ab или a*b. Компиллятор в отличие от человека строится по принципам максимальной однозначности, это оберегает от многих ошибок...

Автор: Unknown 12.7.2004, 17:42
Ясно, всем спасибо. Остается последний (пока я дальше не стал двигаться..) вопрос : "2. Почему запись формул на языке Паскаль линейна?"

Автор: Vit 12.7.2004, 18:14
А что покажет строка "showmessage(inttostr(i));" без компа кто может сказать? wink.gif

Код
procedure TForm1.Button1Click(Sender: TObject);
 var i,j:integer;
 Label 1;
begin
 i:=3; j:=0;
 Goto 1;
 for j:=0 downto j do
   1:if i<abs(j) then break else i:=i + (i mod 4);
 showmessage(inttostr(i));
end;

Автор: Unknown 26.7.2004, 16:09
эх, приболел я малясь. но уже все. ангина.
.
так почему все таки "Запись формул на языке Паскаль линейна?"

Автор: x77 26.7.2004, 16:12
что значит линейна? и как выглядит "нелинейная" формула?

Автор: Unknown 26.7.2004, 16:28
а вот это ХЗ. афтар (Ускова) не уточняет. в том то и дело!

Автор: December 26.7.2004, 17:09
Может, в смысле что запись формулы не рекурсивна? то есть ты не можешь использовать переменную или функцию, пока её не объявишь?

Автор: Unknown 26.7.2004, 17:42
наверно да. тогда вопрос будет выглядеть так : "Почему на языке Паскаль нельзя использовать переменную или фукнцию, пока ее не объявишь?"
.
но ведь рекурсия в Паскале есть!

Автор: December 26.7.2004, 19:23
Цитата
но ведь рекурсия в Паскале есть!

я аллегорически выразился

Автор: Berill 27.7.2004, 07:29
Цитата(Vit @ 12.7.2004, 18:14)
А что покажет строка "showmessage(inttostr(i));" без компа кто может сказать?  wink.gif

Код
procedure TForm1.Button1Click(Sender: TObject);
 var i,j:integer;
 Label 1;
begin
 i:=3; j:=0;
 Goto 1;
 for j:=0 downto j do
   1:if i<abs(j) then break else i:=i + (i mod 4);
 showmessage(inttostr(i));
end;

Если я с утра не торможу, то покажет 6.
Добавлено @ 07:33
Цитата(Unknown @ 26.7.2004, 17:42)
"Почему на языке Паскаль нельзя использовать переменную или фукнцию, пока ее не объявишь?"

Так уж Паскаль устроен, и мы ничего не можем изменить.
Хотя с другой стороны очень даже удобно. Я например уже заранее при этом знаю что и где мне понадобиться.

Автор: Berill 27.7.2004, 07:41
Насчет того, что покажет 6 я не прав.
Кто-нибудь может объяснить, почему после GOTO 1, значение J становиться "-1".

Автор: Unknown 27.7.2004, 17:00
Цитата(Berill @ 27.7.2004, 07:29)
Цитата(Vit @ 12.7.2004, 18:14)
А что покажет строка "showmessage(inttostr(i));" без компа кто может сказать?  wink.gif

Код
procedure TForm1.Button1Click(Sender: TObject);
 var i,j:integer;
 Label 1;
begin
 i:=3; j:=0;
 Goto 1;
 for j:=0 downto j do
   1:if i<abs(j) then break else i:=i + (i mod 4);
 showmessage(inttostr(i));
end;

Если я с утра не торможу, то покажет 6.
Добавлено @ 07:33
Цитата(Unknown @ 26.7.2004, 17:42)
"Почему на языке Паскаль нельзя использовать переменную или фукнцию, пока ее не объявишь?"

Так уж Паскаль устроен, и мы ничего не можем изменить.
Хотя с другой стороны очень даже удобно. Я например уже заранее при этом знаю что и где мне понадобиться.

это, конечно так, но я бы посмотрел как ьы это преподу на экзамене скажешь...

Автор: Cheba 27.7.2004, 17:19
Цитата
Код
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
Label 1;
begin
i:=3; j:=0;
Goto 1;
for j:=0 downto j do
  1:if i<abs(j) then break else i:=i + (i mod 4);
showmessage(inttostr(i));
end;

Ничего оно не должно показывать. Тут применяется GoTo и Label (перед begin'ом). Получается как бы бесконечный цикл. Кстати, из-за этого его и не рекомендуют использовать. Его даже так и переводят на русский: "Иди на ...". smile.gif

Автор: p0s0l 27.7.2004, 19:24
Цитата(Cheba @ 27.7.2004, 17:19)
Цитата
Код
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
Label 1;
begin
i:=3; j:=0;
Goto 1;
for j:=0 downto j do
  1:if i<abs(j) then break else i:=i + (i mod 4);
showmessage(inttostr(i));
end;

Ничего оно не должно показывать. Тут применяется GoTo и Label (перед begin'ом). Получается как бы бесконечный цикл. Кстати, из-за этого его и не рекомендуют использовать. Его даже так и переводят на русский: "Иди на ...". smile.gif

Почему не покажет ? Я проверил - у меня показало 8...
Теперь попытаюсь объяснить:
Код
1) вначале: j = 0, i = 3
   после goto происходит проверка:
   (3 < 0) = false, i := i + (i mod 4) = 3 + 3 = 6
2) j = -1, i = 6
   (6 < 1) = false, i := 6 + 2 = 8
3) j = -2, i = 8
   (8 < 2) = false, i := 8 + 0 = 8
4) j = -3, i = 8
  (8 < 3) = false, i := 8 + 0 = 8

...

10) j = -9, i = 8
     (8 < 9) = true, делается break

Goto тут смущает тем, что не происходит инициализация переменной цикла (оператором FOR), но она делается до этого принудительно (j := 0;). Но цикл всё равно получился кастрированным, т.к. кроме j у него есть еще внутренняя невидимая переменная, отвечающая за количество оставшихся шагов цикла, она получается неинициализированной, поэтому если бы break не было, то цикл выполнялся бы фиг знает сколько шагов (зависит от мусора в стеке)...

Цитата
Тут применяется GoTo и Label (перед begin'ом).

Если я правильно тебя понял, то ты неправильно понял smile.gif. Label лишь объявляет метку 1, но сама метка 1 - перед if в цикле...

Автор: Berill 28.7.2004, 08:46
Цитата(Unknown @ 27.7.2004, 17:00)
это, конечно так, но я бы посмотрел как ьы это преподу на экзамене скажешь...

Понятно, что мой ответ не очень информативен. bored.gif
Могу только посоветовать(причем и себе тоже) прочитать о структуре компилятора Паскаля.

Автор: Cheba 28.7.2004, 16:32
Цитата
Если я правильно тебя понял, то ты неправильно понял smile.gif. Label лишь объявляет метку 1, но сама метка 1 - перед if в цикле...
Когда начал читать твое объяснение понял свою ошибку. Ну, оно понятно - я про метки только читал, никогда их не использовал.

Автор: Unknown 28.7.2004, 22:38
Цитата(Cheba @ 28.7.2004, 16:32)
Цитата
Если я правильно тебя понял, то ты неправильно понял smile.gif. Label лишь объявляет метку 1, но сама метка 1 - перед if в цикле...
Когда начал читать твое объяснение понял свою ошибку. Ну, оно понятно - я про метки только читал, никогда их не использовал.

я бы посоветовал Усковой (и вообще всем преподам) _конкретнее_ задавать вопрос..
.
а тем временем......
у меня еще один тупой вопрос : "Какие обозначения используются в форматах вывода?" этот вобще кандидат на первое место в Top10Shit

Автор: AriX 28.7.2004, 23:14
Unknown
кстати про
Цитата
"Не прибегая к помощи компьютера определите результат выполнения программы :"
.
var j, n : word;
a, b, c : LongInt;

begin
n := 25: a := 1; b := 1;
for j:= 3 to n do
begin
c := b; b := a + b; a := c;
end;
WriteLn('F_', n, ' = ', b);
ReadLn;
end.


результата не будет - там ошибка - n :=25: (надо точку с запятой)
smile.gif))))))

Автор: December 28.7.2004, 23:27
Цитата
Какие обозначения используются в форматах вывода?

Это типа форматирование строки в writeln? %d, %f или чё-то такое?

Автор: Cheba 29.7.2004, 09:08
Нет это скорее о выводе real'ов. Типа такого:
Код
write(a:10:6);

Если так, то вот выдержка их доков от Delphi:
Цитата
OutExpr [: MinWidth [: DecPlaces ] ]

where OutExpr is an output expression. MinWidth and DecPlaces are type integer expressions.

MinWidth specifies the minimum field width, which must be greater than 0. Exactly MinWidth characters are written (using leading blanks if necessary) except when OutExpr has a value that must be represented in more than MinWidth characters. In that case, enough characters are written to represent the value of OutExpr. Likewise, if MinWidth is omitted, then the necessary number of characters is written to represent the value of OutExpr.

DecPlaces specifies the number of decimal places in a fixed-point representation of one of the Real types. It can be specified only if OutExpr is one of the Real types, and if MinWidth is also specified. When MinWidth is specified, it must be greater than or equal to 0.

Автор: Blacksnow 3.8.2004, 16:10
Цитата(Unknown @ 11.7.2004, 02:22)
"Не прибегая к помощи компьютера определите результат выполнения программы :"
.
var j, n : word;
a, b, c : LongInt;

begin
n := 25: a := 1; b := 1;
for j:= 3 to n do
begin
c := b; b := a + b; a := c;
end;
WriteLn('F_', n, ' = ', b);
ReadLn;
end.
(С.А. Немнюгин, "Turbo Pascal", учебник, стр.49, упр.1.4)

Задача к программированию, если честно сказать имеет малое отношение.
Единственное, что требуеться увидеть в ней числа Фибонначи (если знать что это такоеsmile.gif.
Далее можно выписать все числа до 25, можно меньше, если знать свойство:
Fn+m=Fn-1*Fm+Fn*Fm+1. В нашем случаи разбиваем как 13+12 и получаем, что F25=F12*F12+F13*F13=F12^2+F13^2. Если человек не первый раз видит ряд, то можно вспомнить, что F10=55, F12=144, F13=233 (я вспомнилsmile.gif. Иначе просто выписать.
Таким образом, задача имеет математический характер.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)