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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 00:23   #1
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Вопрос проверьте плз код!можно ли его оптимизировать или упростить?

доброго времени бодрствания!Задача: Дан 2мерный массив a размерностью 5*5. Заполнить одномерный массив b по след.-ему правилу: если сумма очередной строки массива чётная,то соответствующий элемент массива равен 2,иначе-элемент массива b равен 1.Вычислить факториал от количества элементов массива равных 2.

Код:
program massivANDfactorial;
var
 a:array[1..5,1..5]of integer;
 i,j:integer;
 b:array[1..5]of integer;
 sum1,sum2,sum3,sum4,sum5,k,s2:integer;
 function Factorial(n:byte):longint;{фукция факториала}
  var
    fact:longint;
    i:byte;
   begin
    fact:=n;
     for i:=n-1 downto 2 do
      fact:=fact*i;
      Factorial:=fact;
    end;
  begin
   randomize;{"основа"}
   for i:=1 to 5 do
    for j:=1 to 5 do
     a[i,j]:=random(100);
     writeln('matrix',' ','a:');
     for i:=1 to 5 do
      begin
       writeln;
        for j:=1 to 5 do
         write(a[i,j]:4);
       end;
       writeln;
       writeln;
     sum1:=0;sum2:=0;sum3:=0;sum4:=0;sum5:=0;
     for i:=1 to 5 do
      begin
       sum1:=sum1+a[1,i];
       sum2:=sum2+a[2,i];
       sum3:=sum3+a[3,i];
       sum4:=sum4+a[4,i];
       sum5:=sum5+a[5,i];
       end;
       if sum1 mod 2=0 then b[1]:=2 else b[1]:=1;
         if sum2 mod 2=0 then b[2]:=2 else b[2]:=1;
           if sum3 mod 2=0 then b[3]:=2 else b[3]:=1;
             if sum4 mod 2=0 then b[4]:=2 else b[4]:=1;
              if sum5 mod 2=0 then b[5]:=2 else b[5]:=1;
              write('matrix',' ','b:');
              writeln;
      for k:=1 to 5 do
      writeln(b[k]);
      s2:=0;
      for k:=1 to 5 do
       if b[k]=2 then s2:=s2+b[k];{сумма всех "двушек" массива}
       writeln;
       writeln('factorial:');
       writeln(s2,'!','=',Factorial(s2));
       end.

Последний раз редактировалось Stilet; 23.04.2009 в 10:22.
-ushёl- вне форума Ответить с цитированием
Старый 23.04.2009, 00:38   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Подобные куски:
Код:
sum1:=sum1+a[1,i];
sum2:=sum2+a[2,i];
sum3:=sum3+a[3,i];
sum4:=sum4+a[4,i];
sum5:=sum5+a[5,i];
нужно упрощать в обязательном порядке.

Код:
uses crt;
const n=5;
var
a : array[1..n,1..n] of integer;
i,j,s,count : integer;
b : array[1..n] of integer;

function fact(n : integer) : longint;
var rez : longint;
begin
rez := n;
while n>1 do
 begin
 rez := rez*n;
 dec(n);
 end;
fact := rez;
end;

begin
clrscr;
randomize;
for i:=1 to n do
 begin
 for j:=1 to n do
  begin
  a[i,j] := random(100);
  write(a[i,j]:4);
  end;
 writeln;
 end;
writeln;

count := 0;
for i:=1 to n do
 begin
 s := 0;
 for j:=1 to n do
  inc(s,a[i,j]);
 if not odd(s) then
  begin
  b[i] := 2;
  inc(count);
  end
 else b[i] := 1;
 end;

writeln('factorial = ',fact(count));

readln;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.04.2009, 00:45   #3
Allen Iverson
Пользователь
 
Аватар для Allen Iverson
 
Регистрация: 15.04.2009
Сообщений: 28
По умолчанию

вот что получилось.....
кстати у вас была ошибка....вам нужно факториал по заданию считать от количества элементов равных 2, т.е. если элементов=2 получилось 3 то нужно вам 3!...а он программа в вашем тексте делает 2+2+2 и считает уже 6!....ошибка...вот исправленный и чуть укороченный код...

