Ni nini algorithm katika programu. Miundo ya msingi ya programu (aina za algorithm). Programu ya huduma ya PC na misingi ya algorithmic

Kozi hiyo inawatambulisha wanafunzi kwa miundo ya msingi ya data na algorithms, ujuzi ambao ni muhimu kutatua kwa ufanisi matatizo mbalimbali ya programu. Waandishi wa kozi hiyo wanajishughulisha na kutafuta na kutoa mafunzo kwa wanafunzi wenye vipawa na watoto wa shule katika uwanja wa sayansi ya kompyuta na programu. Chini ya uongozi wao, timu za wanafunzi zilirudiwa kuwa mabingwa wa programu wa Urusi, mabingwa wa ulimwengu na Uropa.

Kuhusu kozi

Kozi hiyo imejitolea kwa utafiti wa algorithms ya msingi na miundo ya data, ujuzi ambao ni muhimu kutatua kwa ufanisi matatizo mbalimbali ya programu. Algoriti mbalimbali za kupanga, miundo ya data ya mstari kama vile foleni na orodha, algoriti na miundo ya data kwa ajili ya utafutaji na uhifadhi bora wa taarifa - miti ya utafutaji iliyosawazishwa na heshi, pamoja na algoriti za utafutaji za mifuatano huzingatiwa.

Madhumuni ya kozi ni kupata maarifa ya kimsingi kuhusu algoriti za kimsingi na miundo ya data inayotumika kuhifadhi na kurejesha maelezo. Kozi hii hutumia mfumo wa kupima programu otomatiki ambao hutoa tathmini ya lengo la usahihi wa kazi za kupanga.

Baada ya kumaliza kozi, wanafunzi watapata ujuzi katika kuchambua na kutekeleza kanuni za msingi za programu na miundo ya data, pamoja na kubuni na kutengeneza zana za kutekeleza teknolojia ya habari inayotumika.

Kuchukua kozi ya "Algorithms ya Upangaji na Miundo ya Data" kutaongeza tija na ushindani wa wanafunzi katika ukuzaji wa programu.

Umbizo

Kozi hiyo inajumuisha mihadhara ya video, tafiti kulingana na nyenzo za mihadhara, na kazi za programu za vitendo ambazo zinahitaji utekelezaji huru wa algoriti na miundo ya data iliyosomwa katika kozi katika mojawapo ya lugha za kisasa za programu zinazopendekezwa. Kozi huchukua wiki kumi. Wastani wa kazi ya kila wiki kwa kila mwanafunzi ni saa 14. Ugumu wa jumla wa kozi ni vitengo vinne vya mkopo.

Rasilimali za habari

Ili kukamilisha kozi na kukamilisha kazi zote zilizopendekezwa, vifaa vya mihadhara ya video vinatosha. Walakini, ili kuongeza maarifa yako juu ya mada inayosomwa, unaweza kutumia vyanzo vya ziada vifuatavyo:

  1. Cormen T., Leiserson Ch., Rivest R., Stein K. Algorithms: ujenzi na uchambuzi. - M.: Williams, 2012.
  2. Aho A., Hopcroft D., Ullman D. Miundo ya data na algoriti. - M.: Williams, 2007.
  3. Vidokezo vya mihadhara ya mtandaoni kuhusu hisabati bainifu, algoriti na miundo ya data, iliyotolewa katika Idara ya Teknolojia ya Kompyuta ya Chuo Kikuu cha ITMO.

Mahitaji

Ili kukamilisha kozi hiyo kwa mafanikio, unahitaji ujuzi wa misingi ya hisabati isiyo na maana na uwezo wa kuandika programu za ukubwa wa kati katika lugha ya programu inayolenga kitu.

Ili kukamilisha kozi, mkusanyaji yeyote anayepatikana hadharani kwa mojawapo ya lugha zifuatazo za programu inahitajika:

  • Java: toleo la 8 (kiungo cha kupakua kwenye tovuti ya Oracle)
  • C, C++: Toleo la MinGW 5.1 (kwa Linux, unaweza kutumia GCC ya toleo linalofanana), pamoja na Microsoft Visual Studio C++ 2013 (unaweza kupakua Visual Studio Express).
  • C#: Microsoft Visual Studio C# 2013 (unaweza kupakua Visual Studio Express).
  • Python: toleo la 3.5 (kiungo cha kupakua kwenye python.org)
  • Scala: toleo la 2.11 (kiungo cha kupakua kwenye scala-lang.org)
  • Kotlin: toleo la 1.0 (viungo vya maagizo ya kusanikisha mkusanyaji, programu-jalizi kwenye IntelliJ IDEA na Eclipse).

Mpango wa kozi

