IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите оптимизировать программу..., Программа на системы счисления.
сообщение
Сообщение #1


Гость






Помогите пожалуйста оптимизировать программу, говорят, что можно написать намного короче, я же ума не приложу, что можно от нее отрезать...
Исходный код

uses crt;
const s=10;
var sett:set of char;
ch:char;
s1,s2,s3,LER,e:integer;
ploxayperem,i,tochek,ll:integer;
aa,bb,cc,smac:string;
f:boolean;
a,b,c:extended;

Function Pe(sed:extended;st:integer):string;
var nass:array[1..6] of integer;
nass2:array[1..6] of char;
sew,qqq:longint;
z,ssss:integer;
pro,nov,drobi:extended;
na:array[1..9] of integer;
na2:array[1..9] of char;
stroka:string;
begin
pe:='0';
sew:=trunc(sed);
drobi:=sed-sew;
pro:=0;
pro:=drobi;
for z:=1 to 6 do nass[z]:=0;
for z:=1 to 6 do
begin
nov:=pro*st;
nass[z]:=trunc(nov);
pro:=frac(nov);
end;
for z:=1 to 6 do nass2[z]:=' ';
for z:=1 to 6 do
begin
if (nass[z]>=0) and (nass[z]<10) then
nass2[z]:=chr(nass[z]+48)
else nass2[z]:=chr(nass[z]+55);
end;
for z:=1 to 9 do
begin
na[z]:=0;
na2[z]:=' ';
end;
z:=9; qqq:=sew;
while qqq>=st do
begin
na[z]:=qqq mod st;
z:=z-1;
qqq:=qqq div st;
end;
na[z]:=qqq;
for z:=1 to 9 do
begin
if (na[z]>=0) and (na[z]<10) then
na2[z]:=chr(na[z]+48)
else na2[z]:=chr(na[z]+55);
end;
stroka:='';
for z:=1 to 9 do Insert(na2[z],stroka,length(stroka)+1);
Insert('.',stroka,length(stroka)+1);
for z:=1 to 5 do Insert(nass2[z],stroka,length(stroka)+1);
z:=1;
ssss:=1;
while stroka[z]='0' do
begin
ssss:=ssss+1;
z:=z+1;
end;
for z:=1 to ssss-1 do delete(stroka,1,1);
pe:=stroka;
{}
end;

Function perev10(q:string):extended;
var t:integer;
mass:array[1..20] of integer;
mass2:array[1..20] of char;
ma:array[1..20] of integer;
ma2:array[1..20] of char;
ppp:extended;
q1,q2:string;
z:integer;
br:integer;
begin
perev10:=0;
ppp:=0;
t:=pos('.',q);
q1:=copy(q,1,t-1);
q2:=copy(q,t+1,length(q)-t);
for z:=1 to 20 do mass[z]:=0;
for z:=1 to 20 do mass2[z]:=' ';
for z:=1 to 20 do ma[z]:=0;
for z:=1 to 20 do ma2[z]:=' ';
for z:=1 to length(q1) do mass2[z]:=q1[z];
for z:=1 to length(q2) do ma2[z]:=q2[z];
t:=1;
while (mass2[t]<>' ') and (t<=20) do
begin
z:=ord(mass2[t]);
if (z>47) and (z<58) then
mass[t]:=z-48
else mass[t]:=z-55;
t:=t+1;
end;
t:=1;
while (ma2[t]<>' ') AND (t<=20) do
begin
z:=ord(ma2[t]);
if (z>47) and (z<58) then
ma[t]:=z-48
else ma[t]:=z-55;
t:=t+1;
end;
{}
for z:=1 to 20 do
ppp:=ppp+ma[z]*Exp((-1)*z*ln(s1));
for z:=1 to length(q1) do ppp:=ppp+mass[z]*Exp((length(q1)-z)*ln(s1));
{}
perev10:=ppp;
end;

