Uploaded by ddavronbnek16

С++ ЯНГИ

advertisement
ЎЗБЕКИСТОН АЛОҚА ВА АХБОРОТЛАШТИРИШ
АГЕНТЛИГИ
ТОШКЕНТ АХБОРОТ ТЕХНОЛОГИЯЛАРИ
УНИВЕРСИТЕТИ
АХБОРОТ ТЕХНОЛОГИЯЛАРИ ФАКУЛЬТЕТИ
Информатика ва компьютер графикаси кафедраси
С/С++ ДАСТУРЛАШ АСОСЛАРИ
услубий қўлланма
Telegram kanal: @Uzb_Dasturchilar
Кириш
Ҳозирги кунда республикамиздаги техника олий ўқув
юртларида “Информатика ва ахборот технологиялари”
йўналиши ва мутахассисликларига турли хил дастурлаш
тилларини
ўргатиш мўлжалланган. Бизга маълумки,
дастурлаш тилларининг юздан ортиқ кўринишлари мавжуд,
лекин қўлланилиши кўламига қараб С/С++ ва С# дастурлаш
тиллари
юқори
дастурлаш
синфига
мансубдир.
Мутахассисларнинг фикрига кўра С++ дастурлаш тили
Ассемблер дастурлаш тилига энг яқин бўлиб, тезлик
жиҳатидан 10 % ортда қолар экан.
Кейинги йилларда амалий дастурчиларга жуда кўп
интеграцион дастур тузиш муҳитлари таклиф этилмоқда. Бу
муҳитлар у ѐки бу имкониятлари билан бир–биридан фарқ
қилади.
Аксарият
дастурлаштириш
муҳитларининг
фундаментал асоси С/С++ тилига бориб тақалади. Биз ушбу
услубий қўлланмада қуйидаги cаволларга жавоб оламиз:
нима учун С/С++ тили дастурий маҳсулотларни ишлаб
чиқиш соҳасида стандарт бўлиб қолди?
С/С++ тилида дастур ишлаб чиқишни қандай ўзига хос
томонлари бор?
С/С++ тилида дастур қандай ѐзилади ва компиляция
қилинади?
С/С++ алгоритмик тилининг имкониятлари ҳақида.
Ушбу услубий қўлланма, С/С++ дастурлаш тилини
ўрганмоқчи бўлган
талабаларга ва ўқитувчиларга
мўлжалланган.
2
Дастурлашнинг биринчи қадамлари
Дастурларни ѐзиш учун асосий тил қилиб С/С++
дастурлаштириш тили танланган. Мазкур тил, ҳозирда деярли
барча техник олий ўқув юртларида кенг кўламда
ўргатилмоқда. Ушбу тилда дастурлаш усулларини яхшилаб
ўрганиб, бошқа алгоритмик тиллар, масалан Java, Visual
Basicнинг синтаксиси ва бошқа хусусиятларини ўрганиш жуда
осон. Асосий мақсад тилни билиш эмас, дастурлаш
тажрибасини мукаммал эгаллашдир. Дастурлашни зўрлаб
ўрганиб бўлмайди, бунинг учун қобилият ҳамда интилиш
бўлиши талаб этилади.
Дастур сўзи ҳам командаларнинг алоҳида блокини
(берилган кодини) аниқловчи сўз, ҳам
яхлит ҳолдаги
бажарилувчи дастурий маҳсулотни белгиловчи сўз сифатида
ишлатилади.
Биз ишлайдиган ҳар қандай дастур бирор-бир шахс
томонидан ѐзилган бўлиб, улар дастурчилар деб аталади.
Дастурчилар дастурни махсус тилларда ѐзишади ва уларни
дастурлаш тиллари деб айтишади. Бу тиллар ѐрдамида
дастурчилар компьютерга бажариш керак бўлган амалларни
тушунтиришади. Бу амаллар умуман олганда, компьютернинг
нимани, қайси ҳолларда, неча маротаба ва қачонгача бажариш
керак бўлган аниқ йўриқномага ўхшайди. Амалларнинг ўзи
эса алгоритмлар деб аталади. Шунинг учун унга аниқлик
киритамиз.
Демак, дастурни ѐ дастурчи томонидан ѐзиладиган
командалар тўплами, ѐки амалларни бажарадиган компьютер
маҳсулоти сифатида тушунамиз.
Дастурчилар олдида турган вазифалар
Вақт ўтиши билан дастурчилар олдига қуйилган
вазифалар ўзгариб боряпти. Бундан йигирма йил олдин
3
дастурлар катта ҳажмдаги маълумотларни қайта ишлаш учун
тузилар эди. Бунда дастурни ѐзувчи ҳам, унинг
фойдаланувчиси ҳам компьютер соҳасидаги билимлар бўйича
профессионал бўлиши талаб этиларди. Ҳозирда эса кўпгина
ўзгаришлар рўй берди. Компьютер билан кўпроқ унинг
аппарат ва дастурий таъминоти ҳақида тушунчаларга эга
бўлмаган кишилар ишлашяпти. Компьютер
одамлар
томонидан
уни чуқур ўрганиш воситаси эмас, кўпроқ
ўзларининг олдиларига
қўйилган, ўзларининг ишларига
тегишли бўлган муаммоларини ечиш мосламаси бўлиб қолди.
Фойдаланувчиларнинг ушбу янги авлодини дастурлар
билан ишлашларини осонлаштирилиши билан
бу
дастурларнинг ўзини мураккаблиги даражаси ошади.
Замонавий дастурлар - фойдаланувчи билан дўстона
муносабатни юқори даражада ташкил қиладиган кўп сондаги
ойналар, меню, мулоқот ойналари ва визуал графикавий
муҳитлардан таркиб топган интерфейсга эга бўлиши лозим.
Дастурлашга талабнинг ўзгариши нафақат тилларнинг
ўзгаришига, балки уни ѐзиш технологиясини ҳам ўзгаришига
олиб келди. Дастурлаш эволюцияси тарихида кўпгина
босқичлар бўлишига қарамай, биз бу курсимизда процедурали
дастурлашдан
объектларга
мўлжалланган
дастурлашга
ўтишни қараймиз.
С/С++ дастурлаш тилининг яратилиш тарихи
С/С++ дастурлаш тили
Кейинги йилларда амалий дастурчиларга жуда кўп
интеграцион дастур тузиш муҳитлари таклиф этилмоқда. Бу
муҳитлар у ѐки бу имкониятлари билан бир–биридан фарқ
қилади. Cи (инглизча С) дастурлаш тили 1970 йилнинг
бошларида Би тили асосида Bell Labs Кеном Томпсон ва
Денис Ритчи Лар томонидан яратилди. Си дастурлаш тили
UNIX операцион тизимида фойдаланиш учун мщлжалланган
эди. Ушбу тил амалий дастурлар тузишда хам қўлланилар эди.
4
Аксарият дастурлаштириш муҳитларининг фундаментал асоси
С++ тилига бориб тақалади. Ушбу Си ++ жумлани (номни)
Рик Маситти ўйлаб топди. Бу 1983 йил ўйлаб кўрилмаган хам
эди.
С/С++ тили тарихи. Биринчи электрон ҳисоблаш
машиналари пайдо бўлиши билан дастурлаш тиллари
эволюцияси бошланади. Дастлабки компьютерлар иккинчи
жаҳон уруши вақтида артиллерия снарядларининг ҳаракат
траекториясини ҳисоб-китоб қилиш мақсадида қурилган эди.
Олдин дастурчилар энг содда машина тилини ўзида
ифодаловчи компьютер командалари билан ишлаганлар. Бу
командалар нoл ва бирлардан ташкил топган узун қаторлардан
иборат бўлар эди. Кейинчалик, инсонлар учун тушунарли
бўлган машина командаларини ўзида сақловчи (масалан, АDD
ва MOV командалари) ассемблер тили яратилди. Шу вақтларда
BASIC ва COBOL сингари юқори сатҳли тиллар ҳам пайдо
бўлдики, бу тиллар туфайли сўз ва гапларнинг мантиқий
конструкциясидан
фойдаланиб
дастурлаш
имконияти
яратилди. Бу командаларни машина тилига интерпретаторлар
ва компиляторлар кўчирар эди. Интерпретатор дастурни ўқиш
жараѐнида унинг буйруқларини кетма-кет машина тилига
ўтказади. Компилятор эса яхлит дастур кодини бирор бир
оралиқ форма - объект файлига ўтказади. Бу босқич
компиляция босқичи дейилади. Бундан сўнг компилятор
объектли файлни бажарилувчи файлга айлантирадиган
компановка дастурини чақиради.
Интерпретаторлар билан ишлаш осонроқ, чунки дастур
командалари қандай кетма-кетликда ѐзилган бўлса шу тарзда
бажарилади. Бу эса дастур бажарилишини назорат қилишни
осонлаштиради. Компилятор эса компиляция ва компановка
каби қўшимча босқичлардан иборат бўлганлиги учун, улардан
ҳосил бўладиган бажарилувчи файлни таҳлил қилиш ва
ўзгартириш имконияти мавжуд эмас. Фақатгина компиляция
қилинган файл тезроқ бажарилади, чунки бундаги командалар
5
компиляция жараѐнида машина тилига ўтказилган бўлади.
С/С++ каби компиляция қилувчи дастурлаш тилларини
яна бир афзаллиги ҳосил бўлган дастур компьютерда
компиляторсиз ҳам бажарилаверади. Интерпретация қилувчи
тилларда эса тайѐр дастурни ишлатиш учун албатта мос
интерпретатор дастури талаб қилинади.
Айрим
тилларда
(масалан,
VISUAL
BASIC)
интерпретатор ролини динамик библиотекалар бажаради.
Java тилининг интерпретатори эса виртуал машинадир
(Virtual Machine, ѐки VM). Виртуал машиналар сифатида
одатда броузер (Internet Explorer ѐки Netscape)
лар
қўлланилади.
Кўп йиллар давомида дастурларнинг асосий имконияти
унинг қисқалиги ва тез бажарилиши билан белгиланиб
келинар
эди.
Дастурни
ихчамлаштиришга
интилиш
компьютер хотирасини жуда қимматлиги билан боғлиқ бўлса,
унинг тез бажарилишига қизиқиш процессор вақтининг
қимматбаҳолигига боғлиқ эди. Лекин компьютерларнинг
нархи тушиши билан дастур имкониятини баҳолаш мезони
ўзгарди. Ҳозирги кунда дастурчининг иш вақти бизнесда
ишлатиладиган кўпгина компьютерларнинг нархидан юқори.
Ҳозирда профессионал тарзда ѐзилган ва осон эксплуатация
қилинадиган
дастурларга
талаб
ошиб
бормокда.
Эксплуатациянинг оддийлиги, аниқ масалани ечиш билан
боғлиқ бўлган талабни озроқ ўзгаришига, дастурни ортиқча
чиқимларсиз осон мослаштириш билан изоҳланади.
АNSI стандарти. Америка миллий стандартлар
институти (American National Standards Institute – ANSI)
раҳбарлиги остидаги Cтандартларни аккредитивлаш қўмитаси
(Accredited Standards Committee) С++ тилининг халқаро
стандартини тузди.
С++ стандарти айни вақтда ISO – International
Standards Organization (Cтандартлаш бўйича ҳалқаро
ташкилот) стандарти, деб ҳам номланади.
6
Дастур матнини компиляция қилиш. Дастур кодини
бажарилувчи
файлга
ўтказиш
учун
компиляторлар
қўлланилади. Компилятор қандай чақирилади ва унга дастур
коди жойлашган жойи ҳақида қандай хабар қилинади, бу
конкрет
компиляторга
боғлиқдир.
Бу
маълумотлар
компиляторнинг документациясида берилган бўлади.
Дастур коди компиляция қилиниши натижасида
объектли файл ҳосил қилинади. Бу файл одатда .obj
кенгайтмали бўлади. Лекин бу ҳали бажарилувчи файл дегани
эмас. Объектли файлни бажарилувчи файлга ўгириш учун
йиғувчи дастур қўлланилади. Йиғувчи дастур ѐрдамида
бажарилувчи файлни ҳосил қилиш. С++ тилида дастурлар
одатда бир ѐки бир нечта объектли файллар, ѐки
библиотекаларни компоновка қилиш ѐрдамида ҳосил
қилинади. Библиотека деб бир ѐки бир нечта компоновка
қилинувчи файллар тўпламига айтилади. С++ нинг барча
компиляторлари дастурга қўшиш мумкин бўлган функциялар
(ѐки процедуралар) ва синфлардан иборат библиотека ҳосил
қила олади.
Функция-бу айрим хизматчи амалларни, масалан икки
сонни қўшиб, натижасини экранга чиқаришни бажарувчи
дастур блокидир. Синф сифатида маълумотлар тўплами ва
уларга боғланган функцияларни қараш мумкин. Функциялар
ва синфлар ҳақидаги маълумотлар кейинги мавзуларда
батафсил берилган. Демак, бажарилувчи файлни ҳосил қилиш
учун қуйида келтирилган амалларни бажариш лозим:
.срр кенгайтмали дастур коди ҳосил қилинади;
Дастур кодини компиляция қилиш орқали .obj
кенгайтмали объектли файл тузилади. Бажарилувчи файлни
ҳосил қилиш мақсадида .obj кенгайтмали файли зарурий
библиотекалар орқали компоновка қилинади.
1. Интерпретатор
САВОЛЛАР
ва компилятор
7
орасидаги
фарқ
нимадан иборат?
2. Дастурнинг берилган коди қандай компиляция
қилинади?
3. Дастурни компиляция қилиш йўллари ва усуллари
4. Дастур хусусиятлари.
ТАЯНЧ ИБОРАЛАР: Дастур, структуравий дастурлаш,
объект, объектга мўлжалланган дастурлаш, инкапсуляция,
меросхўрлик, полиморфизм.
Ўзгарувчилар ва ўзгармаслар
Дастур ўзи ишлатадиган маълумотларни сақлаш
имкониятига эга бўлиши лозим. Бунинг учун ўзгарувчилар ва
ўзгармаслардан
фойдаланилади.
Дастур
бажарилиши
жараѐнида ўз қийматини ўзгартирмайдиган катталиклар
ўзгармаслар, яъни константа деб аталади. Дастур бажарилиши
жараѐнида ўз қийматини ўзгартира оладиган катталиклар
ўзгарувчилар дейилади. Ўзгарувчи номлари ҳарфлар ѐки ҳарф
ва сонлардан иборат бўлиши мумкин. С/С++
тилида
ўзгарувчиларни белгилашда катта ва кичик харфларнинг
фарқи бор. Масалан: А ва а харфлари икки хил ўзгарувчини
билдиради. Ушбу мавзуда қуйидагиларни билиб оламиз.
Ўзгарувчи ва ўзгармасларни қандай аниқлаш керак?
Ўзгарувчиларга қандай қиймат бериш керак ва уларни
дастурда қандай ишлатиш лозим?
Ўзгарувчи қиймати қандай экранга чиқарилади?
Ўзгарувчи нима? С/С++ тилида ўзгарувчилар
маълумотни сақлаш учун қўлланилади. Ўзгарувчининг
дастурда фойдаланиш мумкин бўлган қандайдир қийматларни
сақлайдиган комьютер хотирасидаги ячейка кўринишда
ифодалаш мумкин.
Компютер хотирасига ячейкалардан иборат қатор
сифатида қараш мумкин. Барча ячейкалар кетма – кет
номерланган. Бу номерлар ячейканинг адреси деб аталади.
Ўзгарувчилар бирор – бир қийматни сақлаш учун бир ѐки бир
8
нечта ячейкаларни банд қилади.
Ўзгарувчининг номини (масалан, MyVariable) хотира
ячейкаси адреси ѐзилган ѐзув деб қараш мумкин
Хотирани заҳиралаш.
С/С++ тилида ўзгарувчини
аниқлаш учун компьютерга унинг типи (масалан, int,
char ѐки бошқа) ҳақида маълумот берилади. Бу ахборот
асосида компиляторга ўзгарувчи учун қанча жой ажратиш
лозим ва бу ўзгарувчида қандай турдаги қиймат сақланиши
мумкинлиги ҳақида маълумот аниқ бўлади.
Ҳар бир ячейка бир байт ўлчовга эга. Агар ўзгарувчи
учун кўрсатилган тип 4 байтни талаб қилса, унинг учун тўртта
ячейка ажратилади. Айнан ўзгарувчини типига мувофиқ
равишда компилятор бу ўзгарувчи учун қанча жой ажратиш
кераклигини аниқлайди.
Компютерда қийматларни ифодалаш учун битлар ва
байтлар қўлланилади ва хотира байтларда ҳисобланади.
Бутун сонлар ўлчами. Бир хил типдаги ўзгарувчилар
учун турли компюьтерларда хотирадан турли ҳажмдаги жой
ажратилиши мумкин. Лекин, битта компюьтерда бир хил
типдаги иккита ўзгарувчи бир хил миқдорда жой эгаллайди.
сhar типли ўзгарувчи бир байт ҳажмни эгаллайди.
Кўпгина комьпютерларда short int (қисқа бутун) типи икки
байт, long int типи эса 4 байт жой эгаллайди. Бутун
қийматлар ўлчовини компьютер системаси ва ишлатиладиган
компилятор аниқлайди. 32 - разрядли компьютерларда бутун
ўзгарувчилар 4 байт жой эгаллайди. 3.1-листингда
келтирилган дастур сизнинг компюьтерингиздаги типларнинг
ўлчовини аниқлаб беради.
С/С++ тилида константалар ишлатилади:
 Бутун тип (тоифа)ли ўзгармаслар: улар фақат бутун
сонлардан иборат бўлади. Масалан: 15, 64, 1964, - 21 ва
ҳ.к.
 Ҳақиқий типли ўзгармаслар: улар бутун ва каср
қисмлардан иборат бўлади. Масалан: 1,5 15,64 ва ҳ.к.
9
Ҳақиқий типли сонларнинг бу кўриниши оддий кўриниш
дейилади. Жуда катта ва жуда кичик ҳақиқий типли сонларни
даражали (экспоненциал) кўринишда ѐзиш қулай. Масалан:
4,5*10-11 ѐки 6,5*1011 каби сонлар 4.5Е-11 ва 6.5Е11.
 Символли
константалар. Улар қаторига дастур
бажарилиши
давомида
ўзгармайдиган
барча
символларни киритиш мумкин.
C/С++ дастурлаш тилида ҳар қандай ўзгарувчи
ишлатилишидан олдин эълон қилиниши керак. Эълон қилиш
дегани-уларнинг типларини аниқлаб қўйиш мақсадга
мувофиқдир:
 Бутун тоифали ўзгарувчилар: int. Масалан: int a,b,i,j; бу
ерда дастурда ишлатилаѐтган a,b,i,j ўзгарувчиларнинг
тоифаси бутун эканлиги кўрсатилди. Бу тоифадаги
ўзгарувчилар хотирадан 2 байт жой эгаллайди. Уларнинг
ўзгариш интервали (диапазони): -32768 дан + 32767 гача.
Бу Windows 98 Windows NT да 32 разрядли бутун сонлар
фойдаланилади.
 Бутун тоифали катта (узун) ўзгарувчилар: long. Масалан:
long a,b,s,dd2. Бу тоифадаги ўзгарувчилар хотирадан 4
байт жой эгаллайди. Уларнинг ўзгариш интервали
(диапазони): -2147483648 дан + 2147483647 гача.
 Ишорасиз
бутун
ўзгарувчилар: unsigned
short.
Хотирадан 2 байт жой эгаллайди, ўзгариш интервали
(диапазони): 0 дан 65535 гача. unsigned long. Хотирадан
4 байт жой эгаллайди, ўзгариш интервали (диапазони): 0
дан 4 294967 295 гача. unsigned сhar. Хотирадан 1 байт
жой эгаллайди, ўзгариш интервали (диапазони): 0 дан
255 гача.
 Ҳақиқий тоифадаги ўзгарувчилар: float. Масалан: float
а,в; бу ерда а, в ўзгарувчиларнинг тоифаси ҳақиқий
эканлиги келтирилган. Бу тоифадаги ўзгарувчилар
хотирадан 4 байт жой эгаллайди, ўзгариш интервали 10 -38
дан 10+38
гача. Жуда катта ѐки жуда кичик
10
ўзгарувчиларни белгилашда double тоифаси ишлатилади
ва хотирадан 8 байт жой олади.
 Символли ўзгарувчилар учун char тоифаси ишлатилади.
Хотирадан 1 байт жой эгаллайди, ўзгариш интервали
(диапазони): -128 дан + 127 гача. Символли ўзгарувчилар
апостроф („) ичига олиниб ѐзилади ва ASCII кодларига
мос равишда танланади.
 Қатор типидаги ўзгарувчилар учун хам char тоифаси
