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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2012, 22:04   #1
Freedo
Пользователь
 
Регистрация: 16.10.2012
Сообщений: 27
По умолчанию Сформировать вектор x так, чтобы в нем чередовались положительные и отрицательные элементы из матрицы n

Здравствуйте, помогите пожалуйста дописать программу.

Задание.
Дана квадратная матрица порядка n(n=10).Сформировать вектор x так, чтобы в нем чередовались положительные и отрицательные элементы из матрицы n. Первый элемент отрицательный.

Примечание.
Разбить задачу на подзадачи, таким образом, чтобы решение каждой подзадачи описывалось процедурой, а основная программа состояла бы из последовательности вызова процедур.

Вот что набрал. Turbo Pascal

Код:
Program Lab_5;
uses
   crt;
const
   n=10;
var
   a: array[1..n, 1..n] of integer;
   i,j: integer;
procedure matrix;
   begin
      randomize;
      for i:=1 to n do
         for j:=1 to n do
            a[i,j]:=random(19)-9;
   end;
procedure write_matrix;
   begin
      for i:=1 to n do
         begin
            for j:=1 to n do
            write(a[i,j]:2,' ');
            writeln;
            writeln;
         end;
   end;
begin
   clrscr;
   matrix;
   write_matrix;
   readln;
end.
Собственно на данный момент имеются две процедуры, одна из них заполняет массив произвольными числами от -9 до 9, другая выводит эту матрицу на экран. Осталось сформировать вектор который будет чередовать положительные и отрицательные элементы, в этом и прошу помощи.
Freedo вне форума Ответить с цитированием
Старый 08.11.2012, 22:16   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Как вариант (без долгих раздумий): завести 2 массива, в один выписать положительные, в другой отрицательные, потом слить в один.


Вариант 2. Отсортировать исходный по возрастанию, а потом в цикле запихнуть элементы как надо в массив.

Цикл примерно такой:

Код:
k:=1;
for i:=1 to n div 2 do 
  for j:=1 to n do begin
    b[k]:=a[i,j];
    inc(k);
    b[k]:=a[n+1-i,n+1-j];
    inc(k);
  end;
Но это только для четного n. Как то так...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 09.11.2012 в 06:54.
Sciv вне форума Ответить с цитированием
Старый 12.11.2012, 22:18   #3
Freedo
Пользователь
 
Регистрация: 16.10.2012
Сообщений: 27
По умолчанию

Sciv, спасибо. А более подробных ответов ни у кого нет? Очень нужно.

Последний раз редактировалось Freedo; 13.11.2012 в 10:33.
Freedo вне форума Ответить с цитированием
Старый 13.11.2012, 10:34   #4
NinaSSS
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 34
По умолчанию

попробуйте так
Код:
program massiv;
uses crt;

var a:array[1..10,1..10] of integer; b,c,d:array[1..50] of integer;
i,j,k,n,m,x,y,t :integer;
 begin  clrscr;
 randomize;
 readln(n,m);
 for i:=1 to n do begin
 for j:=1 to m do begin
 a[i,j]:=random(10)-5;
 end; end;
  for i:=1 to n do begin
 for j:=1 to m do begin
write( a[i,j]:3); end; writeln; end;
k:=0; x:=0;
 for j:=1 to m do begin
 for i:=1 to n  do begin
  if a[i,j]> 0 then begin k:=k+1; b[k]:=a[i,j]; end;
  if a[i,j]< 0 then begin x:=x+1; c[x]:=a[i,j]; end; end;end; writeln;
    writeln('massiv pol');
    for i:=1 to k do begin
    write (b[i]:3);end;
     writeln('massiv otr');
    for i:=1 to x do begin
    write (c[i]:3);end;
    t:=k+x;  writeln ('t=',t);
    for i:=1 to t do begin
    if i mod 2 =0 then begin d[i]:=b[i div 2 ]; end;
    if odd(i) then  begin d[i]:=c[i div 2+1 ]; end; end;
         writeln('massiv rezul');
    for i:=1 to t do begin
    if d[i]<> 0 then
    write (d[i]:3);end;
  end.
