понеділок, 24 листопада 2014 р.

Циклічні алгоритми для квадратних масивів на мові Паскаль



Задача 1. Випадковим чином задається двомірний масив, що складається із nxn елементів, якщо n менше 100. Вивести масив на екран у вигляді  таблиці чисел та знайти суму елементів, що розташовані на  обох діагоналях масиву.
Розв’язання.
program Summa_diag_matriza;
const m=100;
n=100;
var  sum,f,s:real;
b:array[1..m*n] of real;
a:array[1..m,1..n] of real;
i,j,p,  k:integer;
begin
writeln(' Введіть число рядків у квадратній матриці, менше 100 ');
readln(k);
s:=0;
for i:=1 to k do 
for j:=1 to k do
begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j]; 
end;
writeln('   ');
writeln('   ');
writeln(' Квадратна матриця  із випадкових чисел: ');
writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do
begin
write('  a[',i,';',j,']:= ',a[i,j]{'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end;
writeln('   ');
writeln('   ');
end;
s:=0;
for i:=1 to k do
begin
s:=s+a[i,i];
end;
f:=0;
for i:=1 to k do
begin
f:=f+a[i,k+1-i]; 
end;
     if   k mod 2 =1 then
sum:=s+f- a[k div 2 +1, k div 2 +1] 
else
 sum:=s+f;
writeln('   ');
writeln('  Сума чисел головної діагоналі:',s); writeln('   ');
writeln('  Сума  чисел  бічної  діагоналі:',f); writeln('   ');
writeln(' Сума чисел на обох діагоналях: ',sum);
end.

Задача 1.1.  Обміняти  місцями елементи  квадратної матриці розміром nxn , n де  n< 100, відносно головної діагоналі, тобто транспонувати   матрицю.  
Розв’язання.
program Trahsponovana_matriza_golovna_diagonal;
const m=100;
n=100;
var  sum,f,s:real;
b:array[1..m*n] of real;
a:array[1..m,1..n] of real;
t:array[1..m,1..n] of real;
i,j,p,  k:integer;
begin
writeln(' Zo za numer matryza <100 ');
readln(k);
s:=0;
for i:=1 to k do
for j:=1 to k do
begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j];
t[j,i]:=a[i,j];
end;
writeln('   ');
writeln('   ');
writeln(' Matryza  verojatnuh numers: ');
writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do
begin
write('  a[',i,';',j,']:= ',a[i,j]{'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end;
writeln('   ');
writeln('   ');
end;
writeln('   ');
end;
   writeln('  Trahsponovana matriza  golovna diagonal: ');
  writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do begin
write('  t[',i,';',j,']:= ',t[i,j]{'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end;
writeln('   ');
writeln('   ');
 end;
end.

Результат

Zo za numer matryza <100
3
  
  
 Matryza  verojatnuh numers:
  
  a[1;1]:= -5  a[1;2]:= -3  a[1;3]:= 8  
  
  a[2;1]:= 4  a[2;2]:= -6  a[2;3]:= -2  
  
  a[3;1]:= 5  a[3;2]:= 5  a[3;3]:= 5  
  
  
  Trahsponovana matriza  golovna diagonal:
  
  t[1;1]:= -5  t[1;2]:= 4  t[1;3]:= 5  
  
  t[2;1]:= -3  t[2;2]:= -6  t[2;3]:= 5  
  

  t[3;1]:= 8  t[3;2]:= -2  t[3;3]:= 5   

Задача 1.2.  Обміняти  місцями елементи  квадратної матриці розміром nxn ,  де  n< 100, відносно бічної діагоналі.
 Розв’язання.
program Trahsponovana_matriza_bizna_diagonal;
const m=100;
n=100;
var  sum,f,s:real;
b:array[1..m*n] of real;
a:array[1..m,1..n] of real;
u:array[1..m,1..n] of real;
i,j,p,  k:integer;
begin
writeln(' Zo za numer matryza <100 ');
readln(k);
s:=0;
for i:=1 to k do
for j:=1 to k do
begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j];
end;
 for i:=1 to k do
for j:=1 to k do
begin
u[i,j]:=a[k-j+1,k-i+1];
end;
writeln('   ');
writeln('   ');
writeln(' Matryza  verojatnuh numers: ');
writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do
begin
write('  a[',i,';',j,']:= ',a[i,j]{'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end;
writeln('   ');
writeln('   ');
end;
    writeln('  Trahsponovana matriza  bizna diagonal: ');
  writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do begin
write('  u[',i,';',j,']:= ',u[i,j]{'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end;
writeln('   ');
writeln('   ');
 end;
end.

Результат:
Zo za numer matryza <100
3
  
 Matryza  verojatnuh numers:
  
  a[1;1]:= 2  a[1;2]:= -5  a[1;3]:= -7  
  
  a[2;1]:= 2  a[2;2]:= 9  a[2;3]:= -6  
  
  a[3;1]:= 8  a[3;2]:= 9  a[3;3]:= 3  
  
  Trahsponovana matriza  bizna diagonal:
  
  u[1;1]:= 3  u[1;2]:= -6  u[1;3]:= -7  
  
  u[2;1]:= 9  u[2;2]:= 9  u[2;3]:= -5  
  

  u[3;1]:= 8  u[3;2]:= 2  u[3;3]:= 2   



Задача 2.  Випадковим чином задається двомірний масив, що складається із mxn чисел, якщо n менше 100,  m менше 100.  Вивести масив на екран у вигляді  таблиці mхn. Вивести окремо а)суму додатних чисел матриці; б) суму від’ємних елементів масиву; в) суму усіх чисел матриці.
Розв’язання.
program matriza2;
const m=100; n=100;
var  sum, s, c: real;
b:array[1..m*n] of real;
a:array[1..m,1..n] of real;
i,j,p,  k:integer;
begin
writeln(' Введіть число рядків у квадратній матриці, менше 100 ');
readln(k);
writeln(' Введіть число стовпців у квадратній матриці, менше 100 ');
readln(p);
for i:=1 to k do
for j:=1 to p do
begin
a[i,j]:=int(random*20-10);
b[(i-1)*p+j]:=a[i,j];
end;
writeln('   ');
writeln(' Числова  матриця  із випадкових чисел: ');
writeln('   ');
for i:=1  to k do   begin
for j:=1  to p do begin
write('  a[',i,';',j,']:= ',a[i,j] {'  b[',i-1*k+j,']= ',b[(i-1)*k+j]} );
end;
writeln('   ');
writeln('   ');
end;
s:=0;  c:=0;
for i:=1 to k do
for j:=1 to p do begin
if a[i,j]>0 then
c:=c+a[i,j];
if a[i,j]<0 then
s:=s+a[i,j];
end;
sum:=s+c;
writeln('   ');
writeln('  Сума додатних чисел матриці ',c); writeln('   ');
writeln('  Сума від’ємних чисел матриці :',s);writeln('   ');
writeln(' Сума усіх чисел матриці : ',sum);
end.
Задача 3. Випадковим чином задається двомірний масив(цe таблиця чисeл) , що складається із nxn елементів, якщо n менше 100. Вивести масив на екран у вигляді  таблиці чисел та знайти суму елементів, що розташовані на  обох діагоналях масиву. Вивести одномірними масивами елементи окрeмо верхнього і окрeмо нижнього трикутника   матриці без головної діагоналі  знайти суму елементів верхнього трикутника   та сума елементів нижнього  трикутника квадратної матриці nxn.
Розвязання.
Program Summa_trukutnuk_matriza;
const m=100;  n=100;
var  sum,f,s,  d, c:real;    b:array[1..m*n] of real;
 xn:array[1..m*n] of real;     xv:array[1..m*n] of real;      a:array[1..m,1..n] of real;
i,j,p, g, k:integer;
begin
writeln('  Ввeдіть кількість рядків квадратного масиву,  яка мeншe 100 ');
readln(k);    s:=0;
for i:=1 to k do
for j:=1 to k do  begin
a[i,j]:=int(random*20-10);
b[(i-1)*k+j]:=a[i,j];   end;  writeln('   ');
writeln(' Масив випадкових чисeл: ');  writeln('   ');
for i:=1  to k do   begin
for j:=1  to k do  begin      write('  a[',i,';',j,']:= ',a[i,j]  {'  b[',i-1*k+j,']= ',b[(i-1)*k+j]});
end; writeln('   '); end;
s:=0;   for i:=1 to k do  begin   s:=s+a[i,i];  end;
f:=0;  for i:=1 to k do  begin  f:=f+a[i,k+1-i]; end;
     if   k mod 2 =1 then   sum:=s+f- a[k div 2 +1, k div 2 +1]   else   sum:=s+f;
p:=1;  g:=1;    for i:=1  to k do   begin
for j:=k  downto 1 do  begin
  if   i<j  then  begin
  xv[g]:= a[i,j];  g:=g+1; end;  end; end;
  for i:=1  to k do   begin
  for j:=1  to i-1 do  begin
  if   i>j  then  begin
  xn[p]:= a[i,j];   p:= p+1; end; end;  end;
writeln(' Масив   чисeл нижнього трикутника матриці : ');
          d:=0;  for i:=1  to   ((k-1)*k) div 2     do     begin    d:=d+ xn[i];
write('  xn[',i,']= ', xn[i]); end; writeln('   ');
writeln(' Масив   чисeл вeрхнього трикутника матриці :  ');
           c:=0;  for i:=1  to ((k-1)*k) div 2    do   begin
c:=c+ xv[i];  write('  xv[', i, ']= ', xv[i]);   end;    writeln('   ');
writeln('  Сума чисел головної діагоналі матриці:', s); writeln('    ');
writeln('  Сума  чисел  бічної  діагоналі матриці :', f); writeln('    ');
writeln('  Сума чисел на обох діагоналях: ', sum);   writeln('    ');
writeln('  Сума чисел верхнього трикутника матриці ' , c);  writeln('    ');

writeln('  Сума чисел нижнього трикутника матриці  ' ,  d);    writeln('    ');       end.


Peзультати

Введіть число рядків матриці, що менше 100
7
 
Матриця випадкових чисел:
 
  a[1;1]:= -6  a[1;2]:= 0    a[1;3]:= -9  a[1;4]:= 0    a[1;5]:= 0   a[1;6]:= -9  a[1;7]:= -1
  a[2;1]:= -3  a[2;2]:= 2    a[2;3]:= 8    a[2;4]:= -4  a[2;5]:= 0   a[2;6]:= 6   a[2;7]:= 7
  a[3;1]:= -6  a[3;2]:= -9   a[3;3]:= -6  a[3;4]:= 9    a[3;5]:= -9  a[3;6]:= 0  a[3;7]:= 8
  a[4;1]:= -2  a[4;2]:= -3   a[4;3]:= 7    a[4;4]:= 3   a[4;5]:= -7   a[4;6]:= 4  a[4;7]:= 8
  a[5;1]:= -6  a[5;2]:= 8    a[5;3]:= 1    a[5;4]:= 7   a[5;5]:= -6   a[5;6]:= -5  a[5;7]:= 7
  a[6;1]:= -5  a[6;2]:= 7    a[6;3]:= 6    a[6;4]:= 5   a[6;5]:= 5    a[6;6]:= 0    a[6;7]:= 4
  a[7;1]:= 4    a[7;2]:= -6  a[7;3]:= -6   a[7;4]:= 2   a[7;5]:= -8  a[7;6]:= -2  a[7;7]:= 9
 Числа нижнього  трикутника матриці:
  xn[1]= -3  xn[2]= -6  xn[3]= -9  xn[4]= -2  xn[5]= -3  xn[6]= 7  xn[7]= -6  xn[8]= 8
  xn[9]= 1  xn[10]= 7  xn[11]= -5  xn[12]= 7  xn[13]= 6  xn[14]= 5  xn[15]= 5  xn[16]= 4
 xn[17]= -6  xn[18]= -6  xn[19]= 2  xn[20]= -8  xn[21]= -2
 Числа верхнього  трикутника матриці:
  xv[1]= -1  xv[2]= -9  xv[3]= 0  xv[4]= 0  xv[5]= -9  xv[6]= 0  xv[7]= 7  xv[8]= 6
xv[9]= 0  xv[10]= -4  xv[11]= 8  xv[12]= 8  xv[13]= 0  xv[14]= -9  xv[15]= 9  xv[16]= 8
 xv[17]= 4  xv[18]= -7  xv[19]= 7  xv[20]= -5  xv[21]= 4
  Сума чисел головної діагоналі:-4
  Сума  чисел  бічної  діагоналі:11
  Сума чисел на обох діагоналях: 4
  Сума чисел верхнього трикутника  17
  Сума чисел нижнього трикутника  -4
 

Вкладені цикли мовою Paѕcal
Приклад № 1. Обчислити значення змінної  y=3k+ n при всіх значеннях змінних N=1, 2, 3, 4  і K=3, 8, 13, 18, 23.
Розв′язання.
Якщо перебирати всі значення N і K, ми повинні отримати 4*5=20 значень змінної y =f(n, k)= 3k + n.
Скласти програму можна в такий спосіб: для кожного значення N перебрати всі значення К від 3 до 23 з кроком  5, тобто N використати як параметр зовнішнього циклу, К - як параметр внутрішнього циклу.
Текст програми:
Program priklad_1;
var n, k, y:integer;
begin
for n:=1 to 3 do   begin k:=2;
while k<=23 do   begin y:=3*k+n;
writeln('  n=  ', n:3, '  k=  ',  k:3, ' 3k + n =  ' , y:3);
k:=k+5; end;  end; end.
Параметр N змінюється з кроком 1, тому зовнішній цикл організований з використанням оператора For; параметр К змінюється з кроком 5, тому внутрішній цикл є циклом While.

Приклад № 2. Старовинна задача. Скільки можна купити биків, корів та телят, якщо вартість одного бика - 10 тис. грн, однієї корови - 5  тис. грн, а за одного теля платять 0,5 тис. грн. І якщо на 100 тис. рублів потрібно купити 100 голів скоту.
Розв'язування:
Позначимо через b - кількість биків; k - кількість корів; t - кількість телят. Після цього можна записати два рівняння:
10b + 5k + 0.5t = 100       і          b + k + t = 100
На 100 рублів можна купити:  1) не більше 10 биків, тобто 0<=b<=10;  2)  не більше 20 корів, тобто 0<=k<=20;
2) не більше 200 телят, тобто 0<=t<=200. Отже отримуємо текст програми:
Program Priklad_2;
var b, k, t:integer;
begin
for b:=0 to 10 do
for k:=0 to 20 do
for t:=0 to 200 do
if (10*b + 5*k + 0.5*t = 100) and (b + k + t = 100)  then
writeln('Биків - ', b, ';  корів - ', k,';   телят - ',t);
end.


Вінницька (міська) олімпіада
з інформатики  24 грудня 2011 року
Розв’язання задач
8-9 клас
1     Populyatsia
Є популяція комах, розмір якої по днях змінюється згідно закону:
А)  p{n+1} =   0,   якщо p(n) = 0 або 1;
Б)  p{n+1} =   p(n) / 2,   якщо p(n) є парним;
В) p{n+1} =    3 * p(n ) + 1,  якщо p(n) є непарним,
де n – порядковий номер дня, р(n) – розмір популяції на n-й день.
 Необхідно, по заданому розміру популяції на перший день визначити, на який день вона вимре.

 Припустимо, що у перший день (n=1) популяція (p(n))складалася з трьох комах. Тоді вона вимре на 9-й день:
  Номер дня  (n)               1         2        3        4        5        6        7        8        9
 Розмір популяції р(n)   3        10      5        16      8        4        2        1        0

   Технічні умови  Програма читає з клавіатури одне додатне ціле число  – розмір популяції комах на перший день. Програма виводить на екран шукане число. Гарантується, що популяція не проіснує більше 30000 днів.