белгиланган. Хотирадан 1 байт жой эгаллайди, ўзгариш
интервали (диапазони): -0 дан 256
тагача бўлган
символлар кетма-кетлигидан иборат бўлиши мумкин.
Қатор тоифасидаги ўзгарувчилар қўштирноқ (“ “) ичида
ѐзилади. Текст (маълумотларнинг char тури)- a,z,? ва 2
каби символлар кетма-кетлигидан иборат бўлиши
мумкин. Одатда ҳар бир символ 8 бит ѐки бир байт жой
эгаллайди.
Демак, юқоридагилар асосий турлар ҳисобланар экан.
Булар: Char, short, int, long, float, double. Бу ерда дастлабки
4 та тур бутун, қолган 2таси хақиқий сонлар учун ишлатилади.
Агар турлар ҳажмини
таққослаб ифодалайдиган бўлсак,
l=sizeof(char)<=sizeof(short)
l=sizeof(int)<=sizeof(long) <=sizeof(float)<=sizeof(double).
Умуман С/С++ тилида маълумотлар асосан қуйидаги 8та
турга
бўлиниши
мумкин.
Масалан:
char(матнли
маълумотлар), int (бутун сонлар), float(бирлик аниқликдаги
ҳақиқий сонлар), double (иккилик аниқликдаги ҳақиқий
сонлар), void(бўш қийматлар), bool(мантиқий қиймат) ва ҳ.к.
Энди ҳар бир тоифага алоҳида тўхталиб ўтамиз:
Берилганларни бутун тоифаси:
short int x ; // бутун ишорали қисқа
long int y ; //узун бутун
unsigned short k ; // ишорасиз қисқа бутун
unsigned int a ; // бутун ишорасиз
11
unsigned long b ; // ишорасиз узун бутун ва ҳ.к.
Берилганларни ҳақиқий тоифаси:
Ҳақиқий тоифани 3 тури мавжуд: float, double, long double.
Масалан: float a=121.24; double b, eps=1e-5;
Берилганларни символли тоифаси:
Бунда char сўзидан фойдаланамиз:
const a=‟B‟, b=‟t‟, c=‟ „ ,………..;
С/С++ дастурлаш тилида ўзгарувчиларни инициализация
қилиш деган тушунча ҳам мавжуд. Инициализация қилиш
дегани, ўзгарувчини эълон қилиш баробарида унга бошланғич
қийматини ҳам бериш мумкин. Масалан:
int a=19, b=2,
s=100.
Дастурлаш
С/С++ тилидаги дастурларнинг таркибий қисмлари.
C/С++ тилида тузилган дастур объектлар, функциялар,
ўзгарувчилар ва бошқа элементлардан ташкил топади. Ушбу
мавзунинг асосий қисми уларнинг ҳар бирини тўлиқ
тавсифлашга
бағишланган.
Лекин
бу элементларни
уйғунлашган ҳолда қараш учун бирор бир тугалланган ишчи
дастурни қараб чиқиш керак.
Ушбу мавзудан қўйидагиларни билиб олиш мумкин.
* С/С++ тилида дастурлар қандай қисмлардан тузилган.
* Бу қисмлар бир-бири билан қандай алоқа қилади.
* Функция нима ва унинг вазифаси нимадан иборат.
12
Дастур структураси қуйидаги кўринишга эга:
С/С++ дастурлаш тили
Операторлар
Ўзгарувчи.
Ўзгарувчи тоифаси
Оддий
Белгиларни
қайта ишлаш ва
ўзлаштириш
Мураккаб
Муаммоли
Массивлар
Стандарт
ли
Ёзув
Аниқ бир
фойдалан
увчи
Бирлашт
ириш
бошқарув
чи
Берилганларни
қайта ишлаш ва
ташкил этиш
Библиотека ва
модулларни
формирования
Файллар
Белги(нишон)
Кўрсаткич
13
Модуллар
mainбош
функци
я
Функц
иялар
С/С++ тилининг структураси
Дастурда комментария (изоҳ) бериш хам айрим холларда
зарурат туғдиради. Бу /* бу изох * /, // бўлиб, дастурни
хохлаган жойида қўллаш мумкин. Комментарияни бир неча
кўринишлари мавжуд:
- бош функциянинг сарлавҳа қисмидан кейин-дастур
тўғрисида умумий мaьлумот: масала қўйилиши, ўзгарувчилар
ва натижалар, ечиш усуллари, дастур тузувчининг фамилияси,
исми, дастур ѐзилган вақти ва версиялари.
Ҳар бир дастурлаш тили ўз алифбосига эга.
С/С++ тилининг алфбоси махсус символлар, рақамлар ва
харфлардан иборат:
- 26 та лотин ҳарфлари: | A|B|C|…|Z|; a|b|c|…|z|;
- араб рақамлари: = 0|1|2|...|9|;
- махсус символлар: =, *, /, _, |, !, #, %, $, &, ( ), { }, [ ], ^, @
ва ҳ.к.;
арифметик операциялар : =+, |-|, |/|, *, %, |++|, |--|;
Амал бажариш жараѐнида бутун сони бутун сонга
бўлганда натижа ҳар доим ҳам бутун чиқмайди. Масалан:
5/2=3 кўринишда натижа чиқади, агар буни 5/2.деб ѐзсак, у
ҳолда натижа 2,5 чиқади. Модул бўйича бўлиш амалига
тўхталамиз.
....int a=3, b=8, c=0, d;
d=b%a; //натижа 2
d=a%b; // натижа 0
d=b%c; // хатолик ҳақида маълумот.
Модул бўйича бўлишда бўлишдан қолган қолдиқ
қиймати ҳосил бўлади. Охирги сатрда нолга бўлиш содир
бўлганлиги учун компилятор хато ҳақида хабар беради.
Мантиқий операциялар:= &&- мантиқий кўпайтириш (ва), ||
- мантиқий қўшиш (ѐки), ! – мантиқий инкор (эмас).
Мантиқий операцияларни ихтиѐрий тоифадаги сонлар
14
устида бажариш мумкин. Агар, жавоб рост бўлса, натижа 1 га
тенг бўлади, агар жавоб ѐлғон бўлса, натижа 0 га тенг бўлади.
Масалан: (i<25 && j=64); (s1<s2 && (s3>6,4|| s4= =5));
Таққослаш операциялари:=<|<=|>=|>|= =|!=;
Суриш операцияси:=<< >>;
Ўзлаштириш операцияси:=+=|-=|*=|/=|%=|>>=|<<=|=|^= ;
С/С ++ тилининг операциялари. С/С++ дастурлаш тили
300 дан ортиқ функциялар билан ишлайди, яъни тақсимловчи
берилган киритиш, чиқариш графиклари билан ишлаш ва ҳ.к.
Бу ҳолларда кенгайтирилган h библиотекасидаги функция
интерфейслари:
-берилганларни киритиш-чикариш;
-математик операциялар билан ишлаш;
-сатрлар билан ишлаш;
- берилганлар устида қайта ишлаш;
-хотирани тақсимлаш.
Математик функцияларни интерфейси math.h файлида
жойлашган. Киритиш-чиқариш функциялари библиотекада 3
та группага ажратилган ва улар: stdio.h, ioh, conio.h.
Масалан:
# include < conio.h>
#include<stdio.h>
#define pi 3.1415926
File*f ;
void main ( ) // матн функсия танаси ….............
ўзгарувчиларни тоифаларини кўрсатиш:
тоифа номи ўзгарувчи номи=қиймати ва ҳ.к
int а, ar=123, a3; бутун тоифали.
float b=1e-5, с=ar+sin(х); бу ерда х, b, с хақиқий
тоифали ўзгарувчилардир.
Кўп холларда ўзгарувчиларни кичик лотин харфлари
билан белгилаш мақсадга мувофиқ.
Константларни бош ѐки кичик харфлар билан белгилаш керак
15
бўлади.
Масалан идентификаторлар: a, alta, b, test_pr ва х.к.
Идентификаторлар. Дастурлаш тилида идентификаторлар
калитли сўз, ўзгарувчи номи, ўзгармаслар, функциялар ва
белгилар (нишон) бўлиши мумкин. Идентификаторларнинг
номланиши бир нечта белгилардан иборат бўлиши мумкин,
лекин биринчи 32 та белгидан ортиғини қабул қилмайди.
Идентификаторларнинг калитли сўзлари, ушбу 2-жадвалда
келтирилган.
2-жадвал
Ёзилиши
Ма’носи
Ёзилиши
Маъноси
ифодаси
ифодаси
Asm
ассемблер
If
Агар
Auto
автоматик
int
Бутун
Break
якунлаш
long
Узун
Case
танлаш
near
Яқин
Chаг
символли
register
Регистрли
Const
константа
return
Қайтиш
(ўзгармас)
continue
давом
short
Қисқа
эттириш
Do
Бажармоқ
Sizeof
Ўлчами
double
иккиланган
struct switch
cтруктура
аниқликда
улаш
(боғлаш)
Else
акс холда
Typedef
тоифани
э‟лон қилиш
Float
сузувчи
unsigned
Ишорасиз
For
учун
void
Бўш
goto k
шартсиз ўтиш while
ҳозирча
Ўзгармаслар хам икки хил кўринишда бўлади:
номланган ва номсиз.
М: a=b+2,5; бу ерда 2,5 номсиз.
16
Дастурда номланган ўзгармасни кўрсатиш const бўлимида
кўрсатилади.
М: const float k=2.28;
i=1/k;
const char u=d, c=” “; ва ҳ.к.. символли
соnst char *F=”TATУ”, *M=” “; cатрли
# include <stdio.h>
# include <math.h>
main ()
{
тоифа <ўзгаурвчи>лар;
киритиш оператори (''формат'', & ўзгарувчилар) ;
ҳисоблаш танаси;
чоп қилиш қисми
}
# белгиси процессор директиваларини белгилаш учун
ишлатилади. Масалан:
# include <stdio.h> процессор олди буйруғи, бу- дастур
матнини киритиш ва чиқариш функциялар кутубхонасини
чиқаради.
std- стандарт , i- input (киритиш), o- output (чиқариш), hhead (сарлавҳа) маъносини билдиради.
# include <math.h>
<math.h>-махсус стандарт функциялардан фойдаланилганда
қўлланилади.
main ()- бош функция.
Маълумки, барча амаллар тезкор ѐки доимий хотирада
бажарилади, яъни ҳар қандай ўзгарувчиларнинг қийматлари
хотирага киритилади ва барча операциялар хотирадаги
ўзгарувчилар устида бажарилади. Натижа хотирада пайдо
бўлади.
С/С++ тилида дастурни аниқлаш ва ѐзиш ихтиѐрий
17
шаклда, матнли файл сифатида ѐзилиши мумкин. Унда ҳар
бир дастур процессоролди директивалари, бош функция,
объектни тавсифлаш ва аниқлаш кетма-кетлигидан иборат.
Процессор олди директивалари буйруқлари дастур матнини
компиляция қилингунгача қайта ўзгартиришни бошқаради.
Дастурда ўзгарувчилар учун қуйидаги форматлар
ишлатилади:
% с - символли ўзгарувчи учун.
% s - қатор типидаги ўзгарувчи учун.
% d - бутун типидаги ўзгарувчи учун.
%ld - бутун типидаги катта ўзгарувчилар учун (long)
%lu - бутун типидаги ишорасиз катта сонлар учун.
%u - бутун типидаги ишорасиз сонлар учун
(char,int….).
%f - ҳақиқий типидаги ўзгарувчилар учун (float).
%e - экспоненциал формадаги ҳақиқий ўзгарувчилар
учун.
%g - ҳақиқий типдаги натижани яхлитлаб, қисқа
кўринишда олиш учун.
%lf - ҳақиқий типдаги катта ўзгарувчилар учун (long,
float)
%le - экспоненционал формадаги ҳақиқий
ўзгарувчилар (жуда катта ѐки жуда кичик ) учун
%lg - ҳақиқий типдаги катта натижани яхлитлаб,
қисқа кўринишда олиш учун.
Бундан ташқари ўзгарувчиларни 8 ва 16 лик саноқ
системасидаги кўринишида хам киритиш мумкин. Булар учун
алоҳида форматлар белгиланган.
% 0 – бутун типдаги 8 с/системасидаги ўзгарувчилар
учун
% х - бутун типдаги 16 с/системасидаги ўзгарувчилар
учун
% lo - бутун типдаги катта 8 с/системасидаги
ўзгарувчилар учун
18
% lх - бутун типдаги катта 16 с/системасидаги
ўзгарувчилар учун
Ўзгарувчиларни тоифаларини эълон қилиш.
Бутун тоифали ўзгарувчилар:
Изоҳ: 8 лик саноқ/системасидаги сонлар 0-7 гача бўлган
рақамлардан ташкил топган. Масалан: а=025674,
с=1,
вв=02233556677 ва ҳ.к.
16 лик с/с.даги сонлар 0- х ѐки 0 – Х (бу 0 дан бошланиб
х ѐки Х символи
келишлигини билдиради). Масалан:
а=0х79, в=0ХВ64 ва ҳ.к.
Киритиш-чиқариш операциялари
Маълумотларни хотирага клавиатура орқали киритилади
ва унинг умумий кўриниши қуйидагича:
scanf (''формат'', & ўзгарувчилар) ;
Агар клавиатура орқали бирорта ўзгарувчига қиймат
киритиш керак бўлса, у ҳолда ўзгарувчи номи олдига &амперсанд белгиси қўйилади.
Масалан: scanf(''%d'', &a), бу ерда а бутун тоифадаги
ўзгарувчи.
scanf(''%f'', &a), бу ерда а ҳақиқий тоифадаги ўзгарувчи.
scanf(''%ld %f %s‟‟, &a, &b, &c) - бу ерда а катта бутун
ўзгарувчи, b ҳақиқий ўзгарувчи, ва с қатор тоифали ўзгарувчи.
Чиқариш операцияси. Натижани чиқариш учун қуйидаги
процедура ишлатилади.
printf(„‟ „‟)
printf(„‟%f %d„‟, x,y)
printf(„‟x=%f y=%d„‟, x,y)
Демак, натижани экранга чиқаришнинг бир неча
кўриниши мавжуд экан. Агар формат охирига \n белгисини
қўйсак, натижани чиқаргандан кейин курсор янги сатрга
ўтади, акс ҳолда курсор турган ерида қолади. \n белгисини
формат бошига ҳам қўйса бўлади. Масалан:
19
printf(„‟x=%d y=%ld\n„‟, x,y)
printf(„\n йиғинди=%f„‟, s)
printf(„‟%s сен дастурни тўғри тузинг \n\n‟‟, АТ) – бу
кўринишда натижа АТ сен дастурни тўғри туздинг чиқади ва
курсор 2 қатор пастга тушади. Бу
кўринишда натижа
printf(„‟%s сен дастурни тўғри туздинг \n\n‟‟ янги сатрга ўтиш
вазифасини бажаради. Ушбу кўринишни бошқача тасвирлаш
хам мумкин:
Cout <<” сен дастурни тўғри туздинг” << endl;
Бу ерда endl оператори ѐрдамида кейинги сатрга ўтилади
(булар Т.Паскал тилида Write, writeln процедуралари каби).
Стандарт функциялар (1-жадвалда) кўрсатилагн.
Математик
Ифодаси
Sin x
Cos x
tgx
С/С++ д/т
ѐзилиши
sin(x)
cos(x)
tan(x)
ex
Lnx
Lgx
x2
exp(x)
log(x)
log10(x)
sqr(x)
Математик
ифодаси
logab
xn
х
|x|
arctgx
shx
chx
1-жадвал
С/С++ д/т
ѐзилиши
log(b)/log(a)
pow(x,n)
sqrt(x)
abs(x)
atan(x)
exp(x)-exp(-x)/2
exp(x)+exp(-x)/2
Ифода ва операторлар. С/С++
дастурлаш тилида
операциялар кенг тузилишга эга бўлиб, улар ѐрдамида
ифодаларга янги қийматлар қабул қилинади ва ўзгарувчилар
қийматлари ўзгартирилади. С/С++ дастурлаш тилининг айрим
операторлари (2-жадвал).
2-жадвал
20
амал, (вазифаси)
операторлар
Номланиши,
(вазифаси)
Функцияни
чақириш
Операто
рлар
()
Массив
элементига
мурожат
Инкремент
(қиймат ошириш)
Декремент
(қиймат
камайтириш)
Модул
бўйича
бўлиш
Айириш
Кичик
Кичик ѐки тенг
[]
++
Кўпайтириш
*
--
Бўлиш
/
%
қўшиш
+
>
>=
катта
Катта ѐки тенг
Тенг
(мантиқий)
Мантиқий
инкор
Мантиқий ѐки
Кўпайтириш
билан тенглаш
Модул бўйича
бўлиш билан
тенглаш
Айириш билан
тенглаш
<
<=
==
Тенг эмас
!=
Мантиқий ва
Шартли ифода
&&
?:
Бўлиш
тенглаш
билан
/=
Қўшиш
тенглаш
билан
+=
!
||
*=
%=
-=
С/С++ дастурлаш тилида ишлатиладиган асосий
операциялар ва уларнинг структураси.
С/С++ дастурлаш тили 26та лотин ҳарфлари (катта ва
кичик фарқланади, демак 52 та).
Араб рақамлари: 0,1,2,......., 9
Махсус белгилар: =, -, *, /, _, |, !, #, %, $, &, (), { }, [ ], ^, @ ва
ҳ.к.
Махсус символлар бир-биридан пробел (бўш жой ) билан
ажралиб туради.
21
Арифметик операциялар: +(қўшиш), - (айириш), *
(кўпайтириш), / (бўлиш).
Амал бажариш жараѐнида бутун сонни бутун сонга
бўлганда натижа ҳар доим ҳам бутун чиқмайди. Масалан:
5/2=3 кўринишда натижа чиқади, агар буни 5/2. деб ѐзсак, у
ҳолда натижа 2,5 чиқади. Модул бўйича бўлиш амалига
тўхталамиз.
….Int a=3, b=8, c=0, d;
d=b%a; // натижа 2
d=a%b; // натижа 0
d=b% c; // хатолик ҳақида маълумот
Модул бўйича бўлишда бўлишдан қолган қолдиқ
қиймати ҳосил бўлади. Охирги сатрда нолга бўлиш содир
бўлганлиги учун компилятор хато ҳақида хабар беради.
Таққослаш операциялари: >, <, <=, >=, (!= -тенг эмас),
( == мантиқий тенг).
Мантиқий операциялар: && - мантиқий кўпайтириш
(ва), || - мантиқий қўшиш (ѐки), ! –мантиқий инкор (эмас).
Мантиқий операцияларни ихтиѐрий тоифадаги сонлар
устида бажариш мумкин. Агар жавоб рост бўлса, натижа 1 га
тенг чччиқади, агар жавоб ѐлғон бўлса, натижа 0 чиқади.
Масалан: (i<25 && j=64); (s1<s2 && (s3>6,4|| s4= =5))
Қиймат бериш операциялари: юбориш операцияси (=).
Масалан: а=5, b=2, x=y=z=1 ѐки a=(b=c)+d кўринишда ѐзиш
мумкин.
“Қабул қилдим” ва “алмаштирдим” деб номланадиган
операциялар:
+=: а+=в ѐзуви а=а+в ни англатади
-=: а-=в ѐзуви а=а-в ни англатади
*=: а*=в ѐзуви а=а*в ни англатади
/=: а/=в ѐзуви а=а/в ни англатади
Инкремент (++) ва декремент (--) операциялари икки
маънода ишлатилади.
а) i++
- ўзгарувчининг қиймати унга мурожат
22
қилганимиздан кейин 1 та оширилади (i= i+1).
++ i - ўзгарувчининг қиймати унга мурожат қилишдан
олдин 1 тага оширилади.
в) i - -ўзгарувчининг қиймати унга мурожат
қилганимиздан кейин 1 та камаяди.
- - i - ўзгарувчининг қиймати унга мурожат қилишдан
олдин 1 тага камаяди.
Изоҳ: мурожат қилишдан олдин кўпаядиган ѐки
камаядиган операциялар префикс амаллари, мурожат
қилганидан кейин кўпаядиган ѐки камаядиган операциялар
постфикс амаллари деб юритилади.
C/С++ тилида оддий дастур. С/С++ тилида ѐзилган
дастур қуйидаги таркибдан ташкил топган.
1. Директивалар- функциялар кутубхонасини чақириш
(юклаш). Улар махсус include каталогида жойлашган ва .h
файллар деб номланади. Дастурда масаланинг қўйилишига
қараб керакли include лар чақирилади. Бу дастурнинг
хотирада эгаллайдиган жойини минималлаштиради.
Агар
#include
сатрини
Т.Паскал
тилига
солиштирадиган бўлсак, модуллар ѐки махсус оператор ва
функциялар жойлашган библиотекалар кўрсатилади.
С/С++ дастурлаш тилининг яна бир аҳамиятли томони
шундан иборатки, махсус библиотекаларга йўл кўрсатиш
имконияти мавжуд. Масалан:
# include “math.h” – жорий каталогдан чақириш ва у
кўринишда ѐзилади:
# include “/user/pol/math2.h”
Бу ерда math.h файли жорий фойдаланувчи каталогида,
math2.h эса /user/pol каталогида жойлашган, яъни
компилятор шу ерга мурожат қилади.
Масалан: берилган х ва у қийматларида А ва В
ифодаларни ҳисоблаш дастурини тузиш керак бўлсин.
23
А
sin 3 (
x)
2
;
( x y ) 2 e( x )
Бу ерда х=6,3 у=1,2.
B
tg
A * ln(2 *103 cos 2 ( x y))
Дастур кўриниши (С/С++ тилида):
# include <stdio.h>
# include <math.h>
int main()
{
const pi=3.14;
float A,B,C,z,k,s,x=6.3,y=1.2;
z=(x-y); printf(“%f”,z) ;
C=sin(pi-x) ;
k=pow(-x,2) ;
s=2*pow(10,3);
A=abs(pow(C,3)/(sqrt((z*z+exp((x),k))));
B=((sqrt(sin(x))/(cos(x))/(A*log(5)-(cos(x*x)*z))));
printf(“natijalar quyidagi:”);
printf(“%f\n”,A);
printf(“%f\n”,B);
}
{ арифметик ифодалар C++ дастурлаш тилида}
#include <iostream>
#include <math.h>
using namespace std;
void main()
{
double pi=3.14159265;
double x=6.3,y=1.2,a,b;
cout<<"Natija :"<<endl;
a=abs(exp(3*log(sin(pi-x)))/sqrt((x-y)*(x-y)+exp(x*x)));
b=exp((1/3)*log(sin(pi/3)/cos(pi/3)))/(a*log(2000cos(x-y)*cos(x-y)));
cout<<a<<endl;
cout<<b<<endl;
24
}
include препроцессорнинг буйруғи бўлиб, у
қуйидагича таржима қилинади: «Бу буйруқни ортидан файл
номи келади. Ушбу номдаги файлни топиш ва файлдаги
мазмунни дастурнинг жорий кисмига ѐзиш лозим».
Бурчакли
қавс
ичидаги
файлни
мос
файллар
жойлаштирилган барча папкалардан излаш лозимлигини
кўрсатади ва процессоролди компилятордан кейин юкланади
ва фунт (#) белги билан бошланувчи барча қаторларни
бажаради, дастур кодларини компиляцияга тайѐрлайди.
Дастурнинг асосий коди main() функциясини чақириш
билан бошланади. C/С++ тилидаги ҳар бир дастур main()
фукциясини ўзида сақлайди. Функция бу бир ѐки бир неча
амални бажарувчи дастур блокидир. Одатда функциялар
бошқа функциялар орқали чақирилади, лекин main()
функцияси алоҳида хусусиятга эга бўлиб у дастур ишга
туширилиши билан автоматик тарзда чақирилади. Дастурни
бутунлай хотирангиздан ўчириб юбормаслик ва бошқаларга
ҳам тушунарли бўлиши учун изоҳлардан фойдаланиш лозим.
Изоҳлар компилятор томонидан тушириб қолдириладиган
дастурнинг алоҳида сатрида ѐки
бутун бир блокида
қўлланилади. Қуйидаги дастурда кўриб чиқамиз.
Салом.CPP дастури мисолида С/С++ тилида тузилган
дастур қисмларини намойиш қилиш.
1: // Салом.CPP дастури
2: #include <iostream.h >
3: int main( )
4: {
5: cout << “Салом!\n”;
6: return 0;
7: }
НАТИЖА:
Салом!
25
ТАҲЛИЛ: 1-сатрда iostream.h файли жорий файлга
бириктилмоқда. Дастурда биринчи фунта (#) белгиси
жойлашган.
У
процессоролдига
сигнал
узатади.
Компиляторнинг ҳар сафар ишга туширилишида процессор
олди ҳам ишга туширилади. У дастурдаги фунта (#) белгиси
билан бошланувчи қаторларни ўқийди.
Салом.cpp дастури мисолида изоҳларни намойиш
қилиш.
1: # include < iostream.h >
2: main()
3: {
4: cout << “Салом !\ n”;
5: /* бу изоҳ токи изоҳнинг
6: охирини кўрсатувчи белги, яъни юлдузча
7: ва слэш белгиси учрамагунча давом этади */
8: cout << “Бу комментарий якунланди\ n”;
9: // бу изоҳ сатрни охирида тугайди.
10: // Иккита слэшдан сўнг хеч қандай текст
11: // бўлмаслиги мумкин.
12: return 0;
13: }
НАТИЖА
Салом
Бу комментарий якунланди
main()
функциясини
бошқа
функциялар
каби
қайтарадиган қиймат типини эълон қилиш лозим. Салом.cpp
дастурида main()
функцияси int (integer – бутун
сўзидан олинган) типли қиймат қайтаради, яъни бу функция
ишини тугатгандан сўнг операцион системага бутун сонли
қиймат қайтаради. Операцион системага қиймат қайтариш
26
унчалик муҳим эмас, умуман система бу қийматдан
фойдаланмайди, лекин С++ тили стандарти main()
функцияси барча қоидаларга мувофиқ эълон қилинишини
талаб қилади.
Айрим компиляторлар main() функциясини
void типидаги қиймат қайтарадиган қилиб эълон
қилиш имконини беради. С++ да бундан
фойдаланмаслик керак, чунки ҳозирда бундай
услуб эскирган. main() функциясини int
типини қайтарадиган қилиб аниқлаш лозим ва
бунинг ҳисобига функциянинг охирига return 0
ифодаси ѐзилади.
Барча функциялар очилувчи фигурали қавс ({) билан
бошланади ва (}) ѐпилувчи қавс билан тугайди.
main( ) функцияси фигурали қавсида
3-сатрдан 6сатргача жойлаштирилган. Фигурали қавсларни ичида
жойлашган барча сатрлар функция танаси деб айтилади.
Бизнинг оддий дастуримизнинг барча функционаллиги
4-сатрда келтирилган. сout объекти экранга маълумотни
чиқариш учун қўлланилади. cin ва cout объектлари мос
равишда маълумотларни киритиш (масалан, клавиатура
орқали) ва уларни чиқариш (экранга чиқариш) учун
қўлланилади. main() функцияси 6-сатр билан тугалланади.
cout объекти ҳақида қисқача маълумот. Кейинги
мавзуларда сиз сout объектини қандай ишлатиш
лозимлигини билиб оласиз. Ҳозир эса у ҳақида қисқача
маълумот берамиз. Экранга маълумотни чиқариш учун cout
сўзини, ундан сўнг чиқариш операторини (<<) киритиш
лозим. С/С++ компилятори (<<) белгисини битта оператор
деб қарайди. Қуйидаги листингни таҳлил қиламиз.
Ушбу
дастурда
cout
объектини
қўлланилиши
келтирилган.
1: // сout oбъектини кўлланилиши
27
2: # include <iostream.h >
3: int main()
4: {
5: cout << “Бу сон 5 га тенг:” << 5<< “\n”;
6: cout <<“endl оператори экранда янги
7: cout << “ сатрга ўтиш амалини бажаради”;
8: cout <<endl;
9: cout << “Бу катта сон:\t“<< 70000 <<
10: endl;
11: cout << “Бу 5 ва 8 сонларининг йиғиндиси:
12: <<\t“<< 8+5 << endl;
13: cout <<Букасрсон:\t\t“<< (float) 5\8 << endl;
14: cout << “Бу эса жуда катта сон: \t”;
15: cout << (double) 7000*7000 << endl;
16: return 0;
17: };
НАТИЖА:
Бу сон 5 га тенг: 5
endl оператори экранда янги сатрга ўтиш амалини бажаради
Бу катта сон: 70000
Бу 5 ва 8 сонларининг йиғиндиси: 13
Бу каср сон: 0.625
endl оператори end line (cатр охири)
деган сўздан олинган бўлиб «энд-эл» деб
ўқилади.
Бу эса жуда катта сон: 4.9e+07
Функциялар. Биз олдинроқ main() функцияси билан
танишиб чиққан эдик. Бу функция одатдаги бўлмаган, ягона
турдаги функциядир. Функциялар дастурнинг ишлаш даврида
чақирилиши керак. main() функцияси эса дастур томонидан
эмас, балки операцион система томонидан чақирилади.
28
Дастур берилган матни бўйича сатрларни жойлашишига
қараб тартиб билан токи бирор бир функция чақирилгунча
бажарилади. Кейин эса бошқарув биринчи учраган функцияга
берилади. Функция бажарилгандан сўнг бошқарув яна
дастурнинг функция чақирилган жойидан кейинги сатрига
берилади. (Чақирилган функциядан кейинги сатрга берилади.)
Функцияни ишлаш жараѐнига мос ўхшашлик мавжуд.
Масалан,
сиз
расм чизиб турган вақтингизда
қаламингиз синиб қолди. Сиз расм чизишни тўхтатасиз ва
қаламни
йўна бошлайсиз. Кейин эса,
расм чизишни
қаламингиз синиб қолган жойдан бошлаб давом эттирасиз.
Қачонки, дастур бирор бир хизмат кўрсатувчи амалларни
бажарилишига эҳтиѐж сезса керакли функцияни чақиради. Бу
операция бажарилгандан кейин эса дастур ўз ишини функция
чақирилган жойдан бошлаб давом эттиради. Бу ғоя қуйидаги
листингда намойиш этилган.
Функцияларнинг қўлланилиши. Функциялар ѐ void
типидаги, ѐ бошқа бирор бир типдаги қиймат қайтаради.
Иккита бутун сонни қўшиб, уларнинг йиғиндисини
қайтарадиган функция бутун қиймат қайтарувчи дейилади.
Фақатгина қандайдир амалларни бажариб, ҳеч қандай қиймат
қайтармайдиган функциянинг қайтарувчи типи void деб
эълон қилинади.
Функция сарлавҳа ва танадан иборатдир. Функция
сарлавҳасида унинг қайтарадиган типи, номи ва параметрлари
аниқланади. Параметрлар функцияга қиймат узатиш учун
ишлатилади.
Масалан: Функцияни чақирилишига мисол.
1: # include < iostream.h >
2: //намойиш функцияси экранга
3: // ахборот маълумот чиқаради.
4: void намойиш функцияси ()
5: {
29
6: cout<< “\n намойиш функцияси чақирилди\ n;
7: }
8: //main() функцияси олдин ахборот чиқаради ва
9: // намойиш функциясини чақиради
10: // Кейин яна намойиш функциясини чақиради
11: int main()
12: {
13: cout << “\ n Бу main() функцияси \ n”;
14: намойиш функцияси ();
15: cout << “main() функциясига қайтилди\n”;
16: return 0;
17: }
НАТИЖА:
Бу main() функцияси намойиш функцияси чақирилди ва
сўнг main() функциясига қайтилди.
Параметр-бу функцияга узатиладиган қиймат типини
эълон қилишдир. Функция чақирилганда унга узатиладиган
қиймат аргумент деб айтилади. Кўпчилик дастурчилар бу
иккала тушунчани синоним сифатида қарашади. Баъзилар эса
бу терминларни аралаштиришни нопрофессионаллик деб
ҳисоблайди. Мавзуларда иккала термини бир хил маънода
келган.
Функция танаси очилувчи фигурали қавс билан
бошланади ва у бир неча қатордан иборат бўлиши мумкин.
(Функция танасида ҳеч қандай сатр бўлмаслиги ҳам мумкин).
Сатрлардан кейин эса ѐпилувчи фигурали қавс келади.
Функциянинг вазифаси унинг сатрларида берилган дастурий
кодлар билан аниқланади. Функция дастурга return
оператори орқали қиймат қайтаради. Бу оператор функциядан
чиқиш маъносини ҳам англатади.
Агарда функцияга чиқиш операторини (return) қўймасак
функция сатрларини тугаши билан у автоматик void типидаги
қийматни қайтаради. Функция қайтарадиган тип унинг
30
сарлавҳасида кўрсатилган тип билан бир хил бўлиши лозим.
Бундан ташқари бизга учбурчакнинг маълум параметрларига
кўра номаълум параметрларини топиш керак бўлсин. У ҳолда
қуйидаги формулалардан фойдаланамиз:
a
b
c
sin
sin
sin
c
a 2 b 2 2ab cos
Ва хаказо. Масалан: Ихтиѐрий учбурчакнинг 3та (a,b,c)
томонлари берилган бўлсин, қолган 7та номаълум
параметрларини аниқлаш дастурини тузинг.
Дастури:
#include <iostream>
#include <math.h>
using namespace std;
void main()
{
double pi=3.14159265;
double a=3,b=4,c,A,B,C=pi/4,r,R,p,S;
c=sqrt(a*a+b*b-2*a*b*cos(C));
A=asin((a/c)*sin(C));
B=asin((b/c)*sin(C));
p=(a+b+c)/2; S=a*b*sin(C)/2;
r=S/p; R=a*b*c/(4*S);
cout<<"Ярим периметр:p= "
<<p<<endl;
cout<<"Alfa burchak : A= " <<A<<endl;
cout<<"Beta burchak : B= " <<B<<endl;
cout<<"c tomon uzunligi: c= " <<c<<endl;
cout<<"Ichki aylana radiusi:r= " <<r<<endl;
cout<<"Tashqi aylana radiusi: R=" <<R<<endl;
cout<<"Yuzi: S= " <<S<<endl;
getchar();
}
НАЗОРАТ УЧУН CАВОЛЛАР.
1. Компилятор ва препроцессорнинг фарқи нимадан
иборат?
2. #include директиваси қандай вазифани бажаради?
3. main() функциясининг ўзига хос хусусияти
31
нимадан иборат?
4. Қандай изоҳ турларини биласиз ва улар нима билан
фарқ қилади?
5. Изоҳлар бир неча қаторда ѐзилиши мумкинми?
ТАЯНЧ ИБОРАЛАР:
Изоҳ, функция, функция
параметри, функция аргументи, функция танаси.
Таянч
тоифалар
учун
комьпютер
хотирасидан
ажратиладиган байтларни аниқлаш.
1: # include <iostream. h>
2: int main()
3:
4: cout << “int тоифасининг ўлчами: \t”
5: <<sizeof(int)<<” байт.”;
6: cout<< “short int тоифасининг ўлчами:\t”
7: << sizeof(short)<< “байт.”;
8: cout<<“long int тоифасининг ўлчами:\t”
9: << sizeof(long)<<“байт.”;
10: cout<< char тоифасининг ўлчами:\t”
11: << sizeof(long)<<”\t байт.”;
12: return 0;
13: ;
НАТИЖА:
int тоифасининг ўлчами: 4 байт.
short int тоифасининг ўлчами: 2 байт.
long int тоифасининг ўлчами: 4 байт.;
char тоифасининг ўлчами: 1 байт;
Ишорали
ва
ишорасиз
типлар.
Дастурда
қўлланиладиган бутун сонли типлар ишорали ва ишорасиз
бўлиши мумкин. Баъзан ўзгарувчи учун фақатгина мусбат
сонни қўллаш фойдали бўлади. Unsingned калитли сўзиcиз
келтирилган бутун сонли типлар (short
ва
long)
32
ишорали ҳисобланади. Ишорали бутун сонлар манфий ва
мусбат бўлиши мумкин. Ишорасиз сонлар эса доимо мусбат
бўлади.
Ўзгарувчиларнинг таянч тоифалари. С/С++ тилида
бошқа берилганлар тоифалари ҳам қаралган. Улар бутун
сонли, ҳақиқий ва белгили бўлиши мумкин. Ҳақиқий
ўзгарувчилар каср кўринишда ифодаланувчи қийматларни ҳам
ўзида сақлайди. Белгили ўзгарувчилар бир байт
жой
эгаллайди ва 266 та белги ҳамда ASCII белгиларни сақлаш
учун ишлатилади.
ASCII
белгилари
деганда
компьютерларда
қўлланиладиган стандарт белгилар тўплами тушунилади.
ASCII - бу American Standard Code for Information Interchange
( Американинг ахборот алмашиниши учун стандарт коди)
деган маънони англатади. Калит сўзлар. С/С++ тилида айрим
сўзлар олдиндан заҳираланади. Булар калитли сўзлар деб
айтилади. Бундай сўзларни ўзгарувчиларни номлашда
ишлатиш мумкин эмас. Уларга if, while, for ва main
каби сўзлар киради. Компиляторнинг техник хужжатларида
барча заҳираланган сўзларнинг рўйхати туради.
Ўзгарувчига қиймат бериш. Ўзгарувчиларга
қиймат бериш учун ўзлаштириш оператори қўлланилади.
Масалан, Width ўзгарувчисига 5 қийматни бериш учун
қуйидагиларни ѐзиш лозим:
unsigned short Width;
Width = 5;
Бу иккала сатрни Width ўзгарувчисини аниқлаш
жараѐнида биргаликда ѐзиш мумкин.
unsigned short Wigth = 5;
Бир неча ўзгарувчиларни аниқлаш вақтида ҳам уларга
қиймат бериш мумкин:
long widt h=5,
length=7;
33
Бу мисолда long типидаги width ўзгарувчиси 5
қийматни, шу типдаги length ўзгарувчиси эса 7 қийматни
қабул қилди. Қуйидаги дастурда ўзгарувчиларни аниқлашга
оид мисолни қараймиз.
Ўзгарувчиларнинг қўлланиши.
1: # include < iostream. h >
2: int main()
3: {
4: int Бўйи=5, Эни=10, Юзаси;
5: cout << “Бўйи:” <<Бўйи << “ \n”;
6: cout << “Эни:” << Эни << endl;
7: Yuzasi= Бўйи*Эни;
8: cout << “Юзаси:” << Юза << endl;
9: return 0;
}
НАТИЖА:
Бўйи: 5
Эни: 10
Юзаси: 50
typedef калитли сўзи. unsigned short int каби калит
сўзларни кўп марталаб дастурда ѐзилиши зерикарли ва
диққатвозлик келтириши сабабли С/С++ тилида бундай
типларни typedef калитли сўзи ѐрдамида псевдонимини
(тахаллусини) тузиш имконияти берилган. typedef сўзи
тоифани аниқлаш маъносини билдиради.
Псевдоним тузишда тоифанинг номи янги тузиладиган
тоифа номидан фарқли бўлиши лозим. Бунда биринчи
typedef калитли сўзи, кейин мавжуд тоифа номи, ундан
сўнг эса янги ном ѐзилади. Масалан:
typedef unsigned short int ushort
Бу сатрдан сўнг ushort номли янги тоифа ҳосил
бўлади ва у қаерда unsigned short int типидаги
ўзгарувчини аниқлаш лозим бўлса, шу жойда ишлатилади.
34
Ушбу дастурда typedef оператори орқали тоифаларнинг
аниқланиши келтирилган.
1. # include <iostream.h>
2. typedef insigned short int ushort
3. int main()
4. { ushort Бўйи = 5;
5. ushort Эни = 10;
6. ushort Юзаси = Бўйи* Эни;
7. cout << “Юзаси:” << Юзаси << end;
8. }
НАТИЖА:
Юзаси: 50
Белгилар. Белгили ўзгарувчилар одатда бир байт жойни
эгаллайди ва бу 256 хил белгини сақлаш учун етарлидир.
Char типи қийматларини 0..255 сонлар тўпламига ѐки ASCII
белгилар тўпламига интерпретация қилиш мумкин.
Махсус белгилар. С/С++ компилятори матнларни
форматловчи бир нечта махсус белгилардан ташкил топган.
Улардан энг кўп тарқалгани (3- жадвалда келтирилган). Бу
белгиларни
дастурда ишлатишда «тескари слеш»дан
фойдаланамиз. Тескари слешдан кейин бошқарувчи белги
ѐзилади. Масалан, табуляция белгисини дастурга қўйиш учун
қуйидаги ѐзувни ѐзиш керак:
Char tab =„\t‟;
Бу мисолдаги char типидаги ўзгарувчи \t қийматини
қабул қилади. Махсус белгилар ахборотларни экранга, файлга
ва бошқа чиқариш қурилмаларига чиқаришда форматлаш учун
қўлланилади.
3-жадвал.
Белгилар
Қиймати
35
\n
\t
\b
\”
\‟
\?
\\
Янги сатрга ўтиш
Табуляция
Битта позицияга ўтиш
Иккиталик қавсча
Битталик қавсча
Сўроқ белгиси
Тескари слеш
Ўзгармаслар. Ўзгарувчилар каби ўзгармаслар ҳам
маълумотларни
сақлаш
учун
мўлжалланган
хотира
ячейкаларини ўзида ифодалайди. Ўзгарувчилардан фарқли
равишда улар дастурни бажарилиши жараѐнида қиймати
ўзгармайди. Ўзгармас эълон қилиниши билан унга қиймат
бериш лозим, кейинчалик бу қийматни ўзгартириб бўлмайди.
С/С++ тилида икки турдаги, литерал ва белгили ўзгармаслар
аниқланган.
Литерал ўзгармаслар.
Литерал
ўзгармаслар
тўғридан-тўғри дастурга киритилади. Масалан:
int myAge =39;
Бу ифодада MyAge int тоифадаги ўзгарувчи, 39 сони
эса литерал ўзгармасдир.
Белгили ўзгармаслар. Белгили ўзгармас – бу номга эга
бўлган ўзгармасдир. С/С++ тилида белгили ўзгармасни
аниқлашнинг икки усули мавжуд:
1. # define
директиваси ѐрдамида ўзгармасни
аниқлаш.
2. const калитли сўзи орқали ўзгармасни аниқлаш.
Анъанавий усул ҳисобланган #define директиваси
орқали ўзгармасни аниқлашни қуйидаги мисолда кўришимиз
мумкин.
#define SТАТ 15
Бу ҳолда SТАТ ўзгармас ҳеч қандай типга тегишли
36
бўлмайди.
Препроцессор SТАТ сўзига дуч келганида уни 15
литералига алмаштиради.
С/С++ тилида
#define директивасидан ташқари
ўзгармасни аниқлашнинг нисбатан қулайроқ бўлган янги
усули ҳам мавжуд:
const unsigned short int SТАТ=15
Бу мисолда ҳам белгили константа SТАТ номи билан
аниқланаяпти ва унга unsigned short int тофаси бериляпти. Бу
усул бир қанча
имкониятларга эга бўлиб, у сизнинг
дастурингизни кейинги ҳимоясини енгиллаштиради. Бу
ўзгармасни
олдингисидан энг муҳим афзаллиги унинг
тоифага эгалигидир.
Белгили ўзгармасларни литерал ўзгармасларга нисбатан
ишлатиш қулайроқдир. Чунки агарда бир хил номли
литералли ўзгарувчини қийматини ўзгартирмоқчи бўлсангиз
бутун дастур бўйича уни ўзгартиришга тўғри келади, белгили
ўзгармасларни эса фақатгина бирининг
қийматини ўзгартириш етарли.
Тўплам ўзгармаслари. Бундай ўзгармасларни ҳосил
қилиш учун янги берилган маълумотлар типлари тузилади ва
ундан сўнг бу типга тегишли ўзгармасли қийматлар тўплами
билан чегараланган ўзгарувчилар аниқланади. Масалан, RANG
номли саноқли тип деб эълон қилайлик ва унинг учун 5 та
қизил, кўк, яшил,оқ, қора қийматларини аниқлайлик.
Саноқли типларни ҳосил қилиш учун enum калитли
сўзи ва ундан кейин тип номи, ҳамда фигурали қавс ичида
вергуллар билан ажратилган ўзгармас қийматлари рўйхати
ишлатилади. Масалан, enum RANG { қизил, кўк,яшил,оқ,
қора};
Бунда ифода иккита ишни бажаради:
1. RANG номли янги саноқли тип ҳосил қилади;
2. Қуйидаги белгили ўзгармасларни аниқлайди:
0 қиймат билан қизил;
37
1 қиймат билан кўк;
2 қиймат билан яшил ва ҳоказо;
Ҳар бир саноқли ўзгармас бирор бир аниқланган бутун
қийматга мос келади.
Бошланғич ҳолатда ўзгармасларга 0 дан бошлаб қиймат
берилади. Лекин, ихтиѐрий
ўзгармасга бошқа қийматни
ўзлаштириш ҳам мумкин. Бунда уларга қиймат бериш ўсиш
тартибида бўлиши лозим. Масалан, enum RANG{қизил=100,
кўк=200, яшил=300,оқ,қора=500};
кўринишда саноқли типни аниқласак қизил ўзгармаси 100 га,
кўк-200 га, яшил-300 га, оқ-301 га, қора-500 га тенг бўлади.
Ушбу дастурда саноқли ўзгармасни қўлланилиши
келтирилган:
1: # include <iostream.h >
2: int main( )
3: {
4: enum Кунлар{Dushanba, Seshanba, Chorshanba,
5: Payshanba, Juma, Shanba, Yakshanba}
6: int танлаш;
7: сout << “Кун номерини киритинг (0-6):” ;
8: сin << танлаш;
9: if (танлаш=Yakshanba || танлаш = Shanba)
10: cout <<“\n Бугун Сиз учун дам олиш куни!”
11: <<endl;
12: else
13: cout << “\n Бугун Сиз учун иш куни.\n”;
14: return 0;
15: };
HATИЖА:
Кун номерини киритинг (0-6): 6
Бугун Сиз учун дам олиш куни!
38
1.
2.
3.
4.
5.
НАЗОРАТ УЧУН САВОЛЛАР
Нима учун литералли ўзгармасга нисбатан белгили
ўзгармасни ишлатиш яхшироқ?
Бутун сонли ва ҳақиқий типларни қандай фарқи бор?
unsigned short int ва long int типларининг ўзаро
фарқи нимада?
const калитли сўзини #define директиваси ўрнига
қўллашни афзаллиги нимада?
Дастур ишига “яхши” ва “ѐмон” деб номланган
ўзгарувчи қандай таъсир қилади?
ТАЯНЧ
ИБОРАЛАР:
Ўзгарувчи,
ўзгарувчининг
аниқланиши, хотирани резеврланиши, ишорали ва ишорасиз
тоифалар, калитли сўзлар, белгилар, махсус белгилар,
ўзгармаслар, литерал ўзгармаслар, белгили ўзгармаслар,
#define директиваси, сonst
калитли сўзи, саноқли
ўзгармаслар.
Ифодалар ва операторлар. Дастур бирор бир аниқланган
кетма - кетликда бажарилувчи буйруқлар тўпламидан иборат.
Сиз ушбу мавзудан қуйидагилар билан танишасиз:
Оператор нима ?
Блок нима ?
Ифода нима?
Дастурни
берилган
мантиқий
шартларини
бажарилиши натижаси асосида тармоқланишини
қандай ташкил этиш лозим.
С/С++ дастурчиси нуқтаи-назарида “Рост” ва “
Ёлғон” нима?
Ифода. С/С++ тилида ифодалар бирор бир ҳисоблаш
натижасини қайтарувчи бошқа ифодалар кетма-кетлигини
бошқаради, ѐки ҳеч нима қилмайди (нол ифодалар).
С/С++ тилида барча ифодалар нуқтали вергул билан
якунланади. Ифодага мисол қилиб ўзлаштириш амалини олиш
мумкин.
39
Ўзлаштириш оператори. Ўзлаштириш оператори (=)
ўзидан чап томонда турган операнд қийматини тенглик
белгисидан ўнг томондагиларни ҳисобланган қийматига
алмаштиради. Масалан:
х = а+b;
ифодаси х операндга а ва в ўзгарувчиларни қийматларини
қўшишдан ҳосил бўлган натижани ўзлаштиради.
Ўзлаштириш операторидан чапда жойлашган операнд
адресли операнд ѐки
l–киймат (chap-чап сўзидан
олинган) дейилади. Ўзлаштириш
операторидан ўнгда
жойлашган операнд операцион операнд ѐки r–киймат
дейилади.
Ўзгармаслар фақатгина r–киймат бўлиши мумкин ва
ҳеч қачон адресли операнд бўла олмайди, чунки дастурнинг
бажарилиши жараѐнида ўзгармас қийматини ўзгартириб
бўлмайди.
35 = х // нотўғри!
l–қиймат эса r–қиймат бўлиши мумкин.
Алгебрадан фарқли равишда бу ифода х=а+в га тенг
эканлигини англатмайди. Бу ифодани қуйидагича тушуниш
керак:
а ва в ўзгарувчиларни қийматларини йиғиб натижасини
х ўзгарувчига берамиз ѐки х ўзгарувчига а+в қийматни
ўзлаштирамиз. Бу ифода бирданига иккита амални бажаради,
йиғиндини ҳисоблайди ва натижани ўзлаштиради. Ифодадан
сўнг нуқтали вергул қўйилади. (=) оператори ўзидан чап
томондаги операндга ўнг томондаги операндлар устида
бажарилган амаллар натижасини ўзлаштиради.
Математик операторлар. С/С++ тилида 5 та асосий
математик операторлар кўлланилади: қўшиш (+),
айириш (-), кўпайтириш (*), бутун сонга бўлиш (\) ва
модул бўйича бўлиш (%)(қолдиқни олиш).
Ишорасиз бутун сонларни айиришда, агарда натижа
40
манфий сон бўлса ғайриоддий натижа беради. Буни 8листингдан кўришимиз мумкин.
Ушбу дастурда айириш натижасида бутун сонни
тўлиб қолишига мисол
16: #include < iostream.h >
17: int main()
18: {unsiegned int айирма
19: unsisgned int катта сон = 100;
20: unsigned int кичик сон = 50;
21: айирма = катта сон – кичик сон;
22: cout<<“Айирма“:<<айирма<<“га тенг\n”;
23: айирма = кичик сон – катта сон ;
24: cout<<“Айирма“:<<айирма<<“га тенг\n”
25: <<endl;
26: return 0;
27: }
HАТИЖА:
Айирма: 50 га тенг
Айирма Айирма:
га тенг
Бутун сонга бўлиш ва қолдиқни олиш операторлари
Бутун сонга бўлиш одатдаги бўлишдан фарқ қилади.
Бутун сонга бўлишдан ҳосил бўлган бўлинманинг фақатгина
бутун қисми олинади. Масалан, 21 сонини 4 га бўлсак 5 сони
ва 1 қолдиқ ҳосил бўлади. 5 бутун сонга бўлишни қиймати, 1
эса қолдиқни олиш қиймати ҳисобланади.
41
Инкремент ва декремент. Дастурларда ўзгарувчига 1
ни қўшиш ва айириш амаллари жуда кўп ҳолларда учрайди.
С/С++ тилида қийматни 1 га ошириш инкремент, 1 га
камайтириш эса декремент дейилади. Бу амаллар учун махсус
операторлар мавжуддир.
Инкремент оператори (++) ўзгарувчи қийматини 1 га
оширади, декремент оператори (––) эса, ўзгарувчи
қийматини 1 га камайтиради. Масалан, с ўзгарувчисига 1
қийматни қўшмоқчи (оширмоқчи) бўлсак қуйидаги ифодани
ѐзишимиз лозим.
с++ //с ўзгарувчи қийматини 1 га оширдик.
Бу ифодани қуйидагича ѐзишимиз хам мумкин эди.
с=с+1;
Бу ифода ўз навбатида қуйидаги ифодага тенг кучли:
с+=1;
Префикс ва постфикс. Инкремент оператори ҳам,
декремент оператори ҳам икки вариантда ишлайди: префиксли
ва постфиксли. Префиксли вариантда улар ўзгарувчидан
олдин (++Аge), постфиксли вариантда эса ўзгарувчидан
кейин (Age++) ѐзилади.
Оддий ифодаларда бу вариантларни қўлланишида фарқ
катта эмас, лекин бир ўзгарувчига бошқа ўзгарувчининг
қийматини ўзлаштиришда уларнинг қўлланилиши бошқача
характерга эга. Префексли оператор қиймат ўзлаштирилгунча,
постфиксли оператор эса қиймат ўзлаштирилгандан кейин
бажарилади. Буни қуйидаги листингдан кўришимиз мумкин:
Префиксли
ва
постфиксли
операторларни
қўлланилиши.
1:# include < iostrеam. h >
2:int main()
3:{
42
4:int myAge = 39;
5:int yourAge = 39;
6:cout <<“Мен”<< MyAge <<”ёшдаман \n”;
7:cout <<“Siz”<<yourAge<<“ёшдасиз \n”;
8:myAge++ ; // постфиксли инкремент
9:++yourAge; // префексли инкремент
10:cout<< “Бир йил ўтди …\ n”;
11:cout<< “Мен” << MyAge <<” ёшдаман\n”;
12:cout<<“Сиз”<<yourAge<<“ёшдасиз \n”;
13:cout<< “Яна бир йил ўтди\n”;
14:cout<<”Мен”<<myAge++<<“ёшдаман \n”;
15:cout<<”Сиз”<<++yourAge<<“ёшдасиз\n”;
16:cout<< “Маълумотларни қайтадан”
17:cout<< “чиқарайлик\n”;
18:cout<<” Мен”<<myAge<<“ёшдаман\n”;
19:cout<<”Сиз”<<yourAge<<“ёшдасиз \n”;
20:return 0;
21:}
HАТИЖА:
Мен 39 ёшдаман
Сиз 39 ёшдасиз
Бир йил ўтди …
Мен 40 ёшдаман
Сиз 40 ёшдасиз
Яна бир йил ўтди …
Мен 40 ёшдаман
Сиз 41 ёшдасиз
Маълумотларни қайтадан чиқарайлик
Мен 41 ёшдаман
Сиз 41 ёшдасиз
43
Операторлар приоритети. Мураккаб ифодаларда қайси
амал биринчи навбатда бажарилади, қўшишми ѐки
кўпайтиришми? Масалан:
х=5+3*8;
ифодада агарда биринчи қўшиш бажарилса натижа 64 га,
агарда кўпайтириш биринчи бажарилса натижа 29 га тенг
бўлади.
Ҳар бир оператор приоритет қийматига эга. Кўпайтириш
қўшишга нисбатан юқорироқ приоритетга эга. Шунинг учун
бу ифода қиймати 29 га тенг бўлади.
Агарда иккита математик ифоданинг приоритети тенг
бўлса, улар чапдан ўнгга қараб кетма – кет бажарилади.
Демак, х=5+3+8*9+6*4
ифодада биринчи кўпайтириш амаллари чапдан ўнгга қараб
бажарилади 8*9=72 ва 6*4=24. Кейин бу ифода соддароқ
кўриниш ҳосил қилади.
х=5+3+72+24
Энди қўшишни ҳам худди шундай чапдан унга қараб
бажарамиз:
5+3=8; 8+72= 80; 80+24=104;
Лекин, барча операторлар ҳам бу тартибга амал
қилмайди. Масалан, ўзлаштириш оператори ўнгдан чапга
қараб бажарилади.
Ички қавслар. Мураккаб ифодаларни тузишда ички
қавслардан фойдаланилади. Масалан, сизга секундларнинг
умумий сони кейин эса барча қаралаѐтган одамлар сони,
ундан кейин эса уларнинг кўпайтмасини ҳисоблаш керак
бўлсин.
TotalPersonSeconds=((NumMinutesToThink+
NumMinutesToType)*60*(PeopleInTheOffice+
PeopleOnVocation ))
Бу
ифода
қуйидагича
бажарилади.
Олдин
NumMinutesToThink
ўзгарувчисининг
қиймати
NumMinutesToType ўзгарувчиси қийматига қўшилади.
44
Кейин эса ҳосил қилинган йиғинди 60 га кўпайтирилади.
Бундан кейин PeopleInTheOffice ўзгарувчи қиймати
PeopleOnVocation қийматига қўшилади. Кейин эса
секундлар сони кишилар сонига кўпайтирилади.
Бўш жой (пробел) белгиси. Бўш жой белгиларига
нафақат пробел, балки янги сатрга ўтиш ва табуляция
белгилари ҳам киради. Юқорида келтирилган ифодани
қуйидагича ҳам ѐзиш мумкин:
х= а+b
;
Бу вариантда келтирилган ифода кўримсиз ва
тушунарсиз бўлса ҳам тўғридир.
Бўш жой белгилари дастурнинг ўқилишлилигини
таъминлайди.
Блок ва комплекс ифодалар. Баъзан дастур тушунарли
бўлиши учун ўзаро мантиқий боғланган ифодаларни блок деб
аталувчи комплексларга бирлаштириш қулайдир. Блок
очилувчи фигурали қавс ({) билан бошланади ва ѐпилувчи
фигурали қавс (}) билан тугайди. Блок очилганда ва
ѐпилганда нуқтали вергул қўйилмайди.
..........
{
temp= a;
a = b;
b = temp;
}
Бу блок худди бир ифодадек бажарилади, у а ва в
ўзгарувчилар қийматларини алмаштиради.
Мантиқий амаллар ва муносабатлар
Дастурлашда бир эмас балки бир нечта шартли
ифодаларни текшириш зарурияти жуда кўп учрайди. Масалан,
х ўзгарувчиси y ўзгарувчисидан, y эса ўз навбатида z
ўзгарувчисидан каттами шарти бунга мисол бўла олади.
Бизнинг дастуримиз мос амални бажаришдан олдин бу иккала
45
шарт рост ѐки ѐлғонлигини текшириши лозим.
Қуйидаги мантиқ асосида юқори даражада ташкил қилинган
сигнализация системасини тасаввур қилинг. Агарда эшикда
сигнализация ўрнатилган бўлса ВА кун вақти кеч соат олти
ВА бугун байрам ЁКИ дам олиш куни БЎЛМАСА полиция
чақирилсин. Барча шартларни текшириш учун С++ тилида
учта мантиқий оператори ишлатилади.
Улар 4-жадвалда келтирилган. Мантиқий операторлар
(4-жадвал).
4 – жадвал
Оператор
Белги
Мисол
ВА
&&
1ифода && 2ифода
ЁКИ
||
1ифода||2ифода
ИНКОР
!
!ифода
Мантиқий кўпайтириш оператори
Мантиқий кўпайтириш оператори иккита ифодани
ҳисоблайди, агар иккала ифода true қиймат қайтарса ВА
оператори ҳам true қиймат қайтарди. Агарда сизнинг
қорнингиз очлиги рост бўлса ВА сизда пул борлиги ҳам рост
бўлса сиз супермаркетга боришингиз ва у ердан ўзингизга
тушлик қилиш учун бирор бир нарса харид қилишингиз
мумкин.
Ёки
яна
бир
мисол,
масалан,
if(x==5)&&(y==5) мантиқий ифодаси агарда х ва у
ўзгарувчиларини иккаласининг ҳам қийматлари 5 га тенг
бўлсагина true қиймат қайтаради. Бу ифода агарда
ўзгарувчилардан бирортаси 5 га тенг бўлмаган қиймат қабул
қилса false қийматини қайтаради. Мантиқий кўпайтириш
оператори фақатгина ўзининг иккала ифодаси ҳам рост
бўлсагина true қиймат қайтаради.
Мантиқий кўпайтириш оператори && белги орқали
белгиланади.
46
Мантиқий қўшиш оператори
Мантиқий қўшиш оператори ҳам иккита ифода орқали
ҳисобланади. Агарда улардан бирортаси рост бўлса мантиқий
қўшиш оператори true қиймат қайтаради. Агарда сизда пул
ЁКИ
кредит карточкаси бўлса, сиз счѐтни тўлай оласиз. Бу
ҳолда иккита шартнинг бирданига бажарилиши: пулга ҳам ва
кредит карточкасига ҳам эга
бўлишингиз шарт эмас. Сизга улардан бирини бажарилиши
етарли. Бу операторга оид яна бир мисолни қараймиз.
Масалан,
if(x==5)||(y==5)
ифодаси ѐки х ўзгарувчи қиймати, ѐки у ўзгарувчи қиймати,
ѐки иккала ўзгарувчининг қиймати ҳам 5 га тенг бўлса рост
қиймат қайтаради.
Мантиқий инкор оператори
Мантиқий инкор оператори текширилаѐтган ифода
ѐлғон бўлса true қиймат қайтаради. Агарда текширилаѐтган
ифода рост бўлса инкор оператори false қиймат қайтаради.
Масалан, (if!(x==5))
ифодасининг қиймати, агарда х ўзгарувчиси 5 га тенг бўлмаса
true қиймат қайтаради. Бу ифодани бошқача ҳам ѐзиш
мумкин:
if(x!=5)
Амаллар (Операциялар)
Бажарилиши натижасида бирор бир қиймат қайтарадиган
барча ифодалар С/С++ тилида амаллар дейилади. Амаллар
албатта бирор бир қиймат қайтаради. Масалан, 3+2 амали 5
қийматни қайтаради.
Операторлар.
Оператор - бу қандайдир амални
бажариш туғрисида компиляторга узатиладиган литералдир.
Операторлар операндларга таъсир қилади. С/С++ да
операндлар деб алоҳида литераллар ва бутун ифодалар
тушунилади.
47
С/С++ тилида икки кўринишдаги операторлар бор:
ўзлаштириш операторлари
математик операторлар
Муносабат операторлари. Бундай операторлар иккита
қийматни тенг ѐки тенг эмаслигини аниқлаш учун
ишлатилади. Таққослаш ифодаси доимо true (рост) ѐки
false (ѐлғон) қиймат қайтаради. Муносабат
операторларининг кўлланилишига оид мисол 4.1.
жадвалда келтирилган.
Муносабат операторлари
4.1-жадвал
Номи
Оператор
Тенглик
==
Тенг эмас
!=
Катта
>
Катта
тенг
Кичик
ѐки
Кичик
тенг
ѐки
>=
<
<=
Мисол
100==50
50==50
100!=50
50!=50
100>50
50>50
100>=50
50>=50
100<50
50<50
100<=50
50<=50
Мантиқий солиштириш операторлари */
.. .
if (s1 == s2) " тенг "
if (s1 < s2) " кичик
if (s1 >= s2) " катта ѐки тенг
if (s1 != s2) " тенг эмас "
....
return (0);
}
48
Қайтарадиган
қиймат
false
true
true
false
true
false
true
true
true
false
true
true
....
Бу ерда true ни ўрнига 1, false ни қиймати ўрнига 0 ни
қўллашимиз мумкин. Бошқа мисол: while (g<10 || f<4){ ... } Бу
ерда икки ўзгарувчи бор (g ва f). Биринчиси 10 дан кичкина
ѐки иккинчиси 4 дан кичкина бўлганда while нинг танаси
такрорланаверади, яъни шарт бажарилиши учун энг камида
битта true бўлиши керак, AND да (&&) эса хамма оддий
шартлар true бўлиши керак.
&& ва || операторлари иккита аргумент олишади.
Булардан фарқли ўлароқ, ! (мантиқий инкор)
оператори битта аргумент олади ва бу аргументлардан олдин қўйилади.
Инкор оператори ифоданинг мантиқий қийматини
тескарисига ўзгартиради, яъни false ни
true деб
беради, true ни эса false деб беради. if ифодаси маълум
бир шартнинг тўғри (true) ѐки нотўғри (false) бўлишига
қараб, дастурнинг у ѐки бу блокини бажаришга имкон
беради. Агар шарт тўғри бўлса, if дан сўнг келувчи
амал бажарилади. Агар шарт бажарилмаса, у ҳолда if
танасидаги ифода бажарилмай, if дан сўнг келувчи
ифодалар ижроси давом эттирилади. Бу структуранинг
кўриниши қуйидагичадир: switch структураси.
49
if-else-if ѐрдами билан бир неча шартни тест қилишимиз
мумкин. Лекин бундай ѐзув нисбатан ўқишга қийин ва
кўриниши қўпол бўлади. Агар шарт ифода бутун сон тоифага
мансуб бўлса, ѐки бу тоифага келтириши мумкин бўлса, биз
switch (танлаш) ифодаларини ишлата оламиз. switch
структураси бир неча case хизматчи сўзларидан (label) ва
мажбурий бўлмаган default сўзларидан иборатдир. Этикет – бу
бир номдир. У дастурнинг бир нуқтасига қўйилади.
Дастурнинг бошқа еридан ушбу этикетга ўтишни бажариш
мумкин. Ўтиш ѐки сакраш goto билан амалга оширилади,
switch блокида хам қўлласа бўлади.
Функцияда ишлатиладиган операторлар Функцияда
ишлатиладиган операторлар сони ва турига ҳеч қандай чегара
йўқ. Функция ичида исталганча бошқа функцияларни
чақириш мумкин бўлсада, лекин функцияларни аниқлаш
мумкин эмас.
С/С++ тилида функциянинг ҳажмига ҳеч қандай талаб
қўйилмаса ҳам уни кичикроқ тарзда тузган маъқулдир. Ҳар
бир функция тушуниш осон бўладиган битта масалани
бажариши
лозим.
Агарда
функция
ҳажми
катталашаѐтганлигини сезсангиз, бу функцияни бир нечта
кичикроқ функцияларга ажратиш ҳақида ўйлашингиз керак.
Функция аргументлари. Функциянинг аргумент-лари
турли типда бўлиши мумкин. Шунингдек, аргумент сифатида
С++ тилидаги бирор бир қиймат қайтарадиган ўзгармаслар,
математик ва мантиқий ифодалар ва бошқа ихтиѐрий
функцияларни бериш мумкин.
Мисол сифатида бизда бирор бир қиймат қайтарувчи
double(), triple(), square() ва cube() функциялари берилган
бўлсин. Биз қуйидаги ифодани ѐзишимиз мумкин:
Answer=(double(triple(square(my Value))))
Бу ифодада myValue ўзгарувчисини қабул қилади ва у
cube() функциясига аргумент сифатида узатилади.
cube() функцияси қайтарган қиймат эса square()
50
функциясига аргумент cифатида узатилади. square()
функцияси қиймат қайтаргандан кейин, бунинг қиймати ўз
навбатида triple() фунциясига аргумент сифатида
берилади. triple() функциясининг қиймати эса double()
функциясига аргумент қилиб берилади ва у Answer
ўзгарувчисига ўзлаштирилади.
Локал ўзгарувчилар. Функцияга узатилган ҳар бир
аргумент, бу функцияга нисбатан локал муносабатда бўлади.
Функцияни бажарилиши жараѐнида аргументлар устида
бажарилган ўзгартиришлар функцияга қиймат сифатида
берилган ўзгарувчиларга таъсир қилмайди. Бу фикр ушбу
дастурда намойиш қилинган.
Функцияга параметрларни қиймат сифатида узатиш.
1. // Функцияга параметрларни киймат
сифатида
3. // узатиш
4. #include <iostream.h>
5. void Алмаштириш (int х, int y);
6. int main()
7. { int x = 5, y =10;
8. cout<<“Main().Алмаштиришдан олдин,x:”
9. <<x <<” y:” << y <<“\n”;
10.
Алмаштириш (x,y);
11.
cout<<“Main().Алмаштиришдан кейин,
x:”
12.
<<x<< “y:” <<y<< “\n”;
13.
return 0;
14.
}
15.
void Алмаштириш (int x, int y)
16.
{
17.
int temp;
18.
cout<<“Алмаштириш(). Алмаштиришдан
51
”<<
19.
“oldin, x: ”<<x<<“ y: ”<<y<< “\n”;
20.
temp = x ;
21.
x = y;
22.
y = temp;
23.
cout<<“Алмаштириш ().Алмаштиришдан
”<<
24.
“кейин, x: ”<<x<<“ y: ”<<y<< “\n”;
25.
}
HАТИЖА:
Main().Алмаштиришдан олдин,x: 5 y:10
Алмаштириш().Алмаштиришдан олдин, x:5 y:10
Алмаштириш().Алмаштиришдан кейин, x:10 y:5
Main().Алмаштиришдан кейин, x:5 y:10 x:
Функциянинг қайтарадиган қийматлари
Функция ѐ бирор бир реал қийматни, ѐ компиляторга ҳеч
қандай қиймат қайтарилмаслиги ҳақида хабар берувчи void
типидаги қийматни қайтаради.
Функцияни қиймат қайтариши учун return калитли
сўзидан фойдаланилади. Бунда олдин return калитли сўзи,
кейин эса қайтариладиган қиймат ѐзилади. Қиймат сифатида
эса ўзгармаслар каби бутун бир ифодаларни ҳам бериш
мумкин. Масалан:
return 5 ;
return (x > 5) ;
return (MyFunction()) ;
MyFunction() функцияси бирор бир қиймат
қайтаришидан келиб чиқсак, юқоридаги барча ифодалар тўғри
келтирилган. return(x>5) ифодаси эса x 5 дан катта
бўлса true, кичик ѐки тенг бўлса false мантиқий
қийматини қайтаради.
52
Агарда функцияда return калит сўзи учраса ундан
кейинги ифода бажарилади ва унинг натижаси функция
чақирилган
жойга
узатилади.
return
оператори
бажарилгандан кейин дастур функция чақирилган сатрдан
кейинги ифодага ўтади. return калитли сўзидан кейинги
функция танасидаги операторлар бажарилмайди.
Тармоқланиш операторлари. Шартли оператор
Агар дастурнинг бажарилиши давомида буйруқлар
кетма-кетлиги бирор шартга асосан ўзгарса, бундай ҳолларда
тармоқланиш жараѐнини ташкил этадиган операторлардан
фойдаланилади. Улар қуйидагилардан иборат:
if
(мантиқий ифода) оператор_1;
Ишлаш тартиби: агар кўрсатилган шарт рост бўлса,
келтирилган оператор бажарилади, акс ҳолда буйруқ кейинги
қаторга ўтилади. Шартли операторни қисқа ва тўлиқ
кўринишлари мавжуд:
if операторининг қисқа кўриниши. Шартли операторни
қисқа кўриниш структураси қуйидагича:
ха
A
s
йўқ
if операторини қисқартирилган график кўриниши.
Ёзилиши:
if (А) s;
If (a>b) x=y;
Кўп ҳолларда иккита оператор аралашиб кетмаслиги
учун, шартсиз ўтиш оператори – goto n ишлатилади. Бу ерда n
– нишон бўлиб, у ҳарф, ҳарфлар ѐки ҳарф ва сонлар бўлиши
мумкин. Нишон (метка) оператордан : (икки нуқта) белгиси
билан ажратилади.
53
Масалан: Ушбу дастурни кўриб чиқамиз:
# include <stdio.h>
# include <conio.h>
# include <math.h>"
main()
{
float x,y; clrscr();
printf (“х ўзгарувчисининг қийматини киритинг”);
scanf (“%f”, &х);
if(x < 5)
{ y=sin(x); goto a;}
y=pow(x, 2/3.);
a:printf (“x=%f y=%f\n”, x,y);
}
Дастурга изоҳ:
1. Дастурда стандарт функцияларни ҳисоблаш керак бўлгани
учун қўшимча math.h библиотекаси юкланди.
2. x ва y ўзгарувчилари ҳақиқий тоифага эга ва x
ўзгарувчисининг қийматини клавиатура орқали киритамиз
(ихтиѐрий сон).
3. Агар x нинг қиймати 5 дан кичик бўлса, y=sin(x)
функцияси ҳисобланади ва жараѐн натижани олиш
операторига узатади. Бу ерда 2 та оператор y=sin(x) ва
y=pow(x,2/3); аралашиб кетмаслиги учун улар ўртасига goto a
оператори ѐзилади (a- нишон) ва улар бирга келгани учун
уларни алоҳида {} белгилар орасига олинади.
4. Натижа қилиб х ва y лар олинади, улар ҳақиқий тоифага
мансуб бўлганлиги учун f формат ишлатилади. Натижада
курсор 1 қатор пастга тушади (\n).
if операторини тўлиқ кўриниши. Шартли операторни
тўлиқ кўриниш структураси қуйидагича:
S1
+
А
S2
54
if операторининг тўлиқ кўриниш схемаси.
Шартли
бўлади:
операторнинг тўлиқ кўриниши қуйидагича
if (мантиқий ифода)
оператор_1;
else
оператор_2;
Бу ерда else қисми қолдирилса хам бўлади, лекин ушбу
кўринишни ишлаши олдин қавс ичидаги мантиқий ифода,
яъни шарт бажарилади. Агар қавс ичидаги шарт рост бўлса, у
ҳолда биринчи оператор бажарилади, акс ҳолда иккинчи
оператор бажарилади. Агар else дан олдин ; (нуқта вергул)
белгиси қўйилса S1- оддий оператор, ; белгиси қўйилмаса
S1- таркибли (мураккаб) оператор. Шартли операторларнинг
бир неча хил кўринишлари мавжуд. Масалан:
1) if (x<0) y=1;
- оддий оператор
else y=2;
2) if (a>b) {x=0; y=1; } - мураккаб оператор
else {x=1; y=0; }
3) if (n>0)
if (a>b) z=a;
else z=b; if (шарт) ……- ичма-ич жойлашган
оператор.
Агар ичма-ич жойлашган кўринишда
if оператори
қисқартирилган кўринишда бўлса, у ҳолда:
if (n>0)
55
if (a>b) z=a;
else; else z=b;
Мутахассисларнинг фикрига кўра, goto операторидан
фойдаланиш, дастур бажарилишига салбий таъсир кўрсатиши
мумкин экан. Шунинг учун тармоқланиш операторларининг
юқорида келтирилган кўринишларидан фойдаланиш мақсадга
мувофиқдир.
2. if ( мантиқий ифода) 1-оператор;
else 2-оператор;
Агар мантиқий ифода бажарилса, 1-операторни, акс ҳолда
иккинчи операторни қиймати ҳисобланади.
Масалан: Иккита сонни йиғиндиси учинчи сондан катта
бўлса, s=1, акс ҳолда s=0 деб олиш дастурини тузинг.
Дастури С++ тилида:
#include <iostream>
#include <math.h>
using namespace std;
void main()
{
double a,b,c;
unsigned int s;
cout<<"3 ta sonni kiriting : \n";
cout<<"a= ";cin>>a;cout<<"\n";
cout<<"b= ";cin>>b;cout<<"\n";
cout<<"c= ";cin>>c;cout<<"\n";
if (a+b>c)
{
s=1;
}
else s=0;
cout<<"s= "<<s;
getchar();
}
Эътибор бериш керакки, шарт қавс ичида ѐзилади.
56
Бажарилиши: агар мантиқий ифода натижаси рост бўлса,
келтирилган оператор бажарилади ва кейинги сатрга ўтилади.
Агар шарт натижаси ѐлғон false бўлса, ифода бажарилмасдан
кейинги сатрга ўтади. Кўпинча бундай ҳолларда 2 та оператор
аралашиб кетмаслиги учун шартсиз ўтиш оператори – goto n
ишлатилади. Бу ерда n – нишон бўлиб, у ҳарфлар, сонлар ѐки
харфсонлар бўлиши мумкин. Нишон оператордан икки нуқта
белгиси билан ажратилади.
Юқоридаги дастур С тилида:
# include <stdio.h>
# include <math.h>
main()
{
float a,b,c; clrscr ();
printf(“шартни текшириш \n”);
printf(“ агар a+b>c бўлса натижа: ”);
scanf(“%f “, &a,&b,&c);
if (a+b>c)
printf(“ s=1 \n\n”);
else
printf(“ s=0\n\n”);
getch ();
}
Мисол . Ушбу берилган системани шартли оператордан
фойдаланган ҳолда дастурини тузинг.
x
x агар x 3
2 x2
Z
ln x 3
(
)
агар x 3
x
# include <stdio.h>
# include <math.h>
57
main()
{ float x,z; clrscr ();
printf(“ х га қиймат киритинг\n”);
scanf(“%f “, &х);
if (х>3)
z=x/(2+sqr(x))-sqrt(x);
else
z=pow((log(x)/x),3);
printf(“ z йиғинди=%f \n\n”,z);
getch (); }
Masalan: Юқоридаги мисолни кўрадиган бўлсак, x<5?
(y=sin(x)): (y=pow(x, 2/3.)); кўринишда бўлади. Бу кўринишда
шарт қавсларга олинмайди, операторлар эса қавс ичида
ѐзилади. Бир неча марта такрорланиб ҳисоблаш- ларда ҳам
шартли операторни қўллаш мумкин. Масалан: берилган
сонлардан жуфтларини ҳисоблаш дастурини тузинг?
Алгоритми (блок-схемаси).
s=0; i=100
i=i-2
i>=2
+
s=s+i
Нима учун goto операторини ишлатмаслик керак
Шартсиз goto оператори орқали дастурнинг ихтиѐрий
нуқтасига бориш мумкин. Лекин goto операторининг
тартибсиз қўлланилиши бу дастурни умуман тушунарсиз
58
булишига олиб келади. Шунинг учун охирги 20 йилликда
бутун жаҳон бўйича дастурлашни ўрганувчиларга қўйидаги
фикр таъкидланиб келинмокда “Ҳеч қачон goto операторини
ишлатманг‟‟.
goto операторининг ўрнини бир мунча мукаммалроқ
структурага эга бўлган конструкциялар эгаллади. Булар for,
while ва do…while операторлари бўлиб, улар goto
операторига нисбатан кўпрок имкониятларга эгадир. Лекин
дастурлашда ҳар қандай инструмент тўғри қўлланилгандагина
фойдали бўлиши ҳисобга олиниб ANSI комитети С++ тилида
goto операторини қолдиришга қарор қилди. Албатта, бу
билан қуйидаги ҳазил фикр ҳам пайдо бўлди: “Болалар! Бу
оператордан уй шароитида фойдаланиш зарарсиздир‟‟.
goto оператори тарихи
Дастурлашни илк даврларида кичикроқ ҳажмдаги ва
етарлича содда дастурлар ишлатилар эди. Бундай дастурларда
цикллар нишонлардан, операторлар ва командалар кетма –
кетлигидан ҳамда ўтиш операторидан иборат эди.
С++ тилида нишон деб орқасидан икки нуқта (:)
ѐзиладиган идентификаторга айтилади. Нишон доимо
бошқарув ўтиши лозим бўлган оператордан олдин
ўрнатилади. Керакли нишонга ўтиш учун goto оператори
қўлланилади.
Бунда калит сўздан кейин нишон номи ѐзилади. goto
операторига мисол ушбу дастурда келтирилган.
goto оператори ѐрдамида цикл ташкил этиш
1.include <iostream.h>
2. int main()
3. {
4. int
counter=0;
//
cчётчикни
инициализация қилиш
5. loop:
6. counter ++ ;
// циклни бошланиши
59
7. сout <<“counter: ” <<counter<< “\n”;
8. if(counter <s) //кийматни текшириш
9. goto loop; //цикл бошига қайтиш
10. сout<<“T цикл тугади.
11. сounter:”<<counter<<endl;
12. return 0;
13. }
НАТИЖА:
counter : 1
counter : 2
counter : 3
counter : 4
counter : 5
T цикл тугади.Counter: 5.
Switch оператори. Бу операторни танлаш оператори деб
аталади. switch ѐнидаги ифода (ифода ѐки ўзгарувчи ) бутун
тоифали бўлиши керак. Сase оператори эса ўзгарувчи ѐки
ифоданинг қабул қилиши мумкин. Бунда мавжуд бўлган
қийматлари танланади ва мос сатрдаги функция ҳисобланади.
switch оператори бир неча сase номларидан ва мажбурий
бўлмаган default номларидан иборатдир. Дастурнинг бошқа
еридан ушбу номга ўтишни бажариш мумкин.
switch (ифода ѐки ўзгарувчи);
{
case 1- қиймат: оператор (лар); break;
case 2- қиймат: оператор (лар); break;
...
case n- қиймат: оператор (лар); break;
}
switch – вариантдан бирини танлаш. switch га кирган
ўзгарувчи ҳар бир сase ўзгарувчилари билан солиштирилиб
чиқилади. Солиштириш юқоридан пастга қараб бажарилади.
Бу ерда break- бузмоқ, тугатмоқ маъносини билдиради. Агар
break қўйилмаса, кейинги номлар қийматлари
билан
60
солиштириш бажарилмасдан уларга тегишли ифодалар ижро
бўлаверади. Бу албатта биз истамайдиган ҳол.
default номи ѐзилиши шарт эмас, лекин шарт чегарадан
ташқарида бўлган қийматга эга бўлган ҳолларни диагностика
қилиш учун керак бўлади. Унинг график кўриниши
қуйидагича.
+
S1
-
А
------ break----
S
………
Sn
------ break-
Switch операторини структураси.
Масалан: қуйидаги ифода учун дастур тузиш керак
бўлсин.
#include<stdio.h>
# include <conio.h>
#include<math.h>
main()
{
int x; float y; clrscr();
printf(“x o‟zgaruvchisining qiymatini kiriting”);
scanf(“%d”, &x);
switch(x)
{
case1 :y=sin(x); break;
61
case2 :y=cos(x); break;
case3 :y=tan(x); break;
default :y=pow(x, 1/2.);
}
printf(“x=%d y=%g\d”, x,y);
}
Такрорланувчи (циклик) алгоритмлар
Ҳар қандай дастурнинг структураси тармоқланиш ва
цикллар тўпламининг комбинациясидан иборат бўлади.
Юқорида дастурнинг тармоқланиши, if оператори орқали
ташкил этилишини кўриб чиққан эдик. Энди биз
қуйидагиларни кўриб чиқамиз:
1. Цикллар нима ва улар қандай ишлатилади?
2. Циклларни ташкил этишнинг қандай усуллари бор?
3. Кўп тармоқланувчи ҳолда if/else конструкцияси
ўрнига бошқа конструкцияни ишлатилиши.
Циклларни ташкил этиш
Қатор масалаларни ечиш учун кўпинча битта амални бир
неча маротаба бажариш талаб қилинади. Амалиѐтда бу
рекурсиялар ва итератив алгоритмлар ѐрдамида амалга
оширилади. Итератив жараѐнлар – бу операциялар кетмакетлигини зарурий сонда такрорланишидир.
while оператори орқали циклларни ташкил этиш
while оператори ѐрдамида циклларни ташкил этишда
операциялар кетма-кетлиги циклнинг давом этиш шарти
«тўғри» бўлсагина унинг навбатдаги операциялари амалга
оширилади. Дастурда counter ўзгарувчиси қиймати токи 5
га тенг бўлгунга қадар ошиб борар эди. Бу while оператори
ѐрдамида амалга оширилган.
while операторини қўллаш
1.include <iostream.h>
2. int main()
3. {
62
4. int counter=0; //Бирламчи кийматни
ўзлаштириш
5. while(counter<5)//Цикл
шартини
текшириш
6. {
7. counter ++;
8. cout << “counter :‟‟ << counter << “.
\n” ;
9. }
10. cout<<“Tsikl
tugadi.Counter:”<<counter<<“.\n”;
11. return 0;
НАТИЖА:
counter : 1
counter : 2
counter : 3
counter : 4
counter : 5
Цикл тугади.Counter: 5.
while оператори орқали мураккаб
конструкцияларни тузиш
while оператори шартида мураккаб мантиқий
ифодаларни ҳам қўллаш мумкин. Бундай ифодаларни
қўллашда && (мантиқий кўпайтириш), || (мантиқий қўшиш )
, ҳамда !(мантиқий ИНКОР ) каби операциялардан
фойдаланилади. Қуйидаги листингда while оператори
конструкциясида мураккаброқ шартларни қўйилишига мисол
келтирилган .
while конструкциясидаги мураккаб шартлар
1: include <iostream.h>
2: int main()
3:{unsigned short кичик;
63
4:unsigned long катта;
5:const unsigned short
MaxКичик=65535;
6:cout << “Кичик сонни киритинг:”;
cin >> кичик;
12.
cout << “Катта сонни киритинг:”;
13.
cin >> катта;
14.
cout
<< “кичик сон:” << кичик
<< “…”;
15.
//Xар бир итерацияда учта шарт
текширилади.
16.
while (кичик<катта && катта>0 &&
17.
кичик< MaxКичик)
18.
{
19.
if(кичик%5000==0)
//Xар
5000
сатрдан
20.
//кейин нукта чиқарилади
21.
cout<<“.” ;
22. kichik++;
23. katta-=2 ;
24. }
25. cout<<“\n
кичик
катта сон :”
26. <<катта << endl ;
27. return 0 ;
28. }
сон:”<<кичик<<“
НАТИЖА:
Кичик сонни кирит : 2
Катта сонни кирит : 100000
кичик: 2 ………
кичик сон :33335 катта сон : 33334
64
ТАҲЛИЛ:
Юқорида келтирилган дастур қуйидаги мантиқий ўйинни
ифодалайди. Олдин иккита сон – кичик ва катта киритилади.
Ундан сўнг токи улар бир бирига тенг бўлмагунча, яъни
«учрашмагунча» кичик сон бирга оширилади, каттаси эса
иккига камайтирилади. Ўйинни
мақсади қийматлар
«учрашадиган» сонни топишдир.
9 – 12 – cатрларда қийматлар киритилади. 15 – сатрда эса
циклни давом эттиришнинг қуйидаги учта шарти
1. кичик ўзгарувчиси қиймати катта ўзгарувчиси
қийматидан ошмаслиги.
2. катта ўзгарувчиси қиймати манфий ва нолга тенг
эмаслиги.
3. ўзгарувчиси қиймати MaxКичик қийматидан ошиб
кетмаслиги текширилади.
17– сатрда эса кичик сони 5000 га бўлингандаги қолдиқ
ҳисобланади. Агарда кичик 5000 га қолдиқсиз бўлинса бу
операциянинг бажарилиши натижаси 0 га тенг бўлади. Бу
ҳолатда ҳисоблаш жараѐнини визуал ифодаси сифатида
экранга нуқта чиқарилади. Кейин эса kichik қиймати
биттага оширилади, katta қиймати эса 2 тага камайтирилади.
Цикл агарда текшириш шарти таркибидаги бирорта шарт
бажарилмаса тўхтатилади ва бошқарув 24 – сатрга ўтади.
break ва continue операторлари
Кўпинча циклнинг навбатдаги итерациясига цикл
танасидаги бошқа операторлар (навбатдаги операторлар)
бажарилмасдан туриб ўтиш зарурияти туғилади. Бундай
ҳолатларда continue оператори қўлланилади. Бундан
ташқари, циклни бажарилиши шарти қаноатлантирилганда
ҳам, қатор ҳолларда ундан чиқиб кетиш зарурияти пайдо
бўлади. Бу ҳолда эса break оператори ишлатилади. Бундай
операторларни қўлланилишига мисол келтирилган. Бу мисол
бизга олдинги дастурда таниш бўлган ўйиннинг бироз
65
мураккаблаштирилган вариантидир. Бу ерда кичик ва катта
қийматлардан ташқари қадам ва мақсадли катталикни
киритиш талаб этилади. Агарда кичик сон қиймати қадам
ўзгарувчисига (қадам) каррали бўлмаса, катта қиймати иккига
камайтирилади. Қачонки, кичик ўзгарувчиси қиймати катта
ўзгарувчиси қийматидан катта бўлса ўйин тугатилади. Агарда
катта ўзгарувчиси қиймати мақсадли катталик(мақсад)нинг
қиймати билан устма – уст тушса ўйин бекор қилинганлиги
ҳақида хабар экранга чиқарилади.
break ва continue операторларининг қўлланилиши
2. include <iostream.h>
3. int main()
4. {
5.
unsigned short кичик ;
6.
unsigned long
катта;
7.
unsigned long
қадам;
8.
unsigned long
мақсад ;
9.
const unsigned short
MaxКичик =
65535;
10. cout<< “Кичик номерни киритинг:”;
11. cin >>кичик ;
cout<<“Катта номерни киритинг‟‟;
13. cin >>катта;
14. cout<<“Қадам қийматини
киритинг:‟‟;
15.
cin >>қадам ;
16.
cout<<“Мақсадли
катталик
қийматини киритинг:;
17.
cin >> мақсад ;
18.
cout << “\n”;
19. while(кичик<катта && катта>0 &&
20. кичик<MaxКичик)
66
21.
22.
23.
24.
25.
{
кичик++ ;
if(кичик%қадам==0)
{
cout << “қадам:” <<кичик <<
endl ;
26.
continue ;
27.
}
28.
if(катта==мақсад)
//мақсадли
нуқтага
29. // тенглигини текшириш
30. {
31. cout << “Мақсадга эришилди !;
32. break;
33. }
34. катта -= 2;
35. }
36. cout<< “\n Кичик сон:” <<кичик <<
37. <<“катта сон:”<<катта << endl ;
38. return 0;
39. }
НАТИЖА:
Кичик сонни киритинг: 2
Катта сонни киритинг: 20
Қадам қийматини киритинг: 4
Мақсадли катталик қийматини
киритинг: 6
Қадам :4
Қадам: 8
Кичик сон : 10
Катта сон:8
67
while операторини қўллашга оид яна бир мисол
1. include <iostream.h>
2. int main()
3. {
4. int counter = 0 ;
5. while(true)
6. {
7. counter++ ;
8. if(counter>10)
9. break ;
10. }
11. cout<<“counter:”<<counter << „\n „‟
;
12. return 0 ;
13. }
HАТИЖА:
Counter: 11
while операторининг ишлатилишига яна бир мисол
2. include < iostream. h>
3. int main()
4. {
5. int counter=0;
6. while (counter <5)
7. {
8. counter++ ;
9. cout << “Looping!”
10. }
11. cout << “\n Counter:” << Counter <<
“\n”;
12. return 0;
68
13. }
НАТИЖА:
Looping! Looping!
Looping!
Counter: 5
Looping!
Looping!
do…while конструкцияси ѐрдамида цикл ташкил
этиш
Айрим ҳолларда while опeратори ѐрдамида циклларни
ташкил этишда унинг танасидаги амаллар умуман
бажарилмаслиги мумкин. Чунки, циклни давом этиш шарти
ҳар бир итерациядан олдин текширилади. Агарда бошланғич
берилган шарт тўғри бўлмаса цикл танасининг бирорта
оператори ҳам бажарилмайди.
while цикли танасидаги амалларнинг бажарилмай
қолиши
1.
include <iostream.h >
14. int main()
15. {
16. int counter ;
17. cout << “How manу hellos ?:”;
18. cin >> counter ;
19. while (counter>0 )
20. {
21. cout << “Hello ! \n”;
22. counter -- ;
23. }
24. cout<<“Counter is OutPut ;” <<
counter ;
25. return 0;
26. }
69
HАТИЖА:
How manу
hellos ? : 2
Hello !
Hello !
counter is OutPut : 0
How manу hellos ? : 0
counter is OutPut : 0
do…while конструкциясининг қўлланилиши:
do…while конструкциясида цикл шарти унинг
танасидаги операциялар бир марта бажарилгандан сўнг
текширилади. Бу цикл операторларини ҳеч бўлмаганда бир
марта бажарилишини кафолатлайди.
Олдинги дастурда келтирилган вариантнинг бир оз
ўзгартирилган
шакли, яъни while оператори ўрнига
do…while конструкциясининг қўлланган шакли келтирилган
.
Ушбу мисолда while операторининг умумий ишлаш
принципи келтирилган.
# include<stdio.h>
# include<conio.h>
main()
{
int a=1,b; clrscr();
while (a<=10)
}
b=2*(a+5);
printf(“a=%d b=%d\n”, a,b);
a++;
}
getch();
}
Шарти кейин текшириладиган цикл оператори.
Унинг умумий кўриниши қуйидагича:
70
...
do
operator(lar);
while (mantiqiy ifoda);
...
Бу ерда хам шарти аввал текшириладиган цикл
оператори каби қоидаларга амал қилинади, яъни шартли
ифода қиймати 0 га тенг бўлган ҳолда do while цикли ўз
функциясини тўхтатади. while цикли учун бўлганидек do
while цикли учун хам қуйидаги циклдан чиқиш ҳолатларини
келтириш мумкин:
 Шартли ифода 0 га тенг бўлган ҳолда;
 Цикл ичида break операторига дуч келганда;
 Цикл ичида return оператори бажарилганда.
