Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 19:54   #1
Сэм
Пользователь
 
Регистрация: 12.04.2009
Сообщений: 31
Восклицание Ошибка 202

Здравствуйте, люди добрые! Наставьте на путь истинный!
Задание: Сформировать двумерный массив F размером 2 x 8 с помощью генератора случайных чисел и вывести элементы массива на экран и в файл. В строке матрицы F, содержащей максимальный элемент, заменить все отрицательные числа нулями (оформить нахождение максимального элемента в виде функции). Вывести на экран и в файл номер этой строки и максимальный элемент.
Я пошёл следующим путём:
uses crt;
type mass=array [1..2,1..8] of real;
func=function (b:mass): real;
var F:mass;
procedure preobr (var a:mass);
var x,y: integer;
max: func;
begin
x:=1; for y:=1 to 8 do
if (max(f)=a[x,y]) and (a[x,y]<0) then a[x,y]:=0
else x:=2; for y:=1 to 8 do a[x,y]:=0;
end;
function max (b:mass): real; far;
var x,y: integer;
begin
max:=b[1,1];
for x:=1 to 2 do
for y:=1 to 8 do
if b[x,y]>max(b) then max:=b[x,y];
end;
var x,y: integer;
c: text;
begin
assign (c,'f:\');
rewrite (c);
clrscr;
randomize;
for x:=1 to 2 do
for y:=1 to 8 do
f[x,y]:=random*20-10;
x:=1; for y:=1 to 8 do write (f[x,y]:7:3);
writeln;
x:=2; for y:=1 to 8 do write (f[x,y]:7:3);
x:=1; for y:=1 to 8 do write (c,f[x,y]:7:3);
x:=2; for y:=1 to 8 do write (c,f[x,y]:7:3);
writeln;
writeln (c);
max (f);
preobr (f);
writeln ('максимальный элемент=',max (f):5:3,' в строке:',x);
append (c);
close (c);
x:=1; for y:=1 to 8 do write (f[x,y]:7:3);
writeln;
x:=2; for y:=1 to 8 do write (f[x,y]:7:3);
end.
Запускаю всё это дело и выдаётся: "Not enough to run program."
В чём я не прав и где ошибка, подскажите?
Сэм вне форума Ответить с цитированием
Старый 24.04.2009, 20:26   #2
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

program XXX в начале написал?
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 24.04.2009, 20:53   #3
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Поправил прогу...правил в дельфи поэтому чтобы запустилось в Паскале придётся убрать строчку {$APPTYPE CONSOLE}.
Код:
program Project1;

{$APPTYPE CONSOLE}
type
  mass=array [1..2,1..8] of real;
var
  x,y: integer;
procedure preobr (maximum:real;var a:mass);
var
  nomer_stroki:1..2;
begin
  for x := 1 to 2 do
    for y := 1 to 8 do
      if maximum=a[x,y] then nomer_stroki:=x;
  for y := 1 to 8 do
    if a[nomer_stroki,y]<0 then a[nomer_stroki,y]:=0;
end;
function max (b:mass): real;
var
  x,y: integer;
  max1:real;
begin
  max1:=b[1,1];
  for x:=1 to 2 do
    for y:=1 to 8 do
      if b[x,y]>max1 then max1:=b[x,y];
max:=max1;
end;
var
  c: text;
  max_element: real;
  f:mass;
begin
  assign (c,'f:\text.txt');
  rewrite (c);
  randomize;
  for x:=1 to 2 do
    for y:=1 to 8 do
      f[x,y]:=random*20-10;
  for x:=1 to 2 do
  begin
    for y:=1 to 8 do
    begin
      write (f[x,y]:7:3);
    end;
    writeln;
  end;
  max_element:=max (f);
  preobr (max_element,f);
  writeln ('max element= ',max_element:5:3,' v stroke:',x);
  writeln (c,max_element:7:3);
  writeln (c,x);
  close (c);
  for x:=1 to 2 do
  begin
    for y:=1 to 8 do
    begin
      write (f[x,y]:7:3);
    end;
    writeln;
  end;
  readln;
end.
Теперь несколько вопросов...

1. Зачем тебе в проге был нужен uses.crt? (я его отключил...clrscr тоже)
2. откомментируй строчку
Код:
append (c);
3. откомментируй строчку
Код:
assign (c,'f:\');
4. откомментируй строчку
Код:
writeln (c);
5. зачем массив объявлен глобально?
Код:
F:mass;
, если он передаётся от функции к функции...
6. построчно напиши комментарии к функции
Код:
function max (b:mass): real; far;
var x,y: integer;
begin
max:=b[1,1];
for x:=1 to 2 do
for y:=1 to 8 do
if b[x,y]>max(b) then max:=b[x,y];
end;
и кстати...что такое far? Это уже реально непонятно Паскаль учил недолго..каюсь

П.С. У тебя очень необычный вывод двумерного массива....

Последний раз редактировалось Troi666; 24.04.2009 в 21:05.
Troi666 вне форума Ответить с цитированием
Старый 25.04.2009, 16:00   #4
Сэм
Пользователь
 
Регистрация: 12.04.2009
Сообщений: 31
По умолчанию

Я попытаюсь ответить на вопросы и прошу сделать снисхождение поскольку, пока ещё, сам "чайник", почему,собственно, и обратился за помощью. И всё же:
1. С первым пунктом согласен, даже ответить нечего.
2. append (c) - инициирует запись в ранее существовавший текстовый файл для его расширения.
3. assign (c,f:\) - стандартная процедура, в результате которой файловая переменная (с) связывается с именем файла (f:\). Но здесь я имя файла не дописал, только путь обозначил, т.к. имя может быть любым, в принципе.
4. writeln (c) - переводит курсор на следующую строку в текстовом файле.
5. На этот вопрос ответить не могу, честно говоря, не знаю.
6. Я пытался вычислить максимальное число, если что не так, то подскажите. А far - стандартная директива, для установления правильных связей функции с процедурой, ведь я пытался обозначить параметр-функцию. Если и здесь что не так, прошу подсказать в чём ошибка. Указанная функция должна передаваться в качестве фактических параметров вызова.
А вывод массива такой потому, что так попросили, я не указал это условие в задании.
В любом случае я благодарю Вас, Troi666, за подсказки!!!
Я воспользовался Вашими советами и отредактировал программу. В результате её выполнения всё время получается, что максимальный элемент находится в строке 2, даже если он в строке 1.Почему так?

Последний раз редактировалось Сэм; 25.04.2009 в 17:30.
Сэм вне форума Ответить с цитированием
Старый 25.04.2009, 16:31   #5
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

по пунктам

2 - понимаешь в чём штука... append(имя_файла) - открывает файл с установкой курсора в его конец...А ты файл-то и не закрывал до этого места. А во-вторых после ввода в файл массива
Код:
x:=1; for y:=1 to 8 do write (c,f[x,y]:7:3);
x:=2; for y:=1 to 8 do write (c,f[x,y]:7:3);
курсор у тебя и так будет в самом конце файла

3. ты прав...только одно "но"...если ты хочешь работать с любым файлом, тебе нужно указать имя переменной, в которой будет храниться его имя, а не букву диска! допустим так:

Код:
var
  string: imya_faila
begin
  writeln('Vvedite imya faila: ');
  readln(imya_faila);
  assign(c,imya_faila);
end.
4- верно

5-понимаешь в чём фишка..раз ты массив объявил глобально, тогда тебе его не нужно передавать в функции и процедуры Они его и так будут знать

6 -
Код:
function max (b:mass): real; far; (*функция принимает массив b и выдаёт вещественный результат *)
var x,y: integer; (*объявлены локальные переменные x и y*)
begin
max:=b[1,1]; (*имени функции присваиваем значение элемента 1,1 (имени функции мы обычно присваиваем то, что она должна вернуть в прогу). 
Заметь, что мы это присвоили не переменной max: func;, так как локальные переменные главнее глобальных *)
for x:=1 to 2 do (*внешний цикл по строкам*)
for y:=1 to 8 do (*и внутренний по столбцам*)
if b[x,y]>max(b) then max:=b[x,y]; (*а это самое интересное :) Если проверяемый элемент массива больше результата функции max
с параметром этого массива....на этом месте в эту же функцию передаётся этот же массив
...потом мы доходим снова до этого места и опять передаём в неё массив...и снова...и снова...и снова...
вот и получается бесконечная рекурсия :) тобишь вызов функции бесконечное число раз *)
end;