Приклад.
Введення  3
Виведення 9
Програма на мові  Pascal


Program  Populyatsia
var p, n: integer;
begin
read(p);
n:=1;
while p>0 do
begin
if p=1 then p:=0
 else if p mod 2=0 then p:=p div 2
  else if p mod 2<>0 then p:=3*p+1;
n:=n+1;
end;
if n>30001 then n:=30001;
write(n);
end.



2. DROBY
Васі приснився сон, що він потрапив у чарівну країну Математика, там його узяв у полон злий учений, що розробляв план знищення цієї чарівної країни. Учений знав, що Вася добре знає математику і поставив таку умову, що якщо Вася напише в порядку зростання всі правильні нескоротні дроби, знаменники яких не перевищують заданого числа N, то злий геній відпустить його. Допоможіть  Васі вибратися з полону.
Технічні умови.   Програма читає з клавіатури єдине число  N (2 <= N <= 255). Програма виводить на екран всі шукані дроби спочатку чисельник, а потім знаменник. Всі числа розділено пропусками.
Приклад
                Введення  5
                Виведення  1 5 1 4 1 3 2 5 1 2 3 5 2 3 3 4 4 5
Програма на мові  Pascal



Program  DROBY
var chis, znam:array[1..10000]  of integer;
var n, znamen, chisel, dilnuk, kilk, i, j, buf:integer;
var value1, value2:real;
var p: boolean;
begin
read(n); kilk:=1;
For znamen:=2 to n do
 For chisel:=1 to znamen-1 do
  Begin
   p:=true;
   for dilnuk:=2 to chisel  do
    if (chisel mod dilnuk=0) and (znamen mod dilnuk=0)
    then p:=false;
   if p=true
   then
   begin
   chis[kilk]:=chisel;
   znam[kilk]:=znamen;
   kilk:=kilk+1;
   end;
  end;
  kilk:=kilk-1;
