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

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

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

 
 Ответить  Открыть новую тему 
> Списки, приведение подобных
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


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


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


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

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

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


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

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


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


Гость






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

На самом деле вся программа должна уместиться примерно в 20 строк, ты же здесь делаешь ОЧЕНЬ много лишнего и нецелесообразного. Если хочешь - приведи пример входного файла, я покажу тебе, как сделать то же самое гораздо проще...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





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

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


в файле:

1 4
4 6
3 4


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

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


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


Гость






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


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

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

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


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


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

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

 



- Текстовая версия 21.04.2025 5:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name