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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2010, 15:14   #1
Ult1m
Новичок
Джуниор
 
Регистрация: 19.09.2010
Сообщений: 5
По умолчанию Не работает программа

Не работает программа, результат - только мерцание черного окошка.

Программа должна выводить массив чисел.
Заполнение происходит так:
-имеем массив 1 с целыми числами от 1 до 2000;
далее циклом. выполняется, пока массив 1 не будет пуст.
-получаем случайное число в диапазоне от 1 до 2000;
-записываем число в массив 2, который будет выводится;
-проверяем есть ли это число в массиве 1, если да, то вычеркиваем его из массива 1;
-проверяем массив 1 на пустоту, если пустой, то заканчиваем заполнение массива 2.

Код:
var
  M1 : array[1..2000] of integer; //массив для сравнения
  M2 : array of integer;
  k,i,j, u,x : integer;
  found, quit : boolean;
begin
  for i:= 1 to 2000 do   //запрлнение массива М1
    begin
      m1[i] := i;
    end;
    j:=1;    //счетчик для цикла

  repeat               //начало цикла для заполнения массива M2
   k:=random(2000); //получаем случайное число от 1 до 2000
   M2[j]:=k;     // записываем полученное число в динам. массив M2
   j:=j + 1;       //cчетчик +1
   u:=1;
        REPEAT // поиск значения k в массиве М1 и запись туда нуля
         if M1[u] = k then
            begin
             found:=true;
             M1[u]:= 0;
           end
          else u:=u+1;
        UNTIL (u > 2000) or (found = true);
    x:=1;
   while (quit =false) or (x>2000) do // все ли нули в массиве М1, если да,
                                  //то quit равно true для выхода из цикла
       begin
           if  m1[x] = 0 then
              quit:=true
               else quit:=false;
           x:=x+1;
       end;
  until quit = true;

  writeln(m2[4]); //вывод элемента массива М2, для теста всего один элемент
  readln;
end.

Последний раз редактировалось Ult1m; 19.09.2010 в 18:46.
Ult1m вне форума Ответить с цитированием
Старый 19.09.2010, 16:07   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

А кто будет SetLength для M2 делать?
Somebody вне форума Ответить с цитированием
Старый 19.09.2010, 17:01   #3
Ult1m
Новичок
Джуниор
 
Регистрация: 19.09.2010
Сообщений: 5
По умолчанию

добавил SetLength(М1,100000). и кстати, как задавать длину, если не известен конечный размер массива?

после запуска ошибка
Изображения
Тип файла: jpg Снимок.JPG (181.2 Кб, 153 просмотров)
Ult1m вне форума Ответить с цитированием
Старый 19.09.2010, 17:15   #4
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
Сообщение

Цитата:
добавил SetLength(М1,100000). и кстати, как задавать длину, если не известен конечный размер массива?
SetLength - и есть задание длины динамического массива.
Только вместо M1 впишите M2,M1 то имеет конечную длину 2000.
Из-за этого у Вас и вылетает Access Violation.
Цитата:
Не работает программа, результат - только мерцание черного окошка.
Запустите Вашу консольную программу из коммандной строки Windows и увидите,что она там пишет.
P.S.
С количеством итераций больше 5000 поаккуратней,сто тысяч итераций
не вздумайте делать без особой надобности.
Темы для WordPress. Русские WordPress шаблоны

Последний раз редактировалось Alexei91; 19.09.2010 в 17:24.
Alexei91 вне форума Ответить с цитированием
Старый 19.09.2010, 17:33   #5
Ult1m
Новичок
Джуниор
 
Регистрация: 19.09.2010
Сообщений: 5
По умолчанию

ошибся тут, длину я задал М2.
я имел ввиду другое про задание длины - конечная длина неизвестна, какое тогда число писать?

через cmd вот:
Изображения
Тип файла: jpg Снимок.JPG (34.4 Кб, 100 просмотров)

Последний раз редактировалось Ult1m; 19.09.2010 в 17:44.
Ult1m вне форума Ответить с цитированием
Старый 19.09.2010, 18:11   #6
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
Сообщение

Перед первым Repeat ставите
Код:
...
randomize;
  repeat              
   k:=random(2000);
...
Это устраняет Ваш Access Violation.
randomize - исключение повтора значений ГСЧ.
Цитата:
я имел ввиду другое про задание длины - конечная длина неизвестна, какое тогда число писать?
Размер динамического массива Вы меняете в программе через SetLength
- тут уже логика работы Вашего приложения.
Память под дин. массив соответственно выделяется динамически.
И все действия с дин. массивами происходят медленнее,
чем со статическими.
Возьмите любой нормальный учебник по Pascal/Delphi или найдите в Ин-те.
Темы для WordPress. Русские WordPress шаблоны

Последний раз редактировалось Alexei91; 19.09.2010 в 18:17.
Alexei91 вне форума Ответить с цитированием
Старый 19.09.2010, 18:31   #7
Ult1m
Новичок
Джуниор
 
Регистрация: 19.09.2010
Сообщений: 5
По умолчанию

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

немного упростил программу, убрал второй repeat. выдает 1 всегда. остальные элементы массива 2 равны 0.
Код:
var
  M1 : array[1..20] of integer; //массив для сравнения
  M2 : array of integer;
  k,i,j,x : integer;
  quit : boolean;
begin
  // randomize;
  for i:= 1 to 20 do   //запрлнение массива М1
    begin
      m1[i] := i;
    end;
    j:=1;    //счетчик для цикла
    setlength(M2,1000);
    quit:=false;
  repeat               //начало цикла для заполнения массива M2
   k:=1 + random(20); //получаем случайное число от 1 до 2000
   M2[j-1]:=k;     // записываем полученное число в динам. массив M2
   j:=j + 1;       //cчетчик +1
   M1[k]:= 0;
   x:=1;
   while (quit = false) or (x>20) do // все ли нули в массиве М1, если да,
                                  //то quit остается true для выхода из цикла
       begin
           if  M1[x] = 0 then
              quit:=true
               else quit:=false;
           x:=x+1;
       end;
  until quit = true;

  writeln(M2[0]); //вывод элемента массива М2
  readln;
end.

Последний раз редактировалось Ult1m; 19.09.2010 в 19:35.
Ult1m вне форума Ответить с цитированием
Старый 20.09.2010, 21:52   #8
Ult1m
Новичок
Джуниор
 
Регистрация: 19.09.2010
Сообщений: 5
По умолчанию

решение найдено
Ult1m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает программа looloo Помощь студентам 0 27.05.2010 21:53
не работает программа Rusic Общие вопросы C/C++ 2 19.05.2010 23:16
Не работает программа ddr9225 Общие вопросы C/C++ 21 14.01.2010 14:06
Программа не работает ZYRGiX Помощь студентам 2 22.07.2008 21:44
Программа не работает Михаил Юрьевич Общие вопросы Delphi 2 19.04.2008 23:27