Function Summa(r1,r2:string):string;
var t1,t2,t,z:integer;
d1,d2,d6:array[1..20] of char;
d3,d4,d5:array[1..20] of integer;
as:integer;
u:integer;
ph:string;
begin

t1:=pos('.',r1);
t2:=pos('.',r2);

If t1>t2 then
Begin
t:=t1-t2;
For z:=1 to t do Insert('0',r2,1);
End
else
Begin
If t1=t2 then
Begin
t:=0;
End
else
Begin
t:=t2-t1;
For z:=1 to t do Insert('0',r1,1);
End;
End;

t1:=length(r1);
t2:=length(r2);


If t1>t2 then
Begin
t:=t1-t2;
For z:=1 to t do Insert('0',r2,t2+1);
End
ELSE
bEGIN
If t1<t2 then
Begin
t:=t2-t1;
For Z:=1 to T do Insert('0',r1,t1+1);
End;
eND;


t:=length(r1)-pos('.',r1);
Delete(r1,pos('.',r1),1);
Delete(r2,pos('.',r2),1);


For z:=1 to 20 do
Begin
d1[z]:=' ';
d2[z]:=' ';
d3[z]:=0;
d4[z]:=0;
d5[z]:=0;
d6[z]:=' ';
End;
{}
u:=20;
For z:=length(r1) downto 1 do
Begin
d1[u]:=r1[z];
u:=u-1;
End;

u:=20;
For z:=length(r2) downto 1 do
Begin
d2[u]:=r2[z];
u:=u-1;
End;

For z:=1 to 20 do
Begin

as:=ord(d1[z]);
If (as>47) and (as<58) then d3[z]:=as-48
else
Begin
If as<>32 then d3[z]:=as-55 else d3[z]:=0;
End;

as:=ord(d2[z]);
If (as>47) and (as<58) then d4[z]:=as-48
else
Begin
If as<>32 then
d4[z]:=as-55
else d4[z]:=0;
End;
End;

{}
For z:=20 downto 1 do
Begin
d5[z]:=d5[z]+(d3[z]+d4[z]) mod s1;
d5[z-1]:=d5[z-1]+(d3[z]+d4[z]) div s1;;
End;

For z:=1 to 20 do
Begin
If (d5[z]<10) and (d5[z]>=0) then d6[z]:=chr(d5[z]+48)
else d6[z]:=chr(d5[z]+55);
End;

ph:='';
For z:=1 to 20 do
Insert(d6[z],ph,length(ph)+1);

Insert('.',ph,length(ph)-t+1);

t:=1;
While ph[t]='0' do
Begin
t:=t+1;
End;
t:=t-1;

For z:=1 to t do delete(ph,1,1);

summa:=ph;
{}
End;

Procedure redact(Var cursor:string);
Var k:integer;
toch:integer;
Begin
k:=length(cursor);
toch:=pos('.',cursor);
If toch=0 then Insert('.0',cursor,k+1);
End;






Function pravka(Var chislo:string; sys:integer):boolean;
Begin
pravka:=true;
If length(chislo)=0 then pravka:=false
else
Begin
If (chislo[1]='.') or (chislo[length(chislo)]='.') then pravka:=false
else
Begin
tochek:=0;
For i:=1 to length(chislo) do If chislo[i]='.' then tochek:=tochek+1;
If tochek>1 then pravka:=false
else
Begin
For i:=1 to length(chislo) do
If not (chislo[i] in sett) then
pravka:=false;
End;
End;
End;
End;


{Текст основной программы}
Begin
Clrscr;
sett:=[];
sett:=sett+['.']+['0']+['1'];
s1:=3;
If s1<=10 then
Begin
For i:=1 to (s1-1) do sett:=sett+[chr(i+48)];
End
else
Begin
For i:=48 to 57 do sett:=sett+[chr(i)];
For i:=10 to (s1-1) do sett:=sett+[chr(i+55)];
End;


s2:=20;
s3:=18;


Repeat
Clrscr;