Последний раз редактировалось Troi666; 25.04.2009 в 16:33.
Troi666 вне форума Ответить с цитированием
Старый 25.04.2009, 17:32   #6
Сэм
Пользователь
 
Регистрация: 12.04.2009
Сообщений: 31
По умолчанию

Я понял! ОГРОМНОЕ СПАСИБО!!!
Сэм вне форума Ответить с цитированием
Старый 25.04.2009, 17:35   #7
Сэм
Пользователь
 
Регистрация: 12.04.2009
Сообщений: 31
По умолчанию

Я ПОНЯЛ! ОГРОМНОЕ СПАСИБО!!!
Я отредактировал прогу и в результате её выполнения почему-то получается, что максимальный элемент всегда в строке 2. Почему?
Сэм вне форума Ответить с цитированием
Старый 25.04.2009, 17:51   #8
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Отредактированный код в студию
Troi666 вне форума Ответить с цитированием
Старый 10.05.2009, 19:13   #9
Сэм
Пользователь
 
Регистрация: 12.04.2009
Сообщений: 31
По умолчанию

Program Project;
Uses crt;
Type mass=array [1..2,1..8] of real;
Func=function (a: mass): real;
Var x,y: integer;
Procedure preobr (max: func; var a: mass);
Var nomer_stroki: integer; maximum: real;
Begin
Maximum:=max (a);
If maximum=a[x,y] then nomer_stroki:=x;
For y:=1 to 8 do
If a[nomer_stroki,y]<0 then a[nomer_stroki,y]:=0;
End;
Function max (b: mass): real; far;
Var x,y: integer; max1: real;
Begin
Max1:=b[1,1];
For x:=1 to 2 do
For y:=1 to 8 do
If b[x,y]>max1 then max1:=b[x,y];
Max:=max1;
End;
Var max_el: real; c: text; f: mass;
Begin
Assign (c, ‘f:\project.txt’);
Rewrite (c);
Clrscr;
Randomize;
For x:=1 to 2 do
For y:=1 to 8 do
F[x,y]:=random*20-10;
For x:=1 to 2 do
Begin
For y:=1 to 8 do
Begin
Write (f[x,y]:7:3);
End;
Writeln;
End;
For x:=1 to 2 do
Begin
For y:=1 to 8 do
Begin
Write (c, f[x,y]:7:3);
End;
Writeln (c);
End;
Max_el:=max (f);
Preobr (max,f);
Writeln (‘Максимальный элемент = ’, max_el:6:3, ‘в строке’, x);
Writeln (c, ‘Maximal element =’, max_el:6:3);
Writeln (c, ‘v stroke’, x);
Close (c);
For x:=1 to 2 do
Begin
For y:=1 to 8 do
Begin
Write (f[x,y]:7:3);
End;
Writeln;
End;
Readln;
End.
Сэм вне форума Ответить с цитированием
Старый 10.05.2009, 20:03   #10
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Troi666 Посмотреть сообщение
Код:
function max (b:mass): real; far; (*функция принимает массив b и выдаёт вещественный результат *)
Напомнило ТОП 10 самых раздражающих факторов для программиста