Kozi hiyo inashughulikia mada zifuatazo:

  1. Makadirio ya muda wa uendeshaji wa algoriti
  2. Kupanga algoriti kulingana na ulinganifu (unganisha aina, kupanga haraka, mipaka ya chini kwa wakati wa kufanya kazi wa kupanga algoriti)
  3. Kupanga algoriti kwa kutumia wakati wa kukimbia (aina ya kuhesabu, aina ya dijiti, aina ya mfukoni)
  4. Miundo ya msingi ya data (lundika, foleni, orodha zilizounganishwa)
  5. Algorithms kulingana na lundo la jozi (aina ya lundo, foleni ya kipaumbele)
  6. Utangulizi wa Maagizo ya Utafutaji (Utafutaji wa Binary katika Mkusanyiko Uliopangwa, Mti wa Utafutaji wa Nambari)
  7. Miti ya utafutaji iliyosawazishwa (muhtasari wa miti iliyosawazishwa, mti wa AVL, mti wa Splay)
  8. Hashing (meza za hashi zenye anwani za kibinafsi na za umma)
  9. Utangulizi wa utaftaji wa kamba ndogo (algorithm rahisi zaidi ya utaftaji, algorithm ya Rabin-Karp)
  10. Tafuta masharti madogo (algorithm ya Knuth-Morris-Pratt, Z-function, algoriti ya Boyer-Moore)

Kila mada inahitaji kujifunza kwa wiki moja. Kila wiki, kazi za upangaji hupewa ambazo zinahitaji utekelezaji huru wa algoriti na miundo ya data iliyosomwa katika kozi.

Kuna aina mbili za tarehe za mwisho katika kozi (tarehe ya mwisho ya kukamilisha shughuli za tathmini):
- tarehe ya mwisho laini, ambayo ni muhimu kukamilisha shughuli zote za tathmini za wiki ya sasa kabla ya kukamilika kwake;
- tarehe ya mwisho ngumu, ambayo wiki mbili za ziada zimetengwa kwa ajili ya kukamilisha shughuli za tathmini baada ya tarehe ya mwisho ya laini, baada ya hapo ufikiaji wa shughuli husika umefungwa.

Matokeo ya kujifunza

  • Uwezo wa kuchambua na kutekeleza algorithms ya msingi ya programu na miundo ya data
  • Ujuzi katika kubuni na kukuza zana za kutekeleza teknolojia ya habari iliyotumika
  • Ujuzi katika kutengeneza algoriti za kufanya utafiti wa majaribio katika sayansi ya kompyuta

Ustadi ulioundwa

  • 09.03.02 Mifumo ya habari na teknolojia
    1. Uwezo wa kubuni teknolojia ya habari ya msingi na inayotumika (PC-11)
    2. Uwezo wa kukuza njia za kutekeleza teknolojia ya habari (algorithmic) (PC-12)
    3. Nia ya kushiriki katika kuanzisha na kufanya utafiti wa majaribio (PC-23)

Ndio, mafunzo mazuri ya algorithmic ni muhimu kwa mpanga programu. Na hapana, nzuri sio kukariri algorithms kutoka kwa orodha ya "Algorithms Muhimu Zaidi Ambayo Kila Mtu Anapaswa Kujua." Kwa maoni yangu, mafunzo mazuri ya algorithmic yanapaswa kujitahidi kumpa programu ustadi tatu zifuatazo.

Kwanza, hii ni uwezo wa kutatua shida zisizoeleweka. Tazama tafsiri kali zinazowezekana katika uundaji usio wazi wa kazi za maisha. Kulingana na tafsiri kali, wasilisha chaguzi za suluhisho. Chambua kwa kina chaguzi tofauti na uchague inayofaa zaidi.

Ni wazi, kujua tu algorithms haitoshi kwa hili. Unahitaji kuwa na uwezo wa "kuwaona" na kutambua uwezekano wa matumizi yao.

Pili, mafunzo ya algorithmic yanapaswa kukuza tabia ya kuchambua ufanisi wa kila moja ya maamuzi yako. Usiache algoriti za quadratic au kielelezo katika maeneo muhimu, na usilete mawazo katika usanifu wa programu ambayo itakuwa vigumu kutekeleza kwa ufanisi wa kutosha.

Tatu, mafunzo ya algorithmic yanapaswa kusaidia kwa ustadi kutumia zana zilizotengenezwa tayari. Hifadhidata ni miundo yote ya data na algoriti. Kwa kuongeza, katika kiwango cha dhana, ni rahisi sana na inaeleweka - miti ya utafutaji, hashtables, SS-Jedwali, ...

Kwa mfano, kujua kwamba faharisi katika hifadhidata ni mti wa utaftaji, ni rahisi kuelewa ni maswali gani yanaweza kutekelezwa haraka na ambayo yamekataliwa kuchanganuliwa kikamilifu.
Kujua jinsi utafutaji wa maandishi kamili unavyofanya kazi katika Lucene, ambayo algorithms, unaweza kutabiri ni maswali gani kwa Elastic yatatoa majibu muhimu na ambayo hayataleta, na hata jinsi hii inaweza kuboreshwa.

Ili kuhitimisha:

  • Mbali na algoriti zenyewe, jifunze kuzitambua katika matatizo ya ulimwengu halisi.
  • Jijengee mazoea ya kuchanganua ufanisi wa kanuni unayoandika.
  • Jifunze algorithms chini ya kofia ya zana unazotumia - hii itakuwa muhimu wakati wa kuzitumia.

