|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|