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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 00:35   #1
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию Нули в матрице

Здраствуйте,скажите пожалуйста,что не так?(почему нули в матрице,и почему матрица такая)
Код:
uses crt,dos;
const  m = 100;
type mas=array[1..m] of integer;
var
a:mas;
i,d,sr,ob,fir,n:integer;
hour,min,sec,hund:word;
  t,t1,t2:longint;

    Procedure Rand(n:integer; var a:mas);
   var i:integer;
   begin
    writeln('Sluchaino array');
    for i:=1 to n do
     begin
     a[i]:=random(2*d+1)-d;
     end;
     end;
    procedure Sam(n:integer; var a:mas );
var
i:integer;
   begin
    writeln('Samostoiatelno array');
     for i:=1 to n do
     begin
      write('a[',i,'] = ');
     readln(a[i]);
        end;
       end;


  procedure Kuk(var a :mas);
  var
  m,sr,ob,i,l,r,c,j:integer;
   begin
sr:=0;
ob:=0;
   For i:=2 to n do
    begin
sr:=sr+1;
     c:=a[i]; l:=1;r:=i;
      while l<r do
       begin
ob:=ob+1;
          m:=(l+r) div 2;
          if a[m]<=c then l:=m+1 else r:=m;
       end;
      for j:=i downto r+1 do
       a[j]:=a[j-1];
      a[r]:=c;
     end;
      end;


begin
        clrscr;
        writeln('Vvedite kol-vo elementov ');
        read(n);
        writeln('1-sluchainuie chisla');
        writeln('2-vvodit vruchnuiu');
        writeln('Vash vibor');
        readln(fir);
        case fir of
        1:Rand(n,a);
        2:Sam(n,a);
        end; 
         begin
         Kuk(a);
writeln('Otsortirovannui massiv: ');
for i := 1 to m do
write(a[i]:4);
             begin
              writeln;
              GetTime(hour,min,sec,hund);
             writeln(hour,':',min,':',sec,':',hund);
              t1:=sec*1000+min*60000+hund*10;
              {sort(1,n);}
              delay(1000);
              GetTime(hour,min,sec,hund);
              writeln(hour,':',min,':',sec,':',hund);
              t2:=sec*1000+min*60000+hund*10;
                t:=t2-t1;
                 writeln;
               writeln('t1=',t1);
              writeln('t2=',t2);
               writeln('t=',t);

writeln('Kol-vo sravnenii=',sr);
write('Kol-vo obmenov=',ob);
readln
end;
end;
end.

вот исход Vvedite kol-vo elementov
5
1-sluchainuie chisla
2-vvodit vruchnuiu
Vash vibor
1
Sluchaino array
Otsortirovannui massiv:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

22:34:54:56
22:34:54:56

t1=62944
t2=62944
t=0
Kol-vo sravnenii=0
Kol-vo obmenov=0
lialia вне форума Ответить с цитированием
Старый 28.03.2013, 00:58   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

random(2*d+1)-d - при беглом просмотре не увидел нигде инициализации переменной d хоть каким-нибудь значением (глобальная переменная инициализируется нулем с большой долей вероятности). Тогда данное выражение представляет собой random(1) - число из [0,1), т.е. ноль.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.03.2013, 01:13   #3
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

вот тут поставила d:
Код:
 Procedure Rand(n:integer; var a:mas);
   var i,d:integer;
   begin
    writeln('Sluchaino array');
    for i:=1 to n do
     begin
     a[i]:=random(2*d+1)-d;
     end;
     end;
получилось такое
Код:
Vvedite kol-vo elementov
5
1-sluchainuie chisla
2-vvodit vruchnuiu
Vash vibor
1
Sluchaino array
Otsortirovannui massiv:
 -27 -26 -16 -12  20   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

23:11:41:52
23:11:41:52

t1=46160
t2=46160
t=0
Kol-vo sravnenii=0
Kol-vo obmenov=0
lialia вне форума Ответить с цитированием
Старый 28.03.2013, 01:31   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Во всю программу я не вникал (да уж и сил нет - ночь на дворе).
Вы объявили локальную переменную, но НЕ ИНИЦИАЛИЗИРОВАЛИ ее.
Локальные переменные, обычно, содержат изначально мусор.
Заполнение матрицы произошло, хотя в следующий раз может так не повезти.
Лучше сделайте Procedure Rand(n,d:integer; var a:mas); и вызывайте Rand(n, 10, a);, например (тогда числа будут из [-10, 10] диапазона).

Отформатировал (а то читать невозможно):
Код:
uses
  crt, dos;

const
  m = 100;

type
  mas = array [1 .. m] of integer;

var
  a: mas;
  i, sr, ob, fir, n: integer;
  hour, min, sec, hund: word;
  t, t1, t2: longint;

Procedure Rand(n, d: integer; var a: mas);
var
  i: integer;
