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

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

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

 
 Ответить  Открыть новую тему 
> Вставка нового эл-та и со сдвигом массива, чес говоря даже стыдно, но сам не зделаю
kr3v3tkus
сообщение 29.11.2005 18:39
Сообщение #1


Пионер
**

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

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


Задали задачку:
массив [-40;30] константа 10
1.удалить эл-т если в нём есть цифра 1
2.если эл-т состоит из одной цифры или цифры одинаковы (22,33 итд) то вставить перед ним число К с клавы, соответственно при этом мдвинув все эл-ты вправо на 1
3.сделать замену 3х первых и последних эл-тов, сохраняя последовательность
Вобщем 1 и 3 вроде сделал , а 2е НИКАК D: никак не получается нормально присвоить и сдвинуть ((( подскажите или натолкните на мыслю плз
ЗЫ вроде в факе такого не нашёл, я тут первый раз, так что не бейте сапогами плиз


program variant1;
const n=10;
type arr=array[1..n] of integer;
var a:arr;
    i,k,t,q:integer;
    temp1,temp2,temp3:integer;
begin
 begin{'vvod massiva'}
  writeln('zapolniaetsia massiv');
  for i:=1 to n do
  begin
  a[i]:=-40+(random(70));
  writeln(i,'element =',a[i]);
  end;
 end;
 begin{'ydalenie elementa'}
 q:=0;
  for i:=1 to n do
   if ((a[i] mod 10 = a[i] div 10) or (a[i] div 10 = 0)) then
   begin
    q:=q+1;
    a[i]:=a[i+1];
   end;
 for i:=1 to n-q do
 writeln(a[i]);
 end;
readln;
readln;
 begin{'vstavka K'}
 writeln('vvesti k');
 readln(k);
 for i:=1 to n do
  if ((a[i] mod 10 =1) or (a[i] div 10 =1)) then
   begin
   i:=t;
   for i:=t to n do
   a[i+1]:=a[i];
   a[t]:=k;
   end;
 for i:=1 to n do
 writeln(a[i]);
 end;
readln;
readln;
 begin{'perestanovka'}
 temp1:=0;
 temp2:=0;
 temp3:=0;
  temp1:=a[n-2];
  temp2:=a[n-1];
  temp3:=a[n];
  a[n-2]:=a[1];
  a[n-1]:=a[2];
  a[n]:=a[3];
  a[1]:=temp1;
  a[2]:=temp2;
  a[3]:=temp3;
  for i:=1 to n do
   writeln(i,' element = ',a[i]);
 end;
readln;
readln;
end.



--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.11.2005 18:45
Сообщение #2


Гость






kr3v3tkus
Цитата
2.если эл-т состоит из одной цифры или цифры одинаковы (22,33 итд) то вставить перед ним число К с клавы, соответственно при этом сдвинув все эл-ты вправо на 1

У тебя же массив строго заданной размерности... А ели будет 5 элементов из одной цифры? В результате размерность массива должна равняться 15? Или ты что-то недоговариваешь?

В-общем, вот вопрос:
есть массив <2, 4, 6, 8, 0, 15, 19, 23, 22, 33>
С клавиатуры вводится число "7"
что будет в массиве после первого подзадания, что - после второго, а что - после третьего?
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 29.11.2005 23:04
Сообщение #3


Пионер
**

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

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


volvo после 1го действия должно быть так я думаю
2, 4, 6, 8, 0, 23, 22, 33
после 3го
23,22,33,0,2,4,6
По идее размерность может быть любой , для её отсчёта я и ввёл q
q:=0; 
for i:=1 to n do  
if ((a[ i ] mod 10 = a[ i ] div 10) or (a[ i ] div 10 = 0)) then 
begin   
q:=q+1;
a[ i ]:=a[i+1];
 end;
for i:=1 to n-q do writeln(a[ i ]);

Но у меня встречный вопрос :D - если в 1ом действии изменится размерность массива, то изменится ли она во 2ом и 3ем действии? А ваще про размерность не сказано было так что впринципе ето не принципиально, я думаю лучше размерность взять нефиксированную.


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.11.2005 23:52
Сообщение #4


Гость






kr3v3tkus,
проверь логику работы (у меня выполняются все 3 действия последовательно, но проблемы сделать это отдельно я не вижу)... Если пойдет - расскажу, что и как сделал, и почему у тебя было не совсем корректно wink.gif
program variant1;

const
  n = 10;

type
  arr = array[1..2*n] of integer;

{ Это - для контроля работы программы... }
procedure print(const a: arr; const n: integer);
var i: integer;
begin
  for i := 1 to n do
    write(a[i]:4);
  writeln;
end;

var
  a:arr;
  i,j,k,t,q:integer;
  temp1,temp2,temp3:integer;

begin
  { 'vvod massiva' }
  writeln('zapolniaetsia massiv');
  for i:=1 to n do begin
    a[i]:= -40 + (random(70));
    writeln(i:2, ' element = ',a[i]:4);
  end;
  for i := n+1 to 2*n do a[i] := 0;

  print(a, n);

  { 'ydalenie elementa' }
  i := 1; q := n;
  while i <= q do begin
    if (abs(a[i]) mod 10 = 1) or (abs(a[i]) div 10 = 1) then begin
      for j := i to q-1 do a[j] := a[j+1];
      dec(q);
    end
    else inc(i)
  end;

  print(a, q);

  { vstavka }
  write('k = '); readln(k);
  i := 1;
  while i <= q do begin
    if ((abs(a[i]) >= 0) and (abs(a[i]) <= 9)) or
       (abs(a[i]) mod 11 = 0) then begin
      for j := q downto i do a[j+1] := a[j];
      inc(q); a[i] := k; inc(i)
    end;
    inc(i);
  end;

  print(a, q);

  { zamena }
  if Q > 3 then
    for i := 1 to 3 do begin
      T := a[i];
      a[i] := a[q-3+i];
      a[q-3+i] := T;
    end
  else writeln('not enough elements');

  print(a, q);

end.
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 30.11.2005 16:34
Сообщение #5


Пионер
**

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

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


volvo
вау! blink.gif теперь я понял как я касячил mega_chok.gif
вобщем насчёт корректности я впринципе понял - модули, потомучто для отрицательных бы условие не покатило, сами условия не конкретны(mod11 - супер! в жисть бы не допёр), перестановка ваще рульная smile.gif .Пару вопросов:
1.если можно расскажи плз поканкретнее про downto на примере, а то почемуто до меня никак не доходит она no1.gif
2.[1..2*n] - почему 2? это на случай увеличения массива? и вот -
for i := n+1 to 2*n do a[i] := 0;
( после ввода массива ) не совсем понял ето (
3.и ещё если можно - то про процедуру чуть чуть, точнее про связь переменных в процедуре, а то в инсте как то объяснили странно про локал и глоб переменные, с учебников никак не могу тоге понять unsure.gif .Вобщем конкретнее - меня интересует почему мы вводим одни названия в процедуре, а потом как мы их связываем с названиями переменных в самой программе
ЗЫ биг сенкс! пасибки что помог smile.gif вот потусуюсь тут на форуме , глядиш может и научусь кодить, причём оптимально wink.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.11.2005 16:55
Сообщение #6


Гость






Цитата
1.если можно расскажи плз поканкретнее про downto на примере

В смысле? Само действие DownTo, что-ли? Так это просто... Если с To переменная цикла увеличивается на 1 (и стартовое значение должно быть меньше финального), то с DownTo наоборот, уменьшается (стартовое значение должно быть больше финального, чтобы цикл выполнялся...)
For i := 1 to 10 Do Write(i:3);

  1  2  3  4  5  6  7  8  9 10


For i := 10 DownTo 1 Do Write(i:3);

 10  9  8  7  6  5  4  3  2  1




Цитата
[1..2*n] - почему 2
Потому что в худшем случае (ничего не будет удалено на первом этапе и все элементы из одной цифры или кратны 11) длина исходного массива удвоится... Вот я и зарезервировал необходимое место blum.gif

После заполнения массива все оставшееся пустым место я заполняю нулями... Ну, не доверяю я компилятору...


Цитата
меня интересует почему мы вводим одни названия в процедуре, а потом как мы их связываем с названиями переменных в самой программе

Мы даем в процедуре имя формальному параметру (и все действия должны производить именно с этим формальным параметром, потому что не знаем, что будет в Run-Time передано в процедуру фактически)... А вот при вызове процедуры/функции мы передаем какой-то объект, над которым хотим произвести действие, это - фактический параметр, ибо все, что мы задавали сделать в процедуре будет сделано именно с этим объектом...

A и N в описании процедуры - формальный параметр, т.е. ты говоришь процедуре: "Что-то тебе будет передано... Пока назовем это A, когда получишь это что-то - над ним произведешь такие-то действия..."
procedure print(const a: arr; const n: integer);
var i: integer;
begin
  for i := 1 to n do
    write(a[i]:4);
  writeln;
end;

При вызове же A и Q - фактические параметры (здесь просто так получилось, что имя обоих первых параметров совпадает, но это не обязательно...)
print(a, q);
 К началу страницы 
+ Ответить 
kr3v3tkus
сообщение 30.11.2005 19:58
Сообщение #7


Пионер
**

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

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


ух smile.gif огроменное пасибо!
вроде понял good.gif , попрактикуюсь и думаю получится :D


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 26.07.2025 2:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"