Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
gepar:
--- Цитата: AnXIouS ---Если не заметил в куче моего спама:
--- Конец цитаты ---
Так у меня точно такой же код :
--- Код: --- for i:=1 to 4 do if b[i]>b[i+1] then
Begin
buf:=b[i];
b[i]:=b[i+1];
b[i+1]:=b[i];
ind:=false;
end;
--- Конец кода ---
Ну отличия только в том что у меня сортировка элементов массива , а у тебя сейчас не могу сообразить сортировка чего (сонный уже) толи сортировка массива по принципу чтобы элементы массива были больше b толи я что-то перепутал .
AnXIouS:
--- Код: ---0000000000 for i:= 1 to 10;
000000000 for i:= 2 to 10; т.е. for j:=i+1 to 10; т.к. первое значение уже сравнивалось.
00000000 итд. не умею я объяснять...
0000000
000000
00000
0000
000
00
--- Конец кода ---
--- Код: ---for i := 1 to 9 do
for j := i + 1 to 10 do
begin
if b[i] > b[j] then
Begin
buf:=b[i];
b[i]:=b[j];
b[j]:=buf;
end;
end;
--- Конец кода ---
Как то так. Сортирует весь массив. Сортировка у тебя верная, просто не оптимальная.
Еще раз смотрим на эти две строчки, внимательно.
b:=b[i+1];
b[i+1]:=b;
Это твой код...
gepar:
--- Цитата: topos84 ---Переведи на русский, пожалуйста.
--- Конец цитаты ---
Ну это так и было написанно на русском в учебнике , вот его описание :
Ля-ля-ля в упорядоченном массиве порой нужно найти какойто элемент , для этого применим алгоритм деления пополам .Его принцип :берём первоый(q) и последний(p) элементы в массиве далее p+q div 2 , дальше если искомое число больше того что мы получили мы повторяем эту операцию , но по какомуто хитрому способу , который запутанно описан , а приведённый пример у меня вообще не сработал :(
--- Цитата: topos84 ---gepar, прикрепи .pas-файл, а то лень самому набирать в паскале, а виндовский буфер обмена там не пашет.
--- Конец цитаты ---
А меня работает , я думал что у всех так , момент , сейчас прикреплю .
Добавлено позже:
topos84,а где она ?Скопированные 3 строки AnXIouS идентичны моим .
P.S В прикреплённом файле прога , которая сортирует символы , вернее неудачно сортирует символы .
topos84:
--- Код: ---for i:=1 to 4 do if b[i]>b[i+1] then
Begin
buf:=b[i];
b[i]:=b[i+1];
b[i+1]:=b[i];
ind:=false;
end;
--- Конец кода ---
А теперь хорошенько пригляделись вот к этому:
--- Код: ---buf:=b[i];
b[i]:=b[i+1];
b[i+1]:=b[i];
--- Конец кода ---
И, вуаля! Нашли ошибку.
П.С. Не забываем, что
--- Код: ---[i]
--- Конец кода ---
это ВВ-код. Поэтому пишем в коде (#).
Добавлено позже:
--- Цитата: gepar ---Если не заметил в куче моего спама:
Так у меня точно такой же код :
Код:
for i:=1 to 4 do if b>b[i+1] then
Begin
buf:=b;
b:=b[i+1];
b[i+1]:=b;
ind:=false;
end;
Ну отличия только в том что у меня сортировка элементов массива , а у тебя сейчас не могу сообразить сортировка чего (сонный уже) толи сортировка массива по принципу чтобы элементы массива были больше b толи я что-то перепутал .
--- Конец цитаты ---
Где же идентичны?
Ты присваиваешь buf значение b(i), потом b(i) присваиваешь b(i+1)-ое, а потом благополучно забываешь про буфер свой и присваиваешь b(i+1)-ому не старое значение b(i)-го, которое в буфе, а уже новое, которое совпадает теперь с b(i+1)-ым.
AnXIouS:
--- Цитата ---Ля-ля-ля в упорядоченном массиве порой нужно найти какойто элемент , для этого применим алгоритм деления пополам .Его принцип :берём первоый(q) и последний(p) элементы в массиве далее p+q div 2 , дальше если искомое число больше того что мы получили мы повторяем эту операцию , но по какомуто хитрому способу , который запутанно описан , а приведённый пример у меня вообще не сработал
--- Конец цитаты ---
Это поиск. Зачем он тебе пока.
gepar:
--- Цитата: topos84 ---это ВВ-код. Поэтому пишем в коде (#).
--- Конец цитаты ---
Так а это зачем ?У меня же там цифры сравниваются , а не сами символы .Я же добавил ord в самом начале и дальше сравниваю цыфры , но проблема в том что кое - где цифры те же , когда все символы разные .
AnXIouS:
--- Цитата ---это ВВ-код. Поэтому пишем в коде (#).
--- Конец цитаты ---
Это имелось ввиду для форума :)
gepar:
--- Цитата: AnXIouS ---Это поиск. Зачем он тебе пока.
--- Конец цитаты ---
Ну в учебнике он идёт следующим пунктом , полагаю если я его пропущу то я не смогу дальше продолжать заниматься по учебнику так как я не буду знать как искать элементы в массиве , а задания небось и дальше время от времени будут требовать этого .
Добавлено позже:
--- Цитата: topos84 ---Где же идентичны? Ты присваиваешь buf значение b(i), потом b(i) присваиваешь b(i+1)-ое, а потом благополучно забываешь про буфер свой и присваиваешь b(i+1)-ому не старое значение b(i)-го, которое в буфе, а уже новое, которое совпадает теперь с b(i+1)-ым.
--- Конец цитаты ---
Почему то в упор не видел этого , спасибо что показал где ошибка , теперь порядок с сортировкой символьного массива.
topos84:
--- Цитата: gepar ---Почему то в упор не видел этого , спасибо что показал где ошибка , теперь порядок с сортировкой символьного массива.
--- Конец цитаты ---
Вообще учись делать отладку. Это всегда пригодится. Т.е. если прога работает неверно, а компилятор не ругается на синтаксис, то подозрительный кусок программы можешь закомментировать и посмотреть, верно ли выполняется оставшаяся часть (если оставшаяся часть сама по себе не может работать, то добавь к ней то, что заставит ее работать). Ну и так далее, по всем смысловым кускам проги.
Под конец курса обучения паскалю тебе придется писать очень длинные проги по 3-4 страницы размером в экран, причем основная работа будет по написанию фукций и процедур; тело же программы будет состоять лишь в перечислении процедур и функций с конкретными аргументами, т.е. будет очень короткое, что позволит удобно и легко делать отладку, закомментировав конкретную фунцию или процедуру (или их совокупность).
gepar:
--- Цитата: topos84 ---Вообще учись делать отладку. Это всегда пригодится. Т.е. если прога работает неверно, а компилятор не ругается на синтаксис, то подозрительный кусок программы можешь закомментировать и посмотреть, верно ли выполняется оставшаяся часть (если оставшаяся часть сама по себе не может работать, то добавь к ней то, что заставит ее работать). Ну и так далее, по всем смысловым кускам проги.
--- Конец цитаты ---
Понял .
AnXIouS:
--- Цитата: gepar ---Почему то в упор не видел этого , спасибо что показал где ошибка , теперь порядок с сортировкой символьного массива.
--- Конец цитаты ---
А я так намекал... эх.
--- Цитата ---Ну в учебнике он идёт следующим пунктом , полагаю если я его пропущу то я не смогу дальше продолжать заниматься по учебнику так как я не буду знать как искать элементы в массиве , а задания небось и дальше время от времени будут требовать этого .
--- Конец цитаты ---
Попробую объяснить:
Имеем массив: |0|1|2|3|4|<тута_центр>|5|6|7|8|9|
Надобно найти например 7;
q = 0; p = 9;
0+9 = 9;
(9 / 2) ≈ 4;
4 < 7 по этому берем другую половину, т.е. |5|6|7|8|9| q = 5, p = 9, и повторяем.
Писать программы кусок лень.
Это умный поиск. Но в обучении он жестковат как на меня.
topos84:
Кстати, вот хорошее учебное пособие - короткое и, главное, удобное (можно и не скачивать, а читать онлайн): http://window.edu.ru/window_catalog/pdf2txt?p_id=27145&p_page=4
gepar:
Можно всё же конкретный пример для поиска элемента пожалуйста , ато что-то методом тыка не получаеться .
--- Цитата: topos84 ---http://window.edu.ru/window_catalog/pdf2txt?p_id=27145&p_page=4
--- Конец цитаты ---
Учебник хорош , но я сейчас хочу разобраться конкретно с этой сортировкой , его я постараюсь обязательно почитать на выходных когда времени немножко больше будет .
Мне пример нужен поиска типа допустим следующее :
--- Код: ---m:array[1..20] of integer;
i,q,p,s:integer;
--- Конец кода ---
Массив допустим уже отсортирован и в нём пусть элементы все идут подряд от 1 до 20 (первый будет 1 , а последний 20) .
Дальше в учебнике написано вот такое :
--- Код: --- while p<q do
Begin
s:=(p+q) div 2;
if m[s]>a then p:=s+1
else q:=s;
end;
--- Конец кода ---
Но это не работает , поправьте пожалуйста код если вы знаете как совершать поиск элементов в упорядоченных массивах или напишите с 0 свой пример , если приведённый код плох , тут ведь совсем немного кода и это не займёт много времени :)Заранее спасибо !
topos84:
--- Цитата: gepar ---Но это не работает
--- Конец цитаты ---
А 'a' там откуда взялось? Приведи код полностью (и .pas-файл прикрепи, если есть).
gepar:
--- Цитата: topos84 ---А 'a' там откуда взялось? Приведи код полностью (и .pas-файл прикрепи, если есть).
--- Конец цитаты ---
Прикрепил pas файл, у меня там правда random стоит так числа будут не от 1 до 20 но это по сути мало что меняет .
gepar:
А как считать сумму строки матрицы ?Подскажите пожалуйста .
Задание : Дана матрица целых чисел размером 4x3 . Определите сумму каждой строки этой матрицы .Результат вывести на экран монитора .
Начало решения :
--- Код: ---program proga211;
uses crt;
const
m=4;
n=3;
var
matr:array[1..m,1..n] of integer;
i,j:integer;
Begin
for i:=1 to m do
for j:=1 to n do
Begin
writeln('Enter element ',i,' ',j,' ');
read(matr[i,j]);
end;
for i:=1 to m do
for j:=1 to n do
write (matr[i,j]:4);
writeln;
--- Конец кода ---
В прикреплённом файле тот же код , но в виде pas файла .
Fly:
Элементарно. Пробегаем по массиву, записывая сумму элементов в некоторую переменную, по окончании строки выводим переменную на экран и обнуляем.
topos84:
--- Цитата: Fly ---Пробегаем по массиву, записывая сумму элементов в некоторую переменную, по окончании строки выводим переменную на экран и обнуляем.
--- Конец цитаты ---
Вместо введения m переменных, лучше взять массив из m элементов и в него записывать суммы элементов для каждой строки. Проще будет выводить результат на экран.
Fly:
А кто говорит про m переменных? Записываем в одну и ту же.
topos84:
--- Цитата: Fly ---А кто говорит про m переменных? Записываем в одну и ту же.
--- Конец цитаты ---
А, ну это вопрос удобства. Кому как нравится. ;)
Навигация
Перейти к полной версии