Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 578

/ вопрос решён /

Здравствуйте!
вычислить среднее арифметическое положительных элементов для массивов A(N1), B(N2), C(N3) (N1,N2,N3<100) Используя процедуры или функции

ranet Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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;).

Приложение:
  1.  
  2.  
  3.  
  4.  
  5. begin
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17. end;
  18.  
  19.  
  20.  
  21. end;


Ответ отправил: webkent (статус: 2-ой класс)
Время отправки: 24 декабря 2009, 09:51
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 24 декабря 2009, 16:11; участников в обсуждении: 3.

24 декабря 2009, 09:17: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором min@y™ Причина: 100%-ная лаба

webkent

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™

min@y™ (статус: Доктор наук), 24 декабря 2009, 10:09 [#2]:

Цитата (webkent):

a: array of integer; //сам массив чисел

Смотри внимательнее, из какой темы перенесён вопрос. В турбопаскале нет динамических массивов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 10:12 [#3]:

Цитата (min@y™):

SrArif := round(SrArif / Length(a)); //Делим получившуюся сумму на количество чисел в массиве

Делить надо на количество положительных элементов, а не на количество всех. Результат должен быть дробным, а не округлённым. Переменную SrArif перед циклом надо обнулять.

Проведи работу над ошибками! :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

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™

min@y™ (статус: Доктор наук), 24 декабря 2009, 11:00 [#5]:

Цитата (webkent):

знак ">" заменяется на >. Точнее, не почему, а как сделать что бы не менялся =)


Это к автору движка сайта обращайся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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

webkent (статус: 2-ой класс), 24 декабря 2009, 11:35 [#7]:

Спасибо за замечания, а зачем обнулять их, разве локальные переменные не обнуляются когда заканчивается тело функции? А рандом в таком случае генерирует 101 число или 100 чисел?
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 11:53 [#8]:

Цитата (webkent):

разве локальные переменные не обнуляются когда заканчивается тело функции?

Учи матчасть.

Цитата (webkent):

А рандом в таком случае генерирует 101 число или 100 чисел?

Random(N) генерирует целые числа в диапазоне от 0 до (N - 1).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 24 декабря 2009, 14:32 [#9]:

понятно. Так можно узнать что там насчет переменных, в двух словах?
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 15:11 [#10]:

Цитата (webkent):

Так можно узнать что там насчет переменных, в двух словах?


Переменная - это ячейка памяти. Перед тем, как ты начинаешь с ней работать, в ней может находиться абсолютно любое значение. Поэтому переменные надо перед использованием инициализировать начальными значениями. Дельфовый компилятор даже ругается на неинициализированные переменные, и правильно делает.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 24 декабря 2009, 15:16 [#11]:

А, ты имел в виду это, а я про освобождение перед окончанием программы. Ну да, он ругается но ведь только на ссылочные типы данных, а значемые не обязательно инициализировать. (На сколько я помню)
Вадим К

Вадим К (статус: Академик), 24 декабря 2009, 15:33 [#12]:

"Значемые типы" - это какие? Integer что ли? освободить его конечно не получится. А так в целом, лучше объекты за собой освобождать. в объязательном порядке. Да, память то освободиться, файловые дескрипторы скорее всего гарантированно закроются. А вот некоторые типы мютексов могут не освободиться... Поэтому лучше просто чистить за собой.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

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

webkent (статус: 2-ой класс), 24 декабря 2009, 15:47 [#14]:

Ну я никогда не инициализировал типы, которые не обязательно и пока ни разу не видел что бы откуда-то вылезли случайные значения, всегда либо '', либо 0 ну и т.д.

Что мне учить? Я видел эти ворнинги, но они не мешали мне компилировать проект.
Вадим К

Вадим К (статус: Академик), 24 декабря 2009, 15:48 [#15]:

Может просто автор вопроса последовал какому то странному туториалу и повыключал все "лишние предупреждения"?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 16:08 [#16]:

Цитата (webkent):

Я видел эти ворнинги, но они не мешали мне компилировать проект.


Ну тогда продолжай в том же духе.
То, что у тебя либо 0, либо '' - это СЛУЧАЙНОСТЬ. И компилятор однозначно тебе об этом заявляет. Когда у тебя в большой проекте хрензнаетоткуда спонтанно будет вылезать ошибка, ты её до пенсии искать будешь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 16:11 [#17]:

Когда выполнение доходит до вызова функции, под все её локальные переменные выделяется память. Написал ты var i: Integer, 32-битная система выделяет под неё 4 байта. О том, что в этих 4х байтах было до этого, неизвестно и никем не обнуляется.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:28
Выполнено за 0.04 сек.