Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2009, 19:53   #1
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию Помогите с кодом на Delphi

Здраствуйте. У меня вот проблема. Одно из задание отраженное в этом коде, этой найти числа содеращие цифру "5" и вместо них поставить 0.




program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;
type
Titem=longint;
TDar=array of Titem;
Var
x,p,n,k,j,i:longint;
c,A,B:Tdar;
T:Titem;
fl:boolean;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
Begin
repeat
writeln('Vvedite kol-vo elementov'); readln(n);
until n>0;
setLength(A,n);
i:=Low(A);
randomize;
repeat
A[i]:=random(100);
inc(i);
until i>High(A);
writeln('Massiv A');
if High(A)>=0 then
for i := Low(A) to High(A) do
Write(A[i],' ') else
writeln('there are no elements');
writeln;
i:=Low(A);
k:=0;
repeat
begin
inc(k);
Setlength(B,k);
B[k-1]:=A[i];
End;
inc(i);
until i>High(A);
writeln('Massiv B iz A:');
if High(b)>=0 then
for i:=Low(B) to High(B) do
write(B[i],' ')
else
begin
write('there are no elements');
readln;
End;
writeln;
i:=Low(A);
repeat
x:=A[i];
while (x>0) and fl=false do

begin
N:=x mod 10;
x:=x div 10;
if n mod 5=0 then fl:=true
End;
if fl=true then x:=0
else inc(i)
until i>High(A);
writeln('sdvig massiva na k=');
write('vvedite k'); readln(k);
x:=0;
p:=0;
c:=0;
for i := 1 to k do
begin
x:=A[1];
for j:=1 to p-1 do
A[j]:=A[j-1];
A[p]:=x;
End;
writeln(x);
readln;
end;
finally

end;
end.
Saka вне форума Ответить с цитированием
Старый 12.12.2009, 20:02   #2
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

17 сообщений пора бы уже научиться пользоваться кнопкой для оформления кода. Она выглядит вот так #
dr.Chas вне форума Ответить с цитированием
Старый 12.12.2009, 20:09   #3
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

вот так можно
Код:
if pos('5',inttostr(x))<>0 then x:=0;

Последний раз редактировалось пауэрлифтинг; 12.12.2009 в 20:28.
пауэрлифтинг вне форума Ответить с цитированием
Старый 12.12.2009, 20:19   #4
пауэрлифтинг
Заблокирован
 
Регистрация: 11.12.2009
Сообщений: 133
По умолчанию

или попробуй замени на

while (x>0) and not fl do
begin
N:=x mod 10;
x:=x div 10;
fl:=n=5;
End;

if fl then x:=0
else inc(i);
пауэрлифтинг вне форума Ответить с цитированием
Старый 12.12.2009, 22:59   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
if fl=true then x:=0
а зачем обнулять X ?!
а так понял, что надо число в массиве обнулить?!
Это будет:
Код:
if fl=true then A[i]:=0;

и дальше, в коде сдвига массива, имхо, тоже полная ахинея написана ;(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2009, 23:28   #6
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

почему ахинея?
Saka вне форума Ответить с цитированием
Старый 12.12.2009, 23:37   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
почему ахинея?
ну.. исключительно исходя из этого:
Цитата:
Код:
x:=0;
p:=0;
c:=0;
с - не используется совсем. x в цикле переприсваивается, поэтому заносить туда ноль - бесмысленно..
но интереснее того, что дальше делается с переменной p
Цитата:
Код:
p:=0;
...
for j:=1 to p-1 do
как Вы думаете, сколько раз выполнится цикл?...


да. ещё.
в том куске, где идёт проверка на то, содержит ли число 5
надо ещё не забывать в цикле сбрасывать флаг! иначе, найдя одно число, которое содержит 5 - переменная становится истинной (fl := true)
и больше в цикл мы не попадаем!

и ещё. когда пишите несколько условий в логическом выражении:
while (x > 0) and fl = false do
не забывайте скобки. Это принципиально!!!
Код:
        while (x > 0) and (fl = false) do

______________
обнуление всех чисел в массиве, которые содержат в записи цифру "5" я бы записал так:
Код:
      for i:=Low(A) to High(A) do
      begin 
        x := A[i];
        while (x > 0) do
        begin
          N := x mod 10;
          x := x div 10;
          if (n=5) then begin
            A[i] := 0;
            x := 0; {это чтобы выйти из цикла}
          end;
        end;
      end;

Последний раз редактировалось Serge_Bliznykov; 12.12.2009 в 23:45.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 12:21   #8
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

подскажите тогда какой должен быть код у правильного циклического сдвига вправо
Saka вне форума Ответить с цитированием
Старый 13.12.2009, 12:37   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
подскажите тогда какой должен быть код у правильного циклического сдвига вправо
прежде всего, ввёденное число K (на сколько сдвигать), надо взять по модулю РазмераМассива. (это очевидно, но я немножко поясню — если массив из 5 элементов, то свинуть его на 6 элементов, это то же самое, что сдвинуть на ОДИН элемент. А если массив из 5 элементов сдвинуть на 5 элементов, то он вообще не изменится...
Код:
K := K mod КоличествоЭлементовМассива;
теперь о алгоритме собственно сдвига.
вот два.
Первый. в цикле, "тупо в лоб" сдвигаем на один элемент вправо, первый становится на место второго, второй - на место третьего, а последний - на место первого.. и повторяем эту процедуру K раз:
Код:
  for i:=1 to K  do 
     ShiftArray( A );
этот способ не очень эффективен...

поэтому я предлагаю чуть более сложный (алгоритмически) способ, зато он красивее и эффективнее.
Надо A[1] -> A[1+K]
A[1+K] -> A[1+K+K]
...
и т.д. пока мы не выполним цикл переносов ровно столько раз, сколько элементов в массиве!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2009, 13:13   #10
Saka
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 83
По умолчанию

первый способ понял, а вот второй алгоритмический нет. Поясните плз
Saka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с кодом judge_arm Microsoft Office Excel 2 01.07.2009 11:48
Помогите с кодом lewka-serdceed Общие вопросы Delphi 1 22.06.2009 00:25
Помогите с кодом prostoCHEL Общие вопросы Delphi 4 02.03.2008 21:56