Turbo Pascal

Пух

كنت بلهاء
Модератор
Ответ: Turbo Pascal

гг. на, решай первую:
Вступление

Задача циклического сдвига одномерного массива из n элементов на i позиций влево. Например, если n=8, a i=3, вектор "abcdefgh" должен будет превратиться в "defghabc". Дело в том, что алгоритм решения такой казалось бы ничем не выдающейся задачки играет большую роль, например, во всяческих различного рода текстовых редакторах, в каждом из которых сейчас уже обязательно присутствует такая возможность, как выделение мышкой текста и последующего его перемещения как есть в любое другое место редактируемого файла.

И вот если использовать очевидное решение в лоб: использовать n-элементный вспомогательный массив и сделав n шагов завершить всю перестановку - мы натыкаемся на дополнительный расход памяти, пропорционально растущий от объема этого выделенного, перемещаемого текста. Представьте себе, если выделяется текст большого объема, например, в миллион символов и перемещается. В этом случае весь этот миллион символов(байт) - а это уже мегабайт, будет занимать ценное место в оперативной памяти.

Поэтому было бы неплохо найти решение, которое осуществляло бы эту перестановку без дополнительного расхода памяти, по-крайней мере, чтобы этот расход не рос пропорционально объему сдвигаемого фрагмента.

И такое решение существует, а точнее даже целых 3 интересных и проверенных опытом алгоритма, которые позволяют обойтись лишь несколькими дополнительными переменными и завершить весь сдвиг не за n шагов, а всего лишь за время, пропорциональное n.

По книге Джона Бентли:
"Жемчужины программирования"

"... В некоторых языках программирования операция циклического сдвига является элементарной (то есть выполняется одним оператором). Для нас важно, что циклический сдвиг соответствует обмену соседних блоков памяти разного размера: при перемещении фрагмента текста с помощью мыши из одного места файла в другое осуществляется именно эта операция. Ограничения по времени и объему памяти существенны для многих подобных приложений.

Можно попытаться решить задачу, копируя первые i элементов массива х во временный массив, сдвигая оставшиеся n-i элементов влево на i позиций, а затем копируя данные из временного массива обратно в основной массив на последние i позиций. Однако данная схема использует i дополнительных переменных, что требует дополнительной памяти. Другой подход заключается в том, чтобы определить функцию, сдвигающую массив влево на один элемент (за время, пропорциональное n), а потом вызывать ее i раз, но такой алгоритм будет отнимать слишком много времени.
Алгоритм #1: последовательный обмен

Решение проблемы с указанными ограничениями на использование ресурсов потребует написания более сложной программы. Одним из вариантов решения будет введение дополнительной переменной. Элемент х[0] помещается во временную переменную t, затем x помещается в x[0],x[2*i] — в х[1] и так далее (перебираются все элементы массива х с индексом по модулю n), пока мы не возвращаемся к элементу х [0], вместо которого записывается содержимое переменной t, после чего процесс завершается. Если i = 3, а n = 12, этот этап проходит следующим образом (рис. 2.2):
You must be registered for see images

 

Вкладення

  • 6.3 КБ Перегляди: 474

Пух

كنت بلهاء
Модератор
Ответ: Turbo Pascal

помогите решить задачки :

1.Реализовать циклическую перестановку элементов массива на заданое число шагов.

2.В Двухмерном массиве реализовать перестановку заданых строк или столбцов.
1.
Код:
program kyky;
uses crt;
CONST M=10;
var x:array[1..M] of integer;
    j,i,t,n:integer;

begin
clrscr; randomize;
for i:=1 to M do
begin
t:=random(20);
x[i]:=t;
write(x[i],' ');
end;

write('na skoka sdvigat`? ');
read(n);
for j:=1 to n do
begin
t:=x[M];
for i:=M downto 2 do
x[i]:=x[i-1];
x[1]:=t;
end;

gotoxy(25,0);
for i:=1 to M do
write(x[i],' ');
readln; readln;
end.

2.
Код:
program mde;
uses crt;
CONST M=5; N=5;
VAR a,b:array[1..M,1..N] of integer;
cas,z,q,i,x,j,y:integer;

begin

clrscr; randomize;

for i:=1 to M do
for j:=1 to N do
begin
x:=random(20);
a[i,j]:=x;
end;

y:=8;
for i:=1 to M do
begin
for j:=1 to N do
begin
case j of
1:x:=15;
2:x:=18;
3:x:=21;
4:x:=24;
5:x:=27;
end;
Gotoxy(x,y);
write(a[i,j]);
end;
inc(y,2);
end;

