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

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

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

 
 Ответить  Открыть новую тему 
> Задача на списки., Хелп.
QDe5n1K
сообщение 22.11.2004 16:25
Сообщение #1


Новичок
*

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

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


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


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

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

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


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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 24.11.2004 17:26
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.11.2004 17:44
Сообщение #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 - 24.11.2004 17:45
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 24.11.2004 23:45
Сообщение #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 - 24.11.2004 23:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.11.2004 0:15
Сообщение #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;


Опять же, все просто... ;)
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 25.11.2004 15:43
Сообщение #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 - 4.11.2010 12:22
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.11.2004 16:21
Сообщение #8


Гость






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

Трудно что-либо сказать без полного кода (что такое assigned, допустим, понятно, а вот как именно заполняется список?)
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 25.11.2004 16:44
Сообщение #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 - 4.11.2010 12:22
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Werwolf86
сообщение 25.11.2004 22:49
Сообщение #10


Новичок
*

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

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


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

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


Гость






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


Новичок
*

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

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


Куча, куча, volvo прав ;)... и все же, что же не так в моей программе, помогите найти ошибку smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2004 0:04
Сообщение #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)
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 26.11.2004 2:13
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.11.2004 9:26
Сообщение #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 - 4.11.2010 12:23
 К началу страницы 
+ Ответить 
QDe5n1K
сообщение 29.11.2004 15:23
Сообщение #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 - 4.11.2010 12:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Бродяжник
сообщение 29.11.2004 16:30
Сообщение #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 
 К началу страницы 
+ Ответить 
GoodWind
сообщение 29.11.2004 16:42
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.11.2004 16:45
Сообщение #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, я же этот способ описывал раньше... почему не используем?
 К началу страницы 
+ Ответить 
Бродяжник
сообщение 29.11.2004 17:42
Сообщение #20


Бывалый
***

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

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


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

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

 

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