begin
  writeln('Sluchaino array');
  for i := 1 to n do
  begin
    a[i] := random(2 * d + 1) - d;
  end;
end;

procedure Sam(n: integer; var a: mas);
var
  i: integer;
begin
  writeln('Samostoiatelno array');
  for i := 1 to n do
  begin
    write('a[', i, '] = ');
    readln(a[i]);
  end;
end;

procedure Kuk(var a: mas);
var
  m, i, l, r, c, j: integer;
begin
  sr := 0;
  ob := 0;
  For i := 2 to n do
  begin
    sr := sr + 1;
    c := a[i];
    l := 1;
    r := i;
    while l < r do
    begin
      ob := ob + 1;
      m := (l + r) div 2;
      if a[m] <= c then
        l := m + 1
      else
        r := m;
    end;
    for j := i downto r + 1 do
      a[j] := a[j - 1];
    a[r] := c;
  end;
end;

begin
  clrscr;
  writeln('Vvedite kol-vo elementov ');
  read(n);
  writeln('1-sluchainuie chisla');
  writeln('2-vvodit vruchnuiu');
  writeln('Vash vibor');
  readln(fir);
  case fir of
    1:
      Rand(n, 10, a);
    2:
      Sam(n, a);
  end;

  begin
    Kuk(a);
    writeln('Otsortirovannui massiv: ');
    for i := 1 to n do
      write(a[i]:4);

    begin
      writeln;
      GetTime(hour, min, sec, hund);
      writeln(hour, ':', min, ':', sec, ':', hund);
      t1 := sec * 1000 + min * 60000 + hund * 10;
      { sort(1,n); }
      delay(1000);
      GetTime(hour, min, sec, hund);
      writeln(hour, ':', min, ':', sec, ':', hund);
      t2 := sec * 1000 + min * 60000 + hund * 10;
      t := t2 - t1;
      writeln;
      writeln('t1=', t1);
      writeln('t2=', t2);
      writeln('t=', t);

      writeln('Kol-vo sravnenii=', sr);
      write('Kol-vo obmenov=', ob);
      readln
    end;
  end;
end.
Убрал в функции kuk объявление 2 локальных переменных, перекрывающих глобальные (из-за этого количество сравнений и обменов было 0). Заменил m на n (вывод только заполненной части массива).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 28.03.2013 в 01:47.
BDA вне форума Ответить с цитированием
Старый 28.03.2013, 18:28   #5
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

спасибо большое)
lialia вне форума Ответить с цитированием
Старый 28.03.2013, 18:59   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Пожалуйста.
Кстати, на данный момент кусок кода:
Код:
      writeln;
      GetTime(hour, min, sec, hund);
      writeln(hour, ':', min, ':', sec, ':', hund);
      t1 := sec * 1000 + min * 60000 + hund * 10;
      { sort(1,n); }
      delay(1000);
      GetTime(hour, min, sec, hund);
      writeln(hour, ':', min, ':', sec, ':', hund);
      t2 := sec * 1000 + min * 60000 + hund * 10;
      t := t2 - t1;
      writeln;
      writeln('t1=', t1);
      writeln('t2=', t2);
      writeln('t=', t);
Не делает ничего полезного (не измеряет время выполнения сортировки). Правда, с таким размером массива он ничего, скорее всего, не покажет (писал не так давно программу, где тоже нужно было измерять время выполнения различных сортировок над массивами с различными размерами - там время выполнения "чувствовалось", т.к. сортировались массивы размером от 1000 до 100000 элементов).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.03.2013, 12:30   #7
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

подскажите пожалуйста,я вот код немного переделала,у меня опять получаются нули в матрице,и как-то она не так работает,не могли бы вы подсказать в чем ошибки?(3 сортировки в одной)
Код:
program Laba9;

uses dos,crt;
const size=10000;
d=10;
type mas=ARRAY[1..size] OF INTEGER;
VAR N,i,j:INTEGER;
fir,second:byte;
a,m,b:mas;


procedure rand(n:integer; var  a:mas);
var i:integer;
begin

WRITELN('Random array');
FOR I:=1 TO N DO
 begin
 a[i]:=random(d);
 write(a[i],' ');
 end;
  writeln;
 end;

procedure  Sam(n:integer;  a:mas );
begin
WRITELN('User array');
FOR I:=1 TO N DO
 begin
 write('a[',i,'] = ');
 readln(a[i]);
 end;
 end;

procedure second_menu;
begin
writeln;
writeln('1:bubbles_sort');
writeln('2:select_sort');
writeln('3:binary');

end;

procedure Puzir(n:integer; var  a:mas);
VAR I,J,X:INTEGER;
    sr,per:longint;
    hour,minut,sec,sec100:word;
    t,t0,t1:real;
