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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Задача на списки., Хелп.
сообщение
Сообщение #1


Новичок
*

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

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


Люди помогите!!! Плз... Задача звучит так:
"ВВодится некоторая последовательность букв русского алфавита и записывается в памяти в виде линейного списка. Определить упорядочена ли последовательность по алфавиту( если нет, то упорядочить), заменить выбранную K-ую букву на Q-ю, поменять местами первую и последнюю буквы...
Люди, пожалуйста, подскажите как это делать и приведите примеры кусочков кода (полный мне не нужен, хочу сам разобраться, но для этого нужно небольшое ускорение) Пожалуйста, подскажите что и как...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

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


http://forum.pascal.net.ru/index.php?showtopic=2706


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Почитал, многое понял...
Но тогда подскажите, в чем может быть ошибка в этой процедуре:
Код

procedure open(var p:plist;var a:char);
var filex:text;
   s:string;
begin
nameoffile(s);   {задаю имя файла другой процедурой}
assign(filex,s);          
reset(filex);
while not eof(filex) do
     begin
     new(p);
     p^.next:=nil;
     readln(filex, p^.a);
     p:=p^.next;
     end;
while p^.next<>nil do
begin
write(p^.a,' ');
p:=p^.next;
end;
readkey;
end;

в результате выполнения всего этого беспредела мне выдается 6 очень странных сиволов, совсем не похожих на, например, 26 букв английского алфавита... в чем здесь ошибка ? подскажите плз smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






QDe5n1K
Код должен выглядеть вот так:
Код

procedure open(var p:plist;var a:char);
var pp: plist;
...
while not eof(filex) do
    begin
    new(pp); {берем новый элемент из "кучи"}
    pp^.next:=p; {его "следующему" значению }
    readln(filex, pp^.a); {записываем в новый элемент данные}
    p:=pp; {а теперь при следующем выделении данных будем считать "новый" элемент последним, т.е. старым... :)}
    end;
...


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


Ладно, вот еще smile.gif
Я собираюсь поменять число под номером P на число под номером Q...
Код

procedure change_p_to_q(var g:plist; var a:char);
var     l,p,q:word;
        x:char;
begin
writeln('Введите номер числа, которое вы хотите заменить');
readln(p);
writeln('Введите номер числа, на которое вы хотите поменять число под номером',p);
readln(q);
l:=0;
while l<>j do    {здесь я пытаюсь искать букву под номером q - то, на что буду менять}
    begin
       l:=l+1; g:=g^.next; x:=g^.next^.a;
    end;
l:=0;
while l<>i do     {здесь ищу ту букву, которую нужно поменять - p}
begin l:=l+1 g:=g^.next; end;
g^.a:=x;           {собственно присваиваю символьной переменной,  находящейся по этому адресу значение x, то бишь значение символа под номером q}
end;

Блин, ну что здесь не так... обьясните пожалуйста, что же я опять не так делаю?

Сообщение отредактировано: QDe5n1K -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






QDe5n1K
Если честно, я не совсем понял, что нужно найти, но вообще-то, чтобы найти элемент списка под номером X, пользуются такой конструкцией:

writeln('Введите номер числа, которое вы хотите найти'); readln(p);
while p<>0 do
 begin
   g:=g^.next; dec(p)
 end;

то есть вышеприведенный код может быть переписан вот так:

procedure change_p_to_q(var g:plist; var a:char);
var p,q:word;
 x:char;
 T: plist; {обязательно сохраняем исходное значение G }
begin
 T := g;
 writeln('Введите номер числа, которое вы хотите заменить'); readln(p);
 writeln('Введите номер числа, на которое вы хотите поменять число под номером',p); readln(q);
 while q<>0 do    {здесь я пытаюсь искать букву под номером q - то, на что буду менять}
   begin
      g:=g^.next; dec(q)
   end;
 x := g^.a; { сохраняем букву, на которую будем менять }

g := T; { восстанавливаем список }
while p<>0 do     {здесь ищу ту букву, которую нужно поменять - p}
 begin
   dec(p); g:=g^.next;
 end;

{собственно присваиваю символьной переменной, находящейся по этому адресу значение x,
то бишь значение символа под номером q}
g^.a:=x;          
end;


Опять же, все просто... ;)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

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

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


Нет, не просто ;)

while assigned(p) do
begin
write(p^.a,' ');
p:=p^.next;
end;


-при попытке все вывести на экран все буквы выводятся в боратном порядке smile.gif

