• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программа на Паскале

  • Автор темы Автор темы Raep
  • Дата начала Дата начала

Raep

Новые
Регистрация
25 Июл 2011
Сообщения
20
Реакции
0
Баллы
0
Программа на Паскале

Разработать функцию для подсчета количества нулевых элементов (с погрешностью Е) в массиве вещественных чисел.
Используя эту функцию определить номер строк матрицы вещественных чисел,в которых содержится ровно 2 элемента равных 0 с погрешностью 10 в -4.
 
Разработать функцию для подсчета количества нулевых элементов (с погрешностью Е) в массиве вещественных чисел.
Используя эту функцию определить номер строк матрицы вещественных чисел,в которых содержится ровно 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.
 
А не могли бы вы написать объяснение к этой программе? Разумеется , если не затруднит.
 
А не могли бы вы написать объяснение к этой программе? Разумеется , если не затруднит.
Попробую.
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. Всё!
 
Nz это значение переменной,это я понял,а К это что?
 
Возникла проблема.От меня требуют,чтобы Eps задавал сам пользователь,а не чтобы она была в константах.Объясните как это сделать
 
Возникла проблема.От меня требуют,чтобы Eps задавал сам пользователь,а не чтобы она была в константах.Объясните как это сделать
Очень странное требование. В условии задачи четко указана величина погрешности - так причем тут пользователь? И потом - диапазон изменения значений элементов массива у меня подобран именно исходя из предложенного значения погрешности, так, чтобы для некоторой части строк условие с высокой вероятностью выполнялось - а тут как быть прикажете? Дурдом полный... Ну ладно, сейчас выдам два варианта с коррекцией диапазона и без таковой. Сами выберите, что Вам надо.
 
Значит, так. Со вторым вариантом ничего не выходит - подобрать диапазон так, чтобы получалось разумное количество строк с двумя нулями практически невозможно. Поэтому вот вам первый вариант, в котором диапазон значений элементов матрицы определяется через вводимую пользователем погрешность:
Код:
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.
 
Спасибо за помощь,но я начинаю осознавать,что мой преподаватель тупее меня. Требует он,чтобы эта погрешность была в самой функции.Я возможно написал чушь,т.к. с информатикой не дружу вообще.Вообщем она должна быть входным параметром,вроде так.
 
Вообщем она должна быть входным параметром,вроде так.
Да пожалуйста:
Код:
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.
Спасибо за помощь,но я начинаю осознавать,что мой преподаватель тупее меня.
Насчет Вас - не уверен, а вот что бы я сделал с подобными идиотами-преподавателями, которые норовят выхолостить самое главное в обучении начинающих программистов - творческое начало - сказал бы, ну да ладно. Сюда всё-таки дамы заходят.
 
Спасибо вам огромное)
 
Назад
Сверху