For i:=1 to kilk-1 do
 begin
  for j:=1 to kilk-i do
  begin
   value1:=chis[j] / znam[j];
   value2:=chis[kilk-i+1] / znam[kilk-i+1];
   if value1 > value2 then
    begin
    buf:=chis[j];
    chis[j]:=chis[kilk-i+1];
    chis[kilk-i+1]:=buf;
    buf:=znam[j];
    znam[j]:=znam[kilk-i+1];
    znam[kilk-i+1]:=buf;
    end;
   end
 end;
for i:=1 to kilk do
 Write(chis[i],' ',znam[i],' ');
end.



3. SPIRAL
Вася захоплювався програмуванням і отримав завдання: написати програму,що виводить  квадрат, який складається з NхN клітинок, заповнених числами від 1 до N2  по спіралі. Допоможіть йому.
Технічні умови. Програма читає з клавіатури єдине натуральне число N ( не більше 100). Програма виводить N рядків по N чисел, розділених пропусками. Не допускається починати спіраль в іншому куті, окрім верхнього лівого,  закручувати спіраль проти годинникової стрілки або з середини назовні.
Приклад
 Введення  5
 Виведення   1   2   3   4   5
                        16 17 18 19 6
                        15 24 25 20 7
                        14 23 22 21 8
                        13 12 11 10 9

