Mis on programmeerimise algoritm. Põhilised programmeerimisstruktuurid (algoritmi tüübid). PC teenindustarkvara ja algoritmi põhitõed

Kursusel tutvustatakse põhilisi andmestruktuure ja algoritme, mille tundmine on vajalik erinevate programmeerimisprobleemide efektiivseks lahendamiseks. Kursuse autorid tegelevad andekate üliõpilaste ja koolinoorte otsimise ja koolitamisega arvutiteaduse ja programmeerimise vallas. Nende eestvedamisel tulid üliõpilasmeeskonnad korduvalt Venemaa programmeerimismeistriteks, maailma- ja Euroopa meistriteks.

Kursuse kohta

Kursus on pühendatud põhiliste algoritmide ja andmestruktuuride uurimisele, mille tundmine on vajalik erinevate programmeerimisprobleemide tõhusaks lahendamiseks. Vaadeldakse erinevaid sorteerimisalgoritme, lineaarseid andmestruktuure, nagu järjekorrad ja loendid, algoritme ja andmestruktuure teabe tõhusaks otsimiseks ja salvestamiseks – tasakaalustatud otsingupuid ja räsisid, aga ka alamstringi otsingualgoritme.

Kursuse eesmärk on saada algteadmised info salvestamiseks ja hankimiseks kasutatavatest põhialgoritmidest ja andmestruktuuridest Kursusel kasutatakse automaatset programmi testimise süsteemi, mis annab objektiivse hinnangu programmeerimisülesannete õigsusele.

Kursuse läbimisel omandatakse oskused põhiliste programmeerimisalgoritmide ja andmestruktuuride analüüsimisel ja rakendamisel ning rakenduslike infotehnoloogiate juurutamise tööriistade kavandamisel ja väljatöötamisel.

Kursuse “Programmeerimisalgoritmid ja andmestruktuurid” läbimine tõstab oluliselt tudengite tootlikkust ja konkurentsivõimet tarkvaraarenduses.

Vorming

Kursus sisaldab videoloenguid, loengumaterjalidel põhinevaid küsitlusi ning praktilisi programmeerimisülesandeid, mis nõuavad kursusel õpitud algoritmide ja andmestruktuuride iseseisvat realiseerimist ühes väljapakutud kaasaegses programmeerimiskeeles. Kursus kestab kümme nädalat. Keskmine nädalakoormus õpilase kohta on 14 tundi. Kursuse kogukeerukus on neli ainepunkti.

Teabeallikad

Kursuse läbimiseks ja kõigi pakutud ülesannete täitmiseks piisab videoloengute materjalidest. Oma teadmiste süvendamiseks uuritava teema kohta saate aga kasutada järgmisi lisaallikaid:

  1. Cormen T., Leiserson Ch., Rivest R., Stein K. Algoritmid: ehitus ja analüüs. - M.: Williams, 2012.
  2. Aho A., Hopcroft D., Ullman D. Andmestruktuurid ja algoritmid. - M.: Williams, 2007.
  3. ITMO ülikooli arvutitehnoloogia osakonnas peetud veebipõhised loengukonspektid diskreetse matemaatika, algoritmide ja andmestruktuuride kohta.

Nõuded

Kursuse edukaks läbimiseks on vaja teadmisi diskreetse matemaatika põhitõdedest ja oskust kirjutada keskmise suurusega programme objektorienteeritud programmeerimiskeeles.