И еще: как сортировать буквы из этого списка по алфавитному порядку? Я пытаюсь так:

while assigned(p^.next) do begin
pp:=p;
while assigned(p^.next) do begin
ppp:=p^.next;
if ppp^.a>pp^.a then
  begin
       tmp:=ppp^.a;
       ppp^.a:=pp^.a;
       pp^.a:=tmp;
  end;
ppp:=ppp^.next;
end;
pp:=pp^.next;
end;
{здесь я заканчиваю сортировать и пробую вывести результат}
while assigned(p^.next) do
write(p^.a,' ');

В итоге у меня все зацикливается и не реагирует ни на что smile.gif Блин, может у меня повторяется все одна и та же ошибка? Подскажите, плз!

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






QDe5n1K
Цитата
при попытке все вывести на экран все буквы выводятся в боратном порядке

Трудно что-либо сказать без полного кода (что такое assigned, допустим, понятно, а вот как именно заполняется список?)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

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

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


Вот код процедуры open

procedure view_list(p:plist; a:char);
begin
while p<>nil do
begin
write(p^.a , ' ');
p:=p^.next;
end;
end;

procedure open(var p:plist;var a:char);
var filex:text;
   s:string;
   pp:plist;
begin
firstofall;
nameoffile(s);
assign(filex,s);
reset(filex);
while not eof(filex) do
   begin
   new(pp);
   pp^.next:=p;
   read(filex, pp^.a);
   p:=pp;
   end;
pp:=p;
view_list(pp,a);
readkey;
end;

А в файл все буквы записываются как и положено, слева направо... открывал блокнотом и проверял smile.gif

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

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

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


Цитата(volvo @ 24.11.04 17:44)
{берем новый элемент из "кучи"}
    pp^.next:=p; {его "следующему" значению }
    readln(filex, pp^.a); {записываем в новый элемент данные}]

из какой кучи?))) вообще то это называеться выделением памяти под новый элемент))...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Werwolf86
А откуда, интересно, выделяется память? (Heap - это все-таки "куча")
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

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

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


Куча, куча, volvo прав ;)... и все же, что же не так в моей программе, помогите найти ошибку smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






QDe5n1K
А ошибка в том, что ты добавляешь новый элемент в начало списка, а нужно добавлять в конец...

{добавление в начало списка выглядит так:}
{пусть p - начало списка}
new(pp);
pp^.a := ...;
pp^.next := p;
p := pp;

{добавление в конец списка выглядит так:}
{пусть p - начало списка, at_end - конец списка}
new(pp);
pp^.a := ...;
pp^.next := nil;
if p = nil then p := pp else at_end^.next := pp;
at_end := pp;

Что это значит? Это значит, нужно ввести дополнительную переменную "at_end" того же типа, как и "p", которая всегда будет указывать на конец списка, и добавлять данные по приведенной выше схеме в конец списка... :yes:

(Примечание: перед началом работы со списком p = nil и at_end = nil)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

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

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


Хм... ну тогда по идее можно ограничится вариантом без дополнительных указателей:

p:=nil;
while not eof(filex) do
   begin
   new(p);
   read(filex, p^.a);
   write(p^.a,' ');
   p^.next:=nil;
   p:=p^.next;
   end;
   p^.next:=nil;
end;
Разве не так?
И еще, а какже вторая часть моего вопроса? smile.gif
Нужно отсортировать буквы в списке в алфавитном порядке:

procedure sort(var p:plist);
var tmp:char;
   flag:boolean;
   a:char;
begin
repeat
flag:=false;
while assigned(p^.next) do
begin
    if p^.a>p^.next^.a then
       begin
       tmp:=p^.a;
       p^.a:=p^.next^.a;
       p^.next^.a:=tmp;
       flag:=true;
       end;
end;
until flag=true;
while assigned(p) do
write(p^.a,' ');
readln;
end;

По идее должно работать, но не работает sad.gif
P.S. Volvo, если я тебя уж больно загрузил, то извини, больше не буду smile.gif только подскажи в посл раз плиииз smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






QDe5n1K

p:=nil;
while not eof(filex) do
  begin
  new(p);
  read(filex, p^.a);
  write(p^.a,' ');

  p^.next:=nil; p:=p^.next;
{ После выполнения этих 2-х команд p ВСЕГДА будет равняться nil,
т.е. данные не будут связаны одно с другим... }

  end;
  p^.next:=nil; { ... и эта команда будет ошибочной }
end;

