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

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

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

 
 Ответить  Открыть новую тему 
> Стек., начала писать программу, вроде всё правильно, кроме главной программы
сообщение
Сообщение #1





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

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


главная программа точно неверная..но как не разбиралась...не знаю как её написать((

Условие задачки:
При помощи стэка проверить действительно ли строка символов симметрична относительно середины. Признак середины - цифра 0.


вот то, что сама пыталась написать:
program lab13;
zv=^pointer;
pointer=record
elem: char;
next: zv
end;
var
k,sym: char;
s: zv;
b: boolean;
procedure vstek(var st: zv; buk: char);
var Q: zv;
begin
new(Q);
Q^.elem:=buk;
Q^.next:=st;
st:=Q
end;
procedure vdstek(var st: zv; var A: char; var L: boolean);
var Q: zv;
begin
l:=true;
if st=nil then L:=false
else
begin
A:=st^.elem;
Q:=st;
st:=st^.next;
dispose(Q);
end
end;
begin {golovna programa}
s:=nil;
writeln('vvedu sumvolu');
read(sym);
vstek(s,sym);
b:=true;
while (sym<>'.') and b do
begin
if sym='0' then vdstek(s,k,b);
read(sym);
end;
if (S=nil) and b then
writeln('rjadok sumetruchnuj')
else
writeln('ne sum');
end.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






ну помогииите...плс
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Для начала чуть-чуть поправим реализацию стека:

type
pstack = ^stack; { Не надо Pointer-ов, в Паскале есть более типизированные указатели }
stack =
record
elem : char;
next : pstack;
end;


{ Заталкивание в стек всегда называлось Push }
procedure push (var st : pstack; ch : char);
var Q : pstack;
begin
new (Q);
Q^.elem := ch;
Q^.next := st;
st := Q
end;

{
А выталкивание из него - Pop. Причем обрати внимание: это функция, которая
возвращает результат. Было что-то в стеке - значит True, не было - значит, False
}
function pop (var st: pstack; var ch : char) : boolean;
var Q : pstack;
begin
pop := true;

if st = nil then pop := false
else
begin
ch := st^.elem;
Q := st;
st := st^.next;
dispose(Q);
end
end;


А вот теперь с этим стеком уже можно решать поставленную задачу. Есть 2 способа...
1) Прочитать одним циклом символы до '0', записывая их в стек, а потом вторым циклом читать оставшиеся и сравнивать с тем, что было записано ранее.

var
k, sym: char;
s : pstack;
b : boolean;

begin { основная программа }
writeln;
s := nil;
write('s = ');

repeat
read (sym);
push (s, sym);
until sym = '0';

{ Символы до '0' прочитаны, теперь убираем сам '0' с вершины стека }
pop (s, k);

{
... и продолжаем: вторым циклом читаем остальные символы,
выталкивая каждый раз новый символ из ранее запомненных,
до тех пор, пока стек не пуст или пока не найдем несоответствие
}
repeat
b := pop (s, k);
if b then
read (sym);
until (k <> sym) or (not b);

{
Вот когда пришли сюда - есть 2 варианта: либо стек пустой и
строка симметричная - значит, следующий символ, который считается
read-ом, будет признаком конца строки (или точка, или #13: Enter).

Второй вариант - что-то не выполнилось. Либо стек не пустой (значит,
строка не может быть симметричной), либо стек пуст, но в строке есть еще
лишние символы, а не признак конца строки. Например, при вводе '210122.'
последняя двойка - лишняя.

Проверяем пустоту стека и признак конца строки и делаем выводы...
}
read(sym);
if (not b) and (sym = '.') then writeln('Строка симметрична')
else writeln('Нет, что-то не так');
end.


2) сделать всю работу одним циклом.
var
k,sym: char;
s : pstack;
b : boolean;

zero : boolean;

begin {golovna programa}
writeln;
s := nil;
write('s = ');

zero := false; { Был ли уже введен '0' ? }
b := true;
repeat
read (sym);
if sym = '0' then zero := true
else
if zero then
begin
b := pop(s, k);
if b then b := (k = sym);
end
else push (s, sym);
until (sym = '.') or (not b);

if (s = nil) and (sym = '.') then writeln('Строка симметрична')
else writeln('Что-то опять не так...');
end.


Что непонятно - спрашивай...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





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

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


попробуй тут не понять - все так рассписано))
спасибо очень!!!)

но кода запускаю программу, результат неверный(
например, fgh0fgv
строка симметричная, а программа выводит, что нет((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Я, конечно, очень извиняюсь, но симметричная (в моем понимании) строка - это fgh0hgf, например. Или 1230321 (символы расположены симметрично относительно среднего "0" - при проходе от него в любую сторону будет одинаковая последовательность символов).

Что симметричного в строке "fgh0fgv" - я не вижу. Объяснишь? Где симметрия?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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