Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 09.06.2012, 08:39   #1 (permalink)
Raep
Member
 
Регистрация: 25.07.2011
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Программа на Паскале

Разработать функцию для подсчета количества нулевых элементов (с погрешностью Е) в массиве вещественных чисел.
Используя эту функцию определить номер строк матрицы вещественных чисел,в которых содержится ровно 2 элемента равных 0 с погрешностью 10 в -4.
Raep вне форума   Ответить с цитированием

Старый 09.06.2012, 08:39
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Эти темы могут вам помочь

Программа вычисления интеграла на Паскале
Программа на Паскале
Программа на паскале

Старый 09.06.2012, 09:56   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Raep Посмотреть сообщение
Разработать функцию для подсчета количества нулевых элементов (с погрешностью Е) в массиве вещественных чисел.
Используя эту функцию определить номер строк матрицы вещественных чисел,в которых содержится ровно 2 элемента равных 0 с погрешностью 10 в -4.
Да пожалуйста - какие проблемы?
Код:
Const
 Nmax=8;
 Eps=0.0001;

Type
 Vector=Array[1..Nmax] of Real;

Var
 A:Array[1..Nmax] of Vector;
 i,j,N,p:Byte;

Function N_zero(D:Vector;M:Byte):Byte;
var
 k,Nz:byte;
begin
 Nz:=0;
 For k:=1 to M do
  If Abs(D[k])<Eps then Inc(Nz);
 N_zero:=Nz;
end;

Begin
 Randomize;
 Write('N= ');
 Readln(N);
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     A[i][j]:=(Random-0.5)/1000;
     Write(A[i][j]:9:5);
    end;
   Writeln;
  end;
 Writeln;
 Writeln('Numbers of lines containing 2 zero elements:');
 p:=0;
 For i:=1 to N do
  If N_zero(A[i],N)=2 then
   begin
    Inc(p);
    Write(' ',i);
   end;
 If p=0 then Writeln('No such lines!');
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 13.06.2012, 14:54   #3 (permalink)
Raep
Member
 
Регистрация: 25.07.2011
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

А не могли бы вы написать объяснение к этой программе? Разумеется , если не затруднит.
Raep вне форума   Ответить с цитированием
Старый 13.06.2012, 15:34   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Raep Посмотреть сообщение
А не могли бы вы написать объяснение к этой программе? Разумеется , если не затруднит.
Попробую.
1. Задаются константы:
а) Nmax - максимальный размер массива
б) Eps - точность
2. Вводится тип Vector - одномерный массив вещественных чисел длиной Nmax.
3. Определяются переменные:
а) А - матрица размерности Nmax x Nmax, причем задается она не как двумерный массив, а как одномерный массив векторов-строк.
б) всякие переменные типа Byte (реальный размер массива, переменные циклов и т.п.)
4. Задается функция N_zero, входными параметрами которой являются вектор и его длина, а возвращает она количество нулевых элементов в векторе.
5. Запускается генератор случайных чисел.
6. По запросу программы вводится реальная (N) размерность матрицы.
7. Матрица заполняется случайными числами в диапазоне от -0.0005 до +0.0005.
8. На экран выводится заголовок: "Номера строк, содержащих 2 нулевых элемента:".
9. Флажку p присваивается значение, равное 0.
10. Организуется цикл по вектор-строкам матрицы. Если число, возвращаемое функцией N_zero, аргументом которой является текущая строка, равно 2 (т.е. строка содержит 2 нулевых элемента), то номер такой строки выводится на экран и значение флажка p увеличивается на 1.
11. Если по окончании цикла значение p по-прежнему равно нулю, то выводится сообщение "таких строк нет!".
12. Дается команда остановки выполнения, чтобы можно было увидеть результат.
13. Всё!
Vladimir_S вне форума   Ответить с цитированием
Старый 13.06.2012, 18:29   #5 (permalink)
Raep
Member
 
Регистрация: 25.07.2011
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Nz это значение переменной,это я понял,а К это что?
Raep вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 13.06.2012, 19:33   #6 (permalink)
Raep
Member
 
