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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2012, 19:03   #1
rootkot
 
Регистрация: 10.04.2012
Сообщений: 4
Вопрос сдвиг максимального числа в массиве

Прошу помочь. Не получается дописать циклический сдвиг так что-бы максимальное встало на первое место.
Вот например массив идет так 8 4 9 2 после сдвига должен быть так 9 8 4 2
ошибка в процедуре сдвига.


Код:
Uses CRT;
const A=5; B=7;
type mas=array[1..B] of integer;
var x,y:mas;
max,imax,i:integer;
procedure MASSIV(var m:mas;k:integer);
begin
for i:= 1 to k do
m[i]:= random(200)-99;
end;
procedure VVOD(m:mas;k:integer);
begin
write;
for i:= 1 to k do
write(m[i]:5);
writeln;
end;
procedure POSLESDVIGA(var m:mas; k:integer);
var max,imax,kol,a:integer;
begin
imax:=1;
for i:=1 to k do
if m[i]>max then
begin
max:=m[i];
imax:=i;
end;
writeln(' Maksimum = ',max);
a:=m[1];
m[1]:=max;
end;
procedure REZULTAT(m:mas;k,c:integer);
begin
writeln;
write('Massiv ',c,' s maksimalnim na 1 meste');
for i:= 1 to k do
write(m[i]:5);
writeln
end;
BEGIN
CLRSCR;
randomize;
massiv(x,a);vvod(x,a);
poslesdviga(x,a);rezultat(x,a,1);writeln;
massiv(y,b);vvod(y,b);
poslesdviga(y,b);rezultat(y,b,2);
END.

Последний раз редактировалось rootkot; 10.04.2012 в 19:05.
rootkot вне форума Ответить с цитированием
Старый 10.04.2012, 19:18   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Данный код сдвинет все максимальные элементы влево.
Код:
const
  ncount = 10;

var
  i, j, max, k: integer;
  a: array[1..ncount] of integer;

begin
  randomize;
  for i := 1 to ncount do
    a[i] := random(5) + 1;
  for i := 1 to ncount do
    write(a[i], ' ');
  
  max := a[1];
  k := 1;
  for i := 2 to ncount do
    if a[i] > max then
    begin
      max := a[i];
      k := 1;
    end
    else
    if a[i] = max then
      inc(k);
  i := ncount;
  j := ncount;
  while (j > 0) do
  begin
    a[i] := a[j];
    if a[i] = max then
      dec(j)
    else
    begin
      dec(i);
      dec(j);
    end;
  end;
  for i := 1 to k do
    a[i] := max;
  
  writeln;
  for i := 1 to ncount do
    write(a[i], ' ');
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.04.2012 в 00:15.
BDA вне форума Ответить с цитированием
Старый 11.04.2012, 00:01   #3
rootkot
 
Регистрация: 10.04.2012
Сообщений: 4
По умолчанию

Отлично спасибо, но часто прога вылетает с ошибкой думаю дело во втором массиве, что-бы еще подпилить?
Код:
Uses CRT;
const A=5; B=7;
type mas=array[1..B] of integer;
var x,y:mas;
max,imax,i:integer;
procedure MASSIV(var m:mas;k:integer);
begin
for i:= 1 to k do
m[i]:= random(100)-50;
end;
procedure VVOD(m:mas;k:integer);
begin
write;
for i:= 1 to k do
write(m[i]:5);
writeln;
end;
procedure POSLESDVIGA(var m:mas; k:integer);
var max,a,u,j:integer;
begin
max := m[i];
for i:=1 to k do
if m[i]>max then
 begin
  max:=m[i];
writeln(' Maksimum = ',max);
      u:= 1;
 end
    else
    if m[i] = max then
      inc(u);
  i := k;
  j := k;
  while (j > 0) do
  begin
    m[i] := m[j];
    if m[i] = max then
      dec(j)
    else
    begin
      dec(i);
      dec(j);
    end;
  end;
  for i := 1 to u do
   m[i] := max;
 writeln
 end ;
