| 
| 
 | Вопрос # 3 578/ вопрос решён / | 
 |  Здравствуйте!вычислить среднее арифметическое положительных элементов для массивов A(N1), B(N2), C(N3) (N1,N2,N3<100) Используя процедуры или функции
 
|  |   Вопрос задал: ranet (статус: Посетитель)Вопрос отправлен: 24 декабря 2009, 08:29
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Чтобы проснуться и приступить к работе, решил сделать зарядку для мозгов:
 program p3578;
 
{$APPTYPE CONSOLE}
 
{
вычислить среднее арифметическое положительных элементов для массивов
A(N1), B(N2), C(N3) (N1,N2,N3<100) Используя процедуры или функции
}
 
type
  // Описание типа массива
  TVector = record
    Data: array[0..99] of Integer;
    Size: Integer;
  end;
 
// Выбор случаной длины массива 20...99
// Заполнение массива случайными числами -25...+25
procedure RandomVector(var V: TVector);
var
  Index: Integer;
begin
  V.Size:= Random(80) + 20;
 
  for Index:= 0 to V.Size - 1 do
    V.Data[Index]:= Random(51) - 25;
end;
 
// Вычисление ср. арифметического положительных элементов массива
function PositiveAverage(const V: TVector): Real;
var
  Index, Count: Integer;
  Res: Integer;
begin
  Res:= 0;
  Count:= 0;
 
  for Index:= 0 to V.Size - 1 do
    if V.Data[Index] > 0
      then begin
             Inc(Res, V.Data[Index]);
             Inc(Count);
           end;
 
  PositiveAverage:= Res / Count;
end;
 
// Вывод массива на экран
procedure PrintVector(const Name: string; const V: TVector);
var
  Index: Integer;
