Задача на списки., Хелп. |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Задача на списки., Хелп. |
QDe5n1K |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Люди помогите!!! Плз... Задача звучит так:
"ВВодится некоторая последовательность букв русского алфавита и записывается в памяти в виде линейного списка. Определить упорядочена ли последовательность по алфавиту( если нет, то упорядочить), заменить выбранную K-ую букву на Q-ю, поменять местами первую и последнюю буквы... Люди, пожалуйста, подскажите как это делать и приведите примеры кусочков кода (полный мне не нужен, хочу сам разобраться, но для этого нужно небольшое ускорение) Пожалуйста, подскажите что и как... |
APAL |
Сообщение
#2
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
-------------------- |
QDe5n1K |
Сообщение
#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 букв английского алфавита... в чем здесь ошибка ? подскажите плз |
volvo |
Сообщение
#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 - |
QDe5n1K |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Ладно, вот еще
Я собираюсь поменять число под номером 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 - |
volvo |
Сообщение
#6
|
Гость |
QDe5n1K
Если честно, я не совсем понял, что нужно найти, но вообще-то, чтобы найти элемент списка под номером X, пользуются такой конструкцией: то есть вышеприведенный код может быть переписан вот так:
Опять же, все просто... ;) |
QDe5n1K |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Нет, не просто ;)
-при попытке все вывести на экран все буквы выводятся в боратном порядке И еще: как сортировать буквы из этого списка по алфавитному порядку? Я пытаюсь так: В итоге у меня все зацикливается и не реагирует ни на что Блин, может у меня повторяется все одна и та же ошибка? Подскажите, плз! Сообщение отредактировано: volvo - |
volvo |
Сообщение
#8
|
Гость |
QDe5n1K
Цитата при попытке все вывести на экран все буквы выводятся в боратном порядке Трудно что-либо сказать без полного кода (что такое assigned, допустим, понятно, а вот как именно заполняется список?) |
QDe5n1K |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Вот код процедуры open
А в файл все буквы записываются как и положено, слева направо... открывал блокнотом и проверял Сообщение отредактировано: volvo - |
Werwolf86 |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 31 Пол: Мужской Репутация: 0 |
Цитата(volvo @ 24.11.04 17:44) {берем новый элемент из "кучи"} pp^.next:=p; {его "следующему" значению } readln(filex, pp^.a); {записываем в новый элемент данные}] из какой кучи?))) вообще то это называеться выделением памяти под новый элемент))... |
volvo |
Сообщение
#11
|
Гость |
Werwolf86
А откуда, интересно, выделяется память? (Heap - это все-таки "куча") |
QDe5n1K |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Куча, куча, volvo прав ;)... и все же, что же не так в моей программе, помогите найти ошибку
|
volvo |
Сообщение
#13
|
Гость |
QDe5n1K
А ошибка в том, что ты добавляешь новый элемент в начало списка, а нужно добавлять в конец... Что это значит? Это значит, нужно ввести дополнительную переменную "at_end" того же типа, как и "p", которая всегда будет указывать на конец списка, и добавлять данные по приведенной выше схеме в конец списка... :yes: (Примечание: перед началом работы со списком p = nil и at_end = nil) |
QDe5n1K |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Хм... ну тогда по идее можно ограничится вариантом без дополнительных указателей:
Разве не так? И еще, а какже вторая часть моего вопроса? Нужно отсортировать буквы в списке в алфавитном порядке: По идее должно работать, но не работает P.S. Volvo, если я тебя уж больно загрузил, то извини, больше не буду только подскажи в посл раз плиииз |
volvo |
Сообщение
#15
|
Гость |
QDe5n1K
А вообще, могу тебе посоветовать такой способ работы со списком, как написать программу на листе бумаги, а потом рядом с ней попытаться нарисовать список, вручную проходя по строчкам программы (и выполняя те же действия, которые должна выполнять программа)... Вот это выявляет все ошибки (проверено неоднократно) :yes: Сообщение отредактировано: volvo - |
QDe5n1K |
Сообщение
#16
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Вот блин, опять проблема... которая кажется мне неразрешимой ))
Так вот, проблема заключается в том, что данные из файла я считать то считал, но КАК СДЕЛАТЬ, ЧТОБЫ ЭТИ ДАННЫЕ ВЫВОДИЛИСЬ? Я так понял, что нужно p присвоить p начальное... но как это сделать, в толк никак не возьму А так, вроде во всем разобрался... И пожалуйста, не подумайте, что я прикалываюсь ))) Сообщение отредактировано: volvo - |
Бродяжник |
Сообщение
#17
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Цитата данные из файла я считать то считал ...нет, батенька, не считали! Смотрим код:last:=nil;Итак: 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 - на последний элемент} Цитата Сделал, что мог, и пусть, кто может, сделает лучше! |
GoodWind |
Сообщение
#18
|
Автооответчик Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: 16 |
так... зачем тебе last и pp ?
(прости, нет времени просматривать предыдущие посты) так я делал сегодня: function load:plist;набирал тут, так что могут быть ошибки.... скорее всего они есть.... Паса ща нету, проверить не могу... перезайду, исправлю если неправильно.. -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
volvo |
Сообщение
#19
|
Гость |
Бродяжник
Ну, если уже вводить дополнительную переменную, которая укажет на конец списка, то я бы делал вот так: QDe5n1K, я же этот способ описывал раньше... почему не используем? |
Бродяжник |
Сообщение
#20
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
volvo
Да, это лучше. :P |
Текстовая версия | 19.04.2024 17:00 |