Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 03.03.2011, 19:46   #1 (permalink)
JohnnieW
Новичок
 
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль. Пожалуйста, помогите найти ошибку!

Доброго времени суток!
Недавно начал изучать паскаль, встретился с такой вот задачкой:
Дана целочисленная таблица А[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. Пожалуйста, подскажите, в чём ошибка
JohnnieW вне форума   Ответить с цитированием

Старый 03.03.2011, 19:46
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Обсуждения которые так или иначе похожи на вашу тему уже встречались, рекомендую вам их просмотреть

Помогите найти ошибку в программе
Помогите найти ошибку, Pascal abc
Помогите найти ошибку
Не могу найти ошибку в программе. Паскаль

Старый 03.03.2011, 20:15   #2 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

вроде так. прогу не "отлаживал"
Код:
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.

Последний раз редактировалось kreol; 03.03.2011 в 20:23
kreol вне форума   Ответить с цитированием
Старый 03.03.2011, 21:16   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от JohnnieW Посмотреть сообщение
Доброго времени суток!
Недавно начал изучать паскаль, встретился с такой вот задачкой:
Дана целочисленная таблица А[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.
Так что ошибка где-то как раз в невыложенной части, т.е. во вводе массива.
Vladimir_S вне форума   Ответить с цитированием
Старый 03.03.2011, 21:17   #4 (permalink)
JohnnieW
Новичок
 
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Благодарю за помощь, но видимо, я допускаю где то ошибки в синтаксисе, ибо у меня и в Вашем случае у меня К=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   #5 (permalink)
JohnnieW
Новичок
 
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 03.03.2011, 21:28   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от JohnnieW Посмотреть сообщение
Вопросы:
1) подскажите,пожалуйста, как вставлять листинги?
В "расширенном режиме" ответа выделить фрагмент текста и нажать значок "#".
Цитата:
2) inc(i) - увеличивает значение i на 1, я правильно понял?
Да. А оператор Inc(i,m) увеличивает значение переменной i на m единиц. Есть и обратный оператор для уменьшения целого числа на 1 или m - это Dec(i) и Dec(i,m).
Цитата:
3) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат?
Так ведь говорю же - в выложенной части никаких ошибок нет, всё работает. Насчет else - это не ошибка, а так - некая нелепость, не влияющая на работоспособность программы.
Vladimir_S вне форума   Ответить с цитированием
Старый 03.03.2011, 21:29   #7 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

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

есть одна очень полезная штука в паскале для отладки(если бы такие были везде было бы супер)
зайдите в меню паскаля debug -> Watch
сделайте окошко синее по размеру чтоб было видно watch (они находятся в одном окне но примерно как в пэинте можно изменять размеры "холста")
два раза клацните на "окошко" Watch и вбейте туда переменную -> ок потом на зеленой полоске опять и т.д.
а дальше перейдите в "окошко" с листингом и клавишей F8 прогоняйте прогу. попутно замечайте что происходит с переменными
kreol вне форума   Ответить с цитированием
Старый 03.03.2011, 21:37   #8 (permalink)
JohnnieW
Новичок
 
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Большое спасибо за помощь!)
Сейчас занаво переписал программу-заработало. Сравниваю нынешний код с выложенным на сайте - тоже самое.
Спасибо и за остальные подсказки)
Да, Watch - оч полезная штука. Cейчас буду разберираться с кодом который предлжил kreol.
Кстати, kreol, в Вашем варианте нужно заполнять два идентичных массива, или я что-то мудрю?
JohnnieW вне форума   Ответить с цитированием
Старый 03.03.2011, 21:45   #9 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

ээ нет. один. но я код не проверял. кст то, что вы предложили в
Цитата:
Сообщение от JohnnieW Посмотреть сообщение
for i:=1 to 10 do readln(a[i]);
for j:=1 to 10 do readln(a[j]);
задает значения одному и тому же массиву.
a единственное что у них разные индексы. вернее в данном случае просто индекс представляет две разные переменные

и еще в моем листинге два слова var этого делать нельзя) только один раз
kreol вне форума   Ответить с цитированием
Старый 03.03.2011, 21:54   #10 (permalink)
JohnnieW
Новичок
 
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.