• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль. Пожалуйста, помогите найти ошибку!

  • Автор темы Автор темы JohnnieW
  • Дата начала Дата начала

JohnnieW

Ученик
Регистрация
3 Мар 2011
Сообщения
5
Реакции
0
Баллы
0
Паскаль. Пожалуйста, помогите найти ошибку!

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

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

Собственно, программа запускается, но при любых значениях элементов массива переменная s выводится со значением 0. Пожалуйста, подскажите, в чём ошибка
 
вроде так. прогу не "отлаживал"
Код:
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.
 
Последнее редактирование:
Доброго времени суток!
Недавно начал изучать паскаль, встретился с такой вот задачкой:
Дана целочисленная таблица А[1:10]. Подсчитать количество i, таких, чтобы A было больше всех предыдущих элементов таблицы.
Извиняюсь, что не умею делать листинги, поэтому пишу своё решение текстом. (решение без куска, где заполняется массив):

s:=0;
for i:=2 to 10 do
begin
r:=1;
while (r<i) and (a>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;
и получил, как и ожидал, 9.
Так что ошибка где-то как раз в невыложенной части, т.е. во вводе массива.
 
Благодарю за помощь, но видимо, я допускаю где то ошибки в синтаксисе, ибо у меня и в Вашем случае у меня К=0. Массивы заполнял корявенько с помощью

for i:=1 to 10 do readln(a);
for j:=1 to 10 do readln(a[j]);
оба массива имели одинаковые значение (в первом случае от 1 до 10, во втором случае от 10 до 1, в третьем случае все элементы, кроме третье имели значение 234, а третий = 2345)
Вопросы:
1) подскажите,пожалуйста, как вставлять листинги?
2) inc(i) - увеличивает значение i на 1, я правильно понял?
3) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат?
 
Ок. Владимир, спасибо, сейчас выложу полностью.
 
Вопросы:
1) подскажите,пожалуйста, как вставлять листинги?
В "расширенном режиме" ответа выделить фрагмент текста и нажать значок "#".
2) inc(i) - увеличивает значение i на 1, я правильно понял?
Да. А оператор Inc(i,m) увеличивает значение переменной i на m единиц. Есть и обратный оператор для уменьшения целого числа на 1 или m - это Dec(i) и Dec(i,m).
3) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат?
Так ведь говорю же - в выложенной части никаких ошибок нет, всё работает. Насчет else - это не ошибка, а так - некая нелепость, не влияющая на работоспособность программы.
 
1) есть как недоделанная стрелочка вниз дополнительные ВВ-Коды там символ диез.
либо написать {CODE}листинг{/CODE} вместо {} поставить []
2)да
3) ошибки не знаю. возможно ее и нету. возможно у вас что-то с компилятором.

есть одна очень полезная штука в паскале для отладки(если бы такие были везде было бы супер)
зайдите в меню паскаля debug -> Watch
сделайте окошко синее по размеру чтоб было видно watch (они находятся в одном окне но примерно как в пэинте можно изменять размеры "холста")
два раза клацните на "окошко" Watch и вбейте туда переменную -> ок потом на зеленой полоске опять и т.д.
а дальше перейдите в "окошко" с листингом и клавишей F8 прогоняйте прогу. попутно замечайте что происходит с переменными
 
Большое спасибо за помощь!)
Сейчас занаво переписал программу-заработало. Сравниваю нынешний код с выложенным на сайте - тоже самое.
Спасибо и за остальные подсказки)
Да, Watch - оч полезная штука. Cейчас буду разберираться с кодом который предлжил kreol.
Кстати, kreol, в Вашем варианте нужно заполнять два идентичных массива, или я что-то мудрю?
 
ээ нет. один. но я код не проверял. кст то, что вы предложили в
for i:=1 to 10 do readln(a);
for j:=1 to 10 do readln(a[j]);
задает значения одному и тому же массиву.
a единственное что у них разные индексы. вернее в данном случае просто индекс представляет две разные переменные

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