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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 09:57   #1
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию Массив с определенным количеством цифр

Есть программа, которая создает массив любого размера до 20 на 20 элементов и забивает его значениями от 0 до 9.
Код:
uses crt;
const nmax=20;
var a:array[1..nmax+1,1..nmax] of integer;
    n,m,i,j:byte;
    x:integer;
begin
clrscr;
randomize;
repeat
write('Количество строк=');
readln(m);
until m in [1..nmax];
repeat
write('Количество столбцов=');
readln(n);
until n in [1..nmax];
for i:=1 to m do
for j:=1 to n do
a[i,j]:=random(10);
writeln('Исходная матрица:');
for i:=1 to m do
 begin
  write(' ':9);
  for j:=1 to n do
  write(a[i,j]:4);
  writeln;
end;
readln;
end.
Как сделать так, чтобы она создавала точно такой же массив, но с определенным содержанием количества цифр, например нулей?
Количество нулей в формируемом массиве должно задаваться вручную с клавиатуры.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 03.05.2011, 10:49   #2
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Всё, тему можно закрывать, придумал сам
Код:
uses crt;
const nmax=20;
var a:array[1..nmax+1,1..nmax] of integer;
    n,m,i,j,k:byte;
    x:integer;
begin
clrscr;
randomize;
repeat
write('Количество строк=');
readln(m);
until m in [1..nmax];
repeat
write('Количество столбцов=');
readln(n);
until n in [1..nmax];
write('Количество нулей=');
readln(k);
for i:=1 to m do
for j:=1 to n do
a[i,j]:=random(9)+1;
repeat
i:=random(m)+1;
j:=random(n)+1;
a[i,j]:=0;
dec(k);
until k=0;
writeln('Исходная матрица:');
for i:=1 to m do
 begin
  write(' ':9);
  for j:=1 to n do
  write(a[i,j]:4);
  writeln;
end;
readln;
end.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 03.05.2011 в 11:02.
rainbow вне форума Ответить с цитированием
Старый 03.05.2011, 11:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в целом правильно. можно и так решить задачу. Но в вашем алгоритме есть "косячок-с".
Не проверяется, что в записываемой ячейке уже не стоит ноль.
попробуйте взять матрицу 5 на 5, например и задать количество нулей (K) равным, например, 20.
А потом проверьте, сколько реально нулей получится после вашего кода...

p.s. исправить это можно так:
Код:
if a[i,j]<>0 then begin
  a[i,j]:=0;
  dec(k);
end;
ТОЛЬКО ОБЯЗАТЕЛЬНО ДОБАВЬТЕ ПРОВЕРКУ, K должно быть меньше-равно произведения N*M

кстати, я бы поступил не так.
1) заполнил массив K нулями (прямо подряд)
2) заполнил оставшиеся элементы массива значениями RANDOM(xxx)+1;
3) перемешал содержимое массива...
так может и не проще, но чуть-чуть эффективнее...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2011, 14:57   #4
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Не проверяется, что в записываемой ячейке уже не стоит ноль.
А в записываемой ячейки нуля быть и не может, так как массив формируется командой
Код:
a[i,j]:=random(9)+1
То есть случайное значение от 0 до 8 и плюс 1, получается от 1 до 9.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 03.05.2011, 15:32   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
в записываемой ячейки нуля быть и не может, так как массив формируется командой
глупости говорить изволите!
Цитата:
Код:
a[i,j]:=0;
нули появляются в процедуре, которая пишет нули по случайным координатам.
С очень высокой долей вероятности вы попадёте в ячейку, куда раньше (в этом же цикле уже записали ноль!

Ну неужели запустить ВАШУ же программу, задать 5 строк, 5 столбцов, 20 нулей.
и посчитать, сколько циферок НЕ Равно нулю (а потом от 25 отнять это число, получится РЕАЛЬНОЕ число нулей) - это так сложно?!!

Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив,номер столбца с максимальным количеством четных элементов nondeadlollipop Помощь студентам 4 01.11.2010 07:32
массив с количеством элементов N. Напечатать те его элементы, индексы которых являются степенями двойки Маськ@ Паскаль, Turbo Pascal, PascalABC.NET 4 12.12.2008 16:34
Массив структур с заранее неизвестным количеством элементов, С++ PersonaGrata Общие вопросы C/C++ 8 24.02.2008 16:34
как вывести число с ограниченным количеством цифр после запятой? delphi Ensoph Помощь студентам 1 02.10.2007 07:50