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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2012, 22:08   #1
jekie182
 
Аватар для jekie182
 
Регистрация: 28.02.2012
Сообщений: 6
По умолчанию нужно помочь)список двузвязний...

На складе ежедневно в текстовый файл дописывалась информация о поступлении товаров. Каждая строка файла содержит название товара, количество штук, которые разделены пробелами. Данные в файл заносились в течение месяца. Вывести информацию о поступление товаров за месяц за ростом количества, а при равном количестве - вывести названия товаров по алфавиту.
вот я зделал і вроде работает:
Код:
program dvspisok;
uses crt;
Type
str=string[20];   
ptr=^element;     
element=record    
dani:str;  
kilk:integer;  
next,prev:ptr;                         
end;
var f:text;
head:ptr;
name:string; 

Procedure init_file(var f:text);{stvorennia tekstovogo faila}
var s:string;
begin
         rewrite(f);
         writeln('vvodum nazvu mix yakumu probil v end:#');
         readln(s);
         while s<>'#' do
         begin
         writeln(f,s);
         readln(s);
         end;
         close(f);
end;


Procedure Druk_file(var f:text);{vuvodum tekctovyi fail}
var s:string;
begin
         reset(f);
         while not(eof(f)) do
         begin
                  readln(f, s);
                  writeln(s);
         end;
         close(f);
end;

{dodaem nazvu}  
Procedure AddElemS(var current:ptr; slovo:str);
var X:ptr;
begin
         New(X);
         X^.dani:= slovo;
         X^.kilk:=1;
         X^.next := current^.next; 
         X^.prev := current;
         current^.next^.prev := X; 
         current^.next := X;
end;

procedure DelElem(var current : ptr); {vadal zi spusky}
var X:ptr;
begin
         X := current;
         current^.prev^.next:=current^.next;
         current^.next^.prev:=current^.prev;
         current := current^.next;
         Dispose(X);
end;

Procedure Perestanovka(var current:ptr);{perestanovka susidiv}
var k : integer;slovo : str;
begin
         
         slovo := current^.dani;
         k := current^.kilk;
         current^.dani:=current^.prev^.dani;
         current^.kilk:=current^.prev^.kilk;
         current^.prev^.dani:=slovo;
         current^.prev^.kilk:=k;
         current:=current^.prev;
end;

Procedure FindElem(var head:ptr; slovo:str); {wykaem misce y kilci}
var current:ptr;
begin
current:=head^.next;
while
(current<>head) and (current^.dani<>slovo) do
current:=current^.next;
if current^.dani=slovo then
current^.kilk:=current^.kilk + 1
else 
AddElemS(head, slovo);
end;

Procedure Write_file(var f:text; var head:ptr); {stvorennia faila}
Var s, slovo :string; i, j:byte;
begin
reset(f);
while not(eof(f)) do
begin
readln(f,s);
slovo:='';
         for i:=1 to length(s) do{вибірка слів із рядка}
         begin
         if s[i]<>' 'then slovo:=slovo+s[i]
                  else
                  if i< length(s) then
                           if s[i+1]<>' ' then
                                   begin
                                   FindElem(head, slovo);
                                   slovo:='';
                                   end;
         end;
         if (i= length(s)) and (slovo<>'') then
         FindElem(head, slovo);
         end;
         close(f);
end;

Procedure Vivod_Spisok(head:ptr);{vuvod nazv}
var current:ptr;
begin
 current:=head^.next;
         writeln('nazva':25,'kilk':10);
         while current<>head do
                  begin
                  writeln(current^.dani:25, current^.kilk:10);
current:=current^.next;
end;
end;

Procedure SortVstavka(var head:ptr); {sortuem slova}
var X, current:ptr;
begin
X:=head^.next^.next;
while X<>head do
begin
current := X;
while (current^.kilk > current^.prev^.kilk)
 and (current^.prev<>head) do
Perestanovka(current);
if current^.kilk = current^.prev^.kilk then
while (current^.kilk = current^.prev^.kilk) and
(current^.dani < current^.prev^.dani) do
Perestanovka(current);
X:=X^.next;
end;
end;

Procedure Dr_sp(var head:ptr);{naw spusok}
var X:ptr;
Begin
writeln('nazva':25, 'kilk':10);
X:=head^.next;
while (X<>head) do      
begin
writeln(x^.dani:25,x^.kilk:5);
writeln(X^.dani:25, X^.kilk:5);
DelElem(X);
end;
end;

BEGIN
clrscr;
New(head);
head^.dani:= '';
head^.kilk:=0;
head^.next:= head;
head^.prev:= head;
writeln('nazva faila');
readln(name);
assign(f,name);
init_file(f);
writeln('na ekran');
Druk_file(f);
readln;
Write_file(f, head);
writeln('duvumos nazvu');
Vivod_Spisok(head);
readln;
SortVstavka(head);
writeln('naw spusok');
Dr_sp(head);
END.
работает, но я пропустил (
там нужно самому вводить количество) и по ней сортировать а я считал количество за повторениями названий (
сейчас пробую исправить но ничего не выходит (


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

Последний раз редактировалось Serge_Bliznykov; 18.03.2012 в 14:16.
jekie182 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно помочь с Excel Sanya_ads Microsoft Office Excel 1 13.11.2011 16:40
Очень нужно помочь Sabin4ik PHP 0 20.02.2011 23:48
Нужно помочь boomeer Фриланс 5 04.11.2010 02:13