Помощь - Поиск - Пользователи - Календарь
Полная версия: проблема с Pascalями:(
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kizan
есть программа, в которой компиляционных ошибок нет, но вычисляет неверно.
в школе она запускалась нормально, принёс домой при запуске пишет Error while linking.
если куда-нибудь дописать случайный символ, то паскаль пишет ошибку орфографии.
если в этом же паскале написать простейшую программу типа
var x:integer;
begin
read(x); write(x);
end.


работает без ошибочно. а именно на мою безошибочную программу выводит Error while linking.
_____________________________
если кому интересно вот текст программы(калькулятор)
var a,c,i,x:longint;
function step(a,s:longint):longint;
var z:longint;
begin
z:=1;
if s=0 then step:=1 else begin
for i:=1 to s do
z:=z*a;
step:=z;
end;
end;
function perevod10(a,c:longint):longint;
type t=array[1..20] of integer;
var m:t;
K,l:integer;
begin
k:=0;
while a>0 do begin
k:=k+1;
m[k]:=a mod 10;
a:=a div 10;
end;
l:=0;
for l:=k downto 1 do
a:=a+step(c,l-1)*m[l];
perevod10:=a;
writeln('IIepeBe/\ B 10. IIo/\y4u/\ ',a);
readln();
end;
function perevodc(a,c:longint):longint;
type t=array[1..20] of integer;
var m:t;
k,q:integer;
begin
k:=0;
q:=0;
while a>=1 do begin
k:=k+1;
m[k]:=a mod c;
a:=a div c;
end;
for i:=k downto 1 do
q:=q*10+m[i];
perevodc:=q;
end;
procedure summa;
var a,b,c,ac,bc,sum,sumc:longint;
begin
writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)');
readln©;
writeln('BBeguTe c/\araemoe');
readln(a);
writeln('BBeguTe c/\araemoe');
readln(b);
if c=10 then sumc:=a+b else begin
ac:=perevod10(a,c);
bc:=perevod10(b,c);
sum:=ac+bc;
sumc:=perevodc(sum,c);
end;
writeln('cucTema c4ucleHu9 - ',c,'. ',a,'+',b,'=',sumc);
readln();
end;
procedure raznostb;
var a,b,c,ac,bc,razn,raznc:longint;
begin
writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)');
readln©;
writeln('BBeguTe ymeHbIIIaemoe');
readln(a);
writeln('BBeguTe BbI4uTaemoe');
readln(b);
ac:=perevod10(a,c);
bc:=perevod10(b,c);
razn:=ac-bc;
raznc:=perevodc(razn,c);
writeln('cucTema c4ucleHu9 - ',c,'.',a,'-',b,'=',raznc);
readln();
end;
procedure umnozhenie;
var a,b,c,ac,bc,umn,umnc:longint;
begin
writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)');
readln©;
writeln('BBeguTe mHo)/(uTe/\b');
readln(a);
writeln('BBeguTe mHo)/(uTe/\b');
readln(b);
ac:=perevod10(a,c);
bc:=perevod10(b,c);
umn:=ac*bc;
umnc:=perevodc(umn,c);
writeln('cucTema c4ucleHu9 - ',c,'.',a,'*',b,'=',umnc);
readln();
end;
procedure delenie;
var a,b,c,ac,bc,delc,delb:longint;
del:real;
begin
writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)');
readln©;
writeln('BBeguTe ge/\umoe');
readln(a);
writeln('BBeguTe ge/\uTe/\b');
readln(b);
ac:=perevod10(a,c);
bc:=perevod10(b,c);
del:=ac/bc;
delb:=round(del);
delc:=perevodc(delb,c);
writeln('cucTema c4ucleHu9 - ',c,'.',a,'/',b,'=',delc);
readln();
end;
begin
writeln('gobpo po)/(a/\oBatb');
x:=5;
while x<>0 do begin
writeln('BbIbepuTe geucTBue(write 0-4)');
writeln('0-exit');
writeln('1-<+>');
writeln('2-<->');
writeln('3-<*>');
writeln('4-</>');
readln(x);
if x=1 then summa
else
if x=2 then raznostb
else
if x=3 then umnozhenie
else
if x=4 then delenie;
end;
writeln('cIIacubo 3a ucIIo/\3oBaHue');
readln();
end.
IUnknown
Вот тут разбиралось, почему возникает подобная ошибка: Error While Linking

P.S.
Цитата
если в этом же паскале написать простейшую программу типа
и
Цитата
работает без ошибочно
- то выбрасывай компилятор немедленно и бери другой, который выдаст тебе синтаксическую ошибку. Приведенная программа НЕ ДОЛЖНА компилироваться, а уж тем более - работать.
kizan
да я торопился, точки с запятой криво расставилsmile.gif
может кто поможет тогда ошибки в программе найти? а то мне завтра сдавать, буду в режиме "блокнота" задачу решать blink.gif вот условия:
сделать калькулятор, делающий простейшие арифметические действия(+-*/) в разных(2-16) системах счисления.
так и не дошло, как делать 11-16. там же буквы..
P.S. кому несложно, скомпильте у себя в паскале, будет-нет работать?
kizan
ребят плз помогите! мне её завтра сдавать!
IUnknown
Ошибок (синтаксических) нет, программа частично работает (хоть и кривовато, ниже объясню, что имею в виду). Но я бы не стал такую программу сдавать. Ибо Copy/Paste ни к чему хорошему не приводит, а у тебя именно по этой "технологии" все написано. Ну вот скажи, зачем