procedure REZULTAT(m:mas;k,c:integer);
begin
writeln;
write('Massiv ',c,' s maksimalnim na 1 meste');
for i:= 1 to k do
write(m[i]:5);
writeln
end;
BEGIN
CLRSCR;
randomize;
massiv(x,a);vvod(x,a);
poslesdviga(x,a);rezultat(x,a,1);writeln;
massiv(y,b);vvod(y,b);
poslesdviga(y,b);rezultat(y,b,2);
END.
rootkot вне форума Ответить с цитированием
Старый 11.04.2012, 00:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Из-за неправильно инициализированных переменных - 99%.
Код:
procedure POSLESDVIGA(var m:mas; k:integer);
var max,a,u,j:integer;
begin
max := m[1];
u:=1;
for i:=2 to k do
	if m[i]>max then
	begin
		max:=m[i];
		u:= 1;
	end
    else
    if m[i] = max then
		inc(u);
writeln(' Maksimum = ',max);
И раз уж дело дошло до исправлений
Код:
uses
  CRT;

const
  A = 5; B = 7;

type
  mas = array[1..B] of integer;

var
  x, y: mas;

procedure MASSIV(var m: mas; k: integer);
var
  i: integer;
begin
  for i := 1 to k do
    m[i] := random(100) - 50;
end;

procedure VVOD(var m: mas; k: integer);
var
  i: integer;
begin
  write;
  for i := 1 to k do
    write(m[i]:5);
  writeln;
end;

procedure POSLESDVIGA(var m: mas; k: integer);
var
  max, u, j, i: integer;
begin
  max := m[1];
  u := 1;
  for i := 2 to k do
    if m[i] > max then
    begin
      max := m[i];
      u := 1;
    end
    else
    if m[i] = max then
      inc(u);
  writeln(' Maksimum = ', max);
  i := k;
  j := k;
  while (j > 0) do
  begin
    m[i] := m[j];
    if m[i] = max then
      dec(j)
    else
    begin
      dec(i);
      dec(j);
    end;
  end;
  for i := 1 to u do
    m[i] := max;
  writeln
end ;

procedure REZULTAT(var m: mas; k, c: integer);
var
  i: integer;
begin
  writeln;
  writeln('Massiv ', c, ' s maksimalnimi v nachale');
  for i := 1 to k do
    write(m[i]:5);
  writeln
end;

begin
  CLRSCR;
  randomize;
  massiv(x, a);
  vvod(x, a);
  poslesdviga(x, a);
  rezultat(x, a, 1);
  writeln;
  massiv(y, b);
  vvod(y, b);
  poslesdviga(y, b);
  rezultat(y, b, 2);
  readln;
end.
Массивы лучше передавать с var (меньше памяти требуется).
Все переменные объявлять в самих процедурах.
Удалять неиспользуемые переменные.

УПД
Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
не смущает?
Смущает Моя опечатка
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.04.2012 в 00:19.
BDA вне форума Ответить с цитированием
Старый 11.04.2012, 00:12   #5
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

эх едрить колотить
Цитата:
но часто прога вылетает с ошибкой думаю дело во втором массиве,
Ясен перец
Цитата:
Код:
procedure POSLESDVIGA(var m:mas; k:integer);
var max,a,u,j:integer;
begin
max := m[i];
не смущает?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 11.04.2012, 00:35   #6
rootkot
 
Регистрация: 10.04.2012
Сообщений: 4
Хорошо

Большое спасибо за помощь, прога заработала
rootkot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск максимального по модулю числа в массиве ( Assembler ) Forversc Помощь студентам 3 30.01.2012 15:05
Циклический сдвиг строк в многомерном массиве. Corvette Общие вопросы C/C++ 12 29.08.2011 22:05
Поиск максимального элемента в массиве Alexus999 Помощь студентам 8 08.06.2009 19:47
TASM - нахождения максимального числа из трех положительных целых чисел и умножения максимального числа iggor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.05.2009 20:16
Циклический сдвиг столбцов в массиве С++ Помогите! Ладушка Общие вопросы C/C++ 10 01.05.2008 23:17