Writeln('Для начала перевода нажмите ПРОБЕЛ.');
Writeln('Выход осуществляется по нажатию любой другой клавиши.');
ch:=readkey;
e:=ord(ch);
If e=32 then
Begin
Clrscr;
Repeat
Writeln('В ',s1,' ','с/с',' ','можно вводить только цифры от 0 до 2');
Writeln('Введите начало диапозона');
Readln(aa);
f:=pravka(aa,s1);
If f=false then
Begin
Writeln('Ошибка при вводе! Введите начало диапозона правильно!');
Writeln('Для продолжения нажмите Enter');
Readln;
End;
Until f=true;

Repeat
Writeln('Введите шаг');
Readln(cc);
f:=pravka(cc,s1);
If f=false then
Begin
Writeln('Ошибка при вводе! Введите шаг правильно!');
Writeln('Для продолжения нажмите Enter');
Readln;
End;
Until f=true;

Repeat
Writeln('Введите конец диапозона');
Readln(bb);
f:=pravka(bb,s1);
If f=false then
Begin
Writeln('Ошибка при вводе! Введите конец диапозона правильно!');
Writeln('Для продолжения нажмите Enter');
Readln;
End;
Until f=true;

redact(aa);
redact(bb);
redact(cc);

a:=perev10(aa);
c:=perev10(cc);
b:=perev10(bb);
smac:=aa;

If (a>b) then
Begin
Clrscr;
Writeln('Ошибка! Начальное значение превышает конечное. Для продолжения нажмите Enter');
readln;
End
else
Begin

Repeat
Clrscr;
Writeln;
Writeln('ПЕРЕВОД ЧИСЕЛ ИЗ ',S1,'-НОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ',S2,'-НУЮ И ',S3,'-НУЮ СИСТЕМЫ СЧИСЛЕНИЯ');
Writeln('-------------------------------------------------------------------------------');
Writeln;

Write('Начало диапозона - '); Gotoxy(30,Wherey); Writeln(aa);
Write('Шаг перевода - '); Gotoxy(30,Wherey); Writeln(cc);
Write('Конец диапозона - '); Gotoxy(30,Wherey); Writeln(bb);
Writeln;
Writeln(' ',s1,'-ная ',s,'-ная ',s2,'-ная ',s3,'-ная ');

Write(copy(smac,1,pos('.',smac)+5));

Gotoxy(21,wherey); Write(Perev10(smac):12:5);
Gotoxy(43,wherey); Write(pe(perev10(smac),s2));
Gotoxy(62,wherey); Write(pe(perev10(smac),s3));
Writeln;

While (wherey<=12) and (Perev10(smac)<=b) do
Begin

smac:=summa(smac,cc);
If (Perev10(smac)<=b) then Begin
Write(copy(smac,1,pos('.',smac)+5));
Gotoxy(21,wherey); Write(Perev10(smac):12:5);
Gotoxy(43,wherey); Write(pe(perev10(smac),s2));
Gotoxy(62,wherey); Write(pe(perev10(smac),s3));

Writeln;
End;
End;


If wherey>12 then
Begin
Writeln;
Writeln('Для продолжения нажмите Enter');

CH:=READKEY;
iF CH=#27 THEN HALT;

End;




{}
Until (Perev10(smac)>b);
Writeln;
Writeln('После окончания просмотра результата программы нажмите Enter');


{}
readln;
End;
{}

End


Until e<>32;

End.


Сообщение отредактировано: klem4 -
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


А что программа делать-то должна ?


p.s. FAQ : Системы счисления

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Должна вывести на экран в виде таблицы значения чисел из интервала от A до B с шагом C в системах счисления с основаниями S, P, Q, R. Числа A, B, C задаются в системе счисления с основанием S, A>=0, B>A. Обеспечить точность 5 знаков после запятой во всех системах счисления. Разработайте функцию для сложения двух чисел в системе счисления с основанием S.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 12.09.2025 20:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name