begin
b:=a;
sr:=0; per:=0;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
FOR I:=1 TO N DO
  FOR J:=1 TO N-i DO begin
 if a[i]>a[j+1]then
  BEGIN
  inc(sr);
  inc(per);
  x:=a[j];
  a[j]:=a[j+1];
  a[j+1]:=x;
  END;
  for I:=1 to n do
  write(a[i],' ');
  writeln
END;
gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
    WRITELN('Result:');
    writeln('Perest ',per);
    writeln('Srav  ',sr);
writeln('time  ',t:0:3);
a:=b;
end;

procedure Priamoi_vibor(n:integer; var  a:mas);
VAR I,J,R,X:INTEGER;
 hour,minut,sec,sec100:word;
    t,t0,t1:real;
sr,per:longint;
begin
b:=a;
sr:=0; per:=0;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
FOR I:=1 TO N-1 DO BEGIN
R:=I;
X:=A[I];
  FOR J:=I+1 TO N DO IF A[J]<X THEN BEGIN
  inc(sr);
  R:=J;
  X:=A[R]
  END;
  inc(per);
A[R]:=A[I];
A[I]:=X
END;
gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
         WRITELN('Result:');
writeln('Compile ',sr,' Move ',per);
     writeln('time  ',t:0:3);
     a:=b;
end;


procedure Dvoich(n:integer; var  a:mas);
VAR I,J,M,L,R,X:INTEGER;
 hour,minut,sec,sec100:word;
    t,t0,t1:real;
sr,per:longint;
BEGIN
b:=a;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
sr:=0; per:=0;
 FOR I:=2 TO N DO BEGIN
  X:=A[I];L:=1;R:=I;
  WHILE L<R DO BEGIN

   M:=(L+R) DIV 2;
   begin
   inc(sr);
   per:=per+1;
IF A[M]<=X THEN
L:=M+1
 ELSE R:=M
 end;
END;
  FOR J:=I DOWNTO R+1 DO
  begin
  per:=per+1;
   A[J]:=A[J-1];
  A[R]:=X;

  end;
 END;
 WRITELN('Result:');
 gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
  writeln('Perest ',per);
    writeln('Srav  ',sr);
    writeln('time  ',t:0:3);
    a:=b;
END;
{-----------------------------------------------------------------------------}
{Выбор необходимой сортировки}
procedure select( a:mas);
var second:byte;
 begin
         second_menu;
         write('Your choice ');
         readln(second);
         writeln;
         case second of
         1:Puzir(n,a);
         2:Priamoi_vibor(n,a);
         3:Dvoich(n,a);
         end;
         end;

{-----------------------------------------------------------------------------}
{Вывод}
procedure answer(n:integer; a:mas);
var
i,s:integer;
begin
writeln('Select writing answer');
writeln('1-Vozrastanie');
writeln('2-Ubivanie');
readln(s);
if s=1 then
         FOR I:=1 TO N DO
begin
WRITE(A[I],' ');
end;
if s=2 then
         FOR I:=n downTO 1 DO
begin
WRITE(A[I],' ');
end;
end;
{-----------------------}
 procedure all_sorts;
 begin
 writeln('Bubbles');
 Puzir(n,m);
 writeln('Select');
 Priamoi_vibor(n,m);
 writeln('Binary');
 Dvoich(n,m);
 end;

{------------------------------------------------------------------------------}

{Основная программа}
  BEGIN
  clrscr;
WRITELN('Enter size array(1..10000)');
READ(N);
writeln('1 - for random numbers');
writeln('2 - for user numbers');
writeln('Your_choice ');
readln(fir);
case fir of
1:rand(n,m);
2:Sam(n,m);
end;
writeln;
writeln('second_choice ');
readln(second);
if second=1 then
begin
select(m);
answer(n,m);
end;
if second=2 then
begin
all_sorts;
end;
readln;
END.
lialia вне форума Ответить с цитированием
Старый 30.03.2013, 15:23   #8
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Какая матрица...?? Массивы же одномерные.
По крайней мере, в сортировке пузырьком надо исправить
Код:
if a[i]>a[j+1]then
на
Код:
if a[j]>a[j+1]then
Еще внутри цикла не стоит использовать переменную-счетчик цикла.
Да и вообще программа работает неправильно. Сначала сделайте так, чтобы нормально работали сортировки и вывод, а потом уже добавляйте подсчет кол-ва операций и времени выполнения...

upd.
Это вообще умилительно
Код:
 writeln('Sluchaino array');
Is it стиль разговора? To mix russian и английские слова?
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропадают нули из Cstring spamersd Visual C++ 1 19.06.2012 02:58
Как убрать нули??? Егор&Co Microsoft Office Excel 9 24.02.2011 12:39
В матрице отрицательные элементы заменить на нули denis12345 Паскаль, Turbo Pascal, PascalABC.NET 2 13.06.2009 17:25
Нули artemavd Общие вопросы Delphi 22 03.08.2008 10:49
Убрать нули!!!) artemavd Общие вопросы Delphi 13 29.07.2008 09:10