Код:
program massivANDfactorial;
uses crt;
var a:array[1..5,1..5]of integer;
    i,j:integer;
    b:array[1..5]of integer;
    sum:integer;
{-------}
function Factorial(n:byte):longint;{фукция факториала}
var
fact:longint;
i:byte;
begin
fact:=n;
for i:=n-1 downto 2 do
fact:=fact*i;
Factorial:=fact;
end;
{-------}
begin
clrscr;
randomize;{"основа"}
for i:=1 to 5 do
for j:=1 to 5 do
a[i,j]:=random(100);
writeln('matrix',' ','a:');
for i:=1 to 5 do
    begin
    writeln;
    for j:=1 to 5 do write(a[i,j]:4);
    end;
writeln;
writeln;
for i:=1 to 5 do
    for j:=1 to 5 do
        begin
        sum:=sum+a[i,j];
        if j=5 then
           begin
           if sum mod 2=0 then b[i]:=2 else b[i]:=1;
           end;
        end;
write('matrix',' ','b:');
writeln;
for k:=1 to 5 do writeln(b[k]);
for k:=1 to 5 do if b[k]=2 then s2:=s2+1;{!!!!!!КОЛИЧЕСТВО!!!!!!!!!! всех "двушек" массива}
writeln;
writeln('factorial:');
writeln(s2,'!','=',Factorial(s2));
readln;
end.
From Stilet: Что читабельно код оформить не судьба?

Последний раз редактировалось Stilet; 23.04.2009 в 10:22.
Allen Iverson вне форума Ответить с цитированием
Старый 23.04.2009, 10:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Такая оптимизация подойдет?
Код:
var
   a:array[1..5,1..5]of integer;
 sum,cnt,faktorial,i,j:integer;
 b:array[1..5]of integer;
begin
randomize;{"основа"}
faktorial:=1;
   for i:=1 to 5 do begin
    for j:=1 to 5 do begin
     a[i,j]:=random(4);
     sum:=sum+a[i,j]; write(a[i,j]:5);
     if a[i,j]=2 then begin inc(cnt);faktorial:=faktorial*cnt; end;
    end;
     if sum mod 2=0 then b[i]:=2 else b[i]:=1;
     write('   b[i]=',b[i]);
     writeln;
   end;
   writeln('faktorial=',faktorial);
readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2009, 15:53   #5
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

спасибо!!!!
-ushёl- вне форума Ответить с цитированием
Старый 23.04.2009, 20:07   #6
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

Немогли бы вы пояснить несколько моментов из этого куска? процедура inc увеличивает s c первоначальным значением 0 на кол.-во значений j столбцов массива а.И потом проверяется условие,то что чётно.?
count := 0;
for i:=1 to n do
begin
s := 0;
for j:=1 to n do
inc(s,a[i,j]);
if not odd(s) then
begin
b[i] := 2;
inc(count);
end
else b[i] := 1;
end;
-ushёl- вне форума Ответить с цитированием
Старый 23.04.2009, 20:12   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
процедура inc увеличивает s c первоначальным значением 0 на кол.-во значений j столбцов массива а.И потом проверяется условие,то что чётно.?
Не на количество столбцов, а на элемент массива a[i,j].
s - сумма текущей строки.
Цикл
Код:
for j:=1 to n do
inc(s,a[i,j]);
Суммирует элементы строки.
Цитата:
И потом проверяется условие,то что чётно.?
Да. Функция odd возвращает true, если аргумент - нечетное число.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.04.2009, 20:40   #8
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

гениально! этот ведь ход подойдёт и для матрицы большей размерности?
-ushёl- вне форума Ответить с цитированием
Старый 23.04.2009, 20:42   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
этот ведь ход подойдёт и для матрицы большей размерности?
Для любой. Собственно, матрица может быть и не квадратной. Только тогда нужно еще m ввести.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.04.2009, 20:48   #10
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

такие грамотные методы нужно называть в честь создателя!)
-ushёl- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Title на форме. Как можно перерисовать caption на form? Или убрать его и вместо использовать картинки Шульц Общие вопросы Delphi 37 02.10.2010 09:46
Помогите упростить код Ralf_ru Помощь студентам 7 01.04.2009 17:17
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57