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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2011, 20:24   #1
Nastya1221
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 11
По умолчанию Обнуление элементов таблицы(Free Pascal)

Написать подпрограмму,которая в таблице обнуляет элементы,стоящие в строках или столбцах,содержащих нули.

Я написала следующее:

Begin
For i:=1 to n do
For j:=1 to m do
Begin
If x^[i]^[j]=0 then

For k:=1 to n do {зануление по столбцам}
x^[k]^[j]:=0;
For l:=1 to m do {зануление по строчкам}
x^[i]^[l]:=0;
end;
end;

Проблема в том,что зануляется полностью вся таблица, мне посоветовали ввести массив,который сначала будет обнулять строчки,содержащие нули,а уже потом столбцы,содержащие нули,а как
это сделать я не понимаю.
Nastya1221 вне форума Ответить с цитированием
Старый 28.12.2011, 23:06   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да ) Тебе нужно добавить массив, в котором запомнить все положения нулей. А потом обнулять.
Son Of Pain вне форума Ответить с цитированием
Старый 28.12.2011, 23:08   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

p.s. а покажите, пожалуйста, каким образом у Вас в программе определена (описана в секции var) переменная-массив X. Это что, указатель?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.12.2011, 05:46   #4
Nastya1221
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 11
По умолчанию

p.s. а покажите, пожалуйста, каким образом у Вас в программе определена (описана в секции var) переменная-массив X. Это что, указатель?..[/QUOTE]

Type
Telem=single;
Pline=^Tline;
Tline=array[1..1] of Telem;
Ptable=^Ttable;
Ttable=array[1..1] of Pline;

Function NULI(x:Ptable; Var m,n:integer):boolean;
Var S:Telem;
i,j,k,l:integer;
Nastya1221 вне форума Ответить с цитированием
Старый 29.12.2011, 06:04   #5
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Код:
If x^[i]^[j]=0 then begin

For k:=1 to n do {зануление по столбцам}
x^[k]^[j]:=0;
For l:=1 to m do {зануление по строчкам}
x^[i]^[l]:=0;
end;
end;
Вот где Ваша проблема - обнуление по строкам производится всегда вне зависимости от условия, надо добавить begin..end (выделено красным)

UPD: Да, забыл еще об одном - т.к. Вы строку и столбец обнуляете целиком, получается так, что дальше программа тоже будет считать что во всей строке нули и затрет все... Значит нужно сделать так:

Ввести матрицу из элементов boolean (например назовем ее T)
Если в исходной матрице нашли ноль, то в этой же позиции дополнительной матрицы (T) записываем true

После основного цикла повторяем его и смотрим, если элемент матрицы T = true, то обнуляем строку и столбец у исходной (как у вас уже сделано в принципе)

И еще...
Код:
Ttable=array[1..1] of Pline;
Такое разве будет нормально работать для например матрицы 3x3? И вообще - для чего извращаться с указателями?
благодарность - сюда (не забываем писать от кого)

Последний раз редактировалось Zer0; 29.12.2011 в 06:37.
Zer0 вне форума Ответить с цитированием
Старый 29.12.2011, 06:29   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Вот где Ваша проблема - обнуление по строкам производится всегда вне зависимости от условия, надо добавить begin..end (выделено красным)
Да согласен! Это не доработка! Но её исправление не решит проблемы полного обнуления таблицы!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 29.12.2011, 07:14   #7
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

и так хочу показать своё решение этой проблемы!
и так нам надо обнулить столбцы и строки в которых есть нулевые элементы!
Возможные способы решения:
Это создание доп. матрицы для поиска 0 элементов, что бы при нахождении обнулять в исходной строки и столбцы (с) Serge_Bliznykov
Ввести матрицу из элементов boolean (например назовем ее T)
Если в исходной матрице нашли ноль, то в этой же позиции дополнительной матрицы (T) записываем true (с) Zer0


И так, что предлагаю я
Это использование множеств исключения без использования доп матриц
смотрим код
Код:
program dd;
uses crt;
var
    mas: array[1..5, 1..5] of integer;
    i, j, k, l: integer;
    iski, iskj: set of byte;
begin
    clrscr;
    Writeln ('Enter array');
    for i := 1 to 5 do
         for j := 1 to 5 do
             Read(mas[i,j]);
    Readln;
    for i := 1 to 5 do
    begin
        for j := 1 to 5 do
        begin
            if mas[i,j] = 0 then
                if (not(i in iski)) and (not(j in iskj)) then
                begin
                    for k := 1 to 5 do
                    begin
                        mas[k, j] := 0;
                        mas[i, k] := 0;
                    end;
                    iski := iski + [i];
                    iskj := iskj + [j];
                    break;
                end;
        end;
    end;
    for i := 1 to 5 do
    begin
         for j := 1 to 5 do
             write(mas[i,j]:4);
    Writeln;
    end;
    Readkey;
