IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Списки, приведение подобных
It's not important
сообщение 12.04.2009 15:40
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Здравствуйте!
Требуется ввести многочлен из файла и привести в нем подобные при помощи списка, и вывести результирующий многочлен в конец файла, расположив его члены в порядке убывания степеней.


type    Spisok = ^Elem;
          Elem = record
                    koef,step:integer; 
                    next:Spisok;
                 end;
var     a,b,c: Spisok;   
      vk, vst: Integer;
          n,i: Integer;
            f: text;
procedure Vvod;
begin
   while not eof(f) do
   begin
      read(f, vk);
      read(f, vst);
   end;
end;
procedure Pr;
begin
   c:=nil;
   while (b<>nil) and (b^.step<>vst) do  b:=b^.next;
   if b<>nil then   b^.koef:=b^.koef+vk;           
       else
         begin                          
            new(c);                       
            c^.koef:=vk;                
            c^.step:=vst;                 
         end;
        if c<>nil then                   
            begin
               if (c^.step>a^.step) or (a=nil) then 
                  begin
                     c^.next:=a;
                     a:=c;
                  end
               else
                 begin                    
                    b:=a;
                    while (b^.next^.step > c^.step) and (b^.next<>nil) do b:=b^.next;
                    c^.next:=b^.next;
                    b^.next:=c;
                 end;
            end;
end;
procedure  Vivod;
begin
   append(f);
   writeln(f);   writeln(f);
   c:=a;
   while b<>nil do
     begin
        a:=b;
        if (c=nil) and (b^.koef>0) then write(f, '+');
        if a^.koef <> 0 then
          begin
            write(f,a^.koef,'x^',a^.step);
          end;
        b:=b^.next;
        dispose(a);
     end;
    close(f);
end;
BEGIN
   assign(f, 'pr_1.txt');  reset(f);
   a:=nil;
   while not eof(f) do
     begin
        b:=a;
        Vvod;
        if (vk<>0) or (vst<>0) then Pr; 

     end;
   b:=a;
   close(f);
   Vivod;
END. 



Пожалуйста, помогите разобраться с выводом в файл.
Я не могу понять почему он выводит толкьо последние данные в файле...
Благодарю за внимание.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
Lapp
сообщение 12.04.2009 16:04
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


It's not important, я понимаю, что пример - It's not important )). Но все же он сэкономил бы время жаждущим помочь.
Приведи пример входного файла, плз.
А заодно и вывод на это пример smile.gif, если нетрудно.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 13.04.2009 5:47
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(It's not important @ 12.04.2009 16:40) *
Пожалуйста, помогите разобраться с выводом в файл.
Я не могу понять почему он выводит толкьо последние данные в файле...
При чем здесь вывод в файл? Если не горит лампочка в квартире - это не обязательно выключатель, могут быть еще пробки или общий блэкаут)). В твоей программе вся логика страдает. Начать с того, что она просто не компилируется - уж не знаю, как ты получила свои результаты.. Если убрать ";", то программа скомпилируется, но откуда мне знать, что это правильно? Если запустить - вылетает по ошибке (обращение по нулевому пойнтеру).

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.04.2009 13:06
Сообщение #4


Гость






Цитата
Я не могу понять почему он выводит толкьо последние данные в файле...
А потому что Vvod так написан: он читает и перечитывает информацию из входного файла, пока не прочитает его полностью. Естественно, что сохраняется только 2 значения: vk и vst (насколько я понимаю, это - коэффициент и степень последнего из членов?), все остальные просто теряются...

На самом деле вся программа должна уместиться примерно в 20 строк, ты же здесь делаешь ОЧЕНЬ много лишнего и нецелесообразного. Если хочешь - приведи пример входного файла, я покажу тебе, как сделать то же самое гораздо проще...
 К началу страницы 
+ Ответить 
volvo
сообщение 13.04.2009 15:25
Сообщение #5


Гость






Вот решение, о котором я говорил:

type
  Spisok = ^Elem;
  Elem = record
    koef, step: integer;
    next: Spisok;
  end;

procedure append_list(var head, tail: spisok; k, st: integer);
var p: spisok;
begin
  p := head;
  while (p <> nil) and (p^.step <> st) do p := p^.next;

  if p = nil then begin
    new(p);
    with p^ do begin
      next := nil; step := st; koef := k;
    end;

    if head = nil then head := p
    else tail^.next := p;
    tail := p;

  end
  else p^.koef := p^.koef + k;
end;

var
  vk, vst: integer;
  p, head, tail: spisok;
  f: text;

begin
  assign(f, 'pr_1.txt'); reset(f);
  head := nil; tail := nil;
  while not eof(f) do begin
    readln(f, vk, vst);
    append_list(head, tail, vk, vst);
  end;
  p := head;
  close(f); append(f);
  while p <> nil do begin
    write(f, ' + ', p^.koef, 'X^', p^.step);
    p := p^.next;
  end;

  close(f);
end.
 К началу страницы 
+ Ответить 
It's not important
сообщение 15.04.2009 17:07
Сообщение #6





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


в файле:

1 4
4 6
3 4


Ожидаемый результат: 4x^6 + 4x^4

А он выводит 3x^4


пожалуйста, помогите мне разобраться. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.04.2009 17:11
Сообщение #7


Гость






Читай пост выше...
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.04.2009 2:09
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(It's not important @ 15.04.2009 18:07) *
А он выводит 3x^4
пожалуйста, помогите мне разобраться.
Второй раз нижайше прошу: пожалуйста, приведи тот вариант программы, с которым ты работаешь. Приведенный в первом посте не компилируется.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 24.07.2025 16:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"