gotoxy(10,2);
writeln('Wo ti  xo4ew menyat`? Elsi stolbiki, piwu 1, esli stroki-2');
read(cas);
if cas=1 then
begin
writeln('Kakie menyat` stolbiki');
read(z,q);
for i:=1 to N do
begin
b[i,z]:=a[i,z];
a[i,z]:=a[i,q];
a[i,q]:=b[i,z];
end; end;

if cas=2 then
begin
writeln('Kakie menyat` stroki`');
read(z,q);
for i:=1 to M do
begin
b[z,i]:=a[z,i];
a[z,i]:=a[q,i];
a[q,i]:=b[z,i];
end; end;


y:=8;
for i:=1 to M do
begin
for j:=1 to N do
begin
case j of
1:x:=35;
2:x:=38;
3:x:=41;
4:x:=44;
5:x:=47;
end;
Gotoxy(x,y);
write(a[i,j]);
end;
inc(y,2);
end;
readln;
end.
p.s. если б учили процедуры, писать в 2-3 раза меньше пришлось бы.
 
Останнє редагування:

Romualdo

New Member
Ответ: Turbo Pascal

Это такая директория, с которой производятся файловые операции когда задан относительный путь. При запуске программы обычно она устанавливается в директорию, откуда была запущена программа (это не обязательно там, где лежит исполняемый файл), потом ее можно менять с помощью процедуры ChDir и узнать с помощью процедуры GetDir.
Если автор не изменял путь, предлагаемый по умолчанию при сохранении программы, то этот путь необходимо прописывать. Хотя, у него была другая проблема. :roll:
 

Пух

كنت بلهاء
Модератор
Ответ: Turbo Pascal

есть программа, которая использует модули CRT, Graph. Как сделать EXE файл, чтобы можно было его открыть на любом компьютере? А то, я делаю ЕХЕ файл, но если я иницилизирую графику(Gd:=detect; InitGraph(Gd,Gm,''); ), то:
1)если он остается в папке с паскалем, то всё нормально работает
2)если его скопировать в другую папку, то при запуске этого ЕХЕ файла появляется на доли секунды окно ДОС и так же быстро пропадает(естественно ничего не работает).

Если я при иницилизации графику немного по-другому( Gd:=detect, InitGraph(Gd,Gm,'указываю путь к паскалю'), то ЕХЕ файл нормально запускается только на моем компе, с любой папки. Если поменять название папки с паскалем, то ничего уже не работает.

Так как сделать ЕХЕ файл, чтобы он работал на любых компах?
 

[Spider]

New Member
Ответ: Turbo Pascal

Можно включить драйвер в тело программы.
О том, как это сделать можно прочесть (с. 381-383):
 

dreamer

Member
Ответ: Turbo Pascal

Можно включить драйвер в тело программы.
О том, как это сделать можно прочесть (с. 381-383):
Или просто распространять его вместе с программой и указывать относительный путь к драйверу.
 

Djmon

New Member
Ответ: Turbo Pascal

Ребята!

1. Как можно с типизированного файла, заполненого записями, в которых, допустим, есть имя и возраст, выбрать людей, возраст которых ниже заданного при поиске.

2. Как можно организовать рабочее меню выбора операций с подпунктами с защитой "от дурака"?

3. Существует ли более оптимальный переход нежели Label?
 

dreamer

Member
Ответ: Turbo Pascal

1. Как можно с типизированного файла, заполненого записями, в которых, допустим, есть имя и возраст, выбрать людей, возраст которых ниже заданного при поиске.
--- Читаем по одной записи из файла, проверяем необходимое условие, если выполняется то обработать запись (вывести на экран или занести куда-то)

2. Как можно организовать рабочее меню выбора операций с подпунктами с защитой "от дурака"?
--- например выводить варианты выбора пронумерованные и просить нажать номер, плюс отвести один пункт (например 0) на опцию "Вернуться на уровень выше"

3. Существует ли более оптимальный переход нежели Label?
--- конечно существует, нет практически ни одного алгоритма где не обойтись без него. Все сложные случаи реализуются через repeat + case:
Код:
state := START;
repeat
    case state of
        OPT1: 
            do_some_thing;
            state := OPT2;
        OPT_EXIT: 
            state := EXIT;
    end;
until state = EXIT;
 

Пух

كنت بلهاء
Модератор
Ответ: Turbo Pascal

дайте ссылочку на примеры задач с использованием ООП, а конкретней ООП + графика. СтоИт задача описать физическую модель с использованием графики и ООП. Без ООП написал, а как туда эти обьекты вставить незнаю :)
 

Cris

Member
Ответ: Turbo Pascal

закончилась школа, и больше некто не требует решить задачу, и некому нече ненадо))
 
Зверху