end.
да конечно я тут не работаю с указателями но сути это не меняет!
Суть моего предложения заключается в том, что бы при нахождении нулевого элемента запоминать его позицию чтобы в дальнейшем проверять
для хранения использую два множества
iski, iskj: set of byte; соответсвенно для i и j!
и так проверяем
мной введено
Код:
Enter array
1 2 0 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 0
смотрим что выдала программа
Код:
 0   0   0   0   0
 1   2   0   4   0
 1   2   0   4   0
 1   2   0   4   0
 0   0   0   0   0
Вроде работает!
по багам просьба оставлять комментарии! ну и +++
А ну конечно главный + моего способа в том, что не используются доп. массивы и т.д что экономит память!
)
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 29.12.2011, 07:37   #8
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Hacker19_90, условие
Код:
if (not(i in iski)) and (not(j in iskj)) then
неверное
Например для
Цитата:
Enter array
1 2 0 4 5
1 2 3 4 5
1 2 0 4 5
1 2 3 4 5
1 2 3 4 0
С таким условием он не обнулит третью строку

А в целом, решение хорошее
благодарность - сюда (не забываем писать от кого)

Последний раз редактировалось Zer0; 29.12.2011 в 07:39.
Zer0 вне форума Ответить с цитированием
Старый 29.12.2011, 08:41   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Zer0
Такое разве будет нормально работать для например матрицы 3x3? И вообще - для чего извращаться с указателями?
в TurboPascal нет нормальных динамических массивов.
Таким образом реализуется создание (и работа) с динамическими массивами.
и будет работать не только с матрицей 3 на 3:
Код:
   GetMem( Ptable, 3 * SizeOf(Ttable) );
   for i:=1 to 3 do GetMem( Ptable^[i], 3 * SizeOf( Tline ) );
но и с матрицей размера NxM :
Код:
   GetMem( Ptable, N * SizeOf(Ttable) );
   for i:=1 to N do GetMem( Ptable^[i], M * SizeOf( Tline ) );

другой вопрос, зачем ЭТО использует TC...
ведь задача ЯВНО учебная. и тут использование обычного статичного массива было бы, имхо, более уместным..


Hacker19_90, на мой взгляд, идея Вашего решения отличная!
Только надо учитывать, что больше, чем 255x255 у Вас матрицы обрабатываются не могут (конструктивные ограничения типа множество )
Но я бы всё же, по старинке, использовал матрицу той же размерности, что и входная. можно булевского типа (хранить признак "в данной ячейке ноль или не ноль")
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.12.2011, 09:06   #10
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

и так всем спасибо за комменты и за тестинг моего способа всем + 1
вот подумал немного изменил
Код:
program dd;
uses crt;
const
    m = 5;
    n = 4;
type
    matrix = array[1..m, 1..n] of integer;
var
    mas: matrix;
    i, j: integer;

procedure ZeroCool (var m: matrix; const rows, cols: integer);
var
    i, j, k, l: integer;
    ex_i, ex_j: set of byte;
begin
    for i := 1 to rows do
        for j := 1 to cols do
            if m[i, j] = 0 then
            begin
                ex_i := ex_i + [i];
                ex_j := ex_j + [j];
            end;
    for i := 1 to 10 do
        if (i in ex_i) then writeln (i);
    for i := 1 to rows do
        if (i in ex_i) then
            for j := 1 to cols do
                if (j in ex_j) then
                begin
                    for k := i to rows do
                        m[k,j] := 0;
                    for l := 1 to cols do
                        m[i,l] := 0;
                end;
end;

begin
    clrscr;
    Writeln ('Enter array');
    for i := 1 to m do
         for j := 1 to n do
             Read(mas[i,j]);
    Readln;
    ZeroCool (mas, m, n);
    for i := 1 to m do
    begin
         for j := 1 to n do
             write(mas[i,j]:4);
    Writeln;
    end;
    Readkey;
end.
всё бы вроде хорошо!
но есть один баг!
при вводе
Цитата:
1 0 3 4
1 2 3 4
1 0 3 4
1 2 3 4
1 2 3 0
ны выходе получил в TP получил
Цитата:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
и соответствено то что хранится в ex_i
Цитата:
1
3
4
5
6
7
откуда ? эти значения
лан во FreePascal получил следующее при том же вводе
Цитата:
0 0 0 0
1 0 3 0
0 0 0 0
0 0 0 0
0 0 0 0
и ex_i
Цитата:
1
3
4
5
6
7
вот теперь кто нить мне обьяснит в чём дело?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303

Последний раз редактировалось Hacker19_90; 29.12.2011 в 09:09.
Hacker19_90 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Turbo Pascal и Free Pascal , в чем разница? antoxann Паскаль, Turbo Pascal, PascalABC.NET 31 09.11.2011 07:52
формирование таблицы из элементов другой таблицы с удалением повторяющихся значений Selicat Microsoft Office Excel 1 20.10.2011 22:36
Free Pascal GreenDay Помощь студентам 0 03.05.2011 08:55
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
Free pascal Иллидан Свободное общение 5 17.04.2008 12:22