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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 15:36   #1
SoldierOfFortune
 
Регистрация: 23.10.2011
Сообщений: 8
По умолчанию Массивы

Условие: Дан двумерный массив. В каждой строке все его положительные элементы переписать (сохраняя порядок) в начало строки, а отрицательные элементы - в конец массива. Дополнительный массив не использовать.

Подскажите, что у меня не так:

Код:
program lab_4_16;
const
	m = 10;
	n = 10;
var
	matrix : array [1..m, 1..n] of integer;
	
	i, j, k : integer;
	t : integer;
	
begin
    cls();

	{ Заполняем массив случайными значениями }
	for i := m downto 1 do
	begin
		for j := n downto 1 do
		begin
			matrix[i, j] := random(10);
			
			if random(2) = 1 then
				matrix[i, j] := matrix[i, j] * (-1);
		end;
	end;
	
	writeln('Исходный массив:');
	
	{ Печатаем исходный массив }
	for i := 1 to m do
	begin
		for j := 1 to n do
		begin
			write(matrix[i, j] : 2, ' ');
			inc(j);
		end;
		writeln();
		inc(i);
	end;
	
	{ Выполняем преобразование массива согласно с заданием }
	{ Выполняем проход по строкам }
	for i := 1 to m do
	begin
		{ Выполняем проход по строке }
		for j := 1 to (n - 1) do
		begin
			{ Если очередной элемент строки меньше 0 }
			if matrix[i, j] < 0 then
			begin
				{ Запоминаем значение }
				t := matrix[i, j];
				
				{ Сдвигаем все элементы начиная с текущей позиции }
				for k := j to (n - 1) do
				begin
					matrix[i, k] := matrix[i, k + 1];
					inc(k);
				end;
				
				{ Вставляем отрицательный элемент в конце строки }
				matrix[i, n] := t;
			end;
			int(j);
		end;
		inc(i);
	end;
	
	writeln();
	writeln('Обработанный массив:');
	
	{ Печатаем обработанный массив }
	for i := 1 to m do
	begin
		for j := 1 to n do
		begin
			write(matrix[i, j] : 2, ' ');
			inc(j);
		end;
		writeln();
		inc(i);
	end;
end.
SoldierOfFortune вне форума Ответить с цитированием
Старый 03.10.2012, 17:18   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

1) Заполнять массив можно короче
Код:
matrix[i, j] := random(19)-9;
2) Печать массива можно объеденить с заполнением.
3) Нельзя инкреминировать счётчик ( inc(i); inc(j); ) внутри циклов for !!!
4) После циклического сдвига массива дальше сразу идти нельзя, т.к есть вероятность, что там снова отрицательное число. ИМХО, WHILE/REPEAT лучше будет
Код:
	{ Выполняем преобразование массива согласно с заданием }
	{ Выполняем проход по строкам }
	for i := 1 to m do
	begin
		{ Выполняем проход по строке }
		j := 1;
		nnnnnnn := n;
		while j <= nnnnnnn do
		begin
			{ Если очередной элемент строки меньше 0 }
			if matrix[i, j] < 0 then
			begin
				{ Запоминаем значение }
				t := matrix[i, j];
				
				{ Сдвигаем все элементы начиная с текущей позиции }
				for k := j to (n - 1) do
				begin
					matrix[i, k] := matrix[i, k + 1];
					//inc(k);
				end;
				
				{ Вставляем отрицательный элемент в конце строки }
				matrix[i, n] := t;
				dec(nnnnnnn);
			end
			else inc(j);
		end;
		//inc(i);
	end;

Последний раз редактировалось eoln; 03.10.2012 в 17:44.
eoln вне форума Ответить с цитированием
Старый 03.10.2012, 18:13   #3
SoldierOfFortune
 
Регистрация: 23.10.2011
Сообщений: 8
По умолчанию

Итого это выглядит так:

Код:
program lab_4_16;
const
	m = 10;
	n = 10;
var
	matrix : array [1..m, 1..n] of integer;
	
	i, j, k, p : integer;
	t : integer;
	
begin
    cls();

	writeln('Исходный массив:');
	
	{ Заполняем массив случайными значениями и печатаем его }
	for i := 1 to m do
	begin
		for j := 1 to n do
		begin
			matrix[i, j] := random(19) - 9;
			write(matrix[i, j] : 2, ' ');
		end;
		writeln();
	end;	
	
	{ Выполняем преобразование массива согласно с заданием }
	{ Выполняем проход по строкам }
	for i := 1 to m do
	begin
		j := 1;
		p := n;
		
		{ Выполняем проход по строке }
		while j <= p do
		begin
			{ Если очередной элемент строки меньше 0 }
			if matrix[i, j] < 0 then
			begin
				{ Запоминаем значение }
				t := matrix[i, j];
				
				{ Сдвигаем все элементы начиная с текущей позиции }
				for k := j to (n - 1) do
					matrix[i, k] := matrix[i, k + 1];
				
				{ Вставляем отрицательный элемент в конце строки }
				matrix[i, n] := t;
				
				dec(p);
			end
			else
				inc(j);
		end;
	end;
	
	writeln();
	writeln('Обработанный массив:');
	
	{ Печатаем обработанный массив }
	for i := 1 to m do
	begin
		for j := 1 to n do
			write(matrix[i, j] : 2, ' ');
		writeln();
	end;
end.

Может еще кому-нибудь пригодится

Последний раз редактировалось SoldierOfFortune; 03.10.2012 в 18:58.
SoldierOfFortune вне форума Ответить с цитированием
Старый 03.10.2012, 18:37   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

SoldierOfFortune, поправь свой код немного. Должно быть
Код:
while j <= p do
иначе порядок немного путается. Я вначале строгое равенство написал, но потом поправил на нестрогое.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
указатели на массивы и массивы указателей blacktener Общие вопросы C/C++ 16 13.06.2011 20:45
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12