Vifungu kama vile "je, watengeneza programu wanahitaji algoriti" mara nyingi huonekana, na zote zina takriban kiolezo sawa. Mwandishi wa makala kawaida huandika: "Nimekuwa nikiandika tovuti/hati katika 1C kwa miaka N, na sijawahi kutumia algoriti au miundo ya data. Mara moja hutoa mifano ya miti nyekundu-nyeusi au miundo mingine ya kigeni, ambayo katika eneo ambalo mwandishi anafanya kazi hazionekani mara nyingi, ikiwa ni sawa. Nakala kama hizo huchemka kwa ukweli kwamba katika eneo fulani waandaaji wa programu hawatumii miundo tata ya data na hawasuluhishi shida za NP.

Uundaji wa swali kama hilo kimsingi sio sahihi. Idadi ya utaalam katika tasnia inakua kila wakati, na mtu anayeandika tovuti kwenye .net atafanya mambo tofauti kabisa kuliko mtu anayeandika viendesha kwa sensorer kwenye usanifu wa ARM chini ya OS ya kigeni. Hebu kwanza tufafanue algorithm ni nini. Kwa njia isiyo rasmi, Cormen anafafanua algoriti kama utaratibu uliobainishwa vyema ambao huchukua thamani moja au zaidi kama ingizo, na kurudisha thamani moja au zaidi kama matokeo. Hapo awali, algorithm inafafanuliwa katika mifano tofauti ya hesabu: shughuli zinazoweza kufanywa kwenye mashine ya Turing au kutumia calculus ya lambda. Hivyo karibu yoyote kanuni kwamba hana kitu ni algorithm. Inabadilika kuwa swali "je, mtayarishaji programu anahitaji algoriti" linaweza kutafsiriwa kama "je, mtayarishaji programu anahitaji kuwa na uwezo wa kuandika msimbo?" Swali sahihi linapaswa kuwa kama: "je, mpangaji programu katika tasnia X anahitaji kujua algoriti za hali ya juu na maelezo ya nadharia ya hesabu."

Ukiangalia nakala hizi zote, utagundua kuwa watu wanaoziandika wanachukizwa na vyuo vikuu kwa sababu walilazimishwa kujifunza nyenzo nyingi ngumu - kwa njia ya uchambuzi wa algorithmic, algorithms ngumu na muundo wa data - ambayo haikufanya kazi. inaonekana kuwa na manufaa kwao. Kwa kweli, waandishi wa makala wamechukizwa na vyuo vikuu kwa sababu hawakuweza kutabiri uwanja wa baadaye wa kazi ya waandishi na kuwapa tu ujuzi mdogo unaohitajika. Hakika, ili kuandika tovuti rahisi na maandiko, huhitaji ujuzi maalum wa algorithms na miundo ya data. Au bado ni lazima?

Wacha tufikirie juu ya kile mpangaji programu anahitaji kusoma katika chuo kikuu ili kupata ustadi muhimu kwa kazi iliyofanikiwa. Maktaba? Mifumo? Hupitwa na wakati, violesura vyao hubadilika, vyote vimeandikwa mara nyingi katika lugha moja, ambayo huenda wanafunzi wasitumie kwenye tasnia. Je, tunapaswa kufundisha kila mtu jinsi ya kuandika tovuti? Au kufundisha kila mtu jinsi ya kuandika OS? Elimu inapaswa kufikia hadhira pana zaidi iwezekanavyo na kutoa ustadi mpana zaidi iwezekanavyo. Mpangaji programu lazima kwanza awe na uwezo wa kuchambua na kutatua shida - huu ndio ustadi kuu ambao wahitimu wa sayansi ya kompyuta wanapaswa kupata. Nambari ya uandishi ni zana muhimu ambayo hutumiwa kutatua shida. Nani anajua ni ujuzi gani utahitaji katika siku zijazo? Kwa hivyo, nadharia ya kujifunza ndiyo bora zaidi kutoka kwa mtazamo wa kielimu. Ujuzi uliopatikana unaweza kutumika katika nyanja yoyote, na kujifunza maktaba au mfumo wenye msingi mzuri wa ujuzi hautakuwa vigumu. Kitendawili ni kwamba watu wanaouliza maswali kuhusu hitaji la algoriti huwa na ujuzi fulani katika eneo hili. Sikumbuki hata mtu mmoja ambaye hakuwa na ujuzi katika uwanja wa nadharia ya hesabu na alipiga kelele kwa kiburi juu yake, akidai kwamba hakuhitaji.

