ОББН лекция 2. Си программалау тіліне кіріспе Жоспар
Скачать 128.11 Kb.
|
ПолиморфизмЖоспар 1. Полиморфизм2. Полиморфтық объектілерді құрастыру 1.ПолиморфизмC++ объектіге-бағытталған программалау тіліндегі негізгі ұғымдардың бірі полиморфизм болып табылады. Жалпы жағдайда полиморфизм – бұл объектінің өзінің формасын өзгерту мүмкіндігі болып табылады. Мүнда поли көп, ал морфизм бейнелік дегенді білдіреді. Полиморфтық объект – формасын өзгертетін объект. Бұл бөлімде полиморфизм ұғымын программада қолданып, оны тиімді түрде қолдануды қарастырамыз. Полиморфтық объект өзінің формасын программа орындалуы кезінде өзгерту мүмкіндігі бар объект. Мысалы, телефонда орындалатын операцияларды программада орындағымыз келсін. Мұндағы жалпы операциялар: номерді теру, қоңырау, үзу және т.б. Осы операциялардың көмегімен біз келесі класты құрастырамыз: class phone { public: void dial(char "number) { cout << " номерді теру " << number << endl; } void answer(void) { cout << "жауапты күту" << endl; } void hangup(void) { cout << "қоңырау орындалды – трубканы қой" << endl; } void ring(void) { cout << " қоңырау, қоңырау, қоңырау " << endl;) phone(char *number) { strcpy(phone::number, number); }; private: charnumber[13]; ); Келесі программада phone класы объект-телефон құру үшін қолданылады: #include #include class phone { public: void dial(char *number) { cout << " номерді теру " << number << endl; } void answer(void) { cout << " жауапты күту " << endl; } void hangup(void) { cout << " қоңырау орындалды – трубканы қой" << endl;} void ring(void) { cout << "" қоңырау, қоңырау, қоңырау " << endl; } phone(char *number) { strcpy(phone::number, number);}; private: charnumber[13]; }; void main(void) { phonetelephone("555-1212"); telephone.dial("212-555-1212"); } Мұрагерлік ұғымын пайдаланып phone класынан touch_tone және pay_phone кластарын төменде көрсеткендей құрыңыз: class touch_tone : phone { public: void dial(char * number) { cout << "Пик пик номерді теру" << number << endl;} touch_tone(char*number):phone(number){} }; class pay_phone : phone { public: void dial(char * number) { cout<<"төлеңіз"<< amount << " теңге" << endl; cout<<"номерді теру " << number << endl; } pay_phone(char *number, int amount) : phone(number) { pay_phone::amount = amount; } private: intamount; }; Мұнда touch_tone және pay__phone кластары өздерінің dial атты тәсілдерін құрастырады.: #include #include class phone { public: void dial(char *number) { cout << " номерді теру " << number << endl; } void answer(void) { cout << "жауапты күту" << endl; } void hangup(void) { cout << " қоңырау орындалды – трубканы қой " << endl; } void ring(void) { cout << " қоңырау, қоңырау, қоңырау " << endl; } phone(char *number) { strcpy(phone::number, number); }; protected: charnumber[13]; ); class touch_tone : phone { public: void dial(char *number) { cout << "Пик пик номерді теру " << number << endl; } touch_tone(char*number):phone(number){} }; class pay_phone : phone { public: void dial(char * number) { cout << "Төлеңіз " << amount << " центов" << endl; cout << " номерді теру" << number << endl; } pay_phone(char * number, int amount) : phone(number) { pay_phone::amount =amount; } private: intamount; }; void main (void) { phonerotary("303-555-1212"); rotary.dial("602-555-1212"); touch_tonetelephone("555-1212"); telephone.dial("212-555-1212"); pay_phonecity_phone("555-1111",25); city_phone.dial("212-555-1212"); } 2.Полиморфтық объектілерді құрастыру Бөлімнің басында айтқанымыздай, полиморфтық объект өзінің формасын программа орындалуы кезінде өзгерте алады. Алдыңғы программада, полиморфтық объектілер қолданылған жоқ. Енді біз полиморфтық объектілерді құрастыруды қарастырайық. Ол үшін объект-телефонды қарастырамыз. Біздің объект-телефонымыз әртүрлі жағдайларды орындай білуі тиіс.Бір қоңырау үшін объект-телефон : дискалық аппарат,келесі үшін кнопкалы аппарат, ал тағы біреуі үшін ақшасы төленетін телефон болуы тиіс. Яғни бір қоңыраудан екінші қоңырауға өткенде біздің объект-телефонымыз өзінің формасын өзгертуі тиіс. Телефонның осындай әртүрлі кластарында бір ғана өзгеше функция —dial тәсілі бар.Полиморфтық объектіні құру үшін алдымен базалық кластың функциясын анықтаймыз, бұл функцияның туынды кластағы функциялардан айырмашылығы ол виртуальды. Оны білдіру үшін функция прототипінің алдына virtual қызметші сөзін орналастырасыз: class phone { public: virtual void dial(char •number) { cout << " номерді теру " << number << endl; } void answer(void) { cout << "жауапты күту" << endl; } void hangup(void) { cout << "қоңырау орындалды – трубканы қой" << endl; } void ring(void) { cout << " қоңырау, қоңырау, қоңырау " << endl; } phone(char *number) { strcpy(phone::number, number); }; protected: charnumber[13]; }; Әрі қарай программада базалық кластың объектісіне көрсеткіш құрасыз. Программада базалық класс phone объектісіне көрсеткіш құрасыз: phone *poly_phone; Объектінің формасын өзгерту үшін осы көрсеткішке туында кластың объектісінің адресін меншіктейсіз: poly_phone = (phone *) &home_phone; Мына (phone *) символы- типтерді сәйкестендіру операторы, ол C++, компиляторына (touch_tone) типіндегі айнымалының адресін (phone)типтікөрсеткішке меншіктеуді білдіреді. Программа poly_phone объектісінің көрсеткішіне әртүрлі объектілердің адресін меншіктей алатындықтан, онда объект өз формасын өзгерте алады, ол полиморфты. Келесі программадаосы тәсіл объект-телефон құру үшін қолданылады. Программаны орындауға жібергеннен кейін poly_phone объектісі өзінің формасын : дискілік телефоннан кнопкалыққа, ал одан кейін ақылы телефонға өзгереді: #include #include class phone { public: virtual void dial(char *number) { cout << " номерді теру " << number << endl; } void answer(void) { cout << "жауапты күту" << endl; } void hangup(void) { cout << " қоңырау орындалды – трубканы қой " << endl; } void ring(void) { cout << " қоңырау, қоңырау, қоңырау " << endl; } phone(char *number) { strcpy(phone::number, number); }; protected: charnumber[13] ; }; class touch_tone : phone { public: void dial(char * number) { cout << "Пик пик номерді теру " << number << endl; } touch_tone(char*number):phone(number){} }; class pay_phone: phone { public: void dial(char *number) { cout << "төлеңіз " << amount << " центов" << endl; cout << " номерді теру " << number << endl; } pay_phone(char *number, int amount) : phone(number) { pay_phone::amount = amount; } private: intamount; }; void main(void) { pay_phone city_phone("702-555-1212", 25); touch_tone home_phone("555-1212"); phone rotary("201-555-1212") ; // объект дисклық телефон phone *poly_phone = &rotary; poly_phone->dial("818-555-1212"); //объект формасын кнопкалы телефонға ауыстыру poly_phone = (phone*) &home_phone; poly_phone->dial("303-555-1212"); // объект формасын ақылы телефонға ауыстыру poly_phone = (phone*) &city_phone; poly_phone->dial("212-555-1212"); } Мұнда poly_phone объектісі өзінің формасын программа орындалуы кезінде өзгерте алады, сондықтан ол полиморфным болып табылады. Ағымдық файлдар. Жоспар 1. C++ Е/Ш файлдық операциялары 2.Енгізу файлдық ағынынан оқу3. Файлды жабу4. Файлды ашуды басқару5. Оқу және жазу операцияларын орындау1. C++ Е/Ш файлдық операцияларыПрограмма күрделенген сайын мәліметті сақтауға және оқуға файлдарды қолдануға тура келеді. Негізгі орындалатын операциялар бізге Турбо Паскаль, С тілдерінен белгілі болуға тиіс. C++ тілінде қажетті операцияларды орындауға файлдық ағындар класын қолданамыз. Олардың көмегімен файлдаға мәліметтерді жазуға немесе оқуға болады.Сout –бұл ostream (шығатын ағын) типті объект. Осы ostream класынпрограммада қолданып, cout – қа орнына қою оператора (<<) немесе әртүрлі тәсілдер арқылы мысалы cout.put . мәліметтер шығаруға болады. Басқы файл iostream.h шығатын ағын cout өтыанықтайды. Дәл осы сияқты, басқы файл fstream.h шығатын файлдық класс ағынын ofstream өді анықтайды. Ofstream класының объектілерін қолданып программадан файлға мәліметтер шығара аламыз.Алдымен ofstream типті объект жариялаймыз, онда шығатын файл атауы көрсетіледі: ofstream file_object(“FILENAME.EXT”); Егер файл атауын ofstream типті объект жариялағанда берсек, онда C++ дискде жаңа файл құрады, ал егер ондай файл дискіде бар болса ол жойылып қайта құрылады Келесі программада ofstream типті объект құрылады және орнына қою операторы BOOKINFO.DAT файлына бірнеше жолды шығарамыз: #include void main(void) { ofstreambook_file(“BOOKINFO.DAT”); book_file<<“C++ тілінде программалау,“ < Программа BOOKINFO.DAT файлын ашады орнына қою операторының көмегімен файлға үш жол жазылады. Компиляциядан өткізіп, программаны орында. 2.Енгізу файлдық ағынынан оқуofstream класын қолдану арқылы мәліметтерді файлға оңай шығара аламыз. Дәл осындай әдіспен программада файлдан оқу оепрациясын ұйымдастыруға болады Ол үшін ifstream типті объект алынады. Мұнда да параметр ретінде файл атауы берілетін объект, құрылады: ifstream input_file(“filename.EXT”); Келесі программа BOOKINFO.DAT файлын оқуға ашады және ондағы мәліметтерді экранға бейнелейді: #include #include void main(void) { ifstreaminput_file(“BOOKINFO.DAT”); charone[64],two[64],three[64] input_file>>one; input_file>>two; input_file>>three; cout< Компилиядан өткізіп, программаны септеуге жіберіңдер. Мұнда енгізілетін файлдық ағындар бос символдарды, бір мәннен екінші мәнді ажыратуға қолданатынын ескеру қажет. Файлдық ағыннан толық жолды оқу getlineқолданылады.#include #include void main(void) { ifstreaminput_file(“BOOKINFO.DAT”); charone[64],two[64],three[64]; input_file.getline(one,sizeof(one)); input_file.getline(two,sizeof(two)); input_file.getline(three,sizeof(three)); cout< Программа файлдағы мәндердің барлығын оқиды.Бірақ көптеген жағдайда программа файлда қанша жол бар екенін білмейді. Мұндай жағдайларда мәліметтер файлдың соңына дейін оқыла береді..Файлдың соңын анықтау үшін, ағындық объектінің еоf функциясын қолданады. Функция файл соңы бар болса 0 мәнін, ал егер файл соңы кездеспесе 1 мәнін қайтарады. Цикл while қолданып программа файлдың соңына жеткенше оның мәнін оқуын ұйымдастыра алады: while (! Input_file.eof()) { //Операторлар } #include #include void main (void) { ifstreaminput_file(“BOOKINFO.DAT”); charline[64]; while (! Input_file.eof()) { input_file.getline(line,sizeof(line)); cout< } 3. Файлды жабуПрограмманың орындалуы аяқталғанда операциялық жүйе ашылған файлды жабады. Егер программаға файл қажет болмаса, онда ол жабылуы тиіс.Файлды жабуға программа close функциясын қоланады: input_file.close (); Файлды жапқанда, файлға жазылған барлық мәліметтер дискіге жазылады және каталогтағы файл жайындағы информация жаңартылады. 4. Файлды ашуды басқаруБіз келтірген программаларда файлдық енгізу және шығару операциялары файлдың басында орындалды. Егер шығарылатын файлға мәндерді соңынан қосу қажет болса, онда не істеуіміз қажет. Осында жағдайларда С++ тілінде файлдарды басқару режимдері қолданылады: ifstream output_file("FILENAME.EXT", ios::app); Файлдарды ашуды басқару
5. Оқу және жазу операцияларын орындауДәрістің бас жағындағы программаларда файлдық операциялар символьдық жолдарға жүргізілді. Программа күрделегген уақытта мәліметтерді массивтер мен структуралардан оқуға тура келеді.Ол үшін программада read және write функциялары қоданылады. Бұл функцияларды read және write қолдану үшін мәлімттер буферін қолданамыз. Оған қажетті мәліметтер жазылады немесе оқылады.Буфер өлшемі байтпен беріледі. Келесі программада write файлға информация жазуға қолданылады input_file.read(buffer,sizeof(buffer)); output_file.write(buffer, sizeof(buffer)); #include #include void main(void) { struct employee { charname[64]; intage; floatsalary; } worker = { "Арман", 33, 25000.0 }; ofstreamemp_file("EMPLOYEE.DAT"); emp_file.write((char*)&worker,sizeof(employee)); } Жазу функциясы write символдық жолға көрсеткіш алады. Символ (char *) типтерді сәйкестендіру операторы, ол компиляторға көрсеткіш басқа типке берілді деген информация түсіреді.Келесі программада read файлдан информация оқуға қолданылады: #include #include void main(void) { struct employee { charname[64]; intage; floatsalary; } worker = { "Арман", 33, 25000.0 }; ifstreamemp_file("EMPLOYEE.DAT"); emp_file.read((char*)&worker,sizeof(employee)); cout< Әдебиеттер тізімі Негізгі Сағындықов К. М.Алгоритмдік тіл Си. Оқу құралы.- Қарағанды:ҚарМУ баспасы, 2002 ж Керниган Б., Ритчи Д. Язык программирования СИ. М.: Фин. и стат., 1982. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования СИ. (Задачи по языку СИ) М.: Фин. и стат., 1985. Романовская Л.М. и др. Программирование в среде СИ для ПЭВМ ЕС. М.: Фин. и стат., 1991. Макогон В.С. Язык программирования Си для начинающих. Учеб. пособ. Одесса, 1993. Шиманович Е.Л. С/С++ в примерах и задачах. Минск, ООО “Новое знание”, 2004. Глушаков С.В. и др. Язык программирования С++. Москва, “Фолио”, 2004. Шмидский Я.К. Программирование на языке С/С++. Москва, "Диалектика", 2003 Қосымша1. Уинер Р. Язык Турбо Си: Пер с англ.-М.: Мир, 1991.-384 с.,ил. Подбельский В.В., Фомин С.С. Программирование на языке Си. Учебное пособие. М.: Фин. и стат., 2000. Дворжецкий А. Программирование на С и С++. М., 2000. Златопольский Д.М. Я иду на урок информатики. –М.: “Первое сентября”, 2001. |