03.03.2011, 19:46 | #1 (permalink) |
Новичок
Регистрация: 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. Пожалуйста, подскажите, в чём ошибка |
03.03.2011, 19:46 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Обсуждения которые так или иначе похожи на вашу тему уже встречались, рекомендую вам их просмотреть Помогите найти ошибку в программе Помогите найти ошибку, Pascal abc Помогите найти ошибку Не могу найти ошибку в программе. Паскаль |
03.03.2011, 20:15 | #2 (permalink) |
Member
Регистрация: 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 |
03.03.2011, 21:16 | #3 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Единственное - строку 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. Так что ошибка где-то как раз в невыложенной части, т.е. во вводе массива. |
|
03.03.2011, 21:17 | #4 (permalink) |
Новичок
Регистрация: 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) Объясните, пожалуйста, где ошибка в моём решении, и почему в Вашем у меня такой же результат? |
03.03.2011, 21:18 | #5 (permalink) |
Новичок
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ок. Владимир, спасибо, сейчас выложу полностью.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
03.03.2011, 21:28 | #6 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
В "расширенном режиме" ответа выделить фрагмент текста и нажать значок "#".
Цитата:
Цитата:
|
||
03.03.2011, 21:29 | #7 (permalink) |
Member
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
|
1) есть как недоделанная стрелочка вниз дополнительные ВВ-Коды там символ диез.
либо написать {CODE}листинг{/CODE} вместо {} поставить [] 2)да 3) ошибки не знаю. возможно ее и нету. возможно у вас что-то с компилятором. есть одна очень полезная штука в паскале для отладки(если бы такие были везде было бы супер) зайдите в меню паскаля debug -> Watch сделайте окошко синее по размеру чтоб было видно watch (они находятся в одном окне но примерно как в пэинте можно изменять размеры "холста") два раза клацните на "окошко" Watch и вбейте туда переменную -> ок потом на зеленой полоске опять и т.д. а дальше перейдите в "окошко" с листингом и клавишей F8 прогоняйте прогу. попутно замечайте что происходит с переменными |
03.03.2011, 21:37 | #8 (permalink) |
Новичок
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Большое спасибо за помощь!)
Сейчас занаво переписал программу-заработало. Сравниваю нынешний код с выложенным на сайте - тоже самое. Спасибо и за остальные подсказки) Да, Watch - оч полезная штука. Cейчас буду разберираться с кодом который предлжил kreol. Кстати, kreol, в Вашем варианте нужно заполнять два идентичных массива, или я что-то мудрю? |
03.03.2011, 21:45 | #9 (permalink) |
Member
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
|
ээ нет. один. но я код не проверял. кст то, что вы предложили в задает значения одному и тому же массиву.
a единственное что у них разные индексы. вернее в данном случае просто индекс представляет две разные переменные и еще в моем листинге два слова var этого делать нельзя) только один раз |
03.03.2011, 21:54 | #10 (permalink) |
Новичок
Регистрация: 03.03.2011
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
да, точно) массив A, а номер элемента как раз и задан в скобках.
Вообщем, kreol, Ваш код тоже заработал, только с поправкой на обнуление счётчика l после inc(k). Большое спасибо за помощь) |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|