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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 682

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Помогите с решением задачки завтра нужно сдавать!Очень надеюсь на вашу помощь. У меня вопрос в том почему неполучается зарандомить змейку.Преподаватель сказал что нужно обязательно через рандом и что бы на экран выводилась сразу змейка заполненая случайными числами от
-2 до 2 .Паскаль

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. program matrix;
  2. uses crt;
  3. const n=8;
  4. var a:array[1..n,1..n] of real;
  5. sum,max,min:real;
  6. i,j:integer;
  7. Begin
  8. clrscr;
  9. randomize;
  10. for i:=1 to n do
  11. begin
  12. for j:=1 to n do
  13. begin
  14. a[i,j]:= -2+random(4)+random;
  15. if i mod 2=1 then a[i,j]:=(i-1)*n+j
  16. else a[i,j]:=i*n-j+1;
  17. write(a[i,j]:7:2);
  18. end;
  19. writeln;
  20. end;
  21. end.


SHEV Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SHEV (статус: Посетитель)
Вопрос отправлен: 19 октября 2011, 16:37
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Стоило отформатировать код и глянуть на него, всё сразу стало понятно.

program matrix;
 
uses
  crt;
 
const
  n = 8;
 
var
  a: array[1..n, 1..n] of real;
  sum, max, min: real;
  i, j: integer;
 
begin
  clrscr;
  randomize;
 
  for i:= 1 to n do
    begin
      for j:= 1 to n do
        begin
          { диапазон значений: -2.0 <= a[i, j] < 2.0
            Хотя не проще ли так?
            a[i, j]:= 2 * (Random - Random); }
          a[i, j]:= -2 + random(4) + random;
 
          { а вот тут у тебя полученной рандомное значение a[i, j]
            затирается новым значением В ЛЮБОМ СЛУЧАЕ. }
          if i mod 2 = 1
            then a[i, j]:= (i - 1) * n + j
            else a[i, j]:= i * n - j + 1;
 
          write(a[i, j]: 7: 2);
        end;
 
      writeln;
    end;
end.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 октября 2011, 17:04
Оценка за ответ: 4

Комментарий к оценке: Так что же нужно сделать что бы оно не затиралось?

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

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

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 19 октября 2011, 16:51 [#1]:

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

SHEV (статус: Посетитель), 19 октября 2011, 17:04 [#2]:

ну она получается заполняется целыми числами а мне нужно случайными вещественными ошибки нет. Описать матрицу вещественных элементов 8х8 в диапазоне от -2 до 2 .только что бы исходная матрица была сразу змейкой. Проще говоря змейка не рандомиться
min@y™

min@y™ (статус: Доктор наук), 19 октября 2011, 17:08 [#3]:

Цитата (SHEV):

ну она получается заполняется целыми числами а мне нужно случайными вещественными ошибки нет. Описать матрицу вещественных элементов 8х8 в диапазоне от -2 до 2 .только что бы исходная матрица была сразу змейкой. Проще говоря змейка не рандомиться

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

min@y™ (статус: Доктор наук), 19 октября 2011, 17:12 [#4]:

Цитата (SHEV):

Так что же нужно сделать что бы оно не затиралось?

Убрать лишние присваивания. Я не могу понять, зачем они?
if i mod 2 = 1
  then a[i, j]:= (i - 1) * n + j
  else a[i, j]:= i * n - j + 1;

Цитата (SHEV):

Оценка за ответ: 4

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

SHEV (статус: Посетитель), 19 октября 2011, 17:16 [#5]:

Мало что ли?))))давай 5 поставлю)))))))))))
SHEV