Цитата:
Сообщение от zloykif
10. Комментарии, которые объясняют "как", но не объясняют "зачем"

Еще в институте, на курсе программирования, нас учили что код необходимо комментировать, и максимально полно. Всегда лучше иметь слишком много комментариев, чем слишком мало. К сожалению, данная рекомендация иногда перерастает совсем уж в паранойю — программист комментирует каждую строчку кода. Например:

Код:
$r = $n/2; // Устанавливаем $r равным $n поделенное пополам
// Цикл выполняется до тех пор пока $r — ($n/$r) больше $t
while (abs($r — ($n/$r)) > $t) {
$r = 0.5 * ($r + ($n/$r)); // Устанавливаем $r равное половине $r + ($n/$r)
}
Вы имеете хоть малейшее представление что этот код делает? Я — нет. Даже после 100 грамм. Данный код является прекрасной демонстрацией проблемы, когда комментарии описывают что делает код, но никак не описывают зачем он это делает.

Для контраста приведу пример этого же кода, но с нормальными комментариями:

Код:
// Вычисление квадратного корня из n методом Ньютона — Рафсона
$r = $n/2;

while (abs($r — ($n/$r)) > $t) {
$r = 0.5 * ($r + ($n/$r));
}
С такими комментариями уже понятно для чего предназначен данный код.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44
Ошибка!! Blackmore БД в Delphi 0 10.05.2008 11:43
ОШИБКА YLIANOVA83 Microsoft Office Word 5 07.03.2008 15:02