Kwa hivyo, wewe ni mtayarishaji programu katika utupu, umekuwa ukifanya kazi kwa zaidi ya miaka kumi ukiweka tovuti pamoja na kutatua matatizo rahisi yanayofanana kwa wateja/kampuni. Unajisikia vizuri na vizuri katika niche yako, na maumivu makali tu kwa muda uliopotea katika darasa juu ya nadharia ya computational na uchambuzi wa algorithmic ambayo haikukupa chochote. Asubuhi, wakati wa kuwasha sigara juu ya kikombe cha kahawa, katika kina cha tafakari za falsafa juu ya udhaifu wa kuwepo, unashangaa: kwa nini waandaaji wa programu ambao hawana kutatua matatizo magumu wanahitaji kujua algorithms na misingi ya uchambuzi. Jibu fupi ni kuwa na ujuzi na kutumia ipasavyo zana zinazopatikana, pamoja na lugha unayoandika. Nadharia ya algoriti na uchanganuzi haifunzi tu algoriti za kigeni na miundo ya data katika mfumo wa AVL na miti nyekundu-nyeusi. Pia hutoa maarifa kuhusu jinsi ya kupanga data kwa ufanisi, jinsi ya kuandika msimbo kwa utendakazi wa hali ya juu, ambapo vikwazo vinaweza kutokea kwenye mfumo, na jinsi ya kukabiliana nazo. Unaletewa suluhu zilizotengenezwa tayari ili usiandike baiskeli na usikimbie Google kila wakati unahitaji kufanya jambo lisilo la maana.

Ujuzi wa nadharia ya uchambuzi na algorithms kwa kweli hutumiwa na waandaaji wa programu kila siku, tumezoea tu mambo haya hata hatufikirii juu yake. Shida yoyote utakayosuluhisha - iwe tovuti rahisi yenye kuleta data kutoka kwa hifadhidata, au hati ya bash kwenye seva, utatumia aina fulani ya miundo ya data. Angalau safu primitive, na uwezekano mkubwa kitu ngumu zaidi. Lugha hutupa miundo mingi tofauti, ambayo mingi hutumika kwa kubadilishana. Mara nyingi tuna tofauti kadhaa za aina moja ya dhahania na utekelezaji tofauti. Kwa mfano, C++ ina vekta na miundo ya data ya orodha. Je, ni tofauti gani, na itakuwa nini faida na hasara za kutumia moja au nyingine? Ramani inatekelezwaje katika C++, na inatofautiana vipi na multimap? Orodha inatekelezwaje katika Python - kupitia safu au orodha iliyounganishwa na ni ipi njia bora ya kufanya kazi nayo? Kwa nini haifai kutumia ArrayList katika C # na badala yake utumie Orodha? Jinsi SortedDictionary inatekelezwa na itaathiri vipi utekelezaji wa programu ikiwa itatumika badala ya Kamusi? Je, mwendelezo hufanya kazi vipi, wakati unapaswa kutumika, na kuna madhara yoyote wakati wa kuitumia? Je, ni lini mara ya mwisho ulipotumia vitendaji vya curried, ambavyo vinapatikana katika karibu kila lugha? Ikiwa unafikiria kuwa ramani katika C++ inatekelezwa kama jedwali la hashi, umekosea. Inatekelezwa kwenye miti nyekundu-nyeusi, na jedwali la hashi linatekelezwa na unordered_map. Programu inayobadilika inafaa kutajwa tofauti. Kuelewa ni nini, jinsi utendaji wa kujirudia unaweza kuandikwa upya kikamilifu, na kukariri ni nini mara nyingi kutakusaidia kuzuia kujipiga risasi kwenye mguu. Kwa hivyo, ili tu kutumia kikamilifu na kwa ufanisi lugha ambayo unaandika, tayari unahitaji kuwa na ujuzi wa juu juu wa miundo ya data, ni nini, na jinsi inavyoweza kuathiri utekelezaji wa programu yako.

Vipi kuhusu maktaba? Baada ya yote, wao kutatua matatizo mengi! Ili kutumia maktaba kwa ufanisi, unahitaji pia kuzielewa. Kwanza, utendakazi katika maktaba unaweza kuwa na athari au tabia ambayo usingejua bila kuelewa kanuni. Baada ya kupokea hitilafu katika kesi hii, unaweza kujaribu kwa muda mrefu na kwa bidii kuikamata na kuamua ni wakati gani inaweza kuepukwa. Pili, zana na maktaba mbalimbali mara nyingi huhitaji "kubinafsishwa" - kuambiwa ni algoriti gani, miundo ya data na teknolojia za kutumia ndani. Bila maarifa ya kimsingi, itabidi uende kusoma mana au uchague bila mpangilio. Tatu, kuna matatizo mengi ambayo hayawezi kutatuliwa kwa kuita tu API ya maktaba au mfumo. Utafanya nini katika kesi hii? Kutumia saa kutafuta suluhu zinazowezekana na kuuliza rafiki msaada? Nne, matatizo mengi yanaweza kutatuliwa kwa urahisi sana na mistari michache ya msimbo au zana za lugha zilizojengewa ndani. Ikiwa utatoa maktaba ili kutatua kila tatizo, basi programu zako zitakuwa monsters kubwa, zinazochukua mamia ya megabytes au zaidi kwenye diski, kula kumbukumbu zote kwenye seva, na wakati huo huo kuwa na utendaji mdogo. Kwa kuongezea, kuwepo kwa kundi la maktaba zilizojumuishwa kunahusisha matatizo ya uoanifu, na programu inaweza kuharibika kwa nasibu kutokana na tabia ya ajabu ya maktaba kadhaa katika mradi mmoja. Utumiaji wa maktaba bila kufikiria unaweza kusababisha matokeo mabaya kabisa, na watengenezaji ambao wanajua tu jinsi ya kutumia maktaba lakini hawawezi kutatua hata shida rahisi peke yao hawatathaminiwa kamwe kwa sababu suluhisho zao hazitakuwa za ushindani.

