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

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

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

 
 Ответить  Открыть новую тему 
> Стек., начала писать программу, вроде всё правильно, кроме главной программы
Zorka
сообщение 14.11.2011 3:00
Сообщение #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 
 К началу страницы 
+ Ответить 
Гость
сообщение 14.11.2011 23:47
Сообщение #2


Гость






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


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
Zorka
сообщение 15.11.2011 20:08
Сообщение #4





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

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


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

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


a.k.a. volvo877
*****

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

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


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

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

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

 



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