Масалан : y=sinx функцияни ҳисоблаш дастурини тузиш
керак бўлсин. Бу ерда h=0,1 деб олинсин.
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
{float x=1, y; clrscr();
do
{y=sin(x);
printf(“x=%g y=%f\n”, x,y);
x+=0.1;}
while(x<=2);
getch()
}
2- misol.
#include<stdio.h>
main()
71
{
int n;
do
scanf(“%d”, &n);
while(n!=20);
}
Изоҳ : дастурнинг бажарилиши клавиатурадан 20 сонини
киритгунча хисоблаш давом этади. Бу ерда != белгиси
тенг эмас деган маънода ишлатилади.
for оператори
while оператори ѐрдамида циклларни ташкил этишда 3
та зарурий амаллар: цикл ўзгарувчисига бошланғич қиймат
бериш, ҳар бир итерацияда циклни давом этиш шарти
бажарилишини текшириш ва цикл ўзгарувчиси қийматини
ўзгартиришни бажаришимиз керак.
Масалан: y=cosx функциясини ҳисобланг. Бу ерда қадам,
dx= 0,2.
# include<stdio.h>
# include<stdio.h>
# include<math.h>
main()
{ float x,y; clrscr();
for(x=2; x<=3; x+=0.2)
{y=cos(x); printf(“x=%g y=%g\n”, x,y);}
getch();
}
{Циклик жараѐнлар}
#include <iostream>
#include <math.h>
using namespace std;
void main()
{ double p,s=0,f1,f2,n,m;
for(n=1;n<=4;n++)
72
{ p=1; for(m=1;m<=5;m++)
{f1=sqrt(abs(exp(m*log(n))+exp(n*log(m))));
f2=exp(m*log(n))+exp(n*log(m));
p=p*(f1/f2);
}
s=s+p;
}
cout<<"Natija : \n";
cout<<"s= "<<s<<endl;
}
for оператори циклни ишлаши учун зарур бўладиган
учта операцияни ўзида бирлаштиради. Бу операцияларни
қисқача қуйидагича характерлаш мумкин: бошланғич
қийматни ўзлаштириш, шартни текшириш, цикл счѐтчигини
қийматини ошириш. for оператори ифодасидаги қавснинг
ичида шу уччала операцияни амалга оширувчи ифодалар
ѐзилади. Қавс ичидаги ифодалар нуқтали вергул орқали
ажратилади.
for циклининг биринчи ифодаси цикл счѐтчигига
бошланғич қийматни ўзлаштиради. Счѐтчик – тўғридан–тўғри
for циклида эълон қилинадиган ва қиймат ўзлаштириладиган
бутун сонли ўзгарувчидир. С++ да бу ўринда счѐтчикка
қиймат берадиган ихтиѐрий ифода ѐзилишига имкон берилган.
for циклининг иккинчи параметрида циклни давом этиш
шарти аниқланади. Бу шарт while конструкциясининг шарти
бажарадиган вазифани амалга оширади. Учинчи параметрда
эса цикл счѐтчиги қийматини ўзгартирувчи (оширувчи ѐки
камайтирувчи) ифода ѐзилади. for циклидан фойдаланишга
мисол. for циклининг қўлланилишига.
1. include< iostream. h>
2. int main()
3. {
4. int counter;
73
5. for (counter=0 ; counter<5; counter++
)
6. cout<< “Looping!”;
7. cout<< “\n Counter:” << counter<<
“.\n”;
8. return 0;
9. }
НАТИЖА:
Looping!
Looping!
Looping! Looping!
Counter: 5
Looping!
for цикл операторини схемасини қуйидагича
ифодаласак бўлади.
S1
йўқ (0)
S3
Цикл
текшириш
Continue
ха(1) break
S2
Цикл
танаси
Бажарилиш тартиби:
1) бу ерда S1, бир марта бажарилади, цикл танаси
бажарилмасдан олдин;
2) цикл текшириш оператори бажарилади:
а) агар шарт рост бўлса, цикл танаси бажарилади;
б) агар шарт ѐлғон бўлса, цикл танаси
бажарилмайди ва
ҳисоблаш тўхтатилади;
74
3) цикл танаси бажарилгандан сўнг, S3 ҳисобланади ва
шарт текшириш блокига ўтилади;
4) цикл танасида continue учраса, буйруқ S3 га
узатилади.
5) цикл танасида break учраса, буйруқ
цикл
операторидан кейинги сатрга ўтилади.
Масалан: for (i=1; i<5; i++);
Бажарилиши: i нинг ыиймати учун 1 дан то 4 гача цикл
танаси бажарилади ва i=5 бўлганда ҳисоблаш
тўхтатилади.
for оператори учун мураккаб ифодаларни берилиши
for цикли дастурлашнинг
кучли ва қулай
инструментидир. for операторида циклни ўзаро боғлиқ
бўлмаган параметрлар (бошланғич қиймат ўзлаштириш,
бажарилиш шарти ва қадам) ни қўлланилиши цикл ишини
бошқаришда жуда яхши имкониятларни очиб беради.
for цикли қуйидаги кетма–кетликда ишлайди.
1. Цикл счетчигига бошланғич қиймат ўзлаштирилади.
2. Циклни давом этиш шартидаги ифода қиймати
ҳисобланади.
3. Агарда шарт ифодаси true қиймат қайтарса олдин цикл
танаси бажарилади, кейин эса цикл счѐтчиги устида
берилган амаллар бажарилади.
Ҳар бир итерацияда 2 чи ва 3чи қадамлар такрорланади.
Циклда бир нечта счѐтчик (ҳисоблагич)ни
қўлланилиши
for циклининг синтаксиси унда бир нечта ўзгарувчи
ҳисоблагични қўлланилишига, циклни давом этишини
мураккаб шартларини текширишга ва цикл ҳисоблагичлари
устида кетма-кет бир нечта операцияни бажарилишига имкон
беради.
Агарда бир нечта ҳисоблагичга қиймат ўзлаштирилса ѐки
75
улар ўртасида бир нечта операция бажарилса, бу ифодалар
вергул билан ажратилган ҳолда кетма – кет ѐзилади. Қуйидаги
листингда иккита счѐтчикли for
операторининг
қўлланилишини кўриб чиқамиз.
Масалан: for циклида бир нечта счѐтчикни
қўлланилиши
1. include< iostream. h>
2. int main()
3. {
4. for (int i=0, j=0; i<3; i++, j++)
5. cout<< “i:” <<i<< “j:” <<j<< endl;
6. return 0;
7. }
HАТИЖА:
i: 0
j: 0
i: 1
j: 1
i: 2
j: 2
for циклида нол параметрларни ишлатилиши
for
циклининг ихтиѐрий
параметри тушириб
қолдирилиши мумкин. Нол параметрлар for циклини бошқа
параметрларидан нуқтали вергул (;) билан ажратилади. Агарда
for циклини 1 – ва 3 – параметрларини тушириб қолдирсак, у
худди while операторидек қўлланилади.
for циклининг нол параметрлари:
1.
include < iostream. h>
2. int main()
3. {
4. int counter=0;
5. for ( ; counter<5 ; )
6. {
76
7. counter++;
8. cout << Looping!”;
9. }
10. cout<< “\n Counter:” << counter<<
“.\ n”;
11. return 0;
12. }
НАТИЖА:
Looping!
Looping!
Looping!
Looping!
Looping!
Counter: 5
ТАҲЛИЛ: бу циклни бажарилиши юқоридаги листингда
келтирилган while циклини бажарилишига ўхшаш тарзда
амалга оширилади. 4-сатрда сounter ўзгарувчисига қиймат
ўзлаштирилаяпти. for циклида эса параметр сифатида
фақатгина циклни давом этиш шартини текшириш ифодаси
ишлатилган. Цикл ўзгарувчиси устида операция ҳам тушириб
қолдирилган. Бу ҳолда ушбу циклни қуйидагича ифодалаш
мумкин:
while(counter<5)
Қаралган мисолимиз яна бир марта С++ тилида бир хил
масалани бир неча усул билан ҳал қилиш имконияти
борлигини кўрсатади. Бундан ташқари, for циклининг 3 та
параметрини ҳам тушириб қолдириш ва циклнинг break ва
continue
операторларини қўллаш орқали бошқариш
мумкин.
for
конструкциясини
параметрларсиз
қўлланилишига мисол ушбу листингда кўрсатилган.
for операторларини параметрларсиз қўлланилиши
1.
include <iostream. h>
2. int main()
77
3. {
4. int counter=0;
5. int max;
6. cout<< “How many hellos?”;
7. cin>> max;
8. for( ; ; )
9. {
10. if (counter <max)
11. {
12. cout << “Hello! \h”;
13. counter++;
14. }
15. else
16. break;
17. }
18. return 0;
19. }
НАТИЖА:
How many hellos? 3
Hello!
Hello!
Hello!
for циклининг танаси бўш бўлган ҳолда
қўлланилиши
Циклда for оператори орқали унинг танасига ҳеч
қандай оператор ѐзмасдан туриб ҳам бирор бир амални
бемалол бажариш мумкин. Бунда цикл танаси бўш сатрдан
иборат бўлади. Танаси бўш бўлган for циклига мисол 7.13. –
листингда келтирилган.
For циклининг танаси бўш бўлган ҳолда
қўлланилиши
78
20.
include< iostream. h>
21. int main()
22. {
23. for (int i=0; i<5; cout<< “i” <<i++
<<endl)
24. ;
25. return 0;
26. }
HАТИЖА:
i:
0
i:
1
i:
2
i:
3
i:
4
Ички цикллар
Бошқа циклнинг ичида ташкил этилган цикл ички цикл
деб айтилади. Бу ҳолда ички цикл ташқи циклни ҳар бир
итерациясида тўлиқ бажарилади. Юқоридаги дастурда
матрица элементларини ички цикл орқали тўлдирилиши
намойиш қилинган.
Ички циклларга мисол:
1. include< iostream. h>
2. int main()
3. { int rows, columns;
4. char theChar;
5. cout << “How many rovs?”;
6. cin >> rows;
7. cout << “How many columns?”;
8. cin >> columns;
9. cout << “What character?”;
10. cin>>theChar;
79
11. for ( int i=0; i<rows; i++)
12. {
13. for (int j=0; j<colums; j++)
14. cout << the char;
15. cout<< “\n”;
16. }
17. return 0;
18. }
HАТИЖА:
How many rows? 4
How many columns? 12
What character? x
х x x x x x x x x x x x
for цикл счѐтчигининг кўриниш соҳаси
ANSI нинг
янги стандарти бўйича циклда эълон
қилинган ўзгарувчининг кўриниш соҳаси фақат цикл
ичидангина иборат. Лекин кўпгина компиляторлар эски
стандартларни ҳам қўллаб – кувватлайдилар. Қуйида
келтирилган
дастур
кодини
киритиб
ўзингизнинг
компиляторингиз янги стандартга мос келиш- келмаслигини
текширишингиз мумкин.
include <iostream.h>
int main()
{ for ( int i = 0; i<5; i++ )
{ cout << “ i: ” << i << endl ;
}
i=7; // i кўриниш соҳaси чегарасидан
ташқарида
return 0;
}
Агарда бу дастур хатоликсиз компиляция қилинса демак
у ANSI нинг янги стандартини қўллаб - қувватламайди. Янги
80
стандартга мувофиқ компиляторлар i=7 ифода учун хатолик
хақида хабар бериши керак. Дастур кодига озгина ўзгартириш
киритилганда сўнг дастур барча компиляторлар учун
хатоликсиз ишлайди.
include< iostream. h>
int main ()
{int i;
for ( int i = 0; i<5; i++ )
{cout << “ i: ” << i << endl ;
}
i=7; //Энди i барча компиляторлар томонидан
//хатоликсиз қабул қилиниши мумкин.
Қаторлар йиғиндисини ҳисоблаш алгоритмлари
Циклик жараѐнлар учун реккурент формулалар
Реккурент формулаларнинг қуйидаги формалари мавжуд:
81
а)
a)
xn
;
n!
b)
cos nx
;
n
sin(2n 1) x
;
2n 1
c)
x4n 1
;
4n 1
( 1) n
cos nx
;
n2
Мисол.агар
an
x4n 1
,
4n 1
( 1) n
Сn
x4n 1
Cn
Cn 1 x 4 ,
x2n 1
;
(2n 1)!
x2n
(2n)!
cos 2nx
4n 2 1
n2 1 x n
( )
n! 2
бу
ерда
реккурент
киймат
1
4n 1
кўринишга
a
белгилаш
хисоблаймиз,
эга
бўлади.
Мисол 2.
25
( 1) n
S
n 2
n
n2
1
sin nx
бу умумий кўриниши бўйича с) кўринишга мансуб бўлганлиги
учун, реккурент формула бўйича ҳисоблаш
Сn =(-1) – мақсадга мувофиқ
(Сn =-Сn-1 ); n/n-1 sin nx
У холда, an =Cn n/n2 -1 sinnx; С n =-Сn-1 ; бу ерда n=2,3,…..25;
С1 =-1 ва ҳисоблаш S=S+C n/n2 -1 sin nx . бу ерда S- ҳар хил
қийматга эга бўлади, яъни ўнг томондаги S (S n-1 ) ни
қийматини, чап томон навбатдаги қийматни қабул қилади S n+1
ни.
Мисол3. Қаторлар йиғиндисини
x2 x4
x2n
x2n
S 1
.... ( 1)n
... 1
( 1) n
2! 4!
(2n)!
(2n)!
i 1
аниқликда ҳисоблаш дастурини тузинг.
82
S: =12 +22 +32 +..+ n2 йиғиндини ҳисоблаш алгоритми ва
дастурини тузинг.
{қаторлар йиғиндиси}
#include <iostream>
#include <math.h>
using namespace std;
void main()
{
const double pi=3.14159265;
double s=0,x,y,k=1,i;
cout<<"x ni qiymatini kiriting : \n";
cin>>x;cout<<"\n";
if ((x>=0.1) && (x<=0.8))
{
for (i=1;i<=10000;i++)
{
k=k*x;
s=s+k*sin(i*(pi/4));
}
y=(x*sin(pi/4))/(1-2*x*cos(pi/4)+x*x);
cout<<"Summa:\n";cout<<"s= "<<s<<"\n";
cout<<"Formula:\n";cout<<"y= "<<y<<"\n";
}
else cout<<"0.1 va 0.8 oraliqda kiriting !!! ";
}
Бундан ташқари қаторлар йиғиндисини аниқлашда бир
неча мисоларни келтиришимиз мумкин:
{Циклик жараѐнлар}
#include <iostream>
#include <math.h>
using namespace std;
void main()
83
{
double p,s=0,f1,f2,n,m;
for(n=1;n<=4;n++)
{
p=1;
for(m=1;m<=5;m++)
{
f1=sqrt(abs(exp(m*log(n))+exp(n*log(m))));
f2=exp(m*log(n))+exp(n*log(m));
p=p*(f1/f2);
}
s=s+p;
}
cout<<"Natija : \n";
cout<<"s= "<<s<<endl;
}
Бизга ex =1+x1 /1! +x2 /2! +x3 /3! + ….. қаторлар йиғиндиси
берилган бўлсин. Қаторлар йиғиндисини ҳисоблаш учун
қуйидаги реккурент формула ўринли.
r=r x/i;
Дастури:
#include <stdio.h>
#include <math.h>
#include <conio.h>
FILE*f;
float eps=1e-3,b=0, r=1, x=1;
int i=1;
void print ()
{ fprintf(f, ”натижа=%e хатолик =%e\n” “ яқинлашувчи
қадамлар=%i\n”, b, r, i);
}
84
Void main ()
{
f=fopen(“con”, “w”); clrscr ()‟
for (; fabs >eps‟)
{ b+=r; r*=x/i; i++; } print();
for (i=1, b=0, r=1; fabs(r)>eps;)
{ b+=r; r*=x/i; i++; } print();
for (i=1, b=0, r=1; fabs(r) > eps; i++)
{b+=r; r*=x/I; } print();
for (i=1, b=0, r=1; fabs(r) > eps; b+=r, r*=x/I, i++);
print();
printf(“\n ихтиѐрий тугмани босинг \n”);
getch();
}
Сатр ўзгарувчилари устида амаллар
Символларни киритиш-чиқариш. С/С++ дастурлаш
тилларида ўзгарувчиларнинг белгили (символли) ва матн
(сатрли) кўринишларини таърифлаш учун char туридан
фойдаланамиз. Сатр ўзгарувчиларига қиймат қабул қилишда
символ (лар) қўштирноқ (“ “) олиб ѐзилади. Уларни
солиштиришда эса апостроф („ „) ичига олинади.
Бизга маълумки ASCII кодидаги символларни код тартиб
номерига мос символни билиш учун char(N) функцияси
орқали олишимиз мумкин. Бу ерда N символининг ASCII
даги тартиб номери. Масалан: қуйидаги дастур орқали
компьютердаги
мавжуд ҳамма символларни экранга
чиқарамиз ва бу символлар 256 та.
# include <iostream.h>
main()
{
for (int i=0; i<=256;i++)
cout <<i<<”-“ <<char(i)<<”,_”;
}
85
Бизга маълумки Т.Паскал тилида ўзгарувчиларнинг
матн
кўринишларини
таърифлашда
string
туридан
фойдаланамиз. С/С++ тилларида бундай алоҳида тур мавжуд
эмас. Ўзгарувчиларнинг матн кўринишини таърифлашда
символли ўзгарувчиларни таърифлашда фойдаланиладиган
char туридан фойдаланамиз. Масалан:
# include <iostream.h>
void main(void)
{
char letter;
float value;
for (letter=‟A‟;letter<=‟Я‟; letter++)
cout << letter;
cout<<endl;
for (value=0.0; value<=1.0; value+=0.1)
cout<<value<<‟ „;
cout<<endl;
}
Ушбу дастур ишга туширилиши натижасида, экранда
қуйидаги белги ва рақамлар пайдо бўлади:
АБВГДЕЖИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
0 0.1 0.2 0.3 0.4 ……..0.9
Бундан
ташқари
клавиатурадан
киритилаѐтган
символларни ва рақамларни (сонларни) аниқлаш дастурини
кўриб чиқамиз:
# include <iostream.h>
void main(void)
{
char letter;
cout << “ Ихтиѐрий символ киритинг ва Enterни босинг:”;
cin >>letter;
cout<<”Символ киритилди” <<letter<<endl;
}
86
# include <iostream.h>
void main(void)
{
long value;
cout << “Ихтиѐрий сон киритинг ва Enterни босинг:”;
cin >>value;
cout<<”Сон киритилди” <<value <<endl;
}
Ичма-ич жойлашган цикллар
Цикларни сода ва ва ичма-ич жойлашган (бир нечта
циклларни биргаликда) кўринишлари мавжуд. Ичма-ич
жойлашган циклардаги ўзгарувчиларнинг тоифалари ҳар хил
бўлиши мумкин: for, while, do-while. Ичма-ич жойлашган
циклар қуйидаги кўринишларга эга:
for (i=1; i<=ik; i++) {….
for (j=1; j<=jk; j++) {…..
for (k=1; k<=kk; k++) {…
…..}
3 2 1
…..}
….}
Массив. Массив тушунчаси
Дастурда икки асосий турли маълумот структураси
мавжуд. Биринчиси статик, иккинчиси динамик.
1. Статик деганимизда хотирада эгаллаган жойи ўзгармас,
дастур бошида бериладиган структураларга айтамиз.
2. Динамик маълумотни тескари дастур давомида ўз
хажмини эгаллаган ва хотирасини ўзгартирадиган
структураларга айтамиз.
Агар структура бир хил катталикдаги типлардан
тузилган бўлса, унинг номини массив деб айтамиз. Массивлар
87
дастурлашда
энг
кўп
қўлланиладиган
маълумотлар
типларидир. Бундан ташқари, структуралар бир неча фарқли
типдаги ўзгарувчилардан ташкил топган бўлиши мумкин,
буни класс деймиз. Паскалда record. Maсалан: бундай
структуралар ичида ҳар хил кўринишда исми, шарифи, ѐши
бўлиши мумкин. Массивлар хотирада кетма-кет жойлашган
бир типдаги ўзгарувчилар гуруҳидир. Алоҳида бир
ўзгарувчини кўрсатиш учун массив номи ва керакли ўзгарувчи
индексини ѐзамиз. Массивлардаги элементлар индекси ҳар
доим нолдан бошланади. Масалан: Бизга char типидаги m
номли массив ва уни 4 та элементи мавжуд бўлсин: m[0]->4
m[1]->45
m[2]->100
m[3]->37
бу ерда элементга мурожаат қилиш учун массив номи ва [ ]
қавс ичида элемент индекси ѐзилади. m– массив номи. [ ] –
индекс кўрсатилади
Қавс ичидаги индекс бутун сон ѐки бутун сонга олиб келувчи
ифода бўлиши мумкин. Массивларни бир неча хил кўринишда
ѐзиш мумкин:
Char name[20];
Int grades[125]
Float income[30]
Double tel[1500]
Бу ерда биринчи массив номи 20 элементдан
иборатлиги ва массив элементларига мурожаат name[0],
name[1],….. nаme[19]. Иккинчи grades массиви 125 та бутун
сонлардан иборатлиги ва мурожаат grades[0], grades[1],
grades[3],……..grades[124]. Учинчи массив 30 та хақиқий
сонлардан
иборатлиги
ва
мурожаат
income[0],
income[2],…..income[29]. Тўртинчи массив 1500 та икки
марталаб аниқликда бўлган ҳақиқий сонлардир.
Массивларни қуйидагича ѐзиш мумкин:
Берилганлар типи [массив ўлчови]
88
Массивларни ишлатиш учун уларни эълон қилиш ва
керак бўлса массив элементларини инициализация қилиш
керак. Массив эълон қилинганда компилятор элементлар
сонига тенг ҳажмда хотира ажратади. Масалан: юқорида
қўлланилган char типидаги m массивини эълон қилайлик.
Char m[4]; бу ердаги 4 сони массивдаги элементлар
миқдорини билдиради. Бир неча массивни эълонда берсак ҳам
бўлади.
int m1[4], m2[99], k,l=0; Масив элементларини дастур
давомида инициализация қилишимиз мумкин, ѐки бошланғич
қийматларни эълон вақтида, { } қавслар ичида ҳам берсак
бўлади. { } қавслардаги қийматлар массив инициализация
рўйхати дейилади.
int n[5]={3,5,-33,5,90};
юқорида биринчи элементнинг қиймати 3, иккинчисиники
5…………... охирги бешинчи элемент қиймати эса 90 бўлади.
Бошқа бир мисол:
Double array[10]={0.0,0.4,3.55};
Бу ердаги массив типи double бўлади. Ушбу массив 10
та элементдан иборатдир. { } қавслар ичида эса фақат
бошланғич учта элемент қийматлари берилади. Бундай ҳолда,
қолган элементлар автоматик тарзда нолга тенглаштирилади.
Бу ерда айтиб ўтишимиз керакки, { } қавслар ичида берилган
бошланғич қийматлар сони массивдаги элементлар сонидан
катта бўлсин, синтаксис ҳатоси вужудга келади. Масалан:
Char k[3]={3,65,4,-76,90} / /hato!!
Ушбу элементдан иборат массивга 5 дона бошланғич қиймат
берилмоқда, бу хатодир. Бошқа бир мисолни кўриб чиқайлик.
Int w[]={3,7,90,78};
w номли массив эълон қилинди, лекин [ ] қавслар ичида
массивдаги элементлар сони берилмади. Бундай ҳолда неча
элементга жой ажратишни компилятор { } қавслар ичидаги
бошланғич қийматларга қараб билади. Демак, юқоридаги
мисолда массивимиз 4 дона элементдан иборат экан. Эълон
89
давридаги массив инициализация рўйхати дастур ижроси
вақтидаги инциализациядан кўра тезроқ ишлайдиган машина
кодини вужудга келтиради. Бир мисол келтирамиз:
// Massivlar bilan ishlash
#include<iostream.h>
#include<iomanip.h>
Const int massiv=8; // massiv kattaligi uchun ko
int k[massiv];
char c[massiv]={5,7,8,9,3,44,-33,0}; //massiv
initsalizatsiya ro’yhati
int main()
{
for (int i=0; i<massiv; i++)
{
k[i]=i+1; //dastur ichida initsalizatsiya
}
for (int j=0; j<massiv; j++)
{
Cout<<k[j] <<setw (4)
<<c[j]
<<endl;
}
return (0);
}
Экранда
1___5
2___7
3___8
4___9
5___3
6___44
7___-33
8___0
Бу эълон файлида киритиш/чиқариш оқимлари билан
ишлайдиган буйруқлар берилган. Дастуримизда қўлланилган
setw()
манипулятори
чиқиш
оқимига
берилаѐтган
маълумотларнинг энг кичик кенглигини белгилайди, биз
90
setw() параметрини 4 деб бердик, демак,
c[ ] массив элементлари 4 харф кенгликда экранга босилади.
Агар кенглик камлик қилса, у катталаштирилади, агар бўш
жой қолса, элементлар чапга ѐндашилиб ѐзилади. Ушбу
мисолда массив номли ўзгармасни қўлладик. Унинг ѐрдамида
массив чегараларини ва for структурасидаги чегаравий
қийматларни бердик. Бундай ўзгармасларни қўллаш дастурда
хатога йўл қўйишни камайтиради. Массив чегараси
ўзгарганда, дастурнинг фақат бир жойига ўзгариш
киритилади. Массив хажми эълонида фақат const сифатли
ўзгарувчилар қўлланилиши мумкин. Массивлар билан
ишлаганда энг кўп йўл қўйиладиган xato бу массивга 0 дан
кичкина ва (n-1) дан (n:массивдаги элементлар сони) катта
индекс билан мурожат қилишдир. Бундай хато дастурнинг
мантиқий хатосига олиб келади. Компилятор бу турдаги
хатоларни текширмайди. 10 та соннинг тушиш эҳтимолини
кўрсатувчи дастур тузамиз:
//Ehtimollar va massivlar
#include <iomanip.h>
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
int main()
{
Const int massivhajmi=10;
int m[massivhajmi]={0};//hamma 10 ta element 0 ga
srand(time (null));
for(int i=0; i<1000; i++)
{
++m[rand()%10];
}
for (int i=0;j<massivhajmi; j++)
{
Cout<<j<<setw (4)<<m[j]<<endl;
}
return (0);
Экранда
0___96
91
1___89
2___111
3___97
4___107
5___91
6___100
7___118
8___99
9___92
Кўриб турганимиздек, сонларнинг тушиш эҳтимоли
нисбатан тенгдир. Бу қийматлар дастурнинг ҳар янги
ишлашида ўзгаради.
++m[rand( )%10];
Ёзуви билан массивнинг rand( )%10 индексли
элементини бирга оширмоқдамиз. Бунда rand( )%10
ифодасидан чиқадиган қийматлар [0;9] ичида ѐтади. Сатрлар,
яъни харфлар кетма-кетлиги (“Тошкент”, “Янги йил Наврўз
билан!”…). C/C++ да char типидаги массивлар ѐрдамида
берилади. Бундай сатрлар билан иловалар жуда тез
бажарилади, чунки ортиқча текширишлар бажарилмайди.
Бундан ташқари C++ да анча ривожланган String тоифаси
мавжуддир, у оддий char билан берилган сатрлардан кўра
қулайроқдир. Лекин ушбу тоифа хотирадан кўпроқ жой
эгаллайди.
Икки ўлчовли массивлар. C/С++ компилятори энг
камида 12 та индекси билан ишлаши мукин. Масалан: mxn
катталикдаги матрицани иккита индексли массив кўринишида
ѐзиш мумкин:
int matritsa[4][10];
Бу 4 та сатр ва 10 та устундан иборат матрицани эълон
қилиш. Бир индексли массивлар каби кўп индексли
массивларни инциализация рўйхати билан бирга эълон қилиш
мумкин. Масалан:
сhar c[3][4]={{2,4,5,9},{-10,45,77,1},{90,56,4,3}};
92
Иккинчи кўриниши:
int m[2][2]={45,77,8,-5};
бу ерда олдин сатрга, кейин иккинчи сатрга қиймат берилади.
Массивлар билан ишлаш.
Умумий номга эга ва
тартибланган катталиклар тўпламига массив дейилади.
Массив элементларининг тоифаси базавий тоифа деб
юритилади. M: a=(a1,a2,a3,….,an);
бу ерда a- массив номи.
a1,a2,a3,….,an- массив элементлари
1,2,3,……, n- элементлар индекси.
Индекс ўзгарувчидан тартибланган кетма-кетликдаги
ўрнини билдиради ва y [ ] қавс ичида кўрсатилади. M:
a[1]=1.5; b[10]=15; a[4]=-1 ва ҳ.к.
Умумий ҳолатда a[i] ѐки b[j]
Массивларни ишлатишда олдин уларни эълон қилиш
керак. Эълон қилиш ўзгарувчиларни тоифасини кўрсатиш
бўлимида массивлар max. Элементлари сонини кўрсатиб
ѐзилади.
Mасалан: int a[20], S, y[5];
бу ерда a 20 та бутун сонлардан иборат, бир ўлчовли массив.
Индекс ҳар доим 0 дан бошланади. Демак, a[0], a[1], …,a[19];
y эса 5 та бутун сондан иборат ва бир ўлчовли массив. y[0],
y[1],..y[4].
S-оддий бутун ўзгарувчи.
float b[10]-10 та ҳақиқий сонлардан иборат массив.
b[0], b[1],….,b[9];
Массив элементларини киритиш - чиқариш ва улар устида
амаллар бажариш параметрли цикл операторларидан
фойдаланиш мақсадга мувофиқ.
………….
M: int a[10]
for (i=0;i<=9; i++)
scant (“a[%d]=%d”,I,a[i]);
J: a[1]=
93
a[2]= ……
Массив элементларини const ўзгармаслар бўлимида хам
келтириш мумкин. Масалан: N1 ci=ai+bi; i=1;10
#include <stdio.h>
#include<conio.h>
int main ( )
{
int i,a[10],b[10],c[10];chser();
for(i=0;i<=9;i++)
{
printf(“a[%d]=”,i);
scant(“%d”,&a[i]);
}
for(i=0;i<=9;i++)
{
print +(“b[%d]=”,i);
scant(“%d”,&b[i]);
}
for(i=0;i<=9;i++)
{
print +(“c[%d]=”,i);
scant(“c[%d]”,&c[i]);
}
getch();
94
Misol N2:
#include <stdio.h>
#include<conio.h>
int main ( )
{
int i,n;float x[100],y[1000],s;
printf(“massiv elementlari soni:”);
scant(“%d”,&n);
printf(“x va y massiv elementlari:\n”);
for(i=0;i<=n;i++)
scant(“%f %f,&x[i],&y[i]);
s=0;
for(i=0;i<=n;i++)
s=x[i]*y[i];
printf(“s=%dg\n”,s);
getch();
}
Дастурга изоҳ: for (i=1): деб бошланса, бу ерда n нечага
тенг бўлса, шунча элемент бўлади. i=0 деб олинса, n+1 та
элемент бўлади. Унда for (i=1;i<=n-1;i++) деб ѐзиш мумкин.
Умуман: int a[ ]={1,5,4,20,15};
Double x[m]={…}
Элементни { } ичида кўрсатилади, етмагани нол (0) деб
олинади.
Икки ўлчовли массивлар билан ишлаш. Икки ўлчовли
массивлар ўзига хос жадвалдан иборат, яъни улар қатор ва
устунлардан иборат. Уларни эълон қилишда қатор ва устунлар
сонини алоҳида [] қавс ичида кўрсатилади.
Mасалан: a[3][3];
бу ерда a- икки ўлчовли массив бўлиб, 3 та қатор ва 3 та
устундан иборат. Номерлаш бу ерда ҳам 0 дан бошланади,
яъни
A[0..2][0.2]
деб
ҳисобланади.
Икки ўлчовли массив элементларини хотирага киритиш –
чиқариш ѐки ҳисоблаш ишларини бажариш ичма-ич
жойлашган цикл орқали бажарилади, яъни биринчи цикл
қатор элементлари учун, иккинчи цикл устун элементлари
95
учун келтирилади.
#include <stdio.h>
#include<conio.h>
int main ( )
{
int i,j,n,m;a[20][20],b[20][20],c[20][20];
clrscr();
printf(“qator va ustunlar soni:”);
scanf(“%d %d”,n,m);
for(i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
printf(“a[%d,%d]=”,I,j);
scanf(“%d”,&a[i][j]);
}
for(i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
printf(“b[%d,%d]=”,i,j);
scanf(“%d”,&b[i][j]);
}
for(i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
c[i][j]=a[i][j]+b[i][j];
printf(“c[%d,%d]=$d\t”,I,j,c[i][j]);
}
Getch();
Функция. Функцияни аниқлаш
Ушбу дастурлаш жараѐнида учта хосилавий тип
аниқланади: массив, кўрсаткич, функция. Дастурлаш тилида
бунга икки томонлама қараш мумкин. Биринчидан функция
хосилавий типга таалуқли бўлса, иккинчи томондан функция
бажарилувчи
модул ҳисобланади. Бажарувчи модул
тушунчаси бошқа дастурлаш тилларидаги процедура қисм
дастур, қисм дастур – функция синонимлари билан мос
келади. Дастурлаш тилида функциялар стандарт талабига кўра
ягона кўринишга эга:
96
тип функция <номи> (параметрлар _хусусияти)
функция танаси.
Бу ерда биринчи қатор-мазмунига кўра функциянинг
бош қисми бўлиб, ўзининг сатр охирида [;] нуқта вергул
қатнашмаслиги ва албатта соҳта параметрларнинг қатнашиши
билан фарқ қилади.
Тип- қиймат қайтармайдиган void типига, ѐки қиймат
қайтарувчи функциялар турига таалуқли бўлиши мумкин.
Функциянинг исми ѐки бош функция учун main(), ѐки
дастурчи томонидан дастурдаги ихтиѐрий танланадиган
хизматчи сўзлар ва бошқа объектлар исми билан мос
тушмайдиган ном (идентификатор) бўлиши лозим.
Параметрлар хусусияти – бўш ѐки соҳта параметрлар
рўйхати бўлиб, улар қуйидаги кўринишга эга бўлади:
Типнинг белгиланиши,
Параметр исми.
Параметрлар рўйхати нуқта вергулдан кейин […] кўп
нуқта билан тугаши мумкин. Кўп нуқта функцияга кўп сонли
хақиқий параметрлар билан мурожаат қилишини англатади.
Бундай имконият функция танасига махсус воситалар
ѐрдамида бириктирилиши зарур.
Масалан:
Int printf(conct char *формат…..):
Int scanf(conct char* формат);
Бу кўриниш функциялари назарий жихатдан форматланган
киритиш ва чиқаришни чекламаган миқдордаги хақиқий
параметрлар учун қўллашни таъминлайди.
Функция _ танаси – дастурнинг фигурали қавслар ичига
олинган сарлавҳадан кейин келувчи функцияларни аниқлаш
қимидир. Функция танаси блок ѐки таркибий оператор
бўлиши мумкин. Функция танаси ичида бошқа функцияни
аниқлаш имкони йўқ. Функция танасида функция чақирилган
нуқтасидан чиқиш оператори бўлиши хамиша хам талаб
этилавермайди ва у икки хил кўринишга эга:
97
return;
return_ ифода;
Бу ерда биринчи шакл хеч қандай қиймат қайтармайдиган void
типига тўғри келади. Функция кўрсатилган типда қиймат
қайтарувчи, ѐки хеч нарса қайтармайдиган параметрлар билан
ҳамда параметрларсиз ҳам қўлланилиши мумкин. Функцияни
аниқлашнинг умумий шакли қуйидагича:
Тип_натижа
Функция
<номи>(параметрлар_
рўйхати)
параметрлар хусусияти;
Функция танаси.
Функцияни эълон қилиш ва чиқариш. Функцияга
аниқ мурожат қилиш учун у ҳақидаги барча маълумотлар
компиляторга олдиндан маълум бўлиши зарур, яъни
функцияни чақиришдан аввал стандартга кўра ўша функция
унинг аниқланишини ѐки тавсифини дастурга жойлаштириш
керак. Масалан:
double f (int n, float x);
double f (int, float );
ифодалар бир-бири билан эквивалент.
Функцияга мурожаат қилиш учун () операцияси билан
ифодалардан фойдаланилади:
Функциянинг_ белгиланиши (хақиқий параметрлар рўйхати).
Функциянинг белгиланиши- бу унинг номи, хақиқий
параметрлар рўйхати аргументлар деб аталиб, уларнинг сони
функциянинг сохта параметрлари сонига тенг. Ҳақиқий ва
соҳта параметрлар орасидаги мослик уларнинг рўйхатда ўзаро
жойлашувига қараб аниқланади. Ҳақиқий параметрлар типи
соҳта параметрлар типи билан бир бўлгани мақсадга
мувофиқдир.
Мисол 1. Учбурчакнинг томонлари берилса, унинг
периметри ва юзини ҳисобловчи дастурини тузиш керак
бўлсин.
Дастури.
98
# include <stdio.h>
# include <match.h>
main()
{
float x,y,z,pp,ss;
/* timsol:*/
int uchb(float, float, float, float*, float*) ;
printf(„‟\ n x ни киритинг x=‟‟);
scanf(“%f” , &x);
printf(„‟\ t y ни киритинг y=‟‟);
scanf(“%f” , &y);
printf(„‟\ t z ни киритинг z=‟‟);
scanf(“%f” , &z);
if (uchb(x,y,z,&pp,&ss)= = 1)
{
printf(„‟периметр =% f ‟‟, pp);
printf(„‟юза =% f ‟‟, ss);
}
Else
printf(„‟\ n маълумотлар нотўғри‟‟);
}
/*функцияни аниқлаш */
Int uchb (foat a, float b, float c, float *perimeter,float*
arrea);
{
float e;
*периметр=*area=0.0;
If (a+b<=c:: a+c<=b:: b+c<=a):
return 0
*периметр=a+b+c
e=* периметр/2;
*arrea =sqrt(e*(e-a)*(e-b)*(e-c));
return 1
}
99
Дастурнинг бажарилиши:
х ни киритинг: x=3
у ни киритинг:y=4
z ни киритинг :z=5
Натижа:
периметр=12.00
Юза =6.00
Қисм дастурлар икки хил кўринишда бўлади ва улардан
берилган масаланинг моҳиятига қараб, иккисидан бири
танланади.
{функцияларни хисоблаш}
#include <iostream>
#include <math.h>
using namespace std;
void f1(double x)
{
double z;
z=sqrt(sqrt(x)-x/(x+1));
cout<<"1 – функциядан ҳисобланади :"<<endl;
cout<<z;
}
void f2(double x)
{
double z;
if (x<=0)
{
cout<<"x нинг бундай қийматида функцияни ҳисоблаб
бўлмайди !!! "<<endl;
}
else
{
z=(log(x)/x)*(log(x)/x)*(log(x)/x);
100
cout<<"2-функциядан ҳисобланади :"<<endl;
cout<<z<<endl;
}
}
void main()
{
double x;
cin>>x;
if (x>3)
{
f1(x);
}
else
{
f2(x);
};
}
/* Т.Паскалда
uses crt;
var x:real;
procedure f1(x:real);
var z:real;
begin
z:=sqrt(sqrt(x)-x/(x+1));
writeln('1 funksiyadan hisoblandi :');writeln;
writeln(z:4:6);
end;
procedure f2(x:real);
var z:real;
begin
if x<=0 then
writeln('x ning bunday qiymatida funksiyani hisoblab bo`lmaydi
101
!!! ')
else begin z:=sqr(ln(x)/x)*(ln(x)/x);
writeln('2 funksiyadan hisoblandi :');
writeln;writeln(z:4:6);end;
end;
begin clrscr;
writeln('x ni qiymatini kiriting :');
readln(x);writeln;
if x>3 then f1(x) else f2(x);
readkey;
end.
*/
Файл. Файл тушунчаси. Файллар устида амаллар
Файллардан матнларни ўз ичига олиш учун #include
директиваси қўлланилади ва уни ѐзишнинг қуйидаги уч шакли
мавжуд:
# include <файл_номи>
# include «файл_номи»
# include макрос _исми>
Шу вақтгача биз сизлар билан, биринчи шаклини
қўлладик. Файл номи < > белги остига олинса, процессор
файлни каталогнинг стандарт тизимидан қидиради. Агар файл
номи «
» ичига олинса, фойдаланувчининг ҳозирги
каталогини, сўнгра каталогнинг стандарт тизимини қидиради.
Макрос _ исми – бу # define директиваси орқали
киритилган исм ѐки макрослардан иборат. Дастур бажарилиш
жараѐнида киритиш ва чиқариш воситаларига дуч келади.
Бунинг учун дастур матнида қуйидагича директива
жойлаштирилади:
# include <stdio.h>
Бу директиванинг бажарилишида дастур кутубхонадан
киритиш ва чиқаришнинг алоқаларини улайди. Бунда .h
102
кутубхона файллари тимсолини билдиради.
Библиотекада include файлларининг айримлари тўғрисида
маълумот:
assert.h – созловчи макробуйруқ assert ни эълон қилади
bios.h- IBM-PC ROM BIOS процедурасини чақиришда турли
функцияларни эълон қилади.
conio.h- DOS тизимида консолга киритиш-чиқаришда турли
функцияларни эълон қилади.
ctype.h- макробуйруқларда фойдаланиладиган белгиларни
ўзгартириш ва синфларга ажратиш структурасини сақлайди.
dir.h- каталоглар билан ишлаш функцияларини ишлаш
процедураларини ўз ичига олади.
float.h- сузувчи вергулли маълумотлар билан операциялар
бажарганда процедуралар учун сақлайди.
math.h- математик функциялар тимсоллари кутубхонасини ўз
ичига олади.
stddef.hайрим
маълумотларнинг
умумий
типлари
макробуйруқларини ўз ичига олади.
stdio.h-киритиш чиқариш процедураларини ўз ичига олади.
stdlib.h-алмаштириш процедуралари, излаш процедураси,
тартиблаш процедураси ва шу кабиларни ўз ичига олади.
string.h-белгилар қатори билан ишлаш.
time.h-вақтни белгилаш учун.
graphics.h- графиклар билан ишлайди.
Процессор директивалари ва компиляторга кўрсатма
Номланган ўзгарувчи ва макроаниқлашлар
Бизга маълумки, С/С++ дастурлаш тилида ҳар бир дастур
процессор олди директивалардан иборат. Процессор олди
буйруқлари директивалар деб аталади. Уларнинг ҳар бири #
белгиси билан белгиланади. Биз сизлар билан олдинги
бобларда
#
include
директивасини
кўриб
ўтдик.
Директиваларнинг умумий формати қуйидагича:
103
# директива _ исми процессор _ лексемалари
# белгисидан олдин ва кейин пробел( бўш жой)лар
рухсат этилади.
Матнли қатор охири процессор олди директивасининг
тугашини билдиради.
# define директиваси кўп ишлатиладиган
идентификаторларни ўзгармасларга алмаштириш учун хизмат
қилади ва номланган ўзгарувчи деб адалади.
Бу директива икки хил синтактик шаклида бўлади:
# define идентификатор матн;
# define идентификатор (параметрлар рўйхати) матн.
Масалан:
# define WIDTH 80
#defineLENGTH (WIDTH+10)
Агар экранда бирор ўзгарувчининг қийматини тез-тез чоп
қилиш кера бўлса, уни қуйидагича амалга ошириш мумкин:
# define AK printf (<<\ element raqami=%d.>>,N ) ;
бу директивадан сўнг,
int N=4
AK;
Операторлар кетма-кетлиги,
Дастурнинг бажарилиши натижасида:
Элемент рақами = 4 ѐзувини чиқаради.
#define k 100
#define PK printf(<<n элементлар сони %d.>>,K)
….
RK;
….
Экранга <<элементлар сони RK =100>> ни чиқаради.
# undef исм (идентификатор) буйруғи бажарилиши билан исм
ѐки макрос аниқланишини бекор қилмш мумкин.
Масалан:
# define M 16
# undef M
104
M=16 ni bekor qiladi .
...........
A= 10
….
# define A x
........
A=5
# undef A
………
B=A
B=10 га тенг қийматни қабул қилади.
Шартли компиляция
С/С++ тилида шартли компиляциялаш қуйидаги
директивалар ѐрдамида амалга оширилади:
# if бутун_ ўзгармасли _ ифода
# ifdef идентификатор
# ifndef идентификатор
# else
# endif
# elif
Биринчи учта директива шартни текширади, кейинги иккитаси
эса шартнинг ҳаракат кўламини аниқлайди. Шартли
компиляциялаш директиваларини қўллашнинг умумий
тузилиши қуйидагича:
# if .....
1- матн
# else
2-матн
# endif
Шартли компиляциялаш ташқи қурилмалар учун
дастурлар ѐзишда, созланаѐтган чоп қилишни ажратиш ва
шунга ўхшаш холатларда ишлатилади.
# ifdef идентификатор директиваси # define ѐрдамида
105
идентификатор аниқланган бўлса, у ҳолда 1-компилятор 1матндан фойдаланади.
Қуйидаги:
# ifndef идентификатор директиваси # define ѐрдамида
эса тескари шарт – идентификаторнинг аниқланмаганлиги,
яъни идентификатор # define функцияси
фойдаланилмаганлиги ѐки аниқлаш # define буйруғи бекор
қилинмаганлиги текширилади.
Дастурни созлашда назорат қилувчи ахборот
воситаларини ѐки чиқариб ташлаш учун шартли
компиляцияни қўшиш қулай.
Масалан:
# define ИНФОРМ
.............
# ifdef ИНФОРМ
printf (“Созлашда чоп қилиш”);
# endif
Мултитармоқланишларни амалга ошириш учун:
# elif бутун_ ўзгармасли _ ифода
директиваси киритилган.
Бу ерда бутун_ ўзгармасли _ ифодасига қўйиладиган талаблар
# if директивасида келтирилганига ўхшаш бўлади.
Бу директивани қўллаш структураси билан берилган
матн қуйидагича тус олади:
# if шарт
if _ учун_матн
# elif ифода _1
Матн _ 1
# elif ифода_2
Матн_2
#else
Матн_3
Else_учун _main
# endif
106
Шундай қилиб матннинг фақат шартли директивалар
томонидан ажратилган қисми ишлатилади. Қаторларни
рақамлаш учун:
# line ўзгармас
директиваси компиляторга кейинги қатор ўнли бутун ўзгармас
билан аниқланадиган рақамга эга бўлишини кўрсатади.
Директива бир вақтнинг ўзида нафақат қатор рақамини, балки
файл исмини хам ўзгартириш имконини беради. Унинг
умумий шакли:
# line
ITU.S
# define N2
voidmain ()
{
# line 23 “filles.c”
double z(3*n);
}
itu.c 1;
itu.c 2;
itu.c 3; {
itu.c 4;
file.c 23; double z(3*3)
file.c 24; }
Қуйидаги директива:
# error лексем кетма-кетлиги хатоликларнинг олдини олиш
хабарларини етказади.
Масалан:
# define aa 5
# if (aa!=5)
# error aa 5 га тенг бўлиши керак!
Интеграллашган муҳитда (масалан ТС да) ахборот қуйидаги
кўринишга эга бўлади:
Fatal <файл исми> <қатор рақами>;
107
Еrror директив: АА 5 га тенг бўлиши керак!
Бўш директива
С/С++ тилида ҳеч қандай ҳаракатни ифодаламайдиган
директива мавжуд бўлиб,у қуйидаги кўринишга эга:
# дастур буйруқлари;
# pragma лексем_ кетма-кетлиги
Мазкур буйруқ компилятор билан боғлиқ аниқ ҳаракатни
ижро этишни билдиради.
Бу директива таркибига айрим компиляторлар дастур
матни таркибида мавжуд бўлган ассемблер буйруқлари сони
тўғрисидаги варианти ҳам киради. Бу ерда # pragma буйруғи
муҳимдир ва у турлича бўлиши мумкин. Унинг учун стандарт
йўқ. Агар аниқ бир процессор олди ишлови унга нотаниш
дастурни учратса, уни бўш директива сингари бекор қилади.
Айрим компиляторларда
# pragma pask(n)
n- бу ерда , 1,2 ѐки 4 бўлиши мумкин.
Бунда тузилмалардаги ва бирлашмалардаги pask дастури
қўшма элементларга таъсир этади.
Олдиндан аниқланган макроисмлар мавжуд бўлиб, улар
қуйидаги хабарларни олиш имконини беради:
_ _ LINE _ _ -ўнли ўзгармас – С/С++ дастури билан ҳозирги
ишланаѐтган қатор рақами.
_ _FILE_ _- компиляция қилинаѐтган файл номи.
_ _DATE_ _-“ой : кун : йил “ шаклидаги белгилар қатори.
_ _ TIME_ _ “соат:минут:секунд”белгилари қатори – ишлаш
вақтини аниқлайди.
Модел турлари
Кичик (смаил ) модел: бунда дастур бир сегмент
маълумоти ва бир буйруқ сегменти билан яратилади (сегмент
64 кб.га тенг). Бундан келиб чиқадики, бу моделларда дастур
128 Кб дан ошмайди. Ушбу моделда ҳеч қандай калитлар
108
ишлатилмаса, ҳамма кўрсаткичлар near типига эга бўлади,
лекин far, huge калит сўзлари билан ҳам киритишни амалга
ошириш мумкин.
Ўрта (медитум) модел:
Дастур буйруқларининг бир нечта сегменти ва битта
маълумот сегменти билан яратилади. Одатда дастурлар учун
буйруқларнинг катта ўлчами қўлланилади. Бунда ҳар бир
бажарилувчи модел ўзининг буйруқ сегментига эга бўлади.
Компакт (compact) модел
Дастур бир неча маълумот сегментлари ва битта буйруы
сегменти билан яратилади. Олдиндан кўрсатилмаса ҳамма код
кўрсаткичлари бу моделда near типига маълумотлар эса far
типига эга бўлади. Бошқа код кўрсаткичларини far калит сўзи
ѐрдамида ва маълумотларни near ва huge калит сўзлари
ѐрдамида хам киритиш мумкин.
Катта(large) модел:
Дастур бир неча маълумотлар сегменти ва бир неча
буйруқлар
сегменти
ѐрдамида яратилади. Аввалдан
кўрсатилмаса бу моделда элемент коди ва маълумотлар far
типидаги адресга эга бўлади. Бошқа код кўрсаткичларини near
ва huge калит сўзи ѐрдамида хам киритиш мумкин.
Жуда катта (huge) модел:
Дастур бир неча буйруқ ва маълумот сегментлари билан
тўлдирилади. Бундай сегментлар бир қанча бўлиши мумкин.
Бу моделда маълумот ўлчамига (масалан массивга) 64 кбайтли
чеклов олиб ташланади, аммо сегментларга қуйидаги
чекловлар қолади:
-маълумотнинг ягона элементи (масалан массив элементи ) 64
кб дан юқори бўлмаслиги ;
-иҳтиѐри 128 кб дан юқори массивлар учун ҳамма элементлар
2 га каррали ўлчамга эга бўлиши керак .
Sizeof бажарилиш натижаси ва икки кўрсаткичнинг фарқи инт
типига эга бўлади, бунинг учун sizeof операторидан қуйидаги
конструксияда фойдаланиш керак:
109
(long )sizeof (huge _item),
Бунда huge_item талаб қилинган элемент.
Иккита кўрсаткичнинг фарқини hugeда олиш
элементларни қуйидаги конструкцияда олиш керак:
(long) (huge_ptr1-huge_ptr2).
учун
,
Хотира модели
С/С++ дастурлаш тили бешта турдаги хотира моделига
эга. Бу моделлар учун қуйидаги чекловлар ўринли:
- Ҳеч қайси такрорланувчи модул 64 кб дан юқори
ҳажмни эгалламайди.
- Агар жуда катта хотира модели қўлланилмаса ва
маълумот элементи (масалан масив) huge калит сўзи
билан ѐзилмаса, у 64 кб дан ортиқ бўла олмайди.
С/С++ тили юқорида кўрсатилган моделлардан ташқари
яна бир хотира модели (ting) га эга. Бу энг кичик хотира
моделидир. Бунда ҳамма тўртта (CS, DS, SS, ES) регистрлар
битта ягона адресни сақлайди, шунинг учун 64 кб маълумот
коди массивларни сақлашга ажратилади. Ҳамиша near
типидаги кўрсаткичилар қўлланилади. Tiny типидаги хотира
моделидан фойдаланувчи дастур *. сom типидаги форматга
эга бўлади.
Элементлар ѐки кўрсаткичларни элементга near, far ва
huge калит сўзлари ѐрдамида модификациялаш учун қуйидаги
қоидаларни доимо эсда тутиш зарур:
1. калит сўзлар элемент ѐки кўрсаткични ўнгдан
модификациялайди. Масалан, char far ** p; шуни
билдирадики, r-бу far га кўрсаткич char га
кўрсаткичдир.
2. агар ўнгда калит сўзидан кейин идентификатор келса,
у ҳолда бу элемент стандарт маълумот сегменти near да
ѐки far ѐҳуд huge да жойлашишини аниқлайди.
Масалан, char far A; бу ерда А char типидаги far
адресли элементларга эга;
110
3. Агар ўнгда калит сўздан кейин кўрсаткич тўғри келса,
у ҳолда у адрес ўлчами: 16 бит near ѐки 32 бит (huge ѐ
far)ни аниқламайди. Масалан; char far *p. Бу ерда r char
типидаги элемент far кўрсатгичини (32 бит) билдиради;
Мисол:
Char a /3000/ - a стандарт маълумот сегментида
жойлашади.
Near ва far лардан функцияларда фойдаланиш айнан
маълумотлар учун қўллаш қоидаларига ўхшамайди.
Мисол:
Char far fun ( );
ввChar far fun ( ); {z*..*z}- бу ерда fun ( ), char типидаги
элемент қайтарувчи ва 32 битни адресдан чақирувчи
функциялардир.
График режим
Бошқа дастурлаш тиллари каби ушбу тилнинг ҳам ўз
график операторлари мавжуд. Адаптер икки хил режимда
ишлайди: матнли ва графикли. Дастур тузиш жараѐнида биз
матнли режимда ишлаймиз ва сўнгра график режимга
ўтказамиз.
Бунинг учун видеоадаптерларнинг ўзига хос
кўринишлари мавжуд:
- CGA (Color Graphics Adapter);
- MCGA (Multi-Color Graphics Array);
- EGA (Enhanced Graphics Adapter);
- VGA (Video Graphics Array).
График режимга ўтиш. Экранни график режимга ўтказиш
учун махсус initgraph операторидан фойдаланамиз. Унинг
умумий кўриниши қуйидагича:
# include <conio.h>
# include <graphic.h>
…………….
Функциялар графикларини ҳосил қилиш
Ранглар билан ишлаш учун дастурлаш тилида турли
111
функциялар мавжуд бўлиб, улар қуйидагилардан иборат:
Setcolor(color) - кўрсатилган чизиш рангини ўрнатади;
GetColor - чизиш рангини қайтаради;
GetBkColor- фон рангини қайтаради;
GetMaxColor- ранглар сонини қайтаради.
Рангларнинг номи ва уларнинг белгиланиши 5-жадвалда
келтирилган.
Ранглар ва уларнинг белгиланиши
5-жадвал
Белгиланиши
Ранг номи
0
Black
Қора
1
Blue
Кўк
2
Green
Яшил
3
Cyan
Феруза (кўк-яшил)
4
Red
Қизил
5
Magenta
Қирмизи
6
Brown
Жигарранг
7
LIGHTGRAY
Оч кулранг
8
DARKGRAY
Тўқ кулранг
9
LIGHTBBLUE
Хаворанг
10
LIGHTGREEN
Оч яшил
11
LIGHTCYAN
Оч феруза ранг
12
LIGHTRED
Оч қизил
13
LIGHTMA-CENTA
Оч қирмизи
14
YELLOW
Сариқ
15
WITH
Оқ
Масалан: GetBkColor(Green )- экранга яшил фон рангини
ўрнатади.
Нуқта тасвирини ҳосил қилиш. Нуқтани тасвирлаш учун
putpixel операторидан фойдаланамиз. Унинг формати
қуйидагича:
Putpixel(x,y,color) – бу x,y нуқтанинг координаталари, colorунинг ранги.
112
Масалан:
Putpixel(240,220,
Red).
Бу ерда
координаталарда нуқтани қизил рангда ўрнатади.
Дастур структураси.
# include <conio.h>
# include <graphics.h>
main()
{ float x,y;
int gd=detect,gm;
initgraph(&gd,&gm, «\\tc»);
putpixel(240,220, Red);
getch();
ушбу
Тўғри чизиқни ҳосил қилиш. Тўғри чизиқ (кесма) ни ясаш
учун line функциясидан фойдаланилади. Унинг формати
қуйидагича:
Line(x1,y1,x2,y2)
1-расм. Кесма чизиш.
Бу ерда x1,y1- кесманинг бошланғич нуқтасининг
координаталари.
x2,y2- кесма охирининг координаталари.
Масалан: line(100,30,90,15)- кўрсатилган (100,30) ва (90,15)
нуқталар орасида кесма ясайди.
Rectangle(x1,y1,x2,y2)- тўғри тўртбурчак чизади.
113
2-расм.Тўғри тўртбурчак.
Bar(x1,y1,x2,y2) – бўялган тўғри тўртбурчак чизади.
3-расм. Тўғри тўртбурчак.
Айлана ва ѐй тасвирини ҳосил қилиш. Бунда хам ўзига
хос операторлари мавжуд.
Circle- бу айлана чизади. Унинг координаталари қуйидагича:
Circle(x,y,r)- бу ерда x,y айлана марказининг координаталари,
r- радиуси.
R
(x,y)
4-расм. Айлана.
Ellipse(x,y, , ,x1,y1)-
бу ерда
x,y эллипснинг маркази
114
координаталари , - бошланғич бурчак, -охирги бурчак,x1абсиссалар ўқи бўйлаб радиуси,y1-координаталар ўқи бўйлаб
радиуси.
Соҳа чегарасини бўяаш. Бунинг учун
Floodfill(x,y, ранг чегараси)- функциясидан фойдаланилади, у
setfillstyle билан биргаликда ишлайди.
void setfillstyle(int бўяаш тури, int ранг).
Бу функция шаблон турини ва рангини танлаш имконини
беради. Тўлдиришнинг 12 хил тури бўлиб, у қуйидаги (6жадвалда) келтирилган.
6-жадвал
Исми
EMPTY_FILL
SOLID_FIL
LINE_FILL
LTSLAHS_FILL
SLAHS_FILL
BKSLAHS_FILL
LTBKSLASH_FILL
HATCH_FILL
XHATCH_FILL
INTERLEAVE_FILL
WIDE_DOT_FILL
CLOSE_DOT_FILL
Қиймати
0 (соҳа ранги билан тўлдирилади )
1(тўлдирувчи ранг билааан бутунича
бўяаш)
2(горизонтал чизиқлар билан
тўлдириш)
3(оғма чизиқлар билан тўлдириш)
4(йўғон оғма чизиқлар билан
тўлдириш)
5(тескари йўғон оғма чизиқлар
билан тўлдириш)
6(тескари ингичка оғма чизиқлар
билан тўлдириш)
7(тўғрибурчакли горизонтал
штрихлар билан тўлдириш)
8(эгри штрихлар билан тўлдириш)
9(бекилувчи эгри штрихлар билан
тўлдириш)
10(сийрак нуқталар билан
тўлдириш)
11(ўзаро яқин жойлашган нуқталар
билан тўлдириш)
Даструлаш тилида хар-хил йўғонликдаги чизиқларни
selinestyle функцияси
ѐрдамида қуриш мумкин.
115
Void selinestyle(int linesigned, uppatern, int thickness);
Linestyle(“чизиқ тўғри” ) қуйидаги 5та қийматдан бирини
қабул қилиш мумкин.
Матнларни жойлаштириш учун outtext(x,y,
«матн») операторидан фойдаланамиз. Бу ерда outtext(x,y,
«матн»)- керакли матнни кўрсатилган координатадан бошлаб
экранга чиқариш. Масалан: outtext(50, 50, “Информатика”).
textwidth(қатор)-қатор узунлигини қайтаради.
textheight(қатор)- қатор бўйини қайтаради.
Settextstyle(шрифт, йўналиш, ўлчам).
Void far settextstyle(int шрифт, int йўналиш, int ўлчами).
Процедуравий, структуравий ва объектларга
мўлжалланган дастурлаш
Шу вақтгача дастурлар берилган маълумотлар устида
бирор бир амал бажарувчи процедуралар кетма-кетлигидан
иборат эди. Процедура ѐки функция ҳам ўзида аниқланган
кетма-кет бажарилувчи командалар тўпламидан иборатдир.
Бунда берилган маълумотларга мурожаатлар процедураларга
ажратилган ҳолда амалга оширилади.
Структуравий дастурлашнинг асосий ғояси «бўлакла ва
ҳукмронлик қил» принципига бутунлай мос келади.
Компьютер дастурини масалалар тўпламидан иборат деб
қараймиз. Оддий тавсифлаш учун мураккаб бўлган ихтиѐрий
масалани бир нечта нисбатан кичикроқ бўлган таркибий
масалаларга ажратамиз ва бўлинишни токи масалалар
тушуниш учун етарли даражада оддий бўлгунча давом
эттирамиз.
Мисол сифатида компания хизматчиларининг ўртача иш
ҳақини ҳисоблашни оламиз. Бу масала содда эмас. Уни қатор
116
қисм масалаларга бўламиз:
1. Ҳар бир хизматчининг ойлик маоши қанчалигини
аниқлаймиз.
2. Компаниянинг ходимлари сонини аниқлаймиз.
3. Барча иш ҳақларини йиғамиз.
4. Ҳосил бўлган йиғиндини компания ходимлари сонига
бўламиз.
Ходимларнинг ойлик маошлари йиғиндисини ҳисоблаш
жараѐнини ҳам бир неча босқичларга ажратиш мумкин:
2. Ҳар бир ходим ҳақидаги ѐзувни ўқиймиз.
3. Иш хақи тўғрисидаги маълумотни оламиз.
4. Иш ҳақи қийматини йиғиндига қўшамиз.
5. Кейинги ходим ҳақидаги ѐзувни ўқиймиз.
Ўз навбатида, ҳар бир ходим ҳақидаги ѐзувни ўқиш
жараѐнини ҳам нисбатан кичикроқ қисм операцияларга
ажратиш мумкин:
1. Хизматчи файлини очамиз.
2. Керакли ѐзувга ўтамиз.
3. Маълумотларни дискдан ўқиймиз.
Структуравий дастурлаш, мураккаб масалаларни ечишда
етарлича мувофаққиятли услуб бўлиб қолди. Лекин, 1980йиллар охирларида структуравий дастурлашнинг ҳам айрим
камчиликлари кўзга ташланди.
Биринчидан, берилган маълумотлар (масалан, ҳодимлар
ҳақидаги ѐзув) ва улар устидаги амаллар (излаш, таҳрирлаш)
бажарилишини бир бутун тарзда ташкил этилишидек табиий
жараѐн реализация қилинмаган эди. Аксинча, процедуравий
дастурлаш берилганлар структурасини
бу маълумотлар
устида амаллар бажарадиган функцияларга ажратган эди.
Иккинчидан,
дастурчилар
доимий
тарзда эски
муаммоларнинг янги ечимларини ихтиро қилар эдилар. Бу
воқеа кўпинча велосипедни қайта ихтиро қилиш, деб ҳам
айтилади. Кўплаб дастурларда такрорланувчи блокларни кўп
марталаб қўллаш имкониятига бўлган ҳоҳиш табиийдир. Буни
117
радио ишлаб чиқарувчи томонидан приѐмникни йиғишга
ўхшатиш мумкин. Конструктор ҳар сафар диод ва
транзисторни ихтиро қилмайди. У оддийгина олдин
тайѐрланган радио деталларидан фойдаланади холос.
Дастурий таъминотни ишлаб чиқувчилар учун эса, бундай
имконият кўп йиллар мобайнида йўқ эди.
Амалиѐтга дўстона фойдаланувчи интерфейслари,
рамкали ойна, меню ва экранларни тадбиқ этилиши
дастурлашда янги услубни келтириб чиқарди. Дастурларни
кетма-кет бошидан оҳиригача эмас, балки унинг алоҳида
блоклари бажарилиши талаб қилинадиган бўлди. Бирор бир
аниқланган ҳодиса юз берганда дастур унга мос шаклда
таъсир кўрсатиши лозим. Масалан, бир кнопка босилганда
фақатгина унга бириктирилган амаллар бажарилади. Бундай
услубда дастурлар анча интерактив бўлиши лозим. Буни
уларни ишлаб чиқишда ҳисобга олиш лозим.
Объектга мўлжалланган дастурлаш, бу талабларга тўла
жавоб беради. Бунда дастурий компонентларни кўп марталаб
қўллаш ва берилганларни манипуляция қилувчи методлар
билан бирлаштириш имконияти мавжуд.
Объектга мўлжалланган дастурлашнинг асосий мақсади
берилганлар ва улар устида амал бажарувчи процедураларни
ягона объект деб қарашдан иборатдир.
С/С++ тили ва объектларга мўлжалланган дастурлаш
С/С++ тили объектга мўлжалланган дастурлаш
принципларини қўллаб қувватлайди. Бу принциплар
қуйидагилардир:
Инкапсуляция;
Меросхўрлик;
Полиморфизм.
Инкапсуляция. Агарда муҳандис ишлаб чиқариш
жараѐнида резисторни қўлласа, у буни янгидан ихтиро
қилмайди, омборга (магазинга) бориб мос параметрларга
118
мувофиқ керакли детални танлайди. Бу ҳолда муҳандис жорий
резистор қандай тузилганлигига эътиборини қаратмайди,
резистор фақатгина завод характеристикаларига мувофиқ
ишласа етарлидир. Айнан шу ташқи конструкцияда
қўлланиладиган яширинлик, ѐки объектни яширинлиги, ѐки
автономлиги хоссаси инкапсуляция дейилади.
Инкапсуляция
ѐрдамида
берилганларни
яшириш
таъминланади. Бу жуда яхши характеристика бўлиб
фойдаланувчи ўзи ишлатаѐтган объектнинг ички ишлари
ҳақида умуман ўйламайди. Ҳақиқатан ҳам, холодильникни
ишлатишда рефрижекторни ишлаш принципини билиш шарт
эмас. Яхши ишлаб чиқилган дастур объектини қўллашда
унинг ички ўзгарувчиларининг ўзаро муносабати ҳақида
қайғуриш зарур эмас.
Яна бир марта такрорлаш жоизки, резисторни самарали
қўллаш учун унинг ишлаш принципи ва ички қурилмалари
ҳақидаги маълумотларни
билиш умуман шарт эмас.
Резисторнинг барча хусусиятлари инкапсуляция қилинган,
яъни яширилган. Резистор фақатгина ўз функциясини
бажариши етарлидир.
С++ тилида инкапсуляция принципи синф деб аталувчи
ностандарт типларни(фойдаланувчи типларини) ҳосил қилиш
орқали ҳимоя қилинади.
Синфлар қандай тузилишга эга эканлиги билан кейинроқ
танишиб чиқамиз.
Тўғри аниқланган синф объектини бутун дастурий модул
сифатида ишлатиш мумкин. Ҳақиқий синфнинг барча ички
ишлари яширин бўлиши лозим. Тўғри аниқланган синфнинг
фойдаланувчилари унинг қандай ишлашини билиши шарт
эмас, улар синф қандай вазифани бажаришини билсалар
етарлидир.
Меросхўрлик.
Acme
Motors
компанияси
инженерлари янги автомобил конструкциясини яратишга аҳд
қилишса, улар иккита вариантдан бирини танлашлари лозим.
119
Биринчиси, автомобилнинг конструкциясини бошидан бошлаб
янгидан ихтиро қилиш, иккинчиси эса мавжуд Star
моделини ўзгартиришдир. Star модели қарийб идеал,
фақатгина унга турбокомпрессор ва олти тезланишли узатма
қўшиш лозим. Бош муҳандисиккинчи вариантни танлади.
Яъни, нолдан бошлаб қуришни эмас, балки Star
автомобилига озгина ўзгартириш қилиш орқали яратишни
танлади. Уни янги имкониятлар билан ривожлантирмоқчи
бўлди. Шунинг учун, янги моделни Quasar деб номлашни
таклиф қилди.
Quasar-Star моделига янги деталларни
қўшиш орқали яратилган.
С++ тили ҳам шундай меросхўрликни ҳимоя қилади. Бу
янги берилганлар типи (синф), олдиндан мавжуд бўлган
синфни кенгайтиришдан ҳосил бўлади. Бунда янги синф
олдинги синфнинг меросхўри деб аталади.
Полиморфизм.
Акселаторни босилишида Star
моделига нисбатан янги яратилган Quasar моделида
бошқачароқ амаллар бажарилиши мумкин. Quasar моделида
двигателга ѐқилғини сепувчи инжектор системаси ва Star
моделидаги корбюратор ўрнига турбокомпрессор ўрнатилган
бўлиши мумкин. Лекин фойдаланувчи бу фарқларни билиши
шарт эмас. У рулга ўтиргач оддийгина акселаторни босади ва
автомобилнинг мос реакциясини кутади.
С++ тили бир хил номдаги функция турли объект
томонидан ишлатилганда турли амалларни бажариши
имкониятини таъминлайди. Бу функция ва синфнинг
полиморфлиги деб номланади. Поли-кўп, морфе-шакл
деган маънони англатади. Полиморфизм-бу шаклнинг кўп
хиллигидир. Бу тушунчалар билан кейинчалик батафсил
танишамиз.
120
НАЗОРАТ УЧУН САВОЛЛАРИ:
Дастурлаш тиллари классификацияси.
С/С++ тили ва унинг қулайликлари.
С/С++ тили дастурининг асосий структураси.
С/С++ дастурлаш тилида ўзгарувчиларнинг тоифаларини
эълон қилиш.
5. Бутун тоифадаги катталикларнинг берилиши ва улар
устида амаллар.
6. Ҳақиқий тоифадаги катталикларнинг берилиши ва улар
устида амаллар.
7. Мантиқий тоифадаги катталикларнинг берилиши ва улар
устида амаллар.
8. С/С++ тилида ўзгармаслар, ўзгарувчилар ва метка
(нишон)ларни эълон қилиш.
9. Стандарт функциялар.
10. С/С++ тилида библеотекаларнинг қўлланилиши.
11. Стандарт библиотека ва унинг процедуралари.
12. math.h библиотекасининг процедуралари.
13. Ўзлаштириш оператори.
14. Маълумотларни киритиш ва уларнинг турлари.
15. Маълумотларни чиқариш ва уларнинг турлари.
16. Арифметик ифодалар. Уларнинг бажарилиш кетмакетлиги.
17. Бутун сонлар устида махсус амаллар.
18. Ҳақиқий сонлар устида махсус амаллар.
19. Кўрсаткичли ва тригонометрик функцияларни ифодалаш.
20. Тармоқланувчи алгоритм. IF процедурасининг икки
формаси.
21. Шартли ва Шартсиз ўтиш процедуралари.
22. Танлаш процедураси (CASE).
23. Циклик жараѐнлар. FOR процедураси.
24. Шарти олдин қўйилган цикл.
25. Шарти кейин қўйилган цикл.
1.
2.
3.
4.
121
26. Массивлар ва уларнинг берилиш усуллари.
27. Бир ўлчовли массивларни киритиш ва чикариш.
28. Икки ўлчовли массивларни киритиш ва чикариш
29. С/С++ дастурлаш тилида график режим
30. Аралаш тоифалар
31. Мантиқий амаллар
32. Қаторлар йиғиндисини ҳисоблаш алгоритми
33. Ҳаракатланувчи тасвирларни дастурий структураси
34. Функция диаграммаларини қуриш
35. Мураккаб цикллар
36. while оператори орқали мураккаб конструкцияларни
тузиш.
37. Ички цикллар
38. for циклининг танаси бўш бўлган ҳолда қўлланилиши
39. switch оператори
40. SWITCH операторининг қўлланилиши
ТЕСТ САВОЛЛАРИ
1. Ўзгарувчиларни 8лик ва 16лик санок системасида
қандай киритиш мумкин?
% o; % x; %lo; %lx куринишда
%%; %x; %d; %f
lx %; &&lx; &d; &f
%u; %g; %if; %lg
2
Ўзгарувчилар бу..........
дастур бажарилиши жараѐнида ўз қийматларини
ўзгартира оладиган ўзгармасларга
122
дастур бажарилиши жараѐнида ўз қийматларини
ўзгартира олмайдиган ўзгарувчиларга
дастур бажарилиши жараѐнида ўз қийматларини
ўзгартира оладиган ўзгарувчиларга
тўғри жавоб келтирилмаган .
3
Ўзгарувчиларни эълон қилиш неча хил бўлади
локал ва минтақавий
локал глобал ва минтақавий.
локал ва глобал
3 хил
4
getch функциясининг вазифаси.
натижани қуриш
қиймат бериш
таҳлил қилиш
ихтиѐрий клавишани босгунча дастурни кўрсатиб
туриш
5
Дастурни ишга тушириш тугмачалри бу....... .
ctrl+F9
Alt+F9
ctrl+Alt
123
Ctrl+F5
6
Компиляция қилиш тугмачалари бу...... .
Alt+F5
Ctrl+F5
Ctrl+F9
Alt+F9
7
Транслятор бу...
дастурни компиляторга узатиш
таржима қилиш;
кодлаш қурилмаси
шифрлаш
8
Тармоқланувчи алгоритм бу....
дастур бажарилиши жараѐнида буйруқлар кетмакетлиги бирор шартга кўра ўзгарса
дастур бирор шартга кўра бир неча марта
бажарилса
дастур бирор мантиқий шартга кўра бажариш
такрорланмаса
ўзгарувчиларнинг кетма-кетлиги тушунилади
124
19.
# include "conio.h" нинг вазифаси?
дастурни ички кўринишини шакллантириш
дастурни ташқи кўринишини шакллантириш
қатор устида амаллар
тўғри жавоб йўқ
20.
# include "string.h" нима вазифани бажаради
қатор ўзгарувчилари устида амаллар бажариш
учун
белгили ўзгарувчилар устида амаллар бажариш
учун.
мантиқий ўзгарувчилар устида амаллар бажариш
учун.
тўғри жавоблар йўқ
21.
Ўзгарувчиларни эълон қилиш неча хил бўлади
А) 2 хил
B) 3 хил
С) 4 хил
D) тўғри жавоб йўқ
22. Ўзгармасларни эълон қилиш неча хил бўлади
А) 2 хил
125
B) 3 хил
С) 4 хил
D) тўғри жавоб йўқ
23. Қайси маълумотлар
тоифасига киради ?
A) char
B) int
C) void
D) float
сузувчи
вергул
сонлар
24. Қайси сўз ёрдамида кўп альтернативли танлаш
намойиш этилади?
А)switch
B) throw
C) public
D) struct
25. Дастурда қайси усул бўлиши шарт?
A) local()
B) main()
C) friend()
D) global()
27. Массив элементларидан
орқали бажарилади:
A) FIFO йуналиш;
B) нукта операцияси
C) элемент исми;
D) элемент индекси
фойдаланиш
нима
28. Шартли оператор қайси конструкция ёрдамида
ифодаланади
A) while (ифода_шарт) {…}
B) do {…} while (ифода_шарт)
126
C) if (ифода_шарт) else {…}
D) if (ифода_шарт) {…} else {…}
29. goto оператори бошқарувни ...... узатади?
A) операцияга;
B) белгига (нишонга)
C) ўзгарувчига;
D) функцияга
30. Шартдан сўнги цикл қайси конструкция ёрдамида
бажарилади?
A) while (ифода_шарт) {…}
B) do {…} while (ифода_шарт)
C) while (ифода_шарт) do {…}
D)for(выражение_1;выражение_условие; выражение_2){.}
31. Операторлар блоки
белгиланади?
A) {…}
қайси
қавслар орқали
B) (…)
C) /*….*/
D) [….]
32. Қандай шартлар бажарилганда
ҳақиқий қийматга эга бўлади?
A) X>Y ва A<B;
B) X>Y ва A>B;
C) X<Y ва A>B;
D) Тўғри жавоб йўқ.
X>Y && A<B
33. Бутун натижа қайтариб ҳақиқий аргумент қабул
қилувчи функция сарлавхаси аниқлансин.
A) int func1 (float a);
B) int func1 (int a);
127
C) float (float a);
D) float func1 (float a);
34. Дастур натижаси аниқлансин
# include <iostream.h>
int main ()
{
int a,b=4;
a=201;
cout <<a%b;
}
A) 50
B) 50. 25
C) 1
D) 0
35. # include "conio.h" нинг вазифаси?
A) дастурни ички кўринишини шакллантириш
B) дастурни ташки кўринишини шакллантириш
C) қатор устида амаллар
D) тугри жавоб йўқ
36. # include "string.h" нима вазифани бажаради?
A) қатор ўзгарувчилари устида амаллар бажариш учун
B) белгили ўзгарувчилар устида амаллар бажариш учун.
C) мантиқий ўзгарувчилар устида амаллар бажариш учун
D) тўғри жавоблар йўқ
37. Ўзгарувчиларни эълон қилиш неча хил бўлади?
A) 2 хил
B) 3 хил
C) 4 хил
D) Тўғри жавоб йўқ
128
38. Компиляция килиш тугмачалари бу......
A) Alt+F5
B) Ctrl+F5
C) Ctrl+F9
D) Alt+F9
39. getch функциясининг вазифаси.
A) натижани куриш
B) киймат бериш
C) тахлил килиш
D) ихтиѐрий клавишани босгунча дастурни кўрсатиб туриш
40. switch функциясининг вазифаси.
A) Керакли старни танлаш ва бажариш
B) Қиймат бериш
C) тахлил килиш
D) ихтиѐрий клавишани босгунча дастурни кўрсатиб туриш
41. Дастур натижаси аниқлансин
# include <iostream.h>
int main ()
{
int i=1, s=0; clrscr ();
while (i<=10)
s=s+i;
fpintf(“i=%d s=%d\n”, I,s);
i++;
}
A) 10, 30
B) 10, 45
C) 10, 55
D) 11, 35
42. Дастур натижаси аниқлансин
129
# include <iostream.h>
int main ()
{
int i=10, s=0; float x=5.5; clrscr ();
while (i<=x)
s=s+i;
fpintf(“i=%d s=%d\n”, i,s);
i--;
}
A) 5, 40
B) 5, 45
C) 5, 55
D) 6, 35
Тузувчилар: т.ф.н., доцент Р.Я.Мамажанов
т.ф.н., доцент М.Ю.Хайдарова
катта ўқитувчи И.М. Бойназаров
130
Масъул муҳаррир:
т.ф.д., проф Б.Ш.. Раджабов
Муҳаррир:катта ўқитувчи Ф.Ш. Қосимов
Бичими 60х84 1/16
Босма табоғи- 1. Адади – 200
Буюртма N0 255
Тошкент ахборот технологиялари университети
“Алоқачи” нашриѐт-матбаа марказида чоп этилди.
Тошкент ш, А.Темур кўчаси, 108
Telegram kanal: @Uzb_Dasturchilar
131
Download