Програма на мові  Pascal


Program SPIRAL
var n, k,i,j, p, ost, per, r:integer;
var a:array[1..101,1..101] of integer;
begin
read(n);
k:=1;
for i:= 1 to n do
 for j:=1 to n do
  a[i,j]:=0;
 ost:=n; per:=1;
 while k<=n*n do
 begin
 for j:=per to ost do
   begin
   a[per,j]:=k;
   k:=k+1;
   end;
 for i:=per+1 to ost do
   begin
   a[i,ost]:=k;
   k:=k+1;
   end;
  for j:=ost-1 downto per do
  begin
   a[ost,j]:=k;
   k:=k+1;
   end;
   for i:=ost-1 downto per+1 do
    begin
   a[i,per]:=k;
   k:=k+1;
   end;
   ost:=ost-1; per:=per+1;
  end;
  for i:=1 to n do
   begin
    for j:=1 to n do
     write(a[i,j],' ');
    writeln;
   end;

end.


Завдання для самостійної роботи.
1.1.  Обчислити значення змінної  y=5k-4n при всіх значеннях змінних N=1, 2, 3, 4  і K=2, 8, 14, 20, 26.
1.2. Скільки може бабуся купити на пенсію 1280 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.
1.3.   Обчислити значення змінної  y=7k-3n при всіх значеннях змінних N=1, 2, 3, 4  і K=1, 8, 15, 22, 29.
1.4. Скільки може дідусь купити на пенсію 1580 грн  індюків , курей та  гусей, якщо вартість одного індюка - 75 грн, однієї курки - 55 грн, а за одного гуся платять 65 гривень. І якщо  їй  потрібно купити лишe 20 голів.

1.5.    Розв′язати рівняння:  а)58=5k-4n;   б) 76=5(k+3)2-4(n-5)3 ;  в) 1=  5/(k+3) -  4/(n-5)3            при значеннях змінних 1 <N<20  і 1<K<20.

Немає коментарів:

Дописати коментар