Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль. Пожалуйста, помогите найти ошибку! (http://www.tehnari.ru/f41/t48356/)

JohnnieW 03.03.2011 19:46

Паскаль. Пожалуйста, помогите найти ошибку!
 
Доброго времени суток!
Недавно начал изучать паскаль, встретился с такой вот задачкой:
Дана целочисленная таблица А[1:10]. Подсчитать количество i, таких, чтобы A[i] было больше всех предыдущих элементов таблицы.
Извиняюсь, что не умею делать листинги, поэтому пишу своё решение текстом. (решение без куска, где заполняется массив):

s:=0;
for i:=2 to 10 do
begin
r:=1;
while (r<i) and (a[i]>a[i-r]) do r:=r+1;
if r=i then s:=s+1 else
end;
writeln(s);
end.

Собственно, программа запускается, но при любых значениях элементов массива переменная s выводится со значением 0. Пожалуйста, подскажите, в чём ошибка

kreol 03.03.2011 20:15

вроде так. прогу не "отлаживал"
Код:

const n = 10;
var a: array[1..n] of integer;
var k,i,j,l: byte;
begin
  {инициализация массива ;}
  k := 0;
  l := 0;
  for i := 2 to n do
    begin
      for j := 1 to i-1 do
        begin
          if a[j]<a[i] then
            inc(l);{счетчик на то сколько элементов меньше данного}
        end;
      if l = j-1 then {если наш счетчик равен числу предыдущих элементов то все хорошо и увеличиваем k}
        inc(k);
    end;
writeln(k);
end.


Vladimir_S 03.03.2011 21:16

Цитата:

Сообщение от JohnnieW (Сообщение 478292)
Доброго времени суток!
Недавно начал изучать паскаль, встретился с такой вот задачкой:
Дана целочисленная таблица А[1:10]. Подсчитать количество i, таких, чтобы A[i] было больше всех предыдущих элементов таблицы.
Извиняюсь, что не умею делать листинги, поэтому пишу своё решение текстом. (решение без куска, где заполняется массив):

s:=0;
for i:=2 to 10 do
begin
r:=1;
while (r<i) and (a[i]>a[i-r]) do r:=r+1;
if r=i then s:=s+1 else
end;
writeln(s);
end.

Собственно, программа запускается, но при любых значениях элементов массива переменная s выводится со значением 0. Пожалуйста, подскажите, в чём ошибка

Да нет, всё правильно - я Вашу программу погонял, всё работает как надо.
Единственное - строку
if r=i then s:=s+1 else
я заменил строкой
if r=i then s:=s+1;
Потому что этот else ту ни к селу, ни к городу. Но и с ним, т.е. в исходном варианте, тоже работает.
Я для пробы вставил
for i:=1 to 10 do a[i]:=i;
и получил, как и ожидал, 9.
Так что ошибка где-то как раз в невыложенной части, т.е. во вводе массива.

JohnnieW 03.03.2011 21:17

Благодарю за помощь, но видимо, я допускаю где то ошибки в синтаксисе, ибо у меня и в Вашем случае у меня К=0. Массивы заполнял корявенько с помощью

for i:=1 to 10 do readln(a[i]);
for j:=1 to 10 do readln(a[j]);
оба массива имели одинаковые значение (в первом случае от 1 до 10, во втором случае от 10 до 1, в третьем случае все элементы, кроме третье имели значение 234, а третий = 2345)
Вопросы:
1) подскажите,пожалуйста, как вставлять листинги?
2) inc(i) - увеличивает значение i на 1, я правильно понял?
3) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат?

JohnnieW 03.03.2011 21:18

Ок. Владимир, спасибо, сейчас выложу полностью.

Vladimir_S 03.03.2011 21:28

Цитата:

Сообщение от JohnnieW (Сообщение 478393)
Вопросы:
1) подскажите,пожалуйста, как вставлять листинги?

В "расширенном режиме" ответа выделить фрагмент текста и нажать значок "#".
Цитата:

2) inc(i) - увеличивает значение i на 1, я правильно понял?
Да. А оператор Inc(i,m) увеличивает значение переменной i на m единиц. Есть и обратный оператор для уменьшения целого числа на 1 или m - это Dec(i) и Dec(i,m).
Цитата:

3) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат?
Так ведь говорю же - в выложенной части никаких ошибок нет, всё работает. Насчет else - это не ошибка, а так - некая нелепость, не влияющая на работоспособность программы.

kreol 03.03.2011 21:29

1) есть как недоделанная стрелочка вниз дополнительные ВВ-Коды там символ диез.
либо написать {CODE}листинг{/CODE} вместо {} поставить []
2)да
3) ошибки не знаю. возможно ее и нету. возможно у вас что-то с компилятором.

есть одна очень полезная штука в паскале для отладки(если бы такие были везде было бы супер)
зайдите в меню паскаля debug -> Watch
сделайте окошко синее по размеру чтоб было видно watch (они находятся в одном окне но примерно как в пэинте можно изменять размеры "холста")
два раза клацните на "окошко" Watch и вбейте туда переменную -> ок потом на зеленой полоске опять и т.д.
а дальше перейдите в "окошко" с листингом и клавишей F8 прогоняйте прогу. попутно замечайте что происходит с переменными

JohnnieW 03.03.2011 21:37

Большое спасибо за помощь!)
Сейчас занаво переписал программу-заработало. Сравниваю нынешний код с выложенным на сайте - тоже самое.
Спасибо и за остальные подсказки)
Да, Watch - оч полезная штука. Cейчас буду разберираться с кодом который предлжил kreol.
Кстати, kreol, в Вашем варианте нужно заполнять два идентичных массива, или я что-то мудрю?

kreol 03.03.2011 21:45

ээ нет. один. но я код не проверял. кст то, что вы предложили в
Цитата:

Сообщение от JohnnieW (Сообщение 478393)
for i:=1 to 10 do readln(a[i]);
for j:=1 to 10 do readln(a[j]);

задает значения одному и тому же массиву.
a единственное что у них разные индексы. вернее в данном случае просто индекс представляет две разные переменные

и еще в моем листинге два слова var этого делать нельзя) только один раз

JohnnieW 03.03.2011 21:54

да, точно) массив A, а номер элемента как раз и задан в скобках.
Вообщем, kreol, Ваш код тоже заработал, только с поправкой на обнуление счётчика l после inc(k).
Большое спасибо за помощь)


Часовой пояс GMT +4, время: 13:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.