Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите, пожалуйста, исправить ошибку в коде (http://www.tehnari.ru/f43/t42665/)

Татьянчик 28.11.2010 20:19

Помогите, пожалуйста, исправить ошибку в коде
 
помогите пожалуйста исправить ошибку в коде для задачи:

Перечислить все пары простых чисел-близнецов, не превосходящих заданного числа n, троичные представления которых получаются друг из друга записью цифр в обратном по-рядке (первая такая пара - это 5 и 7).

вот сам код:

Код:

program zadacha_1;
uses crt;
type chisla=array[1..100]of integer;
mas_ch=array[1..100] of string;

var k,n:integer;
sim:chisla;
sim_tr,s_sim:mas_ch;


procedure resheto(n:integer; var sim:chisla); {поиск простых чисел с применением решета Эратосфена}
var i,j,p:integer;
begin
p:=1;
for i:=1 to n do
sim[i]:=i;

for i:=1 to n do
begin
if sim[i]<>0 then inc(p);
j:=i;
while j<=n do
if (sim[j] mod p = 0) and (sim[j]>p) then
begin
sim[j]:=0;
inc(j);
end
else inc(j);
end;
sim[1]:=0;

writeln('Sinmple numbers:');
for i:=1 to n do
if sim[i]<>0 then write(sim[i],' ');
end;


procedure trancf(n:integer; sim:chisla; var sim_tr:mas_ch; var k:integer);
{перевод найденных простых чисел в троичную систему}
var i,x,num:integer;
st,r:string;
begin
k:=1;
for i:=1 to n do
begin
if sim[i]<>0 then
begin
num:=sim[i];
r:='';
repeat
x:=num mod 3;
str(x,st);
r:=r+st;
num:=num div 3;
st:='';
until num=0;

sim_tr[k]:=r;
inc(k);

end;
end;
writeln('k=', k);
end;


procedure revers(sim_tr:mas_ch; k:integer);
{формирование массива чисел с обратным троичным представлением и поиск пар-близнецов по условию задачи}
var i,j,l,g:integer;
old, new:string;

begin
for i:=1 to k do
begin
old:=sim_tr[i];
new:=s_sim[i];
l:=length(old);
for j:=1 to l do
new[j]:=old[l-j];
end;

writeln;
writeln('Twins simple numbers: ');
for i:=1 to k do
for g:=1 to k do
if s_sim[i]=sim_tr[g] then writeln(s_sim[i], '-' ,sim_tr[g]);
end;


BEGIN
clrscr;
write('n>13: ');
readln(n);
resheto(n,sim);
trancf(n,sim,sim_tr,k);
revers(sim_tr,k);
readkey;
END.

Vladimir_S 28.11.2010 22:46

Таня, когда Вам это нужно сделать? Начал было исправлять, но чувствую, уже под вечер соображаю плохо.
Вообще ошибок много. Во-первых, в процедуре revers Вы используете идентификатор new - это недопустимо, new - зарезервированное слово в Паскале. Потом абсолютно некорректно и даже невразумительно построена процедура перевода чисел в троичную систему. Она попросту не работает.
Так что подумайте сами, а если не придумаете, я завтра вечером попробую отредактировать.

Татьянчик 29.11.2010 00:31

спасибо))
по срокам так то до завтра но я думаю смогу перенести))

Vladimir_S 29.11.2010 11:25

Цитата:

Сообщение от Татьянчик (Сообщение 423810)
спасибо))
по срокам так то до завтра но я думаю смогу перенести))

Ну раз так, то несколько ускорил процесс. Ниже выложена полностью отлаженная программа. Правда, исходный код пришлось основательно переработать. Вот список изменений:

1. Косметика. Именовать одинаково параметры процедуры и глобальные (подставляемые в процедуру) параметры хоть и допустимо, но, с моей (и не только) точки зрения - неряшливость и дурной тон. Исправлено.
2. После прохождения процедуры Resheto никакой надобности в полном массиве уже нет, дальше мы имеем дело только с выбранными простыми числами. Поэтому в процедуре Resheto формируется массив найденных простых чисел длиной m и с ним продолжается работа.
3. Поиск инверсного троичного кода целесообразно проводить прямо в теле процедуры преобразования, в том же цикле, в котором формируется прямой код. В результате формируются два числовых (а не строковых!) массива, содержащие запись простых чисел в прямом и инвертированном троичном коде. Надобность в типе mas_ch, таким образом, отпадает.
Ну вот как-то так. Если будут вопросы - буду рад ответить.
Код:

program zadacha_1;
uses crt;
const
 Nmax=100;
type
 chisla=array[1..Nmax] of Integer;
var
 n,m:integer;
 sim,sim_3,sim_3_r:chisla;

procedure resheto(n_r:integer; var sim_r:chisla; var m_r:integer);
{поиск простых чисел с применением решета Эратосфена}
 var
  i,j,p:integer;
  sim1:chisla;
 begin
  p:=1;
  for i:=1 to n_r do sim1[i]:=i;
  for i:=1 to n_r do
  begin
    if sim1[i]<>0 then inc(p);
    j:=i;
    while j<=n_r do
    if (sim1[j] mod p = 0) and (sim1[j]>p) then
      begin
      sim1[j]:=0;
      inc(j);
      end
    else inc(j);
  end;
  sim1[1]:=0;
  writeln('Simple numbers:');
  m_r:=0;
  for i:=1 to n_r do
  if sim1[i]<>0 then
    begin
    Inc(m_r);
    sim_r[m_r]:=sim1[i];
    write(sim_r[m_r],' ');
    end;
  WriteLn;
 end;

procedure trancf(m_t:integer; sim_t:chisla; var sim_tr, sim_tr_rev:chisla);
{перевод найденных простых чисел в троичную систему и инверсия}
var
 i,j,num,Code:integer;
 s,r,st:string;
 cchh:Array[1..10] of Char;
 x:Array[1..Nmax] of Integer;
 begin
  for i:=1 to m_t do
  begin
    num:=sim_t[i];
    s:='';
    r:='';
    x[i]:=0;
    Repeat
    Inc(x[i]);
    Str((num mod 3),st);
    cchh[x[i]]:=st[1];
    num:=num div 3;
    Until num=0;
    for j:=x[i] downto 1 do
    s:=s+cchh[j];
    for j:=1 to x[i] do
    r:=r+cchh[j];
    VAL(s,sim_tr[i],Code);
    VAL(r,sim_tr_rev[i],Code);
    WriteLn(sim_t[i]:5,' ',sim_tr[i]:10,' ',sim_tr_rev[i]:10);
  end;
  WriteLn;
 end;

procedure twins(m_t:integer; s_t,s_3,s_3_r:chisla);
{поиск пар-близнецов по условию задачи}
var
 i:integer;
 begin
  writeln('Twins simple numbers: ');
  for i:=1 to m_t-1 do
  If s_3_r[i]=s_3[i+1] then
    writeln(s_t[i],' (',s_3[i],') - ',s_t[i+1],' (',s_3[i+1],')');
 end;


BEGIN
 clrscr;
 write('13<n<=',Nmax,': ');
 readln(n);
 resheto(n,sim,m);
 writeln;
 trancf(m,sim,sim_3,sim_3_r);
 writeln;
 twins(m,sim,sim_3,sim_3_r);
 readkey;
END.


Татьянчик 29.11.2010 19:27

огромнейшее спасибо)))


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.