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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 416

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Дан двумерный массив 10*10 заполненый нолями,
нужно заменит случайным образом некоторые ноли на еденицы, но не больше десяти едениц как сделать не врубаюсь((

ierihon1 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 16 июня 2011, 16:44
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Gooddy

Здравствуйте, ierihon1!

Решение простое: в цикле 10 раз заполняем случайный элемент единицей.
Не заполнит гарантировано 10 элементов, но заполнит от 1 до 10 точно (на практике будет заполнено 7-10 элементов).

Приложение:
  1.  
  2.  
  3. procedure FillArray(var ArrayToFill: array of ...);
  4. var
  5. TotalCount: Byte;
  6. x, y: Integer;
  7. begin
  8. Randomize;
  9. for TotalCount := 1 to 10 do
  10. begin
  11. x := Random()*10;
  12. y := Random()*10;
  13. ArrayToFill[ x, y ] := 1;
  14. end;
  15. end;


Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 16 июня 2011, 16:56
Оценка за ответ: 4

Комментарий к оценке: Но нужно чтобы именно заданное количество... Но спасибо за помощь)

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

Всего сообщений: 37; последнее сообщение — 17 июня 2011, 09:35; участников в обсуждении: 4.

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

Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:02 [#1]:

нужно заменит случайным образом некоторые ноли на еденицы, но не больше десяти едениц как сделать не врубаюсь((

В вопросике ошибка. Написали бы 10 я бы и написал код для 10. Сейчас поправлю.
Чисти код! Чисти код! Чисти код!
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 17:04 [#2]:

Да и правда чуть неправильно сформулировал)
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:06 [#3]:

Не давать коду массив, в котором более 90% заполнено единицами - зависнет. Если не известно, что будет в массиве - лучше сделать проверку.

procedure FillArray(var ArrayToFill: array of ...);
var
  TotalCount: Byte;
  x, y:       Integer;
begin
  Randomize;
  TotalCount := 1;
  while ( TotalCount <= 10 ) do
  begin
    x := Random()*10;
    y := Random()*10;
    if ( ArrayToFill[ x, y ] <> 1 ) then
    begin
      ArrayToFill[ x, y ] := 1;
      Inc(TotalCount);
    end;
  end;
end;
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 16 июня 2011, 17:07 [#4]:

Цитата (ierihon1):

Да и правда чуть неправильно сформулировал)

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

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:08 [#5]:

Правильно: в нулевую матрицу подставить 10 единиц случайным образом.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:09 [#6]:

Кстати. По моему коду видно что я грешу магическими числами ;)
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 16 июня 2011, 17:13 [#7]:

Random()*10; - улыбнуло.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:14 [#8]:

min@y™: RandomRange в модуле math - лишние 500 байт.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:15 [#9]:

ierihon1: можно заменить Range*10 на Math.RandomRange(0,9), заодно округлять не придётся.
Чисти код! Чисти код! Чисти код!
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 17:21 [#10]:

Хм.. Что то не совсем так... иногда выдаёт десять но чаще 9.. иногда даже 7..

16 июня 2011, 17:23: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум » Pascal модератором Ерёмин А.А.

ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 17:25 [#11]:

Вот хотя бы спросили бы что правда ли это лабораторный практикум... я ж даже не учусь ни в коледже ни в универе ещё какая это может быть лаба?)))
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:42 [#12]:

Новый код выдаёт меньше 10 единиц?
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:43 [#13]:

Условие задачи очень похоже на задания преподов ;) они любят давать задачки на заполнение массива всякой хренью.
Чисти код! Чисти код! Чисти код!
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 17:48 [#14]:

Ну я задался проблемой написания игры "Сапёр" и да выдаёт то 7 то 9 иногда только 10..
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:51 [#15]:

procedure CreateArray( var ArrayToCreate: TArray );
var
  x, y: Byte;
begin
  for x := 0 to 9 do
    for y := 0 to 9 do
      ArrayToCreate[x, y] := 0;
end;
 
procedure PrintArray( var ArrayToPrint: TArray );
var
  x, y: Byte;
begin
  for x := 0 to 9 do
    for y := 0 to 9 do
      Form1.Memo1.Lines.Add( '[' + IntToStr( x ) + ', ' + IntToStr( y ) +
        ']' + ': ' + IntToStr( ArrayToPrint[x, y] ) );
end;
 
procedure FillArray( var ArrayToFill: TArray );
var
  TotalCount: Byte;
  x, y: Integer;
begin
  Randomize;
  TotalCount := 1;
  while ( TotalCount <= 10 ) do
  begin
    x := RandomRange( 0, 9 );
    y := RandomRange( 0, 9 );
    if ( ArrayToFill[x, y] <> 1 ) then
    begin
      ArrayToFill[x, y] := 1;
      Inc( TotalCount );
    end;
  end;
end;
 
procedure Tform1.Button1click( Sender: TObject );
var
  WorkArray: TArray;
begin
  CreateArray( WorkArray );
  PrintArray( WorkArray );
  FillArray( WorkArray );
  PrintArray( WorkArray );
end;

Стабильно - 10 элементов.

Ты же код не просто скопипастил, покажи как ты его отредактировал.
Чисти код! Чисти код! Чисти код!
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 17:53 [#16]:

program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Math;
 
type
  TMatrix = array [0..9,0..9] of integer;
 
var M:Tmatrix;
 
procedure MakeMatrix;
var i,j:integer;
begin
for i := 0 to 9 do
  for j := 0 to 9 do
    M[i,j] := 0;
end;
 
procedure FillArray(K:TMatrix);
var TotalCount: Byte;
    x,y: Integer;
begin
TotalCount := 0;
while ( TotalCount < 10 ) do
  begin
    x := Random(10);
    y := random(10);
    if ( K[ x, y ] <> 1 ) then
      begin
        M[ x, y ] := 1;
        Inc(TotalCount);
      end;
  end;
end;
 
Procedure WriteMatrix;
var i,j:Integer;
begin
for i := 0 to 9 do
begin
  for j := 0 to 9 do
    Write(M[i,j]);
  writeln;
end;
end;
 
begin
randomize;
MakeMatrix;
FillArray(M);
WriteMatrix;
readln;
end.
вот так
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 17:56 [#17]:

FillArray(var K:TMatrix);
K[ x, y ] := 1;

Пробуй
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 16 июня 2011, 18:01 [#18]:

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Math;
 
type
  TMatrix = array [0..9,0..9] of integer;
 
var M:Tmatrix;
 
procedure MakeMatrix;
var i,j:integer;
begin
for i := 0 to 9 do
  for j := 0 to 9 do
    M[i,j] := 0;
end;
 
procedure FillArray;
var TotalCount: Byte;
    x,y: Integer;
begin
TotalCount := 0;
while ( TotalCount < 10 ) do
  begin
    x := RandomRange(0,9);
    y := RandomRange(0,9);
    if ( M[ x, y ] <> 1 ) then
      begin
        M[ x, y ] := 1;
        Inc(TotalCount);
      end;
  end;
end;
 
Procedure WriteMatrix;
var i,j:Integer;
begin
for i := 0 to 9 do
begin
  for j := 0 to 9 do
    Write(M[i,j]);
  writeln;
end;
end;
 
begin
randomize;
MakeMatrix;
FillArray();
WriteMatrix;
readln;
end.

Стабильно 10 мин.
Чисти код! Чисти код! Чисти код!
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 18:02 [#19]:

    if ( K[ x, y ] <> 1 ) then
      begin
        M[ x, y ] := 1;
        Inc(TotalCount);
      end;
только сейчас заметил блин))
должно то быть так
    if ( M[ x, y ] <> 1 ) then
      begin
        M[ x, y ] := 1;
        Inc(TotalCount);
      end;
ierihon1

ierihon1 (статус: 1-ый класс), 16 июня 2011, 18:04 [#20]:

Gooddy: №18 сообщение отправь как ответ поставлю пятёрку)

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

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

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