Регистрация: 25.07.2011
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Возникла проблема.От меня требуют,чтобы Eps задавал сам пользователь,а не чтобы она была в константах.Объясните как это сделать
Raep вне форума   Ответить с цитированием
Старый 13.06.2012, 19:50   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Raep Посмотреть сообщение
Возникла проблема.От меня требуют,чтобы Eps задавал сам пользователь,а не чтобы она была в константах.Объясните как это сделать
Очень странное требование. В условии задачи четко указана величина погрешности - так причем тут пользователь? И потом - диапазон изменения значений элементов массива у меня подобран именно исходя из предложенного значения погрешности, так, чтобы для некоторой части строк условие с высокой вероятностью выполнялось - а тут как быть прикажете? Дурдом полный... Ну ладно, сейчас выдам два варианта с коррекцией диапазона и без таковой. Сами выберите, что Вам надо.
Vladimir_S вне форума   Ответить с цитированием
Старый 13.06.2012, 20:03   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Значит, так. Со вторым вариантом ничего не выходит - подобрать диапазон так, чтобы получалось разумное количество строк с двумя нулями практически невозможно. Поэтому вот вам первый вариант, в котором диапазон значений элементов матрицы определяется через вводимую пользователем погрешность:
Код:
Const
 Nmax=8;

Type
 Vector=Array[1..Nmax] of Real;

Var
 A:Array[1..Nmax] of Vector;
 i,j,N,p:Byte;
 Eps:Real;

Function N_zero(D:Vector;M:Byte):Byte;
var
 k,Nz:byte;
begin
 Nz:=0;
 For k:=1 to M do
  If Abs(D[k])<Eps then Inc(Nz);
 N_zero:=Nz;
end;

Begin
 Randomize;
 Write('N= ');
 Readln(N);
 Write('Eps= ');
 Readln(Eps);
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     A[i][j]:=(Random-0.5)*Eps*10;
     Write(A[i][j]:9:5);
    end;
   Writeln;
  end;
 Writeln;
 Writeln('Numbers of lines containing 2 zero elements:');
 p:=0;
 For i:=1 to N do
  If N_zero(A[i],N)=2 then
   begin
    Inc(p);
    Write(' ',i);
   end;
 If p=0 then Writeln('No such lines!');
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 14.06.2012, 10:51   #9 (permalink)
Raep
Member
 
Регистрация: 25.07.2011
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо за помощь,но я начинаю осознавать,что мой преподаватель тупее меня. Требует он,чтобы эта погрешность была в самой функции.Я возможно написал чушь,т.к. с информатикой не дружу вообще.Вообщем она должна быть входным параметром,вроде так.
Raep вне форума   Ответить с цитированием
Старый 14.06.2012, 11:16   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Raep Посмотреть сообщение
Вообщем она должна быть входным параметром,вроде так.
Да пожалуйста:
Код:
Const
 Nmax=8;

Type
 Vector=Array[1..Nmax] of Real;

Var
 A:Array[1..Nmax] of Vector;
 i,j,N,p:Byte;
 Eps:Real;

Function N_zero(D:Vector;M:Byte;E:real):Byte;
var
 k,Nz:byte;
begin
 Nz:=0;
 For k:=1 to M do
  If Abs(D[k])<E then Inc(Nz);
 N_zero:=Nz;
end;

Begin
 Randomize;
 Write('N= ');
 Readln(N);
 Write('Eps= ');
 Readln(Eps);
 For i:=1 to N do
  begin
   For j:=1 to N do
    begin
     A[i][j]:=(Random-0.5)*Eps*10;
     Write(A[i][j]:9:5);
    end;
   Writeln;
  end;
 Writeln;
 Writeln('Numbers of lines containing 2 zero elements:');
 p:=0;
 For i:=1 to N do
  If N_zero(A[i],N,Eps)=2 then
   begin
    Inc(p);
    Write(' ',i);
   end;
 If p=0 then Writeln('No such lines!');
 Readln
End.
Цитата:
Сообщение от Raep Посмотреть сообщение
Спасибо за помощь,но я начинаю осознавать,что мой преподаватель тупее меня.
Насчет Вас - не уверен, а вот что бы я сделал с подобными идиотами-преподавателями, которые норовят выхолостить самое главное в обучении начинающих программистов - творческое начало - сказал бы, ну да ладно. Сюда всё-таки дамы заходят.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 02:02.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.