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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2009, 22:47   #1
Amenus
Пользователь
 
Регистрация: 26.01.2009
Сообщений: 22
По умолчанию Однонаправленные списки в turbo pascal.

Прошу помощи.
чрез дней 10 нужно сдавать курсовую,не хочу покупать,хочу разобраться сам.Чтобы польза была.

1)Дана матрица целых чисел. Известно, что матрица содержит только два одинаковых элемента. Найти и напечатать значения их индексов.

2)Удалить из линейного списка отрицательные элементы, расположенные после первого элемента списка с положительным значением.

списки однонаправленные.
Прошу вас помочь с этими двумя задачами или дать хотя бы какой-нибудь пример.Ссылки на понятную литературу на эту тему очень приветствуются)

Заранее спасибо)))))
Amenus вне форума Ответить с цитированием
Старый 10.06.2009, 11:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) берём очередной элемент и проверяем на совпадение все элементы от текущей позиции до конца матрицы.
Если не нашли - берём следующий и повторяем цикл.
Если нашли - выводим индексы (того, который сверяли и того, который нашли) и прерываем цикл.

2) для начала научитесь описывать/создавать/добавлять элементы в линейный список. Выводить список элементов. (примеров тут на форуме было более чем достаточно!).
потом берёте процедуру вывода элементов, копируете цикл и переделываете под проверку и удаление отрицательных элементов.
Трюк первый. Заводите призначек PoraNachatUdalenie -
в начале (перед циклом делаем его False
дальше в цикле:
Код:
if Not PoraNachatUdalenie then
  begin
     if число положительно then PoraNachatUdalenie := True
  end
else
   {уже было первое положительно число, все отрицательные удаляем} 
  if число<0 then Удаление;
трюк 2.
удаление из однонаправленного списка - это просто запоминаете ссылку на текущий элемент.
у предыдущего элемента списка изменяете ссылку на следующий после удаляемого.
Очищаете память, выделенную под удаляемый элемент (то, что мы запомнили).
всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.06.2009, 13:08   #3
Amenus
Пользователь
 
Регистрация: 26.01.2009
Сообщений: 22
По умолчанию

Огромное спасибо!)
Буду обучаться)
Amenus вне форума Ответить с цитированием
Старый 10.06.2009, 14:20   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на здоровье.
Напишите код, если возникнут вопросы - Welcome!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2009, 13:24   #5
Amenus
Пользователь
 
Регистрация: 26.01.2009
Сообщений: 22
По умолчанию

для первой задачи код получается таким:
Код:
uses crt;

const
  n=2;
  m=3;

label lab1,lab2;

var
  a:array[1..n,1..m] of integer;
  x1,y1,x2,y2,d:integer;

begin
clrscr;
for y1:=1 to n do
  for x1:=1 to m do begin
    writeln('a[',y1,',',x1,']=');
    readln(a[y1,x1]);
    end;

for y1:=1 to n do begin
  for x1:=1 to m do
    write(a[y1,x1]:3);
    writeln;
    end;

for y1:=1 to n do
  for x1:=1 to m do begin
    d:=1;
    for y2:=1 to n do
      for x2:=1 to m do
        if (a[y1,x1]=a[y2,x2])and(not((y1=y2)and(x1=x2))) then inc(d);
    if d>=3 then begin writeln('bolse chem 2'); readln; halt; end;
    end;

for y1:=1 to n do
  for x1:=1 to m do
    for y2:=1 to n do
      for x2:=1 to m do
        if (a[y1,x1]=a[y2,x2])and(not((y1=y2)and(x1=x2))) then goto lab1;

if true then begin writeln('no same'); goto lab2; end;
lab1:
writeln('y1=',y1,' x1=',x1,' y2=',y2,' x2=',x2);
lab2:
readln;
end.

теперь вопрос)
Код:
uses crt;


label lab1,lab2;

var
  n,m:integer;
  a:array[1..n,1..m] of integer;
  x1,y1,x2,y2,d:integer;

begin
clrscr;
     writeln('vvedite chislo stolbcov');
     readln(n);
     writeln('vvedite chislo strok');
     readln(m);
for y1:=1 to n do
  for x1:=1 to m do begin
    writeln('a[',y1,',',x1,']=');
    readln(a[y1,x1]);
    end;

for y1:=1 to n do begin
  for x1:=1 to m do
    write(a[y1,x1]:3);
    writeln;
    end;

for y1:=1 to n do
  for x1:=1 to m do begin
    d:=1;
    for y2:=1 to n do
      for x2:=1 to m do
        if (a[y1,x1]=a[y2,x2])and(not((y1=y2)and(x1=x2))) then inc(d);
    if d>=3 then begin writeln('bolse chem 2'); readln; halt; end;
    end;

for y1:=1 to n do
  for x1:=1 to m do
    for y2:=1 to n do
      for x2:=1 to m do
        if (a[y1,x1]=a[y2,x2])and(not((y1=y2)and(x1=x2))) then goto lab1;

if true then begin writeln('no same'); goto lab2; end;
lab1:
writeln('y1=',y1,' x1=',x1,' y2=',y2,' x2=',x2);
lab2:
readln;
end.
Что же она работать-то не хочет?)
Amenus вне форума Ответить с цитированием
Старый 17.06.2009, 13:26   #6
Amenus
Пользователь
 
Регистрация: 26.01.2009
Сообщений: 22
По умолчанию

Вопрос отпал)
ответ:массив уже в VAR должен быть прописан полностью)
Amenus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленные списки в си Марсель059 C++ Builder 18 27.11.2009 13:16
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
Pascal Множества, стек, списки, очередь. RrR5 Помощь студентам 4 26.01.2009 15:00
Однонаправленные списки, стеки и очереди palich Паскаль, Turbo Pascal, PascalABC.NET 2 16.01.2009 09:28