Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 28.11.2010, 20:19   #1 (permalink)
Татьянчик
Новичок
 
Регистрация: 28.11.2010
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите, пожалуйста, исправить ошибку в коде

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

Перечислить все пары простых чисел-близнецов, не превосходящих заданного числа 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.
Татьянчик вне форума   Ответить с цитированием

Старый 28.11.2010, 20:19
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На нашем форуме так же имеются похожие темы

Open GL, пожалуйста, помогите исправить ошибки в программе
Помогите исправить ошибку в программе
Помогите найти ошибку в коде
Помогите пожалуйста найти ошибку
Помогите, пожалуйста, исправить программку на Паскале
Паскаль. Пожалуйста, помогите найти ошибку!

Старый 28.11.2010, 22:46   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Таня, когда Вам это нужно сделать? Начал было исправлять, но чувствую, уже под вечер соображаю плохо.
Вообще ошибок много. Во-первых, в процедуре revers Вы используете идентификатор new - это недопустимо, new - зарезервированное слово в Паскале. Потом абсолютно некорректно и даже невразумительно построена процедура перевода чисел в троичную систему. Она попросту не работает.
Так что подумайте сами, а если не придумаете, я завтра вечером попробую отредактировать.
Vladimir_S вне форума   Ответить с цитированием
Старый 29.11.2010, 00:31   #3 (permalink)
Татьянчик
Новичок
 
Регистрация: 28.11.2010
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо))
по срокам так то до завтра но я думаю смогу перенести))
Татьянчик вне форума   Ответить с цитированием
Старый 29.11.2010, 11:25   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

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.
Vladimir_S вне форума   Ответить с цитированием
Старый 29.11.2010, 19:27   #5 (permalink)
Татьянчик
Новичок
 
Регистрация: 28.11.2010
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

огромнейшее спасибо)))
Татьянчик вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.