Mtayarishaji programu mmoja aliye na uzoefu wa zaidi ya miaka kumi alifanya kazi nami. Siku moja tulihitaji chaguo la kukokotoa ambalo maktaba tuliyotumia haikuauni wakati huo: maandishi ya awali katika mojawapo ya vipengele vya kuona. "Mpangaji" huyu aliona kuwa hii haiwezi kufanywa kwa kutumia njia za kawaida, na mara moja akatangaza kuwa utekelezaji wa kazi kama hiyo hauwezekani. Tatizo lilitatuliwa na mwanafunzi wa mwaka wa tatu na ubongo wa uchambuzi, ambaye aliandika algorithm rahisi katika masaa mawili na kutekeleza katika sehemu inayohitajika. Nilirithi mradi mwingine kwa njia ya tovuti kwenye .net. Ukurasa kuu ulikuwa na grafu kadhaa ndogo na ilichukua karibu sekunde 10 kupakia. Ilibadilika kuwa mtu ambaye hapo awali alifanya mradi huu alikusanya rundo la miundo ya kutisha kutoka kwa vitanzi vilivyowekwa mara tatu, ambayo ilichukua muda mrefu na wa kusikitisha kuchukua data kutoka kwa hifadhidata na kisha kuifunga kwa grafu. Baada ya kurekebisha tena, ukurasa ulipakiwa karibu mara moja.

Mpangaji programu anaweza kufanya bila ufahamu wa algorithms na nadharia ya uchanganuzi? Labda kuna mengi ya "programmers" vile. Itakuwa rahisi kuwaita watengenezaji programu. Watayarishaji programu wengi huja kwangu kwa mahojiano, wakiwa na uzoefu wa miaka kumi hadi kumi na tano, na hawaelewi kabisa wanachofanya na kwa nini. Wana niche yao wenyewe, huenda kutoka kwa kampuni hadi kampuni, bila kukaa ndani yao kwa zaidi ya mwaka mmoja. Kama sheria, wana seti ndogo ya kazi ambazo wanaweza kutatua, na ikiwa unachukua hatua kwa upande, basi mtu huyo amepotea na anahitaji kujifundisha ujuzi mpya. Watu kama hao wanaalikwa kwenye mradi huo, na wanawaondoa haraka iwezekanavyo, kwa sababu wanapoteza muda mwingi kurejesha magurudumu na kusoma mana ili kujifunza kile walichopaswa kujua kutoka chuo kikuu. Kama sheria, hawana kazi yoyote na mapato yasiyokuwa na utulivu.

Mwishowe, kwa nini unahitaji kujua algorithms na nadharia ya uchanganuzi ikiwa unaweza kufanya kazi bila maarifa haya? Ili kuwa mtaalamu aliyehitimu katika taaluma yako, kuwa na ukuaji wa kazi na heshima kutoka kwa wenzako. Ili kutatua shida kwa ufanisi na sio kurejesha gurudumu. Ili usiandike monsters na idadi kubwa ya maktaba ya mtu wa tatu, ambayo huchukua mamia ya megabytes kwenye diski, kula kumbukumbu nyingi kwenye seva na kuanguka mara kwa mara kwa sababu ya nasibu kulingana na awamu ya mwezi. Ili kutumia lugha unayoandika kwa ufanisi na kwa ukamilifu iwezekanavyo. Kufanya maamuzi sahihi na yenye maana kuhusu uchaguzi wa maktaba na teknolojia ya kutatua tatizo. Ikiwa kazi yako ni kuandika swala la SQL na kuingiza amri kwenye koni, basi ninataka kukukatisha tamaa: wewe sio programu, wewe ni mtumiaji, hauitaji algorithms na kadhalika, na umepoteza yako. wakati wa chuo kikuu kwa sababu kwa kazi kama hiyo Inatosha kukamilisha kozi au kusoma vitabu kadhaa vya utangulizi peke yako.

Mada 1.3: Programu ya Mfumo

Mada 1.4: Programu ya huduma na misingi ya algorithmic

Utangulizi wa Taarifa za Kiuchumi

1.4. Programu ya huduma ya PC na misingi ya algorithmic

1.4.2. Misingi ya algorithmization na lugha za programu

Algorithm na sifa zake

Kutatua matatizo kwenye kompyuta ni msingi wa dhana ya algorithm. Algorithm ni maagizo sahihi ambayo hufafanua mchakato wa kukokotoa unaoongoza kutoka kwa kutofautiana kwa data ya awali hadi matokeo ya awali.

