![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
При вызове процедуры vivodposl (62 строка кода) выдает ошибку Incompatible types
Программа проверяет, является ли введенная последовательность арифметической прогрессией. Но какую последовательность не введешь, всегда ответ Нет. Укажите, пожалуйста, ошибку Код:
type
posl=array [1..100] of real;
stroka=string[30];
var
a:posl;
i,n:integer;
procedure vvodposl(var a:posl;const namefile:stroka);
var
fin: textfile;
i,n:integer;
begin
assignfile(fin,'f1.txt');
reset(fin);
readln(fin,n);
for i:=1 to n do
read(fin,a[i]);
close(fin);
end;
procedure vivodposl(namefile:stroka;const a:posl;i,n:integer;zag:stroka;flag,arifmpr:boolean);
var
j:integer;
fout:text;
begin
assign(fout,namefile);
if flag then
rewrite(fout)
else
append(fout);
writeln(fout,zag);
for i:=1 to n do
write(fout,a[i]:3:2);
writeln(fout);
if arifmpr=true then
write(fout,'Da')
else
write(fout,'Net');
close(fout);
end;
function arifmpr(a:posl; i:integer):boolean;
var
d:real;
k:boolean;
begin
d:=a[2]-a[1];
k:=true;
for i:=2 to n-1 do
if a[i+1]-a[i]=d then
result:=true
else
k:=false;
if k=false then
result:=false
else
end;
begin
vvodposl(a,'f1.txt');
arifmpr(a,i);
vivodposl('f1.txt',arifmpr(a,i));
end. |
|
#2
|
|||
|
|||
|
1. Второй аргумент функции vividposl имеет тип posl (массив). А функция, которая стоит там, возвращает тип boolean. Вот почему "несовпадение типов".
2. Даже после исправления, компилироваться не будет. Ошибка, скорее всего, будет, что не найдена перегруженная функция vividposl с типами параметров string, array (или как-то так), так как описание функции и ее вызов и рядом по передаваемым параметрам не лежали. 3. Строкой выше, вызов функции arifmpr, результат которй никуда не сохраняется, да и передаваемый парамет не инициализирован (там может находится любое значение, под дебагером, скорее всего, там 0, но никто ничего гарантировать не может), т.е. случайным образом там тоже может выскакивать ошибка. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Appolinariya_ (30.11.2015)
| ||
|
#3
|
|||
|
|||
|
Спасибо, что указали ошибки. Мне, как начинающему, еще сложно все понять. Можете помочь исправить?
Программу нужно написать через процедуры или функции, что я собственно и попыталась сделать. В процедуре vivodposl должны была выводится исходная последовательность и результат. Функцию использую в первый раз, но тут, как мне показалось, она к месту, так как результат программы "Да" или "Нет". |
|
#4
|
|||
|
|||
|
Проще не исправлять, а переписать.
Как-то так: Код:
program ArifmTest;
{$APPTYPE CONSOLE}
type
Tposl=array [1..100] of real;
Tstroka=string[30];
var
a : Tposl;
n : integer;
procedure vvodposl(const namefile:Tstroka; var lst : Tposl);
var
fin: textfile;
i:integer;
begin
assignfile(fin,namefile);
reset(fin);
readln(fin,n);
for i:=1 to n do
read(fin,lst[i]);
close(fin);
end;
procedure vivodposl(namefile:stroka; lst : Tposl; IsRewrite : Boolean);
var
i : Integer;
begin
assign(fout,namefile);
if IsRewrite
then rewrite(fout)
else append(fout);
for i:=1 to n do
write(fout,lst[i]:3:2);
writeln(fout,'');
if IsArifm(lst)=true
then write(fout,'Da')
else write(fout,'Net');
writeln(fout,'');
close(fout);
end;
function IsArifm(a:posl):boolean;
var
d:real;
i:integer;
begin
Result := True
if n > 1 Then
Begin
d:=a[2]-a[1];
for i:=2 to n-1 do
Begin
Result := (a[i+1]-a[i])=d;
If Not Result Then Break;
End;
End;
end;
begin
vvodposl('f_in.txt', a);
vivodposl('f_out.txt',a,false);
end. |