SHEV (статус: Посетитель), 19 октября 2011, 17:20 [#6]:

если массив запоняется четными значениями то (i-1)*n+j,иначе
i*-j+1;
Если я уберу присваивание условие перестанет работать
SHEV

SHEV (статус: Посетитель), 19 октября 2011, 17:20 [#7]:

я просто не знаю как проще сделать((((((((((
SHEV

SHEV (статус: Посетитель), 19 октября 2011, 17:36 [#8]:

По этому и помощи прошу
bugmenot

bugmenot (статус: 3-ий класс), 19 октября 2011, 17:38 [#9]:

Два раза Random, чтобы в два раза случайнее было?

Формула же: From + Random(To - From)
виконання програми розпочинається з того самого мiсця, де призупинилося.

SHEV

SHEV (статус: Посетитель), 19 октября 2011, 17:45 [#10]:

Формулу генератора можно поменять дело в том что змейка не заполняется этим самым рандомом

19 октября 2011, 18:54: Вопрос перемещён из тематического раздела Pascal » Общие вопросы в раздел Лабораторный практикум » Pascal модератором Ерёмин А.А.

min@y™

min@y™ (статус: Доктор наук), 19 октября 2011, 20:20 [#11]:

Цитата (SHEV):

Мало что ли?))))давай 5 поставлю)))))))))))

Зачем столько скобок? Нажми сюда.
Меня интересует, почему 4. Именно ПОЧЕМУ.

Цитата (SHEV):

если массив запоняется четными значениями то (i-1)*n+j,иначе i*-j+1; Если я уберу присваивание условие перестанет работать

Что за хрень? Тебе надо заполнить массив случайными вещественными значениями в диапазоне [-2; 2) или целыми, зависящими от индексов массива? Определись уже.

Цитата (SHEV):

только что бы исходная матрица была сразу змейкой. Проще говоря змейка не рандомиться

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

min@y™ (статус: Доктор наук), 19 октября 2011, 20:30 [#12]:

Цитата (SHEV):

если массив запоняется четными значениями то (i-1)*n+j,иначе i*-j+1; Если я уберу присваивание условие перестанет работать

А зачем? ЗАЧЕМ всё это?

Цитата (SHEV):

я просто не знаю как проще сделать((((((((((

А я до сих пор не понимаю, ЧТО ты хочешь сделать.

Цитата (SHEV):

По этому и помощи прошу

"поэтому" пишется слитно. Ты просишь помощи, но не говоришь, что тебе нужно. Как тебе помочь?

Цитата (bugmenot):

Формула же: From + Random(To - From)

Результат Random(x) = целое число в диапазоне 0..X - 1. © Матчасть. Твой КО.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SHEV

SHEV (статус: Посетитель), 19 октября 2011, 23:03 [#13]:

Вот собственно условия задачи
1.Описать матрицу 8х8 вещественных элементов
2.Заполнить элементы матрицы согласно варианту случайными вещественными числами в диапазоне от -N до N, где N -вариант (в моем случае вариант 2)
3.Распечатать элементы с помощью подпрограммы с указанием сумм по каждой строке и каждому столбцу,а так же общей суммы
4.Поменять местами строки с минимальной и максимальной суммами
min@y™

min@y™ (статус: Доктор наук), 20 октября 2011, 08:27 [#14]:

Тогда объясни, к какому пункту относится вот этот кусок кода:
if i mod 2 = 1
  then a[i, j]:= (i - 1) * n + j
  else a[i, j]:= i * n - j + 1;

Цитата (SHEV):

3.Распечатать элементы

Ты уверен, что именно "распечатать"? Конечно, это можно сделать и на турбо-паскале, если есть принтер, подключенный через LPT-порт, но, всё-таки, наверное, нужно просто вывести на экран, а?

Цитата (SHEV):

с помощью подпрограммы

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

min@y™ (статус: Доктор наук), 20 октября 2011, 09:39 [#15]:

Чтобы окончательно разбудить мозги и ради прикола:
{
Вот собственно условия задачи
1.Описать матрицу 8х8 вещественных элементов
2.Заполнить элементы матрицы согласно варианту случайными вещественными
  числами в диапазоне от -N до N, где N -вариант (в моем случае вариант 2)
3.Распечатать элементы с помощью подпрограммы с указанием сумм по каждой строке
  и каждому столбцу,а так же общей суммы
4.Поменять местами строки с минимальной и максимальной суммами
}
 
program p5682;
 
uses
  Crt;
 
const
  N = 8;
 
type
  TMatrix = array[0..N - 1, 0..N - 1] of Real;
 
procedure MakeMatrix(var X: TMatrix);
var
  Row, Col: Integer;
begin
 
  for Row:= 0 to N - 1 do
    for Col:= 0 to N - 1 do
      X[Row, Col]:= 4 * Random - 2;
end;
 
procedure PrintMatrix(const X: TMatrix; out MinRow, MaxRow: Integer);
var
  Row, Col: Integer;
  RowSum, Min, Max, Total: Real;
  ColSum: array[0..N - 1] of Real;
begin
  Min:= +3.0;
  Max:= -3.0;
  MinRow:= 0;
  MaxRow:= 0;
  Total:= 0;
 
  for Col:= 0 to N - 1 do {FillChar(ColSum, sizeof(ColSum), 0);}
    ColSum[Col]:= 0;
 
  for Row:= 0 to N - 1 do
    begin
      RowSum:= 0.0;
 
      for Col:= 0 to N - 1 do
        begin
          Write(X[Row, Col]: 6: 2);
          RowSum:= RowSum + X[Row, Col];
          ColSum[Col]:= ColSum[Col] + X[Row, Col];
          Total:= Total + X[Row, Col];
        end;
 
      if RowSum < Min
        then begin
               Min:= RowSum;
               MinRow:= Row;
             end;
 
      if RowSum > Max
        then begin
               Max:= RowSum;
               MaxRow:= Row;
             end;
 
      WriteLn('  RowSum = ', RowSum: 7: 2);
    end;
 
  for Col:= 0 to N - 1 do
    Write(ColSum[Col]: 6: 2);
 
  WriteLn(' <--- Sum of Cols');
  WriteLn(' Total sum:', Total: 6: 2, '; MinRow: ', MinRow, ' (', Min: 0: 2, '); MaxRow: ', MaxRow, ' (', Max: 0: 2,
')');
  WriteLn;
end;
 
procedure ExchangeMatrixRows(var X: TMatrix; const MinRow, MaxRow: Integer);
var
  Temp: Real;
  Col: Integer;
begin
  if MinRow = MaxRow
    then Exit;
 
  for Col:= 0 to N - 1 do
    begin
      Temp:= X[MinRow, Col];
      X[MinRow, Col]:= X[MaxRow, Col];
      X[MaxRow, Col]:= Temp;
    end;
end;
 
var
  X: TMatrix;
  MinRow, MaxRow: Integer;
 
begin
  Randomize;
  MakeMatrix(X);
  PrintMatrix(X, MinRow, MaxRow);
  ExchangeMatrixRows(X, MinRow, MaxRow);
  PrintMatrix(X, MinRow, MaxRow);
 
  ReadLn;
end.

Alt + F5:

 -2.00 -1.87  1.44 -1.19 -0.91  0.69 -0.73 -1.35  RowSum =   -5.92
 -0.51 -0.30 -1.67 -0.10 -1.72  1.36 -1.76 -0.83  RowSum =   -5.52
  1.67 -0.53  1.10 -0.69  0.79  1.38  0.87 -0.77  RowSum =    3.82
 -1.35 -0.68 -0.14 -1.01  1.30 -0.88 -0.07 -1.40  RowSum =   -4.24
  1.50 -0.85  1.09  1.91 -0.03  1.55  1.31 -1.92  RowSum =    4.56
 -1.44 -1.43  0.00 -1.91  0.37 -1.96  1.10  0.60  RowSum =   -4.66
  1.08  0.83  0.23 -1.18  0.72  0.37  1.82  0.58  RowSum =    4.46
  1.99 -1.02  0.70 -0.82 -1.66  1.09 -0.02  1.53  RowSum =    1.80
  0.95 -5.85  2.76 -4.99 -1.12  3.59  2.52 -3.57 <--- Sum of Cols
 Total sum: -5.71; MinRow: 0 (-5.92); MaxRow: 4 (4.56)
 
  1.50 -0.85  1.09  1.91 -0.03  1.55  1.31 -1.92  RowSum =    4.56
 -0.51 -0.30 -1.67 -0.10 -1.72  1.36 -1.76 -0.83  RowSum =   -5.52
  1.67 -0.53  1.10 -0.69  0.79  1.38  0.87 -0.77  RowSum =    3.82
 -1.35 -0.68 -0.14 -1.01  1.30 -0.88 -0.07 -1.40  RowSum =   -4.24
 -2.00 -1.87  1.44 -1.19 -0.91  0.69 -0.73 -1.35  RowSum =   -5.92
 -1.44 -1.43  0.00 -1.91  0.37 -1.96  1.10  0.60  RowSum =   -4.66
  1.08  0.83  0.23 -1.18  0.72  0.37  1.82  0.58  RowSum =    4.46
  1.99 -1.02  0.70 -0.82 -1.66  1.09 -0.02  1.53  RowSum =    1.80
  0.95 -5.85  2.76 -4.99 -1.12  3.59  2.52 -3.57 <--- Sum of Cols
 Total sum: -5.71; MinRow: 4 (-5.92); MaxRow: 0 (4.56)

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

bugmenot (статус: 3-ий класс), 20 октября 2011, 20:12 [#16]:

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

Результат Random(x) = целое число в диапазоне 0..X - 1.
Ты меня пытался чем-то удивить?

Или поциэнт не осиливает даже [0..1) на N умножить?
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 20 октября 2011, 20:37 [#17]:

Цитата (bugmenot):

Ты меня пытался чем-то удивить?
Или поциэнт не осиливает даже [0..1) на N уиножить?

Твои слова?

Цитата (bugmenot):


Формула же: From + Random(To - From)

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

bugmenot (статус: 3-ий класс), 20 октября 2011, 20:56 [#18]:

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

Как по твоей формуле получить вещественные числа
С минимальными изменениями. Могу покормить с ложечки, но за напиток.
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 20 октября 2011, 21:05 [#19]:

Цитата (bugmenot):

С минимальными изменениями.

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

SHEV (статус: Посетитель), 21 октября 2011, 11:17 [#20]:

Эта формула работает тогда когда ,изначально исходная матрица просто забита случайными числами потом перевожу ее в одномерный массив и тогда получается змейка, а что на с чет рандома почему так (по тому что если вводить другую формулу числа после запятой обнуляются) вот примерно так:

if i mod 2=1 then a[i,j]:=b[(i-1)*n+j]
змейка
else a[i,j]:=b[i*n-j+1]

до змейки уже забита матрица рандомом
просто предод говорит что это через жо.. , сделай проще говорит

Страницы: [1] [2] [Следующая »]

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

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