Algorithm inamaanisha maelezo kamili ya mchakato fulani, maagizo ya utekelezaji wake. Ukuzaji wa algorithm ni mchakato mgumu na unaotumia wakati. Algorithmization ni mbinu ya kutengeneza (kutunga) algorithm ya kutatua matatizo kwenye kompyuta.

Njia za kuona za kuelezea (kuwakilisha) algorithm

Ili kurekodi algorithm ya kutatua shida, njia zifuatazo za kuona za kuwawakilisha hutumiwa:

  1. Maelezo ya maneno na fomula.
  2. Mchoro wa kuzuia (chati ya alama ya picha).
  3. Lugha za algoriti.
  4. Michoro ya waendeshaji.
  5. Msimbo wa uongo.

Kuna mbinu ya jumla ya kuandika algorithm:

  1. Kila algorithm lazima iwe na jina linaloonyesha maana yake.
  2. Ni muhimu kuonyesha mwanzo na mwisho wa algorithm.
  3. Eleza data ya pembejeo na pato.
  4. Taja amri zinazokuwezesha kufanya vitendo maalum kwenye data iliyochaguliwa.

Mtazamo wa jumla wa algorithm:

  • jina la algorithm;
  • maelezo ya data;
  • Anza;
  • timu;
  • mwisho.

Njia ya maandishi-ya maneno ya kuandika algorithm ina sifa ya ukweli kwamba maelezo hufanywa kwa kutumia maneno na fomula. Maudhui ya mlolongo wa hatua za utekelezaji wa algorithm imeandikwa katika lugha ya kitaalamu ya asili ya eneo la somo kwa fomu ya bure.

Njia ya kielelezo ya kuelezea algorithm (mchoro wa kuzuia) imekuwa inayotumiwa sana. Kwa maelezo ya mchoro ya algorithms, michoro za algorithm au alama za kuzuia (vitalu) hutumiwa, ambazo zimeunganishwa na mistari ya mawasiliano.

Kila hatua ya mchakato wa computational inawakilishwa na takwimu za kijiometri (vitalu). Zimegawanywa katika hesabu au hesabu (mstatili), kimantiki (almasi) na vizuizi vya pato la data (parallelogram).


Mchele. 1.

Utaratibu wa hatua unaonyeshwa na mishale inayounganisha vitalu. Maumbo ya kijiometri yanawekwa kutoka juu hadi chini na kutoka kushoto kwenda kulia. Vitalu vinahesabiwa kwa utaratibu ambao wamewekwa kwenye mchoro.

Lugha za algorithmic ni zana maalum iliyoundwa kwa kuandika algorithms katika fomu ya uchambuzi. Lugha za algorithmic ziko karibu na misemo ya hisabati na lugha asilia. Kila lugha ya algoriti ina msamiati wake. Algorithm iliyoandikwa kwa lugha ya algoriti hutekelezwa kulingana na sheria kali za lugha hiyo.

Mipango ya waendeshaji wa algorithms. Kiini cha njia hii ya kuelezea algorithm ni kwamba kila operator huteuliwa na barua (kwa mfano, A ni operator wa hesabu, P ni operator wa mantiki, nk).

Waendeshaji wameandikwa kutoka kushoto kwenda kulia katika mlolongo wa utekelezaji wao, na kila operator ana index inayoonyesha nambari ya mlolongo wa operator. Algorithm imeandikwa katika mstari mmoja kama mlolongo wa waendeshaji.

Pseudocode ni mfumo wa amri kwa mashine ya kufikirika. Hii ni njia ya kuandika algoriti kwa kutumia waendeshaji karibu na lugha za algoriti.

Kanuni za kuendeleza algorithms na programu

Aina za Michakato ya Algorithmic

Kulingana na muundo wa utekelezaji, algorithms na mipango imegawanywa katika aina tatu:

  • mstari;
  • matawi;
  • mzunguko;

Michakato ya Kuhesabu ya Linear

Algorithm ya mstari (muundo wa mstari) ni algorithm ambayo vitendo vyote hufanywa kwa mlolongo mmoja baada ya mwingine na mara moja tu. Mchoro ni mlolongo wa vitalu vinavyopangwa kutoka juu hadi chini kwa utaratibu ambao wanatekelezwa. Data ya msingi na ya kati haiathiri mwelekeo wa mchakato wa kuhesabu.

Algorithms ya muundo wa matawi

Katika mazoezi, mara nyingi kuna matatizo ambayo, kulingana na hali ya awali au matokeo ya kati, ni muhimu kufanya mahesabu kwa kutumia formula moja au nyingine.

Shida kama hizo zinaweza kuelezewa kwa kutumia algorithms ya muundo wa matawi. Katika algorithms vile, uchaguzi wa mwelekeo wa kuendelea na hesabu unafanywa kulingana na matokeo ya kuangalia hali fulani. Michakato ya matawi inaelezewa na taarifa ya IF (hali).


Mchele. 2.

Michakato ya kompyuta ya baiskeli