А вообще, могу тебе посоветовать такой способ работы со списком, как написать программу на листе бумаги, а потом рядом с ней попытаться нарисовать список, вручную проходя по строчкам программы (и выполняя те же действия, которые должна выполнять программа)... Вот это выявляет все ошибки (проверено неоднократно) :yes:

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

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

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


Вот блин, опять проблема... которая кажется мне неразрешимой smile.gif))

procedure open(var p:plist);
var filex:text;
   s:string;
   flagg,x:shortint;
   last,first,pp:plist;
   a:char;
begin
{...............}
assign(filex,s);
reset(filex);
last:=nil;
while not eof(filex) do
   begin
   new(p);
   p:=last;
   read(filex, p^.a);
   last:=p^.next;
   end;
{*}
while p<>nil do  begin
write(p^.a,' ');
p:=p^.next;       end;
end;

Так вот, проблема заключается в том, что данные из файла я считать то считал, но КАК СДЕЛАТЬ, ЧТОБЫ ЭТИ ДАННЫЕ ВЫВОДИЛИСЬ? Я так понял, что нужно p присвоить p начальное... но как это сделать, в толк никак не возьму smile.gif А так, вроде во всем разобрался...
И пожалуйста, не подумайте, что я прикалываюсь smile.gif)))

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Бывалый
***

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

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


Цитата
данные из файла я считать то считал
...нет, батенька, не считали! Смотрим код:
last:=nil;
while not eof(filex) do
  begin
  new(p);
  p:=last;
  read(filex, p^.a);
  last:=p^.next;
  end;
Итак: last:=nil;

Сие означает, что мы указатель на "хвост" списка делаем пустым. К чему бы? Ну да ладно. Единственный вопрос, который возникает, это где же у нашего списка "голова"? Впрочем, идем дальше.
new(p); - выделяем память под элемент списка.
p:=last; - и тут же ее теряем. Ведь, как мы помним, last у нас = nil. А теперь и p тоже nil.
read(filex, p^.a); - считываем из файла значения для элемента списка. Куда считываем??? Ведь p у нас nil!
last:=p^.next; - это было бы не лишено смысла, если бы опять таки p не было nil.
Я бы сделал нечто наподобие следующего:
Код

procedure open(var p:plist);
var filex:text;
  s:string;
  iterator:plist;
begin
{...............}
assign(filex,s);
reset(filex);

new(p);  {выделяем память под первый элемент списка}

iterator:=p; {ставим указатель на "голову"}

while not eof(filex) do
  begin
  read(filex,iterator^.a); {считываем очередное значение из файла}

  if not eof(filex) then {если это значение не последнее}
     begin                    {то выделяем память под следующий элемент}
        new(iterator^.next);
        iterator := iterator^.next;   {сдвигаем указатель}
     end;
  end;

  iterator^.next := nil; {все; дальше элементов нет.}
{теперь у нас p указывает на первый, а iterator - на последний элемент}
Мне самому не нравится то, что в цикле чтения оказалось сразу две проверки на EoF, но на скорую руку я ничего лучше не придумал.
Цитата
Сделал, что мог, и пусть, кто может, сделает лучше!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Автооответчик
*****

Группа: Пользователи
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


так... зачем тебе last и pp ?
(прости, нет времени просматривать предыдущие посты)
так я делал сегодня:

function load:plist;
var begin,temp:plist; f:text;
begin
 assign(f,'file.dat');
 reset(f);
 new(temp);
 begin:=temp;
   while not eof(filex) do
     begin
       read(f,temp^.a);
       temp^.next:=new(plist);
    end;
 temp^.nex:=nil; {в целесообразности не уверен}
 load:=begin;
end;

procedure show_list(as: Plist);
begin
 while as^.next<>nil do
   begin
     writeln(as^.a);
     as:=as^.next;
   end;
end;
набирал тут, так что могут быть ошибки....
скорее всего они есть.... Паса ща нету, проверить не могу...
перезайду, исправлю если неправильно..


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Бродяжник
Ну, если уже вводить дополнительную переменную, которая укажет на конец списка, то я бы делал вот так:

procedure open(var p:plist);
var
 pp:plist;
 iterator: plist;
begin

p := nil; { пишем в пустой список }
while not eof(filex) do
 begin
   new(pp);
   read(filex, pp^.a);
   pp^.next := nil;
   if p = nil then p := pp else iterator^.next := pp;
   iterator := pp;
 end;

end;

QDe5n1K, я же этот способ описывал раньше... почему не используем?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Бывалый
***

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

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


volvo
Да, это лучше. :P
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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