NinaSSS вне форума Ответить с цитированием
Старый 13.11.2012, 12:40   #5
Freedo
Пользователь
 
Регистрация: 16.10.2012
Сообщений: 27
По умолчанию

Цитата:
Сообщение от NinaSSS Посмотреть сообщение
попробуйте так
NinaSSS, Спасибо Вам огромное.

Немного переделал и теперь работает как мне надо.

Почти как надо, после того как чередование элементов закончилось и остались какие либо элементы, то они выводятся в конце массива, но не полностью, хвост почему-то обрубается.

Последний раз редактировалось Stilet; 13.11.2012 в 17:59.
Freedo вне форума Ответить с цитированием
Старый 13.11.2012, 15:01   #6
NinaSSS
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 34
По умолчанию

а вы попробуйте ничего не переделывать и все получится
NinaSSS вне форума Ответить с цитированием
Старый 13.11.2012, 15:08   #7
Freedo
Пользователь
 
Регистрация: 16.10.2012
Сообщений: 27
По умолчанию

Даже в том коде что Вы привели есть такой косяк, но на таком диапазоне его трудно поймать (но можно). Но если уже изменить b,c,d:array[1..50] of integer; на b,c,d:array[1..100] of integer; и задать m и n равными 10, то он станет ещё отчётливее виден.



В коде ничего не менялось, вот видите, в финальном массиве должно выводиться 43 символа, а выводится только 37. Числа -5 -1 -5 -3 -4 -3 не выводятся, хотя должны, в отрицательном массиве они есть.

Последний раз редактировалось Freedo; 13.11.2012 в 15:16.
Freedo вне форума Ответить с цитированием
Старый 13.11.2012, 15:59   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Freedo, я не проверял код, просто хочу уточнить, понимаете ли Вы, что задача в общем случае решения НЕ ИМЕЕТ! Решение будет только в том (частном) случае, когда положительных и отрицательных элементов строго поровну.
возьмём простой пример. матрица 2X2:
-5 -7
-4 11
как будет выглядеть сформированный вектор X ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2012, 16:24   #9
NinaSSS
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 34
По умолчанию

за счет того что не одинаковое количество пол-х и отр-х элементов идет сбой в конце
NinaSSS вне форума Ответить с цитированием
Старый 13.11.2012, 17:10   #10
Freedo
Пользователь
 
Регистрация: 16.10.2012
Сообщений: 27
По умолчанию

Допустим у нас два массива.

1 2 3 4 5

-1 -2 -3 -4 -5 -6 -7 -8 -9

После их объединения должно получиться

-1 1 -2 2 -3 3 -4 4 -5 5 -6 -7 -8 -9

Пока элементов поровну, они чередуются, когда положительные элементы заканчиваются, отрицательные просто выводятся по порядку.

Но в данном случае мы получаем вот такой массив.

-1 1 -2 2 -3 3 -4 4 -5 5 -6 -7

Тоесть половина этого остатка обрубается. Или так и должно быть?

Вобщем вот вопросы: можно ли сделать так чтобы все элементы исходного массива (кроме нулей) появлялись в создаваемом векторе (сначала чередуются, потом выводится остаток)? Или может можно вообще отрубить этот хвост и оставить только чередующиеся элементы?

Спасибо что отвечаете, я Вас наверное уже достал.

Последний раз редактировалось Freedo; 13.11.2012 в 17:31.
Freedo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать одномерный массив, элементами которого являются все положительные элементы исходного массива... sev48fire Помощь студентам 11 07.06.2012 11:06
С генерировать одновременно как отрицательные так и положительные числа в массиве. Leshii Паскаль, Turbo Pascal, PascalABC.NET 0 13.11.2011 22:31
Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W leha_demi Помощь студентам 2 24.09.2011 18:12
Все отрицательные элементы массива А заменить на сумму, а положительные на полусумму предшествующих Lada05 Помощь студентам 1 27.10.2010 15:44
Сформировать новый массив,содержащий отрицательные элементы - Задача по PASCAl. Waia Помощь студентам 2 17.12.2008 18:27