Kutatua matatizo mengi ni sifa ya kurudia mara kwa mara ya sehemu za mtu binafsi za mahesabu. Ili kutatua matatizo hayo, algorithms ya muundo wa mzunguko (algorithms ya mzunguko) hutumiwa. Mzunguko ni mlolongo wa amri unaorudiwa hadi hali maalum imetimizwa. Maelezo ya mzunguko wa michakato ya kurudia mara kwa mara hupunguza kwa kiasi kikubwa ugumu wa programu za kuandika.

Kuna mifumo miwili ya michakato ya mzunguko wa kompyuta.


Mchele. 3.

Kipengele cha mpango wa kwanza ni kwamba hali ya kuondoka kwa kitanzi inakaguliwa kabla ya mwili wa kitanzi kutekelezwa. Ikiwa hali ya kuondoka kwa kitanzi imeridhika, basi mwili wa kitanzi haujatekelezwa kamwe.

Kipengele cha mpango wa pili ni kwamba kitanzi kinatekelezwa angalau mara moja, kwani hundi ya kwanza ya hali ya kuondoka kwa kitanzi inafanywa baada ya mwili wa kitanzi kutekelezwa.

Kuna vitanzi vilivyo na idadi inayojulikana ya marudio na vitanzi vya kurudia. Katika kitanzi cha kurudia, kutoka kwa mwili wa kitanzi, kama sheria, hufanyika wakati usahihi maalum wa hesabu unapatikana.

Lugha za programu

Lugha za programu ni lugha bandia za kuandika algoriti za utekelezaji kwenye kompyuta. Kupanga (coding) - kuandaa programu kulingana na algorithm fulani.

Uainishaji wa lugha za programu. Kwa ujumla, lugha za programu zimegawanywa katika vikundi viwili: operator na kazi. Zinazofanya kazi ni pamoja na LISP, PROLOG, nk.

Lugha za waendeshaji zimegawanywa katika utaratibu na zisizo za kitaratibu (Smalltalk, QBE). Zile za kiutaratibu zimegawanywa kuwa zinazoelekezwa kwa mashine na zinazotegemea mashine.

Lugha zinazoelekezwa na mashine ni pamoja na: lugha za mashine, misimbo otomatiki, lugha za ishara za usimbaji, viunganishi.

Lugha zinazotegemea mashine ni pamoja na:

  1. Iliyoelekezwa kwa utaratibu (Pascal, Fortran, nk).
  2. Inayoelekezwa kwa shida (LISP, nk).
  3. Inayoelekezwa kwa kitu (C++, Visual Basic, Java, nk).
Hivi majuzi, nimekuwa nikifikiria zaidi juu ya kubadili taaluma ya msanidi programu. Iwe meneja, mshauri, afisa wa kijeshi, mwanafizikia wa nyuklia au mbuni wa mazingira - kila mtu alitaka kuwa waandaaji programu. Wacha tujaribu kujua ni kwanini hii inatokea na inaweza kusababisha nini.

Picha ya motisha:

Tatizo

Kwa kawaida, wataalamu wapya walio na umri chini ya miaka 30 huwa watengenezaji. Na shida kadhaa kubwa huibuka mara moja:
  • Miaka 5-6 iliyopotea kusoma masomo na sayansi ambayo haitahitajika tena;
  • Mabadiliko ya lazima ya fikra kutoka kwa kibinadamu\kiufundi hadi kimantiki\kidijitali;
  • Kujua mpango wa chuo kikuu cha kiufundi cha miaka 5-6 kwa muda mfupi iwezekanavyo;
  • Kujenga tishio kwa maisha na ustawi wa watu, makampuni, biashara...

Muda

Swali ni je, kwa nini mtu alisoma sayansi ambayo hakuihitaji kwa miaka kadhaa? Kwa nini ulijipa msongo wa mawazo hivyo? Ili basi kuacha kila kitu na kuanza tena? Hata miaka 5 ni muda mrefu. Wakati huu, unaweza kuwa bilionea au kupokea Tuzo la Nobel, lakini hapana, mtu anasoma kitu ambacho hakimpendezi, analala kwenye madarasa na kusema kwamba falsafa ni upuuzi kamili!

Ni vizuri ikiwa anasoma katika idara ya kulipwa, lakini vipi ikiwa kwa gharama ya serikali? Hii inamaanisha kuwa mtu ambaye alikuwa na ndoto ya kuwa mbunifu, meneja, mfadhili, mwanajeshi hakufika mahali hapa. Ilibidi atafute sehemu nyingine kwenye jua, labda alienda kusoma ili kuwa mtayarishaji programu.

Kila kitu ni rahisi hapo!

Ni wangapi kati ya hawa "watayarishaji programu" wapya wamesoma kuhusu JAVA kutoka kwa Bruce Eckel. Wote wanajiona kuwa mahiri wa upangaji, na OOP, MVC, Agile, mfumo wa nambari za binary, nadharia ya uchangamano ya kikokotozi... si zao.

Acha nikupe mifano michache ya maisha halisi:

  1. "Mpangaji" anaandika toleo la pili la programu. Ya kwanza ilikuwa na fomu moja na vifungo 50. Toleo la pili lina utendaji zaidi, lakini mantiki yake sio wazi. Imepangwa kuandika programu kwa miezi michache. Utendaji unajumuisha vifungo 100 kwenye fomu moja. Baada ya utangulizi wa dakika 10 kwa nadharia ya grafu, idadi ya vifungo ilipunguzwa hadi moja (kufuta uhakika), na muda wa kuandika programu ulipunguzwa hadi siku mbili.
  2. "Mpangaji wa programu" alipewa kazi ya kuandika programu ya kubadilisha fedha. Mantiki ni rahisi: pakiti ya fomu key=value inafika, unahitaji kutumia jedwali maalum ili kuibadilisha kuwa pakiti2 ya fomu key2=value2 na kuituma zaidi. Baada ya miezi miwili ya "kujifunza jukwaa", alipewa mfumo wa maombi (mapokezi ya pakiti, mabadiliko, kutuma vifurushi) na wandugu wakuu. Mwezi mmoja baadaye kibadilishaji kiko tayari!
  3. Wengi waliuza baiskeli;
  4. Akizungumza mwenyewe http://govnokod.ru;
Ninaweza kusema jambo moja tu: ikiwa programu ingekuwa rahisi sana, haitafundishwa katika vyuo vikuu kwa miaka mitano. Kozi ya miezi mitatu itakuwa ya kutosha.

Vipaji

Bila shaka, hatuwezi kusaidia lakini kutaja vipaji. Kuna watu wenye vipaji wanaofanya kazi mbalimbali, wanafanikiwa kila mahali. Lakini kuna wachache sana wao. Ni bora kuwa mtaalamu mwenye uwezo katika eneo moja kuliko katika kadhaa.

"Tafuta kitu unachopenda na hautawahi kufanya kazi kwa dakika moja katika maisha yako" - Confucius. Ni muhimu kutotumia maisha yako yote kutafuta biashara hii, vinginevyo utalazimika kufanya kazi kwa bidii maisha yako yote.

Harufu ya baruti

Ni wazo zuri sana kuonyesha maendeleo yanahusu nini. Mnusi wa baruti, tuseme! Mameya tayari wameanza kusoma JS.

Katika kampuni moja, rafiki yangu na idara nzima ya huduma kwa wateja walionyeshwa jinsi ya kupanga kurasa na ni vitambulisho gani. Walitengeneza hata kurasa rahisi.

Lakini hupaswi kufikiria mwenyewe kujua kila kitu kuhusu programu baada ya hii. Huu ni mwanzo tu. Lakini basi unahitaji kusoma nyenzo nyingi ngumu na rahisi na teknolojia, idadi kadhaa ya algorithms na mazoea na mbinu nyingi nzuri.

Hitimisho

Kupanga ni ufundi, maendeleo ni sawa na sanaa. Kwa watu wa kawaida hii ni uchawi, kwa waandaaji wa programu ni kazi ngumu, tafsiri ya kutokuwepo kwa ulimwengu unaozunguka katika ulimwengu wa majimbo ya mwisho, zero na zile, mapungufu ya RAM, chaneli na kasi ya saa ya processor.

Bado, nadhani "waandaaji wa programu" wengi hujitahidi kupata zaidi: ukikaa hapo, unapata pesa. Ukweli, basi watu kama hao wanaiacha timu yao chini na haifanyi kazi kwa uwezo wao kamili. Na ikiwa usimamizi hugeuka kipofu kwa hili (ndiyo, ndiyo, hii hutokea!), basi hutaweza kupika uji pamoja nao, huwezi kuendeleza Google.

Kama utafiti unavyoonyesha. IT nchini Urusi sio tasnia inayolipwa zaidi. Anachukua nafasi ya tatu tu. Viwanda vya malighafi viko katika nafasi ya pili, na usimamizi wa juu uko katika nafasi ya kwanza. Kwa sababu ya maelezo mahususi ya IT, mpangaji programu hatawahi kufikia kiwango cha usimamizi wa juu. Upeo unaoweza kutumainia ni nafasi ya mkuu wa idara, mwelekeo mkuu, au mkurugenzi wa kampuni yako mwenyewe.

Kwa hivyo, fanya hitimisho lako mwenyewe. Kubadilisha kazi yako ni hatua kubwa na inapaswa kuzingatiwa kwa uangalifu. Kwa uchache, utahitaji kusoma kozi ya kisasa ya programu, na hii itachukua zaidi ya mwaka mmoja.

P.S. Katika maoni wanauliza juu ya malengo ya noti: kuwa mzito zaidi katika kuchagua taaluma, kufanya kile unachopenda tu, kusoma kile unachopenda, kukua kitaaluma, na sio kujaribu kidogo kila kitu bila lengo maalum. . Inashangaza kuona watu ambao, wakiwa na umri wa miaka 30-40, bado hawajaweza kupata kitu wanachopenda.