Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > [TP 7.1] Работа с Type + Function


Автор: MuForum 7.10.2007, 13:15
Добрый день!
Задали задачу в TP 7.1, сама задача очень простая по себе, и я вроде всё сделал, но ругается на "type mismatch".

P.S. -> Я перешел на C++/C#, и всё лето его изучал, так что он Pascal отвык да и позабылось многое.

Задача:
Цитата

Даны следующие описания:
Код

const nmax=100;
type Vector=array [1..nmax] of real;


Напишите функцию, которая возвращает:
а) Сумму элементов некоторого массива типа Vector;
б) Среднее арифметическое элементов данного массива;
в) Максимальный элемент;
г) Минимальный элемент.




Решение:
Код

Program s06;
  Uses Crt;
  Const nmax=100;
  type Vector=array [1..nmax] of real;
  
Var
  a: array[1..nmax] of Vector;
  k1,k2,k3,k4: real;
  i,n: word;
  
  function l1(lk1: word):real;
  Var S: real;
  Begin
    S:=0;
    for i:=1 to lk1 do S:=S+a[i];
    l1:=S;
  end;
  
  function l2(lk2: word):real;
  Var S: real;
  Begin
    S:=0;
    for i:=1 to lk2 do S:=S+a[i];
    S:=S/lk2;
    l2:=S;
  end;
  
  function l3(lk3: word):real;
  Var S: real;
  Begin
    S:=a[1];
    for i:=1 to lk3 do if(a[i] > S) then S:=a[i];
    l3:=S;
  end;

  function l4(lk4: word):real;
  Var S: real;
  Begin
    S:=a[1];
    for i:=1 to lk4 do if(a[i] < S) then S:=a[i];
    l4:=S;
  end;

Begin
  ClrScr;
  Write('n = '); ReadLn(n);
  k1:=0; k2:=0; k3:=0; k4:=0;
  for i:=1 to n do
  Begin
    Write('a['i'] = '); ReadLn(a[i]);
  end;
  k1:=l1(n);
  k2:=l2(n);
  k3:=l3(n);
  k4:=l4(n);
  WriteLn('k1 = ',k1:6:1);
  WriteLn('k2 = ',k2:6:1);
  WriteLn('k3 = ',k3:6:1):
  WriteLn('k4 = ',k4:6:1);
  ReadKey;
end.



P.S. -> Ругается на строчке "for i:=1 to lk1 do S:=S+a[i];", и что-то я не могу разобраться.

Автор: Alix 7.10.2007, 13:46
При беглом взгляде, надо:
Код
var 
  a: Vector;

Автор: MuForum 7.10.2007, 13:50
#2, Alix - Ваш беглый взгляд мне лично не помог...


P.S. -> И как я написал выше, то отвык уже от Pascal, и мне нужно объяснить что Pascal не нравится.
P.S. -> Эту задачу что на C++, что на C# я уже сделал за пару минут, а вот на Pascal не выходит, а мне нужно решить именно на Pascal =(

Автор: volvo877 7.10.2007, 14:42
Цитата(MuForum @  7.10.2007,  12:50 Найти цитируемый пост)
мне нужно объяснить что Pascal не нравится.

А не нравится ему то, что ты описываешь переменную A как массив векторов (соответственно, a[ i ] является вектором) и пытаешься Vector сложить с вещественным числом... Замени описание:
Код

Var
  a: array[1..nmax] of Vector;
на
Код

Var a: Vector;
, ну и еще по мелочи (где запятые забыл, где - двоеточие вместо точки с запятой поставил) и программа будет компилироваться...


Цитата(MuForum @  7.10.2007,  12:50 Найти цитируемый пост)
Эту задачу что на C++, что на C# я уже сделал за пару минут
А вот это не надо... Этим ты в разделе "С/С++" будешь хвалиться... Ты сделал ошибку логическую, а не синтаксическую... Стало быть, в Сях ты мог допустить точно такую же ошибку, и точно так же получил бы "на орехи" от компилятора (ну не верю я чтобы С++ компилер спокойно пропустил сложение вектора с числом без дополнительных телодвижений, так с чего ты взял что Паскаль это тебе позволит?)...

Автор: MuForum 7.10.2007, 15:01
#4, volvo877 - Спс, что разъяснил, а то я ступил не по-детски.

P.S. -> Как говорится: Век живи и век учись  smile 

Код

Program s06;
  Uses Crt;
  Const nmax=100;
  type Vector=array [1..nmax] of real;
  
Var
  a: Vector;
  k1,k2,k3,k4: real;
  i,n: word;
  
  function l1(lk1: word):real;
  Var S: real;
  Begin
    S:=0;
    for i:=1 to lk1 do S:=S+a[i];
    l1:=S;
  end;
  
  function l2(lk2: word):real;
  Var S: real;
  Begin
    S:=0;
    for i:=1 to lk2 do S:=S+a[i];
    S:=S/lk2;
    l2:=S;
  end;
  
  function l3(lk3: word):real;
  Var S: real;
  Begin
    S:=a[1];
    for i:=1 to lk3 do if(a[i] > S) then S:=a[i];
    l3:=S;
  end;

  function l4(lk4: word):real;
  Var S: real;
  Begin
    S:=a[1];
    for i:=1 to lk4 do if(a[i] < S) then S:=a[i];
    l4:=S;
  end;

Begin
  ClrScr;
  Write('n = '); ReadLn(n);
  k1:=0; k2:=0; k3:=0; k4:=0;
  for i:=1 to n do
  Begin
    Write('a[',i,'] = '); ReadLn(a[i]);
  end;
  k1:=l1(n);
  k2:=l2(n);
  k3:=l3(n);
  k4:=l4(n);
  WriteLn('k1 = ',k1:6:1);
  WriteLn('k2 = ',k2:6:1);
  WriteLn('k3 = ',k3:6:1);
  WriteLn('k4 = ',k4:6:1);
  ReadKey;
end.


Цитата(volvo877)

Цитата(S@nek)

Эту задачу что на C++, что на C# я уже сделал за пару минут

А вот это не надо... Этим ты в разделе "С/С++" будешь хвалиться...

- Вообще-то я это сказал не к тому, что я [censored 6] какой умный или лундеркинг, и то, что я ступил мне минус, а не показуха...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)