begin
  WriteLn(#13#10#13#10'  Vector ', Name, '[', V.Size, ']: ');
 
  for Index:= 0 to V.Size - 1 do
    Write(V.Data[Index]: 4);
end;
 
var
  A, B, C: TVector; // Массивы
 
begin
  //Randomize;
  RandomVector(A);
  PrintVector('A', A);
  WriteLn(#13#10'  Average of positive numbers: ', PositiveAverage(A): 3: 3);
  RandomVector(B);
  PrintVector('B', B);
  WriteLn(#13#10'  Average of positive numbers: ', PositiveAverage(B): 3: 3);
  RandomVector(C);
  PrintVector('C', C);
  WriteLn(#13#10'  Average of positive numbers: ', PositiveAverage(C): 3: 3);
 
  ReadLn;
end.
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 24 декабря 2009, 09:46
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: webkent Здравствуйте, ranet!Вот написал на много проще. Написал для а[n1], для остальных всё так же, поменять только названия. Ограничения на 100 элементов ставить не стал, если захотите сами поставьте(поменять строку a:array of integer; на строку a:array[0..99] of integer;).
 
|  | Ответ отправил: webkent (статус: 2-ой класс)Время отправки: 24 декабря 2009, 09:51
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 17; последнее сообщение — 24 декабря 2009, 16:11; участников в обсуждении: 3. 24 декабря 2009, 09:17: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором min@y™ Причина: 100%-ная лаба 
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 09:52 [#1]:Здравствуйте, ranet! Вот написал на много проще. Написал для а[n1], для остальных всё так же, поменять только названия. Ограничения на 100 элементов ставить не стал, если захотите сами поставьте(поменять строку a:array of integer; на строку a:array[0..99] of integer
  . 
 
 
 function proc(n1: integer): integer;   //объявление функции, которая принимает n1 для
var                                    //обозначения длины массива и возвращает среднее арифм.
  a: array of integer;                 //сам массив чисел
  i, SrArif: integer;                  //2 целочисленные переменные
begin
  SetLength(a, n1);                    //устанавливаем массиву а длину n1 (начиная с нуля)
  Randomize;                           //инициализация генератора случ.чисел
 
  for i := 0 to n1 - 1 do              //начало цикла. От (0) до (длины массива а - 1)
                                       //потому что подсчет длины начинается с единицы, а не с нуля
    a[i] := Random(100)-50;               //Заполняем массив а случ.числами от -50 до 50.
 
 
  for i := 0 to n1 - 1 do  begin           //Снова цикл от 0 до длины массива минус один
    if a[i] > 0 then                         //Если число а[i] положительное,
      SrArif := SrArif + a[i];             //прибавляем его к SrArif;
  end;
 
  SrArif := round(SrArif / Length(a));     //Делим получившуюся сумму на количество чисел в массиве
 
end; |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 10:09 [#2]: Цитата (webkent): a: array of integer; //сам массив чисел  Смотри внимательнее, из какой темы перенесён вопрос. В турбопаскале нет динамических массивов.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 10:12 [#3]: Цитата (min@y™): SrArif := round(SrArif / Length(a)); //Делим получившуюся сумму на количество чисел в массиве  Делить надо на количество положительных элементов, а не на количество всех. Результат должен быть дробным, а не округлённым. Переменную SrArif перед циклом надо обнулять.
 
 Проведи работу над ошибками!
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 10:28 [#4]:shit sorry.  Насчет деления, просто раньше стояло рандом(100), а сейчас добавил -50 а про деление забыл. И вопрос: Почему у меня в сообщениях знак ">" заменяется на >. Точнее, не почему, а как сделать что бы не менялся =) 
 Вот исправил:
 
 function proc(): integer;              //объявление функции, которая принимает n1 для
var                                    //обозначения длины массива и возвращает среднее арифм.
  a: array[0..99] of integer;          //сам массив чисел
  i,n1, SrArif, Num: integer;          //2 целочисленные переменные
begin
  Randomize;                           //инициализация генератора случ.чисел
  n1:=Random(98)+1;                    // n1=случайному числу от 1 до 99
  for i := 0 to (n1) do                //начало цикла. От (0) до n1
    a[i] := Random(100)-50;            //Заполняем массив а случ.числами от -50 до 50.
 
  for i := 0 to n1  do  begin          //Снова цикл от 0 до длины массива
    if a[i] > 0 then begin             //Если число а[i] положительное,
      SrArif := SrArif + a[i];         //прибавляем его к SrArif;
      Num:=Num+1;                      // Num у нас счетчик положительных чисел в массиве
    end;
  end;
 
  SrArif := round(SrArif / Num);        //Делим получившуюся сумму на количество положительных чисел
  Result := SrArif;
end; |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 11:00 [#5]: Цитата (webkent): знак ">" заменяется на >. Точнее, не почему, а как сделать что бы не менялся =) 
 Это к автору движка сайта обращайся.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 11:07 [#6]:На счёт твоего кода: не забывай обнулять переменные. Теперь у тебя их 2 штуки. В турбопаскале нету встроенной переменной Result, результат функции нужно присваивать её имени.
 Не нужно вызывать Randomize в функции, ибо функция может быть вызвана несколько раз.
 
 Цитата (webkent): n1:=Random(98)+1; // n1=случайному числу от 1 до 99  n1 = 1...98
 
 Цитата (webkent): a[i] := Random(100)-50; //Заполняем массив а случ.числами от -50 до 50.  от -50 до 49.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 11:35 [#7]:Спасибо за замечания, а зачем обнулять их, разве локальные переменные не обнуляются когда заканчивается тело функции? А рандом в таком случае генерирует 101 число или 100 чисел? |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 11:53 [#8]: Цитата (webkent): разве локальные переменные не обнуляются когда заканчивается тело функции? Учи матчасть.
 
 Цитата (webkent): А рандом в таком случае генерирует 101 число или 100 чисел?  Random(N) генерирует целые числа в диапазоне от 0 до (N - 1).
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 14:32 [#9]:понятно. Так можно узнать что там насчет переменных, в двух словах? |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 15:11 [#10]: Цитата (webkent): Так можно узнать что там насчет переменных, в двух словах?  
 Переменная - это ячейка памяти. Перед тем, как ты начинаешь с ней работать, в ней может находиться абсолютно любое значение. Поэтому переменные надо перед использованием инициализировать начальными значениями. Дельфовый компилятор даже ругается на неинициализированные переменные, и правильно делает.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 15:16 [#11]:А, ты имел в виду это, а я про освобождение перед окончанием программы. Ну да, он ругается но ведь только на ссылочные типы данных, а значемые не обязательно инициализировать. (На сколько я помню) |  
|   | Вадим К (статус: Академик), 24 декабря 2009, 15:33 [#12]:"Значемые типы" - это какие? Integer что ли? освободить его конечно не получится. А так в целом, лучше объекты за собой освобождать. в объязательном порядке. Да, память то освободиться, файловые дескрипторы скорее всего гарантированно закроются. А вот некоторые типы мютексов могут не освободиться... Поэтому лучше просто чистить за собой. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 15:37 [#13]:Что за бред? Компилятор ругается на ВСЕ типы данных. Попробуй скомпилить такой код:
 
 procedure Dummy;
var
  i: Integer;
begin
  if i > 0 // <-- [Warning] xxxx.dpr(63): Variable 'i' might not have been initialized
    then WriteLn(i)
    else WriteLn(-i);
end;Именно в этом операторе значение переменной i может быть непроинициализированным (вольный перевод с английского).
 Ещё раз говорю: УЧИ МАТЧАСТЬ!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 24 декабря 2009, 15:47 [#14]:Ну я никогда не инициализировал типы, которые не обязательно и пока ни разу не видел что бы откуда-то вылезли случайные значения, всегда либо '', либо 0 ну и т.д. 
 Что мне учить? Я видел эти ворнинги, но они не мешали мне компилировать проект.
 |  
|   | Вадим К (статус: Академик), 24 декабря 2009, 15:48 [#15]:Может просто автор вопроса последовал какому то странному туториалу и повыключал все "лишние предупреждения"? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 16:08 [#16]: Цитата (webkent): Я видел эти ворнинги, но они не мешали мне компилировать проект.  
 Ну тогда продолжай в том же духе.
 То, что у тебя либо 0, либо '' - это СЛУЧАЙНОСТЬ. И компилятор однозначно тебе об этом заявляет. Когда у тебя в большой проекте хрензнаетоткуда спонтанно будет вылезать ошибка, ты её до пенсии искать будешь.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 24 декабря 2009, 16:11 [#17]:Когда выполнение доходит до вызова функции, под все её локальные переменные выделяется память. Написал ты var i: Integer, 32-битная система выделяет под неё 4 байта. О том, что в этих 4х байтах было до этого, неизвестно и никем не обнуляется. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |