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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2012, 23:32   #1
kalosha-stepa
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 25
Вопрос формирование линейного списка целых чисел, элементы которого считываются из текстового файла

Составить программу формирования линейного списка целых чисел, элементы которого считываются из текстового файла (элементы в файле записаны в строку). Написать функцию, определяющую, сколько элементов сформированного списка больше первого его элемента.


Код:
program k;

type
  Chain = ^elem;
  Elem = record
    data: integer;
    next: chain;
  end;

var
  first: chain;
  i: integer;

procedure form(var first: chain);
var
  f:text;temp: chain;
begin
  Assign(f, '5.txt');
  Reset(f);
 
  readln(f, temp^.data);
  
  temp^.next := first;
  first := temp;
  Close(f);
end;

procedure print(first: chain);
var
  temp: chain;
begin
  temp := first;
  while temp <> nil do
  begin
    write(temp^.data, ' ');
    temp := temp^.next;
  end;
end;
Плюсом функцию дописать




________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 15.10.2012 в 06:51.
kalosha-stepa вне форума Ответить с цитированием
Старый 15.10.2012, 06:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сразу - чтение из файла и заполнение списка - НЕПРАВИЛЬНОЕ.
Вы забываете, что нужно для каждого нового элемента выделять память через New(указатель)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2012, 08:50   #3
kalosha-stepa
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 25
По умолчанию

Дак вот я и прошу мне помочь!
kalosha-stepa вне форума Ответить с цитированием
Старый 15.10.2012, 09:39   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. разбирайтесь:
Код:
program k;

type
  Chain = ^elem;
  Elem = record
    data: integer;
    next: chain;
  end;

procedure AddToEndList(iValue : integer; var start : Chain);
var
 One, tmp : Chain;
begin
  New(One);{ выделяем память под очередной элемент}
  One^.data := iValue;
  One^.next := nil; {т.к добавляем в конец,то указатель на след.равен nil}

  {если "голова" списка start не равна nil, значит список уже не пуст}
  if start <> nil then
  begin
     tmp:=start;
     {перематываем список,что бы list стал последним элементом}
     while tmp^.next <> nil do
        tmp := tmp^.next;
     tmp^.next:= One{устанавливаем указатель на след.элемент}
  end
  else {если список был пуст, тогда делаем One первым элементом}
     start:= One; 
end;

procedure ReadFileToList(const FName : string; var first: chain);
var
  f : text;
  d : Integer;
begin
  Assign(f, FName);
  Reset(f);
 
  while (not eof(f)) and ( not eoln(f) ) do 
  begin
    read(f, d);
    AddToEndList( d, first);
  end;
  Close(f);
end;

procedure print(first: chain);
var
  temp: chain;
begin
  temp := first;
  WriteLn('List contains of: ');
  while temp <> nil do
  begin
    write(temp^.data, ' ');
    temp := temp^.next;
  end;
  WriteLn;
end;

function CountElementGreaterThenFirst(first: chain) : integer;
var
  cnt, firstValue : integer;
  temp: chain;
begin
  if first = nil then
     CountElementGreaterThenFirst := 0
  else begin
    temp := first;
    firstValue := temp^.data;
    cnt := 0;
    temp := temp^.next; {перейдём на второй элемент списка}

    while temp <> nil do
    begin
      if temp^.data > firstValue then Inc(cnt);
      temp := temp^.next;
    end;

    CountElementGreaterThenFirst := cnt

  end;
end;

var
  first: chain;
  i: integer;

begin
  first := nil;
  ReadFileToList('5.txt', first);
  print( first );

  WriteLn('Elementov greater then first: ',
              CountElementGreaterThenFirst ( first ));

  Readln
end.
файл 5.txt должен быть текстовым и содержать целые числа в одной строке (разделённые пробелами, например).
вот, как может выглядеть такой файл:
Цитата:
Код:
7 2 4 5 9 1 2 16 8


p.s. при добавлении элементов в список все элементы перебираются, чтобы найти последний (добавляем в конец списка).
Разумеется, это не очень красиво и эффективно. Я бы рекомендовал вам добавить ЕЩЁ одну переменную, указатель, которая всегда будет показывать на конечный элемент списка и добавление производить через неё.
Переделать код процедуры добавления оставляю Вам в качестве домашнего задания, если не справитесь, пишите, подскажу...

Последний раз редактировалось Serge_Bliznykov; 15.10.2012 в 09:44.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2012, 09:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure form(var first: chain);
var
  f:text;last,temp: chain;
begin
  Assign(f, '5.txt');
  Reset(f);last:=first;
  while not eof(f) do begin
   new(temp);
   readln(f, temp^.data);
   temp^.next := last;
   last:= temp;
  end;
  Close(f);
end;
Так понятнее?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2012, 09:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Stilet, не-а.. А first кто будет изменять? (если first -= nil - то теряете все добавленные элементы)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2012, 10:56   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
procedure form(var first: chain);
var
  f:text;last,temp: chain;
begin
  Assign(f, '5.txt');
  Reset(f);last:=first;
  while not eof(f) do begin
   new(temp);
   readln(f, temp^.data);
   temp^.next := last;
   last:= temp;
  end;
  Close(f);
end;
Так понятнее?
что-то сильно на стек смахивает. Хоть это тоже линейный список, но, как мне кажется, в задании подразумевалась очередь.

Код:
procedure form(var first: chain);
var
  f:text; head, last, temp: chain;
begin
  Assign(f, '5.txt');
  Reset(f);head := nil; last := nil;
  
while not eof(f) do begin
   new(temp);
   if head = nil then head := temp;
   readln(f, temp^.data);
   If last <> nil then last^.next := temp;
   last:= temp;
  end;
  Close(f);
  first := head;
end;
з.ы. я бы функцией оформил
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 15.10.2012, 11:18   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А first кто будет изменять?
Согласен, провтыкал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2012, 18:35   #9
kalosha-stepa
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 25
По умолчанию

а для чего last и можно ли обойтись без него
kalosha-stepa вне форума Ответить с цитированием
Старый 21.10.2012, 19:14   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

last это указатель на последний элемент. теоретически можно и без него.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка линейного списка с последовательным хранением, элементами которого являются окружности (C++) rutatarin Помощь студентам 1 20.05.2011 16:50
Создать двоичный файл, записать n целых чисел. Из файла создать массив, элементы числа-палиндромы (на C) Simak63 Помощь студентам 0 30.03.2011 21:06
В матрице nxm (n, m ≥ 10) целых чисел элементы нечетных строк упорядочить по возрастанию, а элементы четн serafimGroup Помощь студентам 1 01.12.2010 16:45
Создать матрицу A[1..N,1..N] из целых чисел. Сформировать одномерный массив, элементы которого - максимал spezzA Помощь студентам 2 24.11.2010 19:29