Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ комбинированные типы. операторы присоединения.

Автор: ducky 5.12.2010 2:34

помогите пожалуйста из неработающей программы, работающую сделать..

program errors;
type поле = (а,b);
запись = record a:integer; b:char end;
var х,у:запись; c:char;
function f (var r:запись):запись;
var р:поле;
begin for p := a to b do f.p := succ(z.p) end;
begin read©;
with x do begin a := ord©; b := c end;
y := x; if x = у then y := f(x);
with у do writeln(a,x)
end.


Автор: Lapp 5.12.2010 13:42

Цитата(ducky @ 4.12.2010 22:34) *
помогите пожалуйста из неработающей программы, работающую сделать..
И.. как она должна работать? если не секрет, конечно.

Самое простое - заменить ее на работающий пример из учебника. Например, вывод "Hello, World!". Она гарантированно будет работать, зуб даю.

Автор: ducky 5.12.2010 16:09

да вроде бы просто запускаться должна))

Автор: Lapp 5.12.2010 16:43

Цитата(ducky @ 5.12.2010 12:09) *
да вроде бы просто запускаться должна))
А какой у тебя компилятор?

Автор: ducky 5.12.2010 17:27

Паскаль у меня. компилятор же там есть..

Автор: Krjuger 5.12.2010 19:15

А слова поле,записть и тд,это ваш перевод или они в самой программе?
И вопрос. y := x; if x = у then y := f(x);
Вам не кажется,что это будет выполняться всегда?

Автор: Lapp 6.12.2010 5:13

Цитата(ducky @ 5.12.2010 13:27) *
Паскаль у меня. компилятор же там есть..

н-даа..
Какой у тебя Паскаль?

Turbo Pscal?
Pascal-ABC?
FreePascal (FPC)?
...

Ответь, пожалуйста..

Смысл вот, в чем. Я знаю точно, что ни Turbo, ни FPC не признают русских идентификаторов. Но про ABC я точно не знаю. Потому и спросил.
И в любом случае я ОЧЕНЬ не рекомендую тебе использовать русские буквы в названиях переменных (даже если твой какой-нить неизветсный мне зверь типа Паскаль-ЭЮЯ это и позволяет).
Короче, переделай все на английские буквы, тогда будем говорить по делу.

Автор: volvo 6.12.2010 17:34

Цитата
Я знаю точно, что ни Turbo, ни FPC не признают русских идентификаторов. Но про ABC я точно не знаю.
Из всех компиляторов Паскаля только Глагол (хотя это не совсем Паскаль, так, просто синтаксис похож) и Component Pascal поддерживают идентификаторы на кириллице.

Автор: ducky 7.12.2010 1:36

Паскаль Турбо.

русские буквы в условии были..сейчас переделаю)

Автор: ducky 12.12.2010 3:34

вот..наконец-то код нормально набрала..
даже переделала немного.

program errors (input,output);
type pole=(ar,br);
zapis=record
a:integer;
b:char;
end;

var x,y:zapis; c:char;
function f(var z:zapis):real;
var p:pole;

begin
for p:=ar to br do f:=succ(z.a);
end;

begin
read ©;
with x do begin a:=ord(4); b:=c;
end;


if x:=y then y:=f(x);
with y do writeln (a,x.a);
end.


но вот в этом рядочке - "if x:=y then y:=f(x);" жалуется Паскаль. sad.gif

Автор: volvo 12.12.2010 4:00

if x=y then y:=f(x);
Первый оператор - сравнение, второй - присваивание, не надо их путать smile.gif "Если X равно Y, то Y присвоить что_то"

Заметь, в первом посте было записано правильно.

Автор: ducky 12.12.2010 4:32

поменяла как в первом посте..все-равно не хочет.
выдает Error 41..

Автор: volvo 12.12.2010 5:06

Цитата
выдает Error 41.
А вот это уже серьезнее... Дело в том, что операция сравнения (в Турбо Паскале по крайней мере) допустима только между простыми типами. Запись - это тип сложный, нельзя сравнивать записи между собой таким образом (через оператор "="). В более продвинутых компиляторах возможно переопределить оператор сравнения, тогда можно будет добиться работоспособности программы.

Единственный способ сравнить записи в Турбо Паскале - это сравнить их по каждому полю отдельно. К тому же, ты неправильно написала: функция в первом посте возвращает тип "запись", в 10-м посте у тебя она возвращает вещественное число. Тут - тоже засада: не может в Турбо-Паскале функция возвращать значение сложного типа. То есть, с использованием Турбо-Паскаля невозможно заставить приведенную выше (в самом начале треда) программу компилироваться. Только путем значительной переделки этого удастся достичь...

Автор: ducky 19.12.2010 17:56

вообщем рабочую из нее сделать почти нереально? sad.gif

Автор: volvo 19.12.2010 18:24

Вот это:

Цитата
type поле = (а,b);
{ ... }
for p := a to b do f.p := succ(z.p)
- нереально (в таком виде, когда типы полей разные). Нельзя подставлять в цикле названия полей записи, и работать с ними. Можно заменить на
f.a := succ(f.a); f.b := succ(f.b)
Я ж говорю - почти полная переделка:

program errors (input,output);
type
zapis =
record
a: integer;
b: char;
end;
var
x, y: zapis; c: char;

function equal(left, right: zapis): boolean;
begin
equal := (left.a = right.a) and (left.b = right.b);
end;

procedure f(var z:zapis; var res: zapis);
begin
res.a := succ(z.a);
res.b := succ(z.b);
end;

begin
read ©;
with x do
begin
a:=ord(4); b:=c;
end;
y := x; if equal(x, y) then f(x, y);
with y do
writeln (a, ' ', x.a, ' ', x.b);
end.



Ты лучше расскажи, откуда этот бредовый код откопала? Смысл его в чем? Просто поизвращаться с записями?

Автор: ducky 19.12.2010 20:56

спасибо Вам большое - пребольшое.
в книжке был записан и задания состояло в том, чтобы найти ошибки..