Цитата
procedure raznostb;
var a,b,c,ac,bc,razn,raznc:longint;
begin
writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)'); // <--- Раз
readln( С ); // <--- Два
writeln('BBeguTe ymeHbIIIaemoe'); // <--- Три
readln(a); // <--- Четыре
writeln('BBeguTe BbI4uTaemoe'); // <--- Пять
readln(b); // <--- Шесть
ac:=perevod10(a,c); // <--- Семь
bc:=perevod10(b,c); // <--- Восемь
razn:=ac-bc;
raznc:=perevodc(razn,c); // <--- Девять
writeln('cucTema c4ucleHu9 - ',c,'.',a,'-',b,'=',raznc); // <--- Десять
readln(); // <--- Одиннадцать
end;

выделенные 11 строк повторять во всех процедурах, выполняющих и умножение, и деление, и сложение, и вычитание? Один раз написать в основной программе:
const
titles : array[1 .. 4, 0 .. 2] of string =
(
('+', 'c/\araemoe', 'c/\araemoe'),
('-', 'ymeHbIIIaemoe', 'BbI4uTaemoe'),
('*', 'mHo)/(uTe/\b', 'mHo)/(uTe/\b'),
('/', 'ge/\umoe', 'ge/\uTe/\b')
);
var
A, B : string;
res, C : longint;
begin
writeln('gobpo po)/(a/\oBatb');
repeat
writeln('BbIbepuTe geucTBue(write 0-4)');
writeln('0-exit');
writeln('1-<+>');
writeln('2-<->');
writeln('3-<*>');
writeln('4-</>');
readln(x);

writeln('BBeguTe cucTemy c4uc/\eHu9(2-16)');
readln©;
writeln('BBeguTe ' + titles[x, 1]); readln(A); // Тут будут еще проверки, читай ниже
writeln('BBeguTe ' + titles[1, 2]); readln(B);

case x of
1 : res := summa(perevod10(C, a), perevod10(C, b));
2 : res := raznostb(perevod10(C, a), perevod10(C, b));
3 : res := umnozhenie(perevod10(C, a), perevod10(C, b));
4 : res := delenie(perevod10(C, a), perevod10(C, b));
end;
writeln('cucTema c4ucleHu9 - ', c, '. ',
a, titles[x, 0], b, '=', perevodc(res, C);
readln();
until x = 0;
writeln('cIIacubo 3a ucIIo/\3oBaHue');
readln();
end.

, а потом в подпрограммах только производить само действие над уже подготовленными операндами, и заниматься отсеиванием заведомо неверных данных (при делении Делитель не может быть равным 0, твоя программа об этом ничего не говорит, а тихо вылетает) - никак нельзя было?

Дальше. Нельзя просить у пользователя число в какой-то СС, отличной от 10-ной, и вводить его в LongInt. Только в строку. Даже если тебе удастся ввести число в СС с основанием 2..9 в целочисленную переменную, это будет неправильно. О том, что я могу ввести в ответ на запрос 16 и потом - любую 16-ричную цифру $A..$F и при этом твоя программа тоже вылетит - я опять же не говорю.

Еще одна проблема: когда пользователь сказал, что у него число восьмеричное, надо проверять, что он ввел (он должен использовать только цифры 0 .. 7 в таком случае), иначе при конвертации к десятичному числу вылезут проблемы. На это тоже обрати внимание, понадобится еще одна функция, которая будет проверять, не содержит ли введенная пользователем строка запрещенных в выбранной им системе счисления символов, и если содержит - то просить ввести число заново.

Итого: программу надо переписывать почти полностью. Единственный случай, когда она почти правильно работает - это выбор 10-ной СС. Но деление на 0 все-таки проверяй...
kizan
1) подпрогамма-замена.
мы не проходили case of и нам не разрешат им пользоваться(пытался один парень уже..). поэтому и приходится бедным школьникам работать копипастом)
2)деление на ноль как-то не подумал.
3) говорил же программа недописана, сам вкурсе, что 11-16 СС не считает... буду переделывать, только вот где паскаль рабочий взять(всё-такие почему мой выдаёт error while linking?? ссылка не помогла..)
4) так и недопёр как в операциях переводов в другие СС делать действия с дробными числами типа 5.5? при деление делаю округление в нижнюю сторону, что, конечно, неправильно.
TarasBer
> мы не проходили case of и нам не разрешат им пользоваться(пытался один парень уже..). поэтому и приходится бедным школьникам работать копипастом)

Объясни связь между case of и копипастом.
Заменить case на цепочку ifов - это что, сложнее, чем придумывать отмазки не менять свой код?

> при деление делаю округление в нижнюю сторону, что, конечно, неправильно.

Почему? Задание же только для целых чисел.
kizan
Цитата(TarasBer @ 3.02.2012 9:15) *

> мы не проходили case of и нам не разрешат им пользоваться(пытался один парень уже..). поэтому и приходится бедным школьникам работать копипастом)

Объясни связь между case of и копипастом.
Заменить case на цепочку ifов - это что, сложнее, чем придумывать отмазки не менять свой код?

> при деление делаю округление в нижнюю сторону, что, конечно, неправильно.

Почему? Задание же только для целых чисел.

задание сделать калькулятор, умеющий считать в разных системах счисления.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.