Kursuse lõpetamiseks on vaja mis tahes avalikult kättesaadavat kompilaatorit ühe järgmistest programmeerimiskeeltest:

  • Java: versioon 8 (allalaadimislink Oracle'i veebisaidilt)
  • C, C++: MinGW versioon 5.1 (Linuxile saate kasutada sarnase versiooni GCC-d), samuti Microsoft Visual Studio C++ 2013 (saate alla laadida Visual Studio Expressi).
  • C#: Microsoft Visual Studio C# 2013 (saate alla laadida Visual Studio Expressi).
  • Python: versioon 3.5 (allalaadimislink aadressil python.org)
  • Scala: versioon 2.11 (allalaadimislink saidilt scala-lang.org)
  • Kotlin: versioon 1.0 (lingid kompilaatori paigaldamise juhistele, pluginad IntelliJ IDEA ja Eclipse).

Kursuse programm

Kursus hõlmab järgmisi teemasid:

  1. Algoritmide tööaja hindamine
  2. Võrdlusel põhinevad sortimisalgoritmid (ühendatud sortimine, kiire sortimine, sortimisalgoritmide tööaja alampiir)
  3. Sorteerimisalgoritmid lineaarse käitusajaga (loendamise sortimine, digitaalne sortimine, taskusse sortimine)
  4. Elementaarsed andmestruktuurid (virn, järjekord, lingitud loendid)
  5. Binaarsel kuhjal põhinevad algoritmid (kuhja sortimine, prioriteetne järjekord)
  6. Sissejuhatus otsingualgoritmidesse (binaarne otsing sorteeritud massiivist, binaarne otsingupuu)
  7. Tasakaalustatud otsingupuud (ülevaade tasakaalustatud puudest, AVL-puu, Splay-puu)
  8. Räsimine (privaatse ja avaliku aadressiga räsitabelid)
  9. Sissejuhatus alamstringi otsingusse (lihtsaim alamstringi otsingualgoritm, Rabin-Karpi algoritm)
  10. Otsige alamstringe (algoritm Knuth-Morris-Pratt, Z-funktsioon, Boyer-Moore'i algoritm)

Iga teema nõuab ühe nädala õppimist. Igal nädalal antakse programmeerimisülesandeid, mis nõuavad kursusel õpitud algoritmide ja andmestruktuuride iseseisvat rakendamist.

Kursusel on kahte tüüpi tähtaegu (hindamistoimingute sooritamise tähtaeg):
– leebe tähtaeg, mille jooksul on vaja lõpetada kõik jooksva nädala hindamistoimingud enne selle lõpetamist;
– range tähtaeg, mille jooksul eraldatakse pärast pehmet tähtaega hindamistegevuste lõpetamiseks täiendavalt kaks nädalat, pärast mida on juurdepääs asjakohastele tegevustele suletud.

Õpitulemused

  • Oskus analüüsida ja juurutada põhilisi programmeerimisalgoritme ja andmestruktuure
  • Rakenduslike infotehnoloogiate juurutamise tööriistade kavandamise ja väljatöötamise oskused
  • Arvutiteaduse eksperimentaaluuringute läbiviimise algoritmide väljatöötamise oskus

Kujunenud kompetentsid

  • 09.03.02 Infosüsteemid ja tehnoloogiad
    1. Oskus kujundada põhilisi ja rakenduslikke infotehnoloogiaid (PC-11)
    2. Oskus välja töötada vahendeid infotehnoloogiate juurutamiseks (algoritmiline) (PC-12)
    3. Valmisolek osaleda eksperimentaalsete uuringute loomises ja läbiviimises (PC-23)

Jah, programmeerija jaoks on oluline hea algoritmiline koolitus. Ja ei, hea ei jäta üldse meelde algoritme loendist "Kõige olulisemad algoritmid, mida kõik peaksid teadma". Minu arvates peaks hea algoritmilise koolitusega püüdma anda programmeerijale järgmised kolm oskust.

Esiteks on see võime lahendada arusaamatuid probleeme. Vaata võimalikke rangeid tõlgendusi eluülesannete ebaselgetes sõnastustes. Tuginedes rangetele tõlgendustele, esitage lahendusvariandid. Analüüsige põhjalikult erinevaid võimalusi ja valige neist sobivaim.

Ilmselgelt selleks ei piisa ainult algoritmide tundmisest. Peate suutma neid "nägema" ja ära tundma nende kasutamise võimalusi.

Teiseks peaks algoritmiline koolitus sisendama harjumuse analüüsida iga oma otsuse tõhusust. Ärge jätke kriitilistes kohtades ruut- või eksponentsiaalseid algoritme kasutamata ja ärge sisestage programmi arhitektuuri ideid, mida pole siis võimalik piisavalt tõhusalt rakendada.

Kolmandaks peaks algoritmiline koolitus aitama oskuslikult kasutada valmis tööriistu. Andmebaasid on kõik andmestruktuurid ja algoritmid. Pealegi on need kontseptuaalsel tasandil üsna lihtsad ja arusaadavad - otsingupuud, räsitabelid, SS-tabel, ...

Näiteks teades, et andmebaasi indeks on lihtsalt otsingupuu, on lihtne aru saada, milliseid päringuid saab kiiresti täita ja millised on määratud täielikule skannimisele.
Teades, kuidas Lucene'i täistekstiotsing milliste algoritmide alusel töötab, saate ennustada, millised Elasticu päringud annavad asjakohaseid vastuseid ja millised mitte, ja isegi kuidas seda parandada.

Kokkuvõtteks:

  • Lisaks algoritmidele endile õppige neid ära tundma reaalsetes probleemides.
  • Harjutage oma kirjutatud koodi tõhusust analüüsima.
  • Uurige kasutatavate tööriistade kapoti all olevaid algoritme – see tuleb nende kasutamisel kasuks.

Sageli ilmuvad sellised artiklid nagu "kas programmeerijad vajavad algoritme" ja neil kõigil on ligikaudu sama mall. Artikli autor kirjutab tavaliselt: “Olen N aastat 1C-s veebisaite/skripte kirjutanud ega ole kunagi kasutanud algoritme ega andmestruktuure. Kohe tuuakse näiteid punamustadest puudest või mõnest muust eksootilisest ehitisest, mida autori tööpiirkonnas sageli ei näe, kui üldse. Sellised artiklid taanduvad tõsiasjale, et konkreetses piirkonnas ei kasuta programmeerijad keerulisi andmestruktuure ega lahenda NP-probleeme.

Sellise küsimuse sõnastus on põhimõtteliselt vale. Erialade arv tööstuses kasvab pidevalt ja inimene, kes kirjutab .net-is veebisaite, teeb täiesti teistsuguseid asju kui see, kes kirjutab eksootilise OS-i all ARM-i arhitektuurile andurite draivereid. Kõigepealt määratleme, mis on algoritm. Mitteametlikult määratleb Cormen algoritmi kui täpselt määratletud protseduuri, mis võtab sisendiks ühe või mitu väärtust ja tagastab selle tulemusena ühe või mitu väärtust. Formaalselt on algoritm defineeritud erinevates arvutusmudelites: toimingud, mida saab sooritada Turingi masinal või lambdaarvutuse abil. Seega on peaaegu iga kood, mis midagi teeb, algoritm. Selgub, et küsimuse "kas programmeerija vajab algoritme" võib tõlkida kui "kas programmeerija peab oskama koodi kirjutada?" Õige küsimus peaks kõlama umbes nii: "kas programmeerija tööstuses X peab teadma täpsemaid algoritme ja arvutusteooria üksikasju."

Kui vaatate kõiki neid artikleid, märkate, et inimesed, kes neid kirjutavad, on ülikoolide peale tegelikult solvunud, sest nad olid sunnitud õppima palju keerulist materjali – algoritmilise analüüsi, keerukate algoritmide ja andmestruktuuride näol –, mis aga ei näivad neile kasulikud olevat. Tegelikult on artiklite autorid ülikoolide peale solvunud, sest nad ei osanud ennustada autorite edasist töövaldkonda ega anda neile vaid minimaalselt vajalikke oskusi. Tõepoolest, lihtsate veebisaitide ja skriptide kirjutamiseks ei vaja te eriteadmisi algoritmide ja andmestruktuuride kohta. Või on see siiski vajalik?

Mõelgem, mida on programmeerijal vaja ülikoolis õppida, et omandada edukaks karjääriks vajalikud oskused. raamatukogud? Raamistikud? Need vananevad, nende liidesed muutuvad, need on kõik enamasti kirjutatud ühes keeles, mida õpilased ei pruugi tööstuses kunagi kasutada. Kas peaksime õpetama kõigile veebisaite kirjutama? Või õpetada kõigile OS-i kirjutama? Haridus peaks jõudma võimalikult laia publikuni ja pakkuma võimalikult laia valikut oskusi. Programmeerija peab ennekõike oskama probleeme analüüsida ja lahendada – see on põhioskus, mille informaatika lõpetajad peaksid omandama. Koodi kirjutamine on lihtsalt vajalik tööriist, mida kasutatakse probleemide lahendamiseks. Kes teab, milliseid oskusi sul tulevikus vaja läheb? Seega on õppimise teooria kasvatuslikust seisukohast kõige optimaalsem. Omandatud oskusi saab rakendada igas valdkonnas ning hea teadmistebaasiga raamatukogu või raamistiku õppimine ei ole keeruline. Paradoks on selles, et inimestel, kes esitavad küsimusi algoritmide vajalikkuse kohta, on tavaliselt selles valdkonnas teatud teadmised. Ma ei mäleta ühtegi inimest, kellel poleks teadmisi arvutusteooria vallas ja kes selle üle uhkelt karjus, väites, et tal pole seda vaja.

Niisiis, olete abstraktne programmeerija vaakumis, olete juba üle kümne aasta töötanud veebisaitide kokkupanemise ja klientide/ettevõtte jaoks lihtsate sarnaste probleemide lahendamisega. Tunnete end oma nišis hästi ja mugavalt ning tunnete ainult piinavalt valu raisatud aja pärast arvutusteooria ja algoritmilise analüüsi tunnis, mis ei andnud teile midagi. Hommikul kohvitassi kõrvale sigaretti süüdates, eksistentsi hapruse üle filosoofiliste mõtiskluste sügavuses, mõtled: miks peavad programmeerijad, kes keerulisi probleeme ei lahenda, teadma algoritme ja analüüsi põhitõdesid. Lühike vastus on olla oskuslik ja kasutada tõhusalt olemasolevaid tööriistu, sealhulgas keelt, milles kirjutate. Algoritmide ja analüüsi teooria ei õpeta mitte ainult eksootilisi algoritme ja andmestruktuure AVL-ide ja puna-mustade puude kujul. Samuti annab see ülevaate sellest, kuidas andmeid tõhusalt korraldada, kuidas maksimaalse jõudluse saavutamiseks koodi kirjutada, kus võivad süsteemis tekkida kitsaskohad ja kuidas nendega toime tulla. Sulle tutvustatakse valmislahendusi, et sa ei kirjutaks jalgrattaid ja ei jookseks iga kord Google’i, kui on vaja midagi mittetriviaalset teha.

Analüüsi ja algoritmide teooriateadmisi kasutavad tegelikult kõik programmeerijad iga päev, me oleme lihtsalt nende asjadega nii harjunud, et me isegi ei mõtle sellele. Ükskõik, mis probleemi te lahendate – olgu selleks siis lihtne veebisait andmebaasist andmete toomisega või serveris olev bash-skript, kasutate teatud andmestruktuure. Vähemalt primitiivne massiiv ja tõenäoliselt midagi keerukamat. Keeled annavad meile palju erinevaid struktuure, millest paljusid kasutatakse vaheldumisi. Sageli on meil mitu sama abstraktset tüüpi variatsiooni, millel on erinevad teostused. Näiteks C++-s on vektor- ja loendiandmete struktuurid. Mille poolest need erinevad ning millised oleksid ühe või teise kasutamise eelised ja puudused? Kuidas kaarti C++-s rakendatakse ja mille poolest see erineb multikaardist? Kuidas Pythonis loendit rakendatakse – massiivi või lingitud loendi kaudu ja milline on parim viis sellega töötamiseks? Miks ei ole soovitatav kasutada C#-s ArrayListi ja selle asemel kasutada loendit? Kuidas SortedDictionaryt rakendatakse ja kuidas see sõnastiku asemel programmi täitmist mõjutab? Kuidas jätkamine toimib, millal seda kasutada ja kas kasutamisel on mingeid kõrvalmõjusid? Millal kasutasite viimati curry-funktsioone, mida leidub peaaegu kõigis keeltes? Kui arvate, et C++ kaart on räsitabelina rakendatud, siis eksite. See on rakendatud punastele-mustadele puudele ja räsitabelit rakendab unordered_map. Eraldi tasub mainida dünaamilist programmeerimist. Mõistmine, mis see on, kuidas saab rekursiivseid funktsioone optimaalselt ümber kirjutada ja mis on meeldejätmine, aitab sageli vältida endale jalga tulistamist. Seega, selleks, et täielikult ja tõhusalt kasutada kirjutamiskeelt, on teil vaja juba vähemalt pealiskaudseid teadmisi andmestruktuuride kohta, mis need on ja kuidas need võivad teie programmi täitmist mõjutada.

Aga raamatukogud? Lõppude lõpuks lahendavad nad nii palju probleeme! Teekide tõhusaks kasutamiseks peate neid ka mõistma. Esiteks võivad teekide funktsioonidel olla kõrvalmõjud või käitumine, mida te ei teaks ilma algoritme mõistmata. Kui olete sel juhul vea saanud, võite kaua ja kõvasti proovida seda tabada ja otsustada, millal oleks saanud seda vältida. Teiseks tuleb sageli erinevaid tööriistu ja teeke “kohandada” – öelda, milliseid algoritme, andmestruktuure ja tehnoloogiaid sisemiselt kasutada. Ilma põhiteadmisteta peate kas manat lugema või juhuslikult valima. Kolmandaks on palju probleeme, mida ei saa lahendada lihtsalt teegi või raamistiku API kutsumisega. Mida te sel juhul ette võtate? Kas kulutate tunde võimalike lahenduste otsimisele ja sõbra abi palumisele? Neljandaks saab paljusid probleeme lahendada väga lihtsalt mõne koodirea või sisseehitatud keeletööriistadega. Kui tõmbate iga probleemi lahendamiseks välja raamatukogu, on teie programmid hiiglaslikud koletised, mis hõivavad kettal sadu megabaite või rohkem, söövad kogu serveri mälu ja neil on samal ajal üsna kasin funktsionaalsus. Lisaks kaasnevad hulga kaasatud teekide olemasoluga ühilduvusprobleemid ja programm võib juhuslikult kokku kukkuda mitme teegi kummalise käitumise tõttu ühes projektis. Teekide mõtlematu kasutamine võib kaasa tuua üsna hukatuslikke tagajärgi ning arendajaid, kes teavad ainult raamatukogusid kasutada, kuid ei suuda isegi lihtsat probleemi iseseisvalt lahendada, ei hinnata kunagi, sest nende lahendused ei ole konkurentsivõimelised.

Minuga töötas üks rohkem kui kümneaastase kogemusega programmeerija. Ühel päeval vajasime funktsiooni, mida meie kasutatav teek tol ajal ei toetanud: primitiivne tekstimurdmine ühes visuaalses komponendis. See "programmeerija" nägi, et seda ei saa tavaliste vahenditega teha, ja teatas kohe, et sellise funktsiooni rakendamine on võimatu. Probleemi lahendas analüütilise ajuga kolmanda kursuse praktikant, kes kirjutas kahe tunniga lihtsa algoritmi ja realiseeris selle vajalikku komponenti. Pärisin veel ühe projekti .net-i veebisaidi näol. Avaleht koosnes mitmest väikesest graafikust ja selle laadimiseks kulus peaaegu 10 sekundit. Selgus, et inimene, kes selle projekti algselt tegi, kuhjas kolmekordsetest pesastatud silmustest hunniku kohutavaid kujundusi, mille jaoks võttis andmebaasist andmete võtmine ja seejärel graafikutega sidumine kaua ja kurb aega. Pärast mõningast ümbertöötamist laaditi leht peaaegu kohe.

Kas programmeerija saab hakkama ilma algoritmide ja analüüsiteooria tundmiseta? Võib-olla on selliseid "programmeerijaid" palju. Oleks veniv nimetada neid programmeerijateks. Paljud programmeerijad tulevad minu juurde intervjuudele, kellel on kümne-viieteistkümneaastane kogemus ja nad ei saa tegelikult aru, mida nad teevad ja miks. Neil on oma nišš, nad käivad ettevõttest ettevõttesse, viibimata neis üle aasta. Reeglina on neil väike ülesannete komplekt, mida nad saavad lahendada ja kui astute sammu kõrvale, siis on inimene eksinud ja peab endale uusi oskusi õpetama. Selliseid inimesi kutsutakse projekti ja nad saavad neist võimalikult kiiresti lahti, sest nad raiskavad palju aega rataste taasleiutamisele ja mana lugemisele, et õppida seda, mida nad oleks pidanud juba ülikoolist teadma. Reeglina pole neil erilist karjääri ja ebastabiilset sissetulekut.

Lõppkokkuvõttes, miks on vaja algoritme ja analüüsiteooriat tunda, kui saate seda tööd teha ilma nende teadmisteta? Et olla oma erialal kvalifitseeritud spetsialist, tunnetage karjääri kasvu ja kolleegide austust. Et probleeme tõhusalt lahendada ja mitte jalgratast uuesti leiutada. Et mitte kirjutada koletisi, millel on tohutul hulgal kolmandate osapoolte teeke, mis võtavad kettal sadu megabaite, söövad serveris palju mälu ja jooksevad regulaarselt juhuslikul põhjusel, sõltuvalt kuufaasist. Et kasutada kirjutatavat keelt tõhusalt ja võimalikult täiel määral. Teha teadlikke ja sisukaid otsuseid raamatukogu ja tehnoloogia valikul probleemi lahendamiseks. Kui teie ülesanne on kirjutada SQL-päring ja sisestada konsooli käsk, siis ma tahan teile pettumust valmistada: te pole programmeerija, olete kasutaja, te tõesti ei vaja algoritme jms ning raiskasite oma aega ülikoolis, sest selliseks tööks piisab kursuste läbimisest või paari tutvustava raamatu iseseisvast läbilugemisest.

Teema 1.3: Süsteemitarkvara

Teema 1.4: Teenindustarkvara ja algoritmi põhitõed

Sissejuhatus majandusinformaatikasse

1.4. PC teenindustarkvara ja algoritmi põhitõed

1.4.2. Algoritmiseerimise ja programmeerimiskeelte alused

Algoritm ja selle omadused

Ülesannete lahendamine arvutis põhineb algoritmi kontseptsioonil. Algoritm on täpne ettekirjutus, mis määratleb arvutusprotsessi, mis viib algandmete muutumisest esialgse tulemuseni.

Algoritm tähendab teatud protsessi täpset kirjeldust, juhiseid selle rakendamiseks. Algoritmi väljatöötamine on keeruline ja aeganõudev protsess. Algoritmiseerimine on tehnika arvutis ülesannete lahendamise algoritmi väljatöötamiseks (koostamiseks).

Visuaalsed vahendid algoritmi kirjeldamiseks (esitamiseks).

Probleemi lahendamise algoritmi salvestamiseks kasutatakse nende kujutamiseks järgmisi visuaalseid meetodeid:

  1. Sõnaline ja vormiline kirjeldus.
  2. Plokkskeem (graafiline sümbol diagramm).
  3. Algoritmilised keeled.
  4. Operaatorskeemid.
  5. Pseudokood.

Algoritmi kirjutamiseks on üldine tehnika:

  1. Igal algoritmil peab olema nimi, mis paljastab selle tähenduse.
  2. On vaja märkida algoritmi algus ja lõpp.
  3. Kirjeldage sisend- ja väljundandmeid.
  4. Määrake käsud, mis võimaldavad teil valitud andmetega konkreetseid toiminguid teha.

Algoritmi üldvaade:

  • algoritmi nimi;
  • andmete kirjeldus;
  • algus;
  • meeskonnad;
  • lõppu.

Algoritmi kirjutamise valemis-verbaalset meetodit iseloomustab asjaolu, et kirjeldamine toimub sõnade ja valemite abil. Algoritmi täitmise etappide järjestuse sisu kirjutatakse ainevaldkonna loomulikus erialakeeles vabas vormis.

Algoritmi kirjeldamise graafiline meetod (plokkskeem) on muutunud enim kasutatavaks. Algoritmide graafiliseks kirjeldamiseks kasutatakse algoritmskeeme või plokisümboleid (plokke), mis on omavahel sideliinidega ühendatud.

Arvutusprotsessi iga etappi kujutavad geomeetrilised kujundid (plokid). Need jagunevad aritmeetilisteks ehk arvutuslikeks (ristkülik), loogilisteks (teemant) ja andmete sisend-väljundplokkideks (parallelogramm).


Riis. 1.

Etappide järjekorda näitavad plokke ühendavad nooled. Geomeetrilised kujundid paigutatakse ülalt alla ja vasakult paremale. Plokid on nummerdatud nende skeemil paigutamise järjekorras.

Algoritmilised keeled on spetsiaalne tööriist, mis on loodud algoritmide kirjutamiseks analüütilisel kujul. Algoritmilised keeled on lähedased matemaatilistele avaldistele ja loomulikele keeltele. Igal algoritmilisel keelel on oma sõnavara. Algoritmikeeles kirjutatud algoritm täidetakse selle konkreetse keele rangete reeglite järgi.

Algoritmide operaatoriskeemid. Selle algoritmi kirjeldamise meetodi olemus seisneb selles, et iga operaator on tähistatud tähega (näiteks A on aritmeetiline operaator, P on loogiline operaator jne).

Operaatorid kirjutatakse nende täitmise järjekorras vasakult paremale ja igal operaatoril on indeks, mis näitab operaatori järjekorranumbrit. Algoritm on kirjutatud ühele reale operaatorite jadana.

Pseudokood on abstraktse masina käsusüsteem. See on viis algoritmi kirjutamiseks, kasutades algoritmilistele keeltele lähedasi operaatoreid.

Algoritmide ja programmide väljatöötamise põhimõtted

Algoritmiliste protsesside tüübid

Täitmisstruktuuri järgi jagunevad algoritmid ja programmid kolme tüüpi:

  • lineaarne;
  • hargnemine;
  • tsükliline;

Lineaarsed arvutusprotsessid

Lineaaralgoritm (lineaarne struktuur) on algoritm, milles kõik toimingud sooritatakse järjestikku üksteise järel ja ainult üks kord. Diagramm on plokkide jada, mis on paigutatud ülalt alla nende täitmise järjekorras. Esmased ja vaheandmed ei mõjuta arvutusprotsessi suunda.

Hargnemisstruktuuri algoritmid

Praktikas esineb sageli probleeme, mille puhul on olenevalt algtingimustest või vahetulemustest vaja teha arvutusi ühe või teise valemi abil.

Selliseid probleeme saab kirjeldada hargnevate struktuuride algoritmide abil. Sellistes algoritmides tehakse arvutuse jätkamise suuna valik antud tingimuse kontrollimise tulemuste põhjal. Hargnemisprotsesse kirjeldab lause IF (tingimus).


Riis. 2.

Tsüklilised andmetöötlusprotsessid

Paljude probleemide lahendamist iseloomustab arvutuste üksikute osade korduv kordamine. Selliste probleemide lahendamiseks kasutatakse tsüklilise struktuuri algoritme (tsüklilisi algoritme). Tsükkel on käskude jada, mida korratakse, kuni määratud tingimus on täidetud. Korduvalt korduvate protsesside tsükliline kirjeldamine vähendab oluliselt programmide kirjutamise keerukust.

On kaks tsükliliste arvutusprotsesside skeemi.


Riis. 3.

Esimese skeemi eripäraks on see, et silmuse väljumise tingimust kontrollitakse enne tsükli keha täitmist. Kui tsükli väljumise tingimus on täidetud, siis tsükli keha ei täideta kunagi.

Teise skeemi tunnuseks on see, et silmust käivitatakse vähemalt üks kord, kuna tsükli väljumistingimuste esimene kontroll viiakse läbi pärast tsükli põhiosa täitmist.

On teadaoleva korduste arvuga silmuseid ja iteratiivseid silmuseid. Iteratiivses tsüklis toimub tsükli kehast väljumine reeglina siis, kui on saavutatud määratud arvutustäpsus.

Programmeerimiskeeled

Programmeerimiskeeled on tehiskeeled arvutis täitmiseks kasutatavate algoritmide kirjutamiseks. Programmeerimine (kodeerimine) - programmi koostamine etteantud algoritmi järgi.

Programmeerimiskeelte klassifikatsioon. Üldiselt jagunevad programmeerimiskeeled kahte rühma: operaator- ja funktsionaalsed. Funktsionaalsete hulka kuuluvad LISP, PROLOG jne.

Operaatorkeeled jagunevad protseduurilisteks ja mitteprotseduurilisteks (Smalltalk, QBE). Protseduurilised jagunevad masinale orienteeritud ja masinast sõltumatuteks.

Masinapõhised keeled hõlmavad: masinkeeled, automaatkoodid, sümboolsed kodeerimiskeeled, komplekteerijad.

Masinast sõltumatud keeled hõlmavad järgmist:

  1. Protseduurile orienteeritud (Pascal, Fortran jne).
  2. Probleemile orienteeritud (LISP jne).
  3. Objektorienteeritud (C++, Visual Basic, Java jne).
Viimasel ajal olen üha enam mõelnud arendaja erialale üleminekule. Olgu see juht, konsultant, sõjaväelane, tuumafüüsik või maastikukujundaja – kõik tahtsid saada programmeerijaks. Proovime välja mõelda, miks see juhtub ja milleni see võib viia.

Motiveeriv pilt:

Probleem

Tavaliselt saavad arendajateks äsja vermitud alla 30-aastased spetsialistid. Ja kohe tekivad mitmed tõsised probleemid:
  • 5-6 aastat raisatud ainete ja teaduste õppimist, mida enam kunagi vaja ei lähe;
  • Vajalik mõtlemise muutus humanitaarsest\tehnilisest loogilisest\digitaalseks;
  • 5-6-aastase tehnikaülikooli programmi valdamine võimalikult lühikese ajaga;
  • Inimeste, ettevõtete, ettevõtete elule ja heaolule ohu tekitamine...

Aeg

Küsimus on selles, miks õppis inimene mitu aastat loodusteadusi, mida tal vaja ei läinud? Miks sa end sellisele vaimsele pingele allutasid? Et siis kõik maha jätta ja otsast alustada? Isegi 5 aastat on pikk aeg. Selle aja jooksul võib saada miljardäriks või saada Nobeli preemia, aga ei, inimene õpib midagi, mis talle ei paku huvi, magab tundides ja ütleb, et filosoofia on täielik jama!

Hea, kui ta õpib tasulises osakonnas, aga mis siis, kui riigi kulul? See tähendab, et keegi, kes unistas saada arhitektiks, juhiks, finantsistiks, sõjaväelaseks, ei jõudnud sellesse kohta. Ta pidi otsima teise koha päikese käes, võib-olla läks ta programmeerijaks õppima.

Seal on kõik lihtne!

Kui paljud neist uutest "programmeerijatest" on Bruce Eckelilt JAVA kohta lugenud. Kõik nad peavad end programmeerimisgeeniuseks ja OOP, MVC, Agile, kahendarvusüsteem, arvutusliku keerukuse teooria... pole nende jaoks.

Lubage mul tuua paar näidet päriselust:

  1. Programmeerija kirjutab programmi teise versiooni. Esimesel oli üks vorm 50 nupuga. Teisel versioonil on rohkem funktsioone, kuid selle loogika pole nii läbipaistev. Programmi on plaanis kirjutada paariks kuuks. Funktsionaalsus sisaldab umbes 100 nuppu ühel vormil. Pärast 10-minutilist graafikuteooria tutvustust vähendati nuppude arvu ühele (punkti kustutamine) ja programmi kirjutamiseks kuluvat aega kahe päeva peale.
  2. “Programmeerija” sai ülesandeks kirjutada konverterprogramm. Loogika on lihtne: saabub pakett kujul võti=väärtus, tuleb see spetsiaalse tabeli abil teisendada pakett2-ks kujul võti2=väärtus2 ja edasi saata. Pärast kahekuulist platvormi õppimist andsid talle vanemad seltsimehed rakendusraamistiku (paketi vastuvõtmine, muutmine, pakkide saatmine). Kuu aega hiljem oli konverter valmis!
  3. Paljud müüsid jalgrattaid;
  4. Rääkides enda eest http://govnokod.ru;
Võin öelda vaid üht: kui programmeerimine oleks nii lihtne, ei õpetataks seda ülikoolides viis aastat. Kolmekuulisest kursusest piisaks.

Talendid

Muidugi ei saa me jätta mainimata andeid. On andekaid inimesi, kes teevad erinevaid töid, nad saavad igal pool hakkama. Kuid neid on väga vähe. Parem olla pädev spetsialist ühes valdkonnas kui mitmes.

"Leidke midagi, mis teile meeldib ja te ei tööta kunagi oma elus minutitki." - Konfutsius. Oluline on mitte kulutada kogu oma elu selle ettevõtte otsimisele, vastasel juhul peate kogu oma elu kõvasti tööd tegema.

Püssirohu lõhn

Väga hea mõte on näidata, mida arendus endast kujutab. Nii-öelda püssirohu nuusutamine! Linnapead on juba JS-i õppima asunud.

Ühes ettevõttes näidati mu sõbrale ja kogu klienditeeninduse osakonnale, kuidas lehti küljendatakse ja millised on sildid. Nad koostasid isegi lihtsaid lehti.

Kuid pärast seda ei tohiks te arvata, et teate programmeerimisest kõike. See on alles algus. Siis aga tuleb uurida palju keerukamaid ja lihtsamaid materjale ja tehnoloogiaid, mitut algoritmide köidet ning lugematul hulgal häid tavasid ja tehnikaid.

Järeldus

Programmeerimine on käsitöö, arendamine on kunstiga sarnane. Tavainimeste jaoks on see maagia, programmeerijate jaoks raske töö, ümbritseva maailma püsimatuse tõlkimine lõppolekute, nullide ja ühtede maailma, RAM-i, kanali ja protsessori taktsageduse piirangud.

Siiski arvan, et enamik "uusi programmeerijaid" püüab rohkem teenida: kui istud endale, saad raha. Tõsi, siis veavad sellised inimesed oma meeskonda kõvasti alt ja ei tööta täiel määral ära. Ja kui juhtkond selle peale silma kinni pigistab (jah, jah, see juhtub!), siis ei saa te nendega putru keeta ega Google'i arendada.

Nagu uuringud näitavad. IT Venemaal ei ole kõige rohkem tasustatud tööstusharu. Ta saavutab alles kolmanda koha. Teisel kohal on toorainetööstused ja esikohal tippjuhtkond. IT spetsiifikast tulenevalt ei jõua programmeerija kunagi tippjuhtkonna tasemele. Maksimaalne, mida saate loota, on oma ettevõtte osakonnajuhataja, juhtiva suuna või direktori koht.

Seetõttu tehke omad järeldused. Ametikoha vahetamine on tõsine samm ja seda tuleks hoolikalt kaaluda. Vähemalt peate õppima kaasaegse programmeerimiskursuse ja see võtab rohkem kui ühe aasta.

P.S. Kommentaarides küsitakse märkme eesmärkide kohta: olla elukutse valikul tõsisem, teha ainult seda, mis sulle meeldib, õppida seda, mis sulle meeldib, areneda professionaalselt ja mitte proovida kõike natuke ilma konkreetse eesmärgita. . Üllatav on näha inimesi, kes 30–40-aastaselt pole ikka veel leidnud midagi, mis neile meeldiks.