Кілттік сөздер:
"Эратосфен торы" әдісі – 1-ден N-ге дейінгі аралықтағы жай сандарды анықтау алгоритмі.
Бақылау сұрақтары
Келесі сөйлемді аяқтаңдар: "Массивтегі белгілі бір шартты қанағаттандыратын элементтерді белгілеу үшін … ".
"Эратосфен торы" әдісін пайдаланып 1-ден N-ге дейінгі аралықтағы жай сандарды анықтау алгоритмін түсіндір.
Тапсырмалар
Массивтегі қайталанатын элементтердің санын анықтау керек.
Мәтіннің сөздерін жеке массивке ажыратып жазыңдар. Әріптерінің саны бірдей сөздердің санын анықтаңдар.
Қосымша «жалаушалар» массивін қолдану
(үш есеп – бір алгоритм)
Алдыңғы тақырыпта қарастырылған әдісті пайдаланудың басқа да мысалдарын келтірейік. Мысалы, қандай да бір жағдайдың (оқиғаның) басталуы мен аяқталуын сипаттау қажет болғанда (жақшаның ашылуы мен жабылуы, күзетшінің келіп-кетуі, кесіндінің басы мен соңы, т.с.) өңдеуді жалғастырамыз. Жағдайдың (оқиғаның) басталуын «1» «жалаушасы» арқылы,ал аяқталуын «-1» арқылы белгілейміз.
Жұмыстың мақсаты: классикалық есептерді шешу барысында «жалаушалар»-ды қолдануды үйрену.
1-мысал. Арифметикалық өрнектегі жақшалардың дұрыс қойылғандығын тексеру керек. Ашылған немесе жабылған жақшалар саны әртүрлі болса - өрнектің қате екенін хабарлау керек, ал егер олардың саны бірдей, бірақ, артық жазылған жақшалар бар болса, онда өрнек қате емес (мысалы ((а+b)) – жақшалар дұрыс қойылған) .
Есепті шешу идеясы:
(а + b ((4а - 8) b + 3) – 15b) арифметикалық өрнегі берілді деп есептейік
А және Flag екі массивін сипаттаймыз. Арифметикалық өрнекті сипаттайтын қатардың әр символын А массивіне орналастыра отырып «бөлшектейміз» (ҚАТАРДЫ СИМВОЛДАРҒА «БӨЛШЕКТЕУ» типтік алгоритмін қолдану арқылы).
Flag массивін жалаушамен толтырамыз:
Егер массивтің А элементі ашылған жақша, яғни «(» болса - "1";
Егер массивтің А элементі жабылған жақша, яғни «)» болса - "-1"; (7.1-сурет)
7.1-сурет
Flag массивінің элементтерін қосамыз.
Егер элементтердiң қосындысы 0-ден өзге сан болса, онда жақша дұрыс қойылмаған. Дұрыс өрнек үшін қосындының мәні 0-ге тең болуы керек.
Есепті Бейсикте шешу үлгісі:
input "арифм. өрнекті енгіз"; s$
n=len(s$)
dim a$ (n), flag (n)
for i=1 to n
a$(i)=mid$(s$, i, 1)
next
rem=======================
for i=1 to n
if a$(i)='(' then flag (i)=1
if a$(i)=')' then flag (i)=-1
next
rem=======================
for i=1 to n
s=s+flag (i)
if s<0 then x=1
next
if s=0 and x=0 then ?"жақшалар дұрыс қойылған" else ?"жақшалар қате қойылған"
Есепті Паскальда шешу үлгісі:
const m=10;
var flag: array [1..m] of integer;
a: array [1..m] of string[1];
st: string;
i,s,n,x: integer;
begin
writeln ('арифм. өрнекті енгіз'); readln (st);
n:=length (st);
for i:=1 to n do
begin
a[i]:=copy(st, i, 1);
flag[i]:=0;
end;
for i:=1 to n do
begin
if a[i]='(' then flag [i]:=1;
if a[i]=')' then flag [i]:=-1;
end;
s:=0;
for i:=1 to n do
begin
s:=s+flag [i];
if s<0 then x:=1;
end;
if (s=0) and (x=0) then writeln ('жақшалар дұрыс қойылған')
else writeln ('жақшалар қате қойылған');
end.
Тест:
-
Берілгені:
(4*5+1)*((2/6-2*3)+4))
(6+56))-90*(5-2*(3-7/3)
Нәтижесі:
Жақшалар дұрыс қойылған
Жақшалар қате қойылған
2-мысал: Сурет галереясында күзетшілер жұмыс істейді. Әр күзетшінің жұмысқа келу уақыты мен жұмыстан кету уақыты белгілі. Сурет галереясы әрдайым күзетілген бе, әлде күзетілмей қалған кездер бар ма?
Есепті шешу идеясы: мысал (7.1-кесте)
7.1-кесте |
||
|
Келу уақыты |
Кету уақыты |
1-күзетші |
8.00 |
12.00 |
2-күзетші |
11.00 |
16.00 |
3-күзетші |
15.00 |
19.30 |
4-күзетші |
20.00 |
23.50 |
Массивтерді толтырамыз:
А массиві: күзетшілердің келу және кету уақыттары;
Flag массиві:
егер А массивінің сәйкес элементі күзітшінің келу уақыты болса – «1»;
кету уақыты болса – «-1»;
7.2-сурет
А массивін СҰРЫПТАЙМЫЗ. Сәйкесінше, Flag массивінің элементтерін ауыстырамыз:
7.3-сурет
Екінші массивтің элементтерін қосамыз. Егер ағымдық қосынды 0-ге тең болып қалса (алайда массив әлі аяқталмаған болса), онда галерея күзетсіз қалды деген сөз (19.30-да күзетші кетіп қалды, ал ауысым әлі келген жоқ).
7.4-сурет
Есепті Паскальда шешу үлгісі:
const m=20;
var a, flag: array [1..m] of integer;
i,s,k,n,x: integer;
begin
writeln ('күзетшілер саны');
readln (n);
j:=1;
for i:=1 to n do
begin
writeln ('келу,кету уакыты');
readln (a[j], a[j+1]);
flag [j]:=1;
flag [j+1]:=-1;
j:=j+2;
end;
for j:=2*n downto 2 do
for i:=1 to j-1 do
if a[i]>a[i+1] then
begin
x:=a[i];
a[i]:=a[i+1];
a[i+1]:=x;
x:=flag[i];
flag [i]:=flag [i+1];
flag [i+1]:=x;
end;
k:=0;
s:=0;
for i:=1 to 2*n do
begin
s:=s+flag [i];
if s=0 then k:=k+1;
end;
if k=1 then writeln ('галерея ардайым күзетілді')
else writeln ('галерея ',k-1,' рет күзетсіз қалды');
end.
Тест:
-
Берілгені:
n=3
8
10
9
12
11
13
n=3
8
10
9
12
13
14
Нәтижесі:
галерея ардайым күзетілді
галерея 1 рет күзетсіз қалды'
3-есеп: Координаттық түзуде N бөлік (үзік) өз координаттарының соңымен берілген. Байланысқан облыстардың санын анықтау керек.
Есепті шешу идеясы:
Массивті толтырамыз:
А: бөліктердің басы мен соңының координаттары;
Flag:
Егер массивтің сәйкес А элементі – бөліктің басының координатасы болса – «1» ;
Егер массивтің А элементі – бөліктің соңының координатасы болса – «-1» ;
Flag массивінің элементтерінің орнын ауыстыра отырып, А массивін СҰРЫПТАЙМЫЗ:
