Оқушыларды олимпиадаға дайындау
М а з м ұ н ы
Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ... ... ..3
Информатикадан олимпиада жүргізу және оның әдістері
І. Негізгі бөлім
1.1 Олимпиада және оны жүргізу
әдісі ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ...4
1.2 Олимпиада тапсырмаларын есептеудің тиімді
жолдары ... ... ... ... ... ... ...4
1.3 Олимпиаданың өткізілу
ережесі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..18
1.4 Оқушыларды олимпиадаға
дайындау ... ... ... ... ... ... ... ... ... ... ... ... ... ... .26
ІІІ.
Қорытынды ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... .32
IV. Пайдаланылған әдебиеттер
тізімі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..33
Кіріспе
Факультативтік сабақтармен тығыз байланысты сыныптан тыс
жұмыстардың бірі информатика пәні бойынша өтетін олимпиада. Олимпиада
білімді оқушыларды анықтау мақсатында ұйымдастырылғанымен, оның басты
мақсаты - аса қабілетті және даярлығы күшті 2-3 оқушыны табу ғана емес,
мектеп оқушысының басым көпшілігінің информатика пәніне деген ынта,
ықыласын арттыру.
Оқушыларды олимпиадаға дайындау барысында олимпиадалық есептерді
талдаған дұрыс. Себебі, мұндай талдау оқушылардың олимпиадалық
есептердің түрлерімен таныс болып, оны шығарудағы өз күшіне деген
сенімін арттырады.
Информатикалық олимпиада - оқушыны информатикалық білім алуға
ынталандыратын ойларының дамуына себеп болатын жарыс болып
есептеледі. Информатика олимпиадасы мектеп ішілік, аудандық және қалалық,
облыстық, республикалық, халықаралық деңгейлерге бөлінеді.
Мектепте өткізілетін олимпиада екі кезең бойынша жүргізіледі:
1. кезеңде барлық үлгеретін оқушылар қатысады. Бұл кезеңнен 4-
5 алған оқушылыр келесі кезеңдегі олимпиадаға қатысады.
2. Кезеңде қияндығы жоғары тапсырмалар ұсынылады. Осы
кюезеңнің жеңімпаздары алдыңғы олимпиадаға жіберіледі.
Факультатив сабақтарды, олимпиадалық есептерді шығарудың әдіс -
тәсілдерін талдау практикасына ацйналдарған тиімді. Мектептік үздік
информатика аудандық, облыстық, республикалы, халықаралық
олимпиадаларға қатысуға мүмкіндік алу үшін оқушылар мектеп
информатика пәнін жүйелі игеру қажет.
Олимпиада және оны жүргізу әдістемесі
Олимпиаданың мақсаты;
- білімді, дамыған, дарынды мектеп оқушыларын іздеу;
- мектепте информатиканы оқыту деңгейін бағалау;
- информатиканы оқыту барысындағы ең жоғарғы деңгейге қойылатын талапты
ашу;
- мектеп, жоғарғы оқу орындары буынындағы кері байланысты жүзеге асыру.
Олимпиаданың негізгі мақсаты - оқушының қабілетін ашуды ескере
отырып, логикалық - алгоритмдік және жүйелі комбинаторикалық ойлауы дамыған
оқушыларды табу қажет. Бұл әртүрлі дайын программалық құралдар мен
командаларды пайдалану іскерлігінде пайда болады.
Олимпиадаға дайындау әдістемесі- қарастырылып отырған тәсілде
оқушьшарды олиапиядаға дайындау информатиканың базалық курсының жалғасы
болып табылады. Дайындықтың ең тиімді түрі -- сабақты олимпиада түрінде
жүргізу. Стандартты емес есептерді шешгу үшін мәліметтерді ұйымдастыру мен
програлмалаудың қазіргі әдістерін білу қажет.
Олимпиада тапсырмаларын есептеудің тиімді жолдары
Олимпиада -- оқушының білім дағдылары мен қисынды ойлау әрекеттерін
саралайтын кезең. Оқушыны олимпиадаға дайындау сәтінде есептеудің
тиімді жолдарын қарастыру - мұғалім атқарар міндетті екені
белгілі. Талапкердің жүйелі жұмыс жасай білу қабілетін саралап,
есептеудің тиімді жолдарын қолдана білу шеберліктерін шыңдап,
өзіндік бағыт - бағдар беру - қазіргі таңдағы ізденімпаз ұстаздардың
негізгі ұстанымы. Төмендегі олимпиада тапсырмалары Pascal ABC
бағдарламасында орындалған Pascal АВС өте ыңғайлы бағдарлама., бұнда
көптеген әрекеттер орындауға болады. Бұл бағдарлама қазіргі
заманның талабына сай операциялық жүйелерге сәйкес келеді.
Сонымен қатар ол терезеелі интерфейспен жұмыс істеуге мүмкіндік
береді Pascal ABC www.sunsclwol.math.rsu.ru сайтында толық
қарастырылған.
1-есеп.Кубиктер
Енгізу файлының аты: cubes.in
Шығару файлының аты: cubes.out
Уақыт шектеу: 2 секунд
Жадыға шектеу: 64 мегабайт
N кубик берілген. Қатар қойылған бірнеше бағаналардан тұратын
кубиктерді жар деп атаймыз.
Жардың і - ші бағанасының биіктігін һ3 деп белгілейміз. Жардағы
бағаналар саны М болса барлық і үшін (1ІМ-1), һ3 һ3-1 және
Һ3 + һ2 + ... + Һм = N ережесіне бағынатындай әр түрлі неше жар бар екенін
табу керек. Мәліметтерді енгізу форматы Кіріс файлына жалғыз N саны
берілген (lN100)
Мәліметтерді шығару форматы Шығыс файлға бір бүгін сан жазу керек
ізделінген сан.
Есептің шығару жолы.
Алдымен мысалда көрсетілген жарларды сандар тізбегі ретінде
белгілейік:
4; 3,1; 2,2; 2,1,1; 1,1,1,1.
Бұл тізбектердің әрқайсысында келесі шарттар орындалуы керек:
1) Әрбір тізбектегі элементтердің қосындысы N-ге тең болуы керек:
h1+h2+...+hM=N.
2) Тізбектің әрбір элементі өзінің алдынлағы элеменітерден аспауы
керек: һ=һ1+1
Мұндай тізбектерді табу үшін терулер орындау керек. Алдымен 1 орынға,
сосын 2 орынға, сосын 3 орынға, сол сияқты ең соңынан N орынға 1-ден N-re
дейінгі бүтін сандардан теру орындаймыз. Терулерді гее(х) рекурсивті
проиедурсы көмегімен жасаймыз. М - тізбек элементтерінің, яғни теру
орындарының саны. М=1, 2 , 3 ... .N.
К-берілген (1),(2) шарттарды қанағаттандыратын тізбектер саны болсын.
Онын алғашқы мәнін О-ге тең етіп аламыз. Программаның негізгі бөлімінде
әрбір М-нің мәні үшін терулер орындайтын гес(х) ироцедурасын шақырамыз.
к:=0;
for m:=l to n do
rec(I);
Енді гес(х) рекурсивті процедурсын қарастырайық. Бұл процедура М
орынға N саннан теру орында керек және табылған терудің (1), (2) шарттарды
қанағаттандыратындығын тексеру керек. Шарттар қанағаттандырылатын болса К
есептеуіш айнымалысы 1 санға артуы керек. Рекурсия алдымен 1-деңгейде
шақырылады, сосын өзін-өзі шақырып келесі деңгейге өтеді. Әрбір і-ші
деңгейде һ тізбегінің і-ші элементін тереді. Егер Х-проиедура параметрі M +
1-re тең болса онда М орынға теру орындалып болғаны. Онда алдымен (1)
шарттың орындалуын тексеру үшін һ тізбегі элементтерінің қосындысын
есептейміз.
s:=0;
for i:=l to m do s:=s+h[i];
Енді (2) шарттың орындалуын тексеру үшін.
t айнымалысын алып, оның бастапқы мәнін О-ге теңестіреміз. Әрбір і үшін (1
іМ-1), һ[іһ[і+1) шарты орындалса t:=l қылып өзгертеміз. Сонда
һ[і]һі+1] шарты ең болмаса бір рет орындалса t-ның мәні 1-ге тең болады,
ал бірді-бір рет орындалмаса t-ның мәні бастапқы 0 қалпында қалады.
for i:=l to m-1 do
if h[i]h[i+l] then t:=l;
Erep бұл шарттардың екеуі де орындалса К-ның мәнін 1 санға есіреміз.
if (s=n)and(t=0) then k:=k+l;
Сонымен программаның толық мәтіні келесідей болады:
program cubes;
var fin, fout: text;
k,n,ra,s,t,i:integer;
h:array[1..100] of integer;
procedure rec(x:integer); {рекурсивті процедура}
var ininteger;
begin if x=m+l tben {peKypcия соңғы деңгейге жетті}
begin
s:=0; {қосындыны есептеу}
for i:=l to m do s:=s+h[i];
t:=0;
for i:=l to m-1 do {(2) шартты тексеру}
if h[i]h[i+l] then t:=l;
if (s=n)and(t=0) then k:=k+l;
end else {Рекурсия соңғы деңгейге жеткен жоқ}
begin
for ir:= 1 to n do
begin h[x]:=ir; rec(x+1)
end; {h-mi теpin, рекурсияның } {келесі деңгейіне өту}
end;
begin {программаның негізгі бөлімі}
assign(fm,'cubes.in'); (негізу файлын байланыстыру)
assign(iout,'cubes.out'); {шығару файлын байліаныстыру}
reset(fin); {енгізу файлын оқу үшін ашу}
read(fin,n); {енгзіу файлынан пдіі енгізу}
close(fin); {енгізу файлын жабу}
к:=0;
for m:= I to n do
rec( 1); {рекурсивті процедураны шақыру}
rewrite(fout); шығару файлын жсау үшін ашу
writcln(fout,k); шығару файлына К - ның мәнін жазу
l(se(fout); шығару файлын жабу
end.
2-есеп. Сақина
Енгізу файлының аты: hoop.in
Шығару файлының аты: hoop.out
Уақыт файлының шектеу: 2 секунд
Жадыға шектеу: 64 мегабайт
Сақинаның бойына бірдей қашықтықта 1 -- ден N-re-дейін сандар сағат
тілінің бағыты бойынша өсу ретімен жабыстырылған, 1 саны сақинаның ең
жоғары нүктесінде орналасқан. Осыдан кейін сақинамен М әрекет жасалды.
Сақинаның соңғы қалпын анықгау керек.
Сақинамен жасалатын әрекеттер:
Оңға немесе солға бірнеше санға айналдыру.
Белгілі бір нүктенің айналасында аудару.
Кез - келген әрекет кезінде сақинаның центрі орнында қалады.
Мәліметтерді енгізу форматы
Кіріс файлдың бірінші жолында екі бүтін сан жазылған N және М
(0N,M105). Осыдан кейін әрекеттерді сипаттайтын М жол жазылған. Бұл
жолдардың әрқайсысы келесі форматтардың бірінде болады:
+Х -- оң жаққа (сағат тілінің бағытымен) X орынға айналдыру;
-X - сол жаққа (сағат тіліне қарама-қарсы) X орынға айналдыру;
У -- У позициясының айналасында аудару; ең жоғары нүктенің позициясы
әрқашан 1-ші, келесі позициялар сағат тілінің бағытымен сананалады.
0Х109, 1YN
Мәліметтерді шығару форматы
Шығыс файлдың бірінші N бүтін сан болу керек-сақинаның бойындағы
сандар ең жоғарысынан бастап сағат тілінің бағаты бойынша.
Мысалға комментарий
Сақинаның бастапқы қалпы: 1 2 3 4 5
1-ші әрекеттен кейін (оң жаққа 2 орынға айналдыру) 4 5 1 2 3
2-ші әрекеттен кейін (сол жаққа 3 орынға айналдыру) 2 3 4 5 1
3-ші әрекеттен кейін (3-ші позииияның айналасында аулару) 1 5 4 3 2
Мысал
Hoop.in Hoop.out
5 3 1 5 4 3 2
+2
-3
3
Есентің шығару жолы.
Есептің мазмұнын дұрыс түсіну үшін алдымен сакинаны сызып
көрсетейік.
Бұл сақинының, орындарын тізбек элементтері ретінде қарастыруымызға
болады. Ол тізбекті а деп белгілейік.
[ 1.. 1000001 of integer; aI тізбегін түрлендіру үшін қолдануға қосымша
алып отырмыз. Енді түрлендіру үшін қолданылатын процедурадарды қарастырайық
povpra(x) процедурасы саиптына сағат тілі бағытымен X орынға айналдырады.
Біздің мысалымызда берілген сақина үшін сонда povpra (2) процедуралық
шақырту суретте көрсетілгендей түрлендіру орындайды. Яғни әрбір і-ші орынға
і-х -ші орындағы сан ауысады. Егер і-х 1 болса, онда і-ші орынға і-х+п -- ші
орындағы санды айтамыз. Түрлендірулерді орындау үшін аі тізбегіне а
тізбегін меншіктеп алып, соңынан түрлендірілгсн aI тізбегін а тізбегіне
қайта меншіктейміз. Сонымен
procedure povpra(x:integer);
begin
al:=a;
for i:=l to n do
if i-x 1 then al[i]:=a[i-x+n] else al[i]:=a[i-x];
a:=al;
end;
povlev(x) процедурасы сақинаны сағат тіліне қарама-қарсы бағытта X
орынға айналдырады.
Біздің мысалымызда берілген сақина үшін соңда povlev(2) процедуралық
шақыту суретте көрсетілгендей түрлендіру орындалады. Яғни әрбір і-ші
орынға і+х -ші орындағы сан ауысады. Егер і+хп болса, онда і-ші орынға і+х-
п -- ші орыңдағы санды аламыз. Сонымен
procedure povlev(x:integer
begin------
al:=a;
for i:=l to n do
if i+xn then al[ij:=a[i-\-n else аЦі):=а[і+х;
a:=al;
end;
Енді y-ші пoзицияның айналасында аудару әрекетіп орындайтын
процедурасын қарастырайық.
Мысалға беріліен сақина үшін perev (3) процедуралық шақыру
суретіндегідей түрлендіру жасайды.
Суретте көрсетілгендей әрбір у+і -ші орындағы элементті у-і ші
орындағы элементпен орын ауыстыруымыз керек. ауыстырулар n div 2 циклда
орындалады. Егер у+і г. болса. оны у+і-п-мен ауыстырамыз. Сондай-ақ егер у-
і1 болса, оны у-і+п -- мен ауыстырамыз. у-і және у-і мәндерін есептеу алу
үшін оларды ;1.у2 айнымалыларына меншіктеп аламыз. Сонымен процедура
былай жазылады:
procedure perev(y:integer):
varyl,y2:integer;
begin
al:=a;
for i:=l to n div 2 do
begin
if y+in then yl:=y+i-n else yl:=y+i;
if y-i 1 then y2:=y-i+n else y2:=y-i;
al[yl]:=a[y2]; ally2]:=a[yl];
end;
a:=al;
end;
Енді программаның негізгі бөлігін қарастырайық. Алдымен енгізу файлын
ашып алып, одан есеп шартында берілгендей форматта п мен m-ді, содан соң
әрекеттерді білдіретін жолдың қатарларды енгіземіз. Әрбір s жолдың қатарын
енгізген соң оның бірінші символы s[l]-j.i тексереміз. Егер ат'+' болса, s-
тің бірінші символын dekte(s,l,l) процедурасы арқылы жойып. қалған бөлігін
val(s,t,code) процедуфасы арқылы t айнымалысына түрлендіріп жазамыз. Содан
соң povpra(t) процедурасын шақырамыз. Егер s[l]='-' болса да тура осындай
әрекеттер орындаимыз тек povlev(t) процедурасын шақырамыз. Бірінші символ
+ ке де, - -ке де тең болмаса, s-ті t санына түрленліріп жазамызда
perev(t) процедурасын шақырамыз. Соңынан шығару файлын ашып, оған а тізбегі
элементтері мәндерін жазып шығамыз да, ашылған файлдарды жабамыз. Сонымен
программаны толық нұсқасы мынадай:
program hoop;
var a,al:array[l.. 1000000] ofinteger; a,
fin,fout:text:
i,k,n,m,t,code:integer: s:string;
procedure povpra(x:integer):
begin
al:=a;
for i:=l to n do
if i-xl then al[i]:=a[i-x+n] else al[i]:=a[i-x];
a:=al;
end;
procedure povlev (xnnteger):
begin
al:=a;
for i:=l to n do
if i+xn then al[i]:=a[i+x-n] else al[i]:=a[i+x];
a:=al;
end;
procedure perev(y:uiteger):
var yl,y2:integer:
begin
al:=a;
for i:=l to n di\ 2 do
begin
if y+in then yl:=y+i-n else yi:=y+i;
if y-il then y2:=-i-un else y2:=y-i;
ai"[yll:=a[y2]:
aly2]:=a[vl]:
end;
a:=al;
end;
begin
assignffin.'hoop.in):
reset(fin):
readln(fin.n,m):
for k:=l to n do a[k]: = k:
for k:=l lo m do
begin
rcadln(fin.s):
if s!='+" then
begin
delele(s,1.1):
val(s.t.code);
povpra(t);
end else if s[l]='-'then
begin
delete(s,l,l);
val(s,t,code);
povlev(t);
end else .car begin
val(s,t,code);
perev(t);
end; end;
assign(fout,'hoop.out');
rewrite(fout);
for k:=l to n do
write(fout,a[k],' ");
close(fin);
close(fout);
end.
3-есеп. Шахмат тақтасындағы шеңбер
Енгізу файлының аты: сігсіе.іп
Шығару файльшың аты: eircle.out
Уақыт шектеу: 2 секуид
Жадыға шектеу: 64 мегабайт
N х М шахмат тақтасындағы R радиусты шеңбер қойылған, оның центрі
тақтаның белгілі бір ұяшығының центрімен сәйкес келеді. Шеңбердің астында
толығымен қалған ақ және қара ұяшықтардың саның анықтау керек. Тақтаның сол
жақ төменгі ұяшығы қара.
Мәліметтрді енгізу форматы
Кіріс файлдың бірінші жолында аралары пробелмен белінген 4 бүтін caн
жазылған:
N -- тақтаға қабырғасының өлшемі (lN100); R - шеңбер радиусы
(isRslOO):
X. У -- шеңбердің центрі сәйкес келетін ұяшықтың координаталары
(ІХ.УХ). ұяшықтардың координаталары сол жақ төменгі ұяшықтан бастап
саналады, ол ұяшықтың координаталары (1.1).
Мәліметтерді шығару форматы
Шығыс файлдың бірінші жолында екі caн болу керек: шеңбермен толығымен
жабылған қара және ақ ұяшықтардың саны сәйкесінше.
мысалы:
circle, in eircle.out!
5 1 3 3 1 0
Есептің шығару жолы.
Алдымене шахмат тақтасын координаталық жүйемен байланыстырамыз.
Координаталар жүйесін есеп шартына байланысты 1-суретте көрсетілгендей етіп
аламыз і арқылы тік, j арқылы көлденең координаталық өстерді алайық. Сонда
әрбір шаршының нөмірлері (і, j) олардың центріндегі нүктеге сәйкес келеді.
Шаршының түсін анықтау үшін олардың координаталарының қосындысының
тақжұптығын анықтаймыз.
Егер i+j жұп сан ... жалғасы
Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ... ... ..3
Информатикадан олимпиада жүргізу және оның әдістері
І. Негізгі бөлім
1.1 Олимпиада және оны жүргізу
әдісі ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ...4
1.2 Олимпиада тапсырмаларын есептеудің тиімді
жолдары ... ... ... ... ... ... ...4
1.3 Олимпиаданың өткізілу
ережесі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..18
1.4 Оқушыларды олимпиадаға
дайындау ... ... ... ... ... ... ... ... ... ... ... ... ... ... .26
ІІІ.
Қорытынды ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... .32
IV. Пайдаланылған әдебиеттер
тізімі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..33
Кіріспе
Факультативтік сабақтармен тығыз байланысты сыныптан тыс
жұмыстардың бірі информатика пәні бойынша өтетін олимпиада. Олимпиада
білімді оқушыларды анықтау мақсатында ұйымдастырылғанымен, оның басты
мақсаты - аса қабілетті және даярлығы күшті 2-3 оқушыны табу ғана емес,
мектеп оқушысының басым көпшілігінің информатика пәніне деген ынта,
ықыласын арттыру.
Оқушыларды олимпиадаға дайындау барысында олимпиадалық есептерді
талдаған дұрыс. Себебі, мұндай талдау оқушылардың олимпиадалық
есептердің түрлерімен таныс болып, оны шығарудағы өз күшіне деген
сенімін арттырады.
Информатикалық олимпиада - оқушыны информатикалық білім алуға
ынталандыратын ойларының дамуына себеп болатын жарыс болып
есептеледі. Информатика олимпиадасы мектеп ішілік, аудандық және қалалық,
облыстық, республикалық, халықаралық деңгейлерге бөлінеді.
Мектепте өткізілетін олимпиада екі кезең бойынша жүргізіледі:
1. кезеңде барлық үлгеретін оқушылар қатысады. Бұл кезеңнен 4-
5 алған оқушылыр келесі кезеңдегі олимпиадаға қатысады.
2. Кезеңде қияндығы жоғары тапсырмалар ұсынылады. Осы
кюезеңнің жеңімпаздары алдыңғы олимпиадаға жіберіледі.
Факультатив сабақтарды, олимпиадалық есептерді шығарудың әдіс -
тәсілдерін талдау практикасына ацйналдарған тиімді. Мектептік үздік
информатика аудандық, облыстық, республикалы, халықаралық
олимпиадаларға қатысуға мүмкіндік алу үшін оқушылар мектеп
информатика пәнін жүйелі игеру қажет.
Олимпиада және оны жүргізу әдістемесі
Олимпиаданың мақсаты;
- білімді, дамыған, дарынды мектеп оқушыларын іздеу;
- мектепте информатиканы оқыту деңгейін бағалау;
- информатиканы оқыту барысындағы ең жоғарғы деңгейге қойылатын талапты
ашу;
- мектеп, жоғарғы оқу орындары буынындағы кері байланысты жүзеге асыру.
Олимпиаданың негізгі мақсаты - оқушының қабілетін ашуды ескере
отырып, логикалық - алгоритмдік және жүйелі комбинаторикалық ойлауы дамыған
оқушыларды табу қажет. Бұл әртүрлі дайын программалық құралдар мен
командаларды пайдалану іскерлігінде пайда болады.
Олимпиадаға дайындау әдістемесі- қарастырылып отырған тәсілде
оқушьшарды олиапиядаға дайындау информатиканың базалық курсының жалғасы
болып табылады. Дайындықтың ең тиімді түрі -- сабақты олимпиада түрінде
жүргізу. Стандартты емес есептерді шешгу үшін мәліметтерді ұйымдастыру мен
програлмалаудың қазіргі әдістерін білу қажет.
Олимпиада тапсырмаларын есептеудің тиімді жолдары
Олимпиада -- оқушының білім дағдылары мен қисынды ойлау әрекеттерін
саралайтын кезең. Оқушыны олимпиадаға дайындау сәтінде есептеудің
тиімді жолдарын қарастыру - мұғалім атқарар міндетті екені
белгілі. Талапкердің жүйелі жұмыс жасай білу қабілетін саралап,
есептеудің тиімді жолдарын қолдана білу шеберліктерін шыңдап,
өзіндік бағыт - бағдар беру - қазіргі таңдағы ізденімпаз ұстаздардың
негізгі ұстанымы. Төмендегі олимпиада тапсырмалары Pascal ABC
бағдарламасында орындалған Pascal АВС өте ыңғайлы бағдарлама., бұнда
көптеген әрекеттер орындауға болады. Бұл бағдарлама қазіргі
заманның талабына сай операциялық жүйелерге сәйкес келеді.
Сонымен қатар ол терезеелі интерфейспен жұмыс істеуге мүмкіндік
береді Pascal ABC www.sunsclwol.math.rsu.ru сайтында толық
қарастырылған.
1-есеп.Кубиктер
Енгізу файлының аты: cubes.in
Шығару файлының аты: cubes.out
Уақыт шектеу: 2 секунд
Жадыға шектеу: 64 мегабайт
N кубик берілген. Қатар қойылған бірнеше бағаналардан тұратын
кубиктерді жар деп атаймыз.
Жардың і - ші бағанасының биіктігін һ3 деп белгілейміз. Жардағы
бағаналар саны М болса барлық і үшін (1ІМ-1), һ3 һ3-1 және
Һ3 + һ2 + ... + Һм = N ережесіне бағынатындай әр түрлі неше жар бар екенін
табу керек. Мәліметтерді енгізу форматы Кіріс файлына жалғыз N саны
берілген (lN100)
Мәліметтерді шығару форматы Шығыс файлға бір бүгін сан жазу керек
ізделінген сан.
Есептің шығару жолы.
Алдымен мысалда көрсетілген жарларды сандар тізбегі ретінде
белгілейік:
4; 3,1; 2,2; 2,1,1; 1,1,1,1.
Бұл тізбектердің әрқайсысында келесі шарттар орындалуы керек:
1) Әрбір тізбектегі элементтердің қосындысы N-ге тең болуы керек:
h1+h2+...+hM=N.
2) Тізбектің әрбір элементі өзінің алдынлағы элеменітерден аспауы
керек: һ=һ1+1
Мұндай тізбектерді табу үшін терулер орындау керек. Алдымен 1 орынға,
сосын 2 орынға, сосын 3 орынға, сол сияқты ең соңынан N орынға 1-ден N-re
дейінгі бүтін сандардан теру орындаймыз. Терулерді гее(х) рекурсивті
проиедурсы көмегімен жасаймыз. М - тізбек элементтерінің, яғни теру
орындарының саны. М=1, 2 , 3 ... .N.
К-берілген (1),(2) шарттарды қанағаттандыратын тізбектер саны болсын.
Онын алғашқы мәнін О-ге тең етіп аламыз. Программаның негізгі бөлімінде
әрбір М-нің мәні үшін терулер орындайтын гес(х) ироцедурасын шақырамыз.
к:=0;
for m:=l to n do
rec(I);
Енді гес(х) рекурсивті процедурсын қарастырайық. Бұл процедура М
орынға N саннан теру орында керек және табылған терудің (1), (2) шарттарды
қанағаттандыратындығын тексеру керек. Шарттар қанағаттандырылатын болса К
есептеуіш айнымалысы 1 санға артуы керек. Рекурсия алдымен 1-деңгейде
шақырылады, сосын өзін-өзі шақырып келесі деңгейге өтеді. Әрбір і-ші
деңгейде һ тізбегінің і-ші элементін тереді. Егер Х-проиедура параметрі M +
1-re тең болса онда М орынға теру орындалып болғаны. Онда алдымен (1)
шарттың орындалуын тексеру үшін һ тізбегі элементтерінің қосындысын
есептейміз.
s:=0;
for i:=l to m do s:=s+h[i];
Енді (2) шарттың орындалуын тексеру үшін.
t айнымалысын алып, оның бастапқы мәнін О-ге теңестіреміз. Әрбір і үшін (1
іМ-1), һ[іһ[і+1) шарты орындалса t:=l қылып өзгертеміз. Сонда
һ[і]һі+1] шарты ең болмаса бір рет орындалса t-ның мәні 1-ге тең болады,
ал бірді-бір рет орындалмаса t-ның мәні бастапқы 0 қалпында қалады.
for i:=l to m-1 do
if h[i]h[i+l] then t:=l;
Erep бұл шарттардың екеуі де орындалса К-ның мәнін 1 санға есіреміз.
if (s=n)and(t=0) then k:=k+l;
Сонымен программаның толық мәтіні келесідей болады:
program cubes;
var fin, fout: text;
k,n,ra,s,t,i:integer;
h:array[1..100] of integer;
procedure rec(x:integer); {рекурсивті процедура}
var ininteger;
begin if x=m+l tben {peKypcия соңғы деңгейге жетті}
begin
s:=0; {қосындыны есептеу}
for i:=l to m do s:=s+h[i];
t:=0;
for i:=l to m-1 do {(2) шартты тексеру}
if h[i]h[i+l] then t:=l;
if (s=n)and(t=0) then k:=k+l;
end else {Рекурсия соңғы деңгейге жеткен жоқ}
begin
for ir:= 1 to n do
begin h[x]:=ir; rec(x+1)
end; {h-mi теpin, рекурсияның } {келесі деңгейіне өту}
end;
begin {программаның негізгі бөлімі}
assign(fm,'cubes.in'); (негізу файлын байланыстыру)
assign(iout,'cubes.out'); {шығару файлын байліаныстыру}
reset(fin); {енгізу файлын оқу үшін ашу}
read(fin,n); {енгзіу файлынан пдіі енгізу}
close(fin); {енгізу файлын жабу}
к:=0;
for m:= I to n do
rec( 1); {рекурсивті процедураны шақыру}
rewrite(fout); шығару файлын жсау үшін ашу
writcln(fout,k); шығару файлына К - ның мәнін жазу
l(se(fout); шығару файлын жабу
end.
2-есеп. Сақина
Енгізу файлының аты: hoop.in
Шығару файлының аты: hoop.out
Уақыт файлының шектеу: 2 секунд
Жадыға шектеу: 64 мегабайт
Сақинаның бойына бірдей қашықтықта 1 -- ден N-re-дейін сандар сағат
тілінің бағыты бойынша өсу ретімен жабыстырылған, 1 саны сақинаның ең
жоғары нүктесінде орналасқан. Осыдан кейін сақинамен М әрекет жасалды.
Сақинаның соңғы қалпын анықгау керек.
Сақинамен жасалатын әрекеттер:
Оңға немесе солға бірнеше санға айналдыру.
Белгілі бір нүктенің айналасында аудару.
Кез - келген әрекет кезінде сақинаның центрі орнында қалады.
Мәліметтерді енгізу форматы
Кіріс файлдың бірінші жолында екі бүтін сан жазылған N және М
(0N,M105). Осыдан кейін әрекеттерді сипаттайтын М жол жазылған. Бұл
жолдардың әрқайсысы келесі форматтардың бірінде болады:
+Х -- оң жаққа (сағат тілінің бағытымен) X орынға айналдыру;
-X - сол жаққа (сағат тіліне қарама-қарсы) X орынға айналдыру;
У -- У позициясының айналасында аудару; ең жоғары нүктенің позициясы
әрқашан 1-ші, келесі позициялар сағат тілінің бағытымен сананалады.
0Х109, 1YN
Мәліметтерді шығару форматы
Шығыс файлдың бірінші N бүтін сан болу керек-сақинаның бойындағы
сандар ең жоғарысынан бастап сағат тілінің бағаты бойынша.
Мысалға комментарий
Сақинаның бастапқы қалпы: 1 2 3 4 5
1-ші әрекеттен кейін (оң жаққа 2 орынға айналдыру) 4 5 1 2 3
2-ші әрекеттен кейін (сол жаққа 3 орынға айналдыру) 2 3 4 5 1
3-ші әрекеттен кейін (3-ші позииияның айналасында аулару) 1 5 4 3 2
Мысал
Hoop.in Hoop.out
5 3 1 5 4 3 2
+2
-3
3
Есентің шығару жолы.
Есептің мазмұнын дұрыс түсіну үшін алдымен сакинаны сызып
көрсетейік.
Бұл сақинының, орындарын тізбек элементтері ретінде қарастыруымызға
болады. Ол тізбекті а деп белгілейік.
[ 1.. 1000001 of integer; aI тізбегін түрлендіру үшін қолдануға қосымша
алып отырмыз. Енді түрлендіру үшін қолданылатын процедурадарды қарастырайық
povpra(x) процедурасы саиптына сағат тілі бағытымен X орынға айналдырады.
Біздің мысалымызда берілген сақина үшін сонда povpra (2) процедуралық
шақырту суретте көрсетілгендей түрлендіру орындайды. Яғни әрбір і-ші орынға
і-х -ші орындағы сан ауысады. Егер і-х 1 болса, онда і-ші орынға і-х+п -- ші
орындағы санды айтамыз. Түрлендірулерді орындау үшін аі тізбегіне а
тізбегін меншіктеп алып, соңынан түрлендірілгсн aI тізбегін а тізбегіне
қайта меншіктейміз. Сонымен
procedure povpra(x:integer);
begin
al:=a;
for i:=l to n do
if i-x 1 then al[i]:=a[i-x+n] else al[i]:=a[i-x];
a:=al;
end;
povlev(x) процедурасы сақинаны сағат тіліне қарама-қарсы бағытта X
орынға айналдырады.
Біздің мысалымызда берілген сақина үшін соңда povlev(2) процедуралық
шақыту суретте көрсетілгендей түрлендіру орындалады. Яғни әрбір і-ші
орынға і+х -ші орындағы сан ауысады. Егер і+хп болса, онда і-ші орынға і+х-
п -- ші орыңдағы санды аламыз. Сонымен
procedure povlev(x:integer
begin------
al:=a;
for i:=l to n do
if i+xn then al[ij:=a[i-\-n else аЦі):=а[і+х;
a:=al;
end;
Енді y-ші пoзицияның айналасында аудару әрекетіп орындайтын
процедурасын қарастырайық.
Мысалға беріліен сақина үшін perev (3) процедуралық шақыру
суретіндегідей түрлендіру жасайды.
Суретте көрсетілгендей әрбір у+і -ші орындағы элементті у-і ші
орындағы элементпен орын ауыстыруымыз керек. ауыстырулар n div 2 циклда
орындалады. Егер у+і г. болса. оны у+і-п-мен ауыстырамыз. Сондай-ақ егер у-
і1 болса, оны у-і+п -- мен ауыстырамыз. у-і және у-і мәндерін есептеу алу
үшін оларды ;1.у2 айнымалыларына меншіктеп аламыз. Сонымен процедура
былай жазылады:
procedure perev(y:integer):
varyl,y2:integer;
begin
al:=a;
for i:=l to n div 2 do
begin
if y+in then yl:=y+i-n else yl:=y+i;
if y-i 1 then y2:=y-i+n else y2:=y-i;
al[yl]:=a[y2]; ally2]:=a[yl];
end;
a:=al;
end;
Енді программаның негізгі бөлігін қарастырайық. Алдымен енгізу файлын
ашып алып, одан есеп шартында берілгендей форматта п мен m-ді, содан соң
әрекеттерді білдіретін жолдың қатарларды енгіземіз. Әрбір s жолдың қатарын
енгізген соң оның бірінші символы s[l]-j.i тексереміз. Егер ат'+' болса, s-
тің бірінші символын dekte(s,l,l) процедурасы арқылы жойып. қалған бөлігін
val(s,t,code) процедуфасы арқылы t айнымалысына түрлендіріп жазамыз. Содан
соң povpra(t) процедурасын шақырамыз. Егер s[l]='-' болса да тура осындай
әрекеттер орындаимыз тек povlev(t) процедурасын шақырамыз. Бірінші символ
+ ке де, - -ке де тең болмаса, s-ті t санына түрленліріп жазамызда
perev(t) процедурасын шақырамыз. Соңынан шығару файлын ашып, оған а тізбегі
элементтері мәндерін жазып шығамыз да, ашылған файлдарды жабамыз. Сонымен
программаны толық нұсқасы мынадай:
program hoop;
var a,al:array[l.. 1000000] ofinteger; a,
fin,fout:text:
i,k,n,m,t,code:integer: s:string;
procedure povpra(x:integer):
begin
al:=a;
for i:=l to n do
if i-xl then al[i]:=a[i-x+n] else al[i]:=a[i-x];
a:=al;
end;
procedure povlev (xnnteger):
begin
al:=a;
for i:=l to n do
if i+xn then al[i]:=a[i+x-n] else al[i]:=a[i+x];
a:=al;
end;
procedure perev(y:uiteger):
var yl,y2:integer:
begin
al:=a;
for i:=l to n di\ 2 do
begin
if y+in then yl:=y+i-n else yi:=y+i;
if y-il then y2:=-i-un else y2:=y-i;
ai"[yll:=a[y2]:
aly2]:=a[vl]:
end;
a:=al;
end;
begin
assignffin.'hoop.in):
reset(fin):
readln(fin.n,m):
for k:=l to n do a[k]: = k:
for k:=l lo m do
begin
rcadln(fin.s):
if s!='+" then
begin
delele(s,1.1):
val(s.t.code);
povpra(t);
end else if s[l]='-'then
begin
delete(s,l,l);
val(s,t,code);
povlev(t);
end else .car begin
val(s,t,code);
perev(t);
end; end;
assign(fout,'hoop.out');
rewrite(fout);
for k:=l to n do
write(fout,a[k],' ");
close(fin);
close(fout);
end.
3-есеп. Шахмат тақтасындағы шеңбер
Енгізу файлының аты: сігсіе.іп
Шығару файльшың аты: eircle.out
Уақыт шектеу: 2 секуид
Жадыға шектеу: 64 мегабайт
N х М шахмат тақтасындағы R радиусты шеңбер қойылған, оның центрі
тақтаның белгілі бір ұяшығының центрімен сәйкес келеді. Шеңбердің астында
толығымен қалған ақ және қара ұяшықтардың саның анықтау керек. Тақтаның сол
жақ төменгі ұяшығы қара.
Мәліметтрді енгізу форматы
Кіріс файлдың бірінші жолында аралары пробелмен белінген 4 бүтін caн
жазылған:
N -- тақтаға қабырғасының өлшемі (lN100); R - шеңбер радиусы
(isRslOO):
X. У -- шеңбердің центрі сәйкес келетін ұяшықтың координаталары
(ІХ.УХ). ұяшықтардың координаталары сол жақ төменгі ұяшықтан бастап
саналады, ол ұяшықтың координаталары (1.1).
Мәліметтерді шығару форматы
Шығыс файлдың бірінші жолында екі caн болу керек: шеңбермен толығымен
жабылған қара және ақ ұяшықтардың саны сәйкесінше.
мысалы:
circle, in eircle.out!
5 1 3 3 1 0
Есептің шығару жолы.
Алдымене шахмат тақтасын координаталық жүйемен байланыстырамыз.
Координаталар жүйесін есеп шартына байланысты 1-суретте көрсетілгендей етіп
аламыз і арқылы тік, j арқылы көлденең координаталық өстерді алайық. Сонда
әрбір шаршының нөмірлері (і, j) олардың центріндегі нүктеге сәйкес келеді.
Шаршының түсін анықтау үшін олардың координаталарының қосындысының
тақжұптығын анықтаймыз.
Егер i+j жұп сан ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz