Friday, January 30, 2009

Онч мэргэн үгс 2

Өдөр бүр ядаж нэг дуу сонсож, уран зураг үзэх юм уу мэргэн үг ганцыг ч болов уншиж байх хэрэгтэй.

М. Гёте

Онч үгсийг хэрэглэвэл үг цөөн, утга агуу болно.

Марк Твен

Бидний бодол санаа амьралыг хэрхэн төсөөлж байна, сайн, муу, баяр гутранги, ялан давамгайлсан эсвэл дуулгавартай юу гэдгээс л хамаардаг.

Марк Аврелий

Эрдэм чадлыг хичээн эс сурваас хэрэглэх цаг дор гэмшмүй
Эрүүл биеэ хичээн эс сувилбаас өвдсөн цаг дор гэмшмүй

В. Инжинаш

Хийж чаддаг зүйлээ байнга хийвэл хэзээ ч өсөхгүй. Харин хийж чаддаггүй зүйлсээ хийж байж та өснө.

Роналд Э. Осборн

Дундаж хүн цагийг хэрхэн өнгөрөөхөө л бодож явдаг бол авьяастай хүн түүнийг ашиглахыг чармайдаг.

Шопенхуар

Өрөвдөж байгаа нь биш тусалж байгаа нь л нөхөр

Томас Фюллер

Гай зовлон амсахгүй гэвэл ухаантныг түш,
Лай болдог хар санаатнаас хол яв.
Ухаантан мэргэд хор өгсөн ч хүртэж болгоо,
Угаас муу хүн эм өгсөн ч бүү хуурт.

Омар Хайяам

Sunday, January 18, 2009

Java хөгжүүлэгчид

Жава дээр програм хєгжvvлэхэд хэрэглэгддэг олон програмууд байдаг ба тэдгээрийн сайтын линкийг татаж авах линктэй нь тавилаа.

- NetBeans Татаж авах
- Borland JBuilder

- JCreator Татаж авах

- Oracle JDeveloper


Жава дээр бичихэд дээрхи програмуудын аль нэгнээс гадна JDK, JRE - суулгах хэрэгтэй.

JDK(Java Development Kit) буюу Жава хєгжvvлэх багаж нь Жава дээр програм бичихэд хэрэг болдог програм бєгєєд энэ нь source(Эх код)-ыг хөрвүүлэлт хийж Жава Прoграм(Class) болгодог багаж юм.


JRE(Java Runtime Environment) нь жава хэл дээр бичигдсэн програмуудыг ажиллуулах орчныг бүрдүүлдэг програм юм.

JRE Татаж авах

Миний хувьд бодлого бодох, GUI(Graphic User Interface)-ийг кодчилох гэх мэтэд би гэх мэт кодтой ажиллахад Eclipse тун дажгүй санагдсан. Консол нь Windows - ын орчинд ажилладаг гэх мэт.

Wednesday, January 14, 2009

QuickSort

Бидний урьд өмнө хэрэглэж байсан бөмбөлөгөн эрэмбэлэлт, оруулалттай эрэмбэлэлт, сонголттой эрэмбэлэлтийн аргууд нь олон тооны элемэнтүүдийн эрэмбэлэх үед хугацаа нэлээд шаарддаг байсан. Харин эрэмбэлэлтийн маш үр өгөөжтэй нэгэн аргыг 1962 онд Ч. Хоар санал болгосон. Энэ аргыг QuickSort буюу хурдан эрэмбэлэлтийн арга хэмээн нэрлэдэг.

Энэ аргын гол санаа нь эхлээд анхны эрэмбэлэлт хийгдээгүй массив дотроос нэгэн Х элемэнтийг сонгон авч түүний зүүн талд түүнээс бага буюу тэнцүү элементүүд, баруун талд түүнээс олон элемэн байрлаж байхаар сэлгэн байрлуулна. Энэ алхмын дараа Х элемэнт нь өөрийн байраа олсон байх ба түүний 2 талд эрэмбэлэгдээгүй 2 хэсэг үүссэн байх бөгөөд энэ хоёр хэсэг дээрээ дахин түрүүчийн алхмыг хийх гэх мэтээр бүгд эрэмбэлэгдэх хүртэл үргэлжилнэ.

Харин одоо бүхэл тоон массивын элемэнтүүдийг эрэмбэлэх програмыг рекурс ашиглан бичье.


#include <stdio.h>
int a[100];
int qsort(int m,int l){
int i=m;
int j=l;
int x=a[(m+l)/2];
do
{
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i<=j){
int w=a[i];
a[i]=a[j];
a[j]=w;
i++;
j--;
}
}
while(i<=j);
if (m<j) qsort(m,j);
if (i<l) qsort(i,l);

}
main(){
int n,e;
scanf("%d",&n);
for(e=0; e<n; e++)
scanf("%d",&a[e]);
qsort(0,n-1);
for(e=0; e<n; e++)
printf("%d ",a[e]);
return 0;
}

Харин QuickSort-ыг C/C++ хэлэнд бичиглэл маш багатайгаар алдаа бараг гаргахгүйгээр хэрэглэж боломж байдагийг та бүхэн мэдэх үү?
C/C++ хэлэнд stdlib.h толгой файлд qsort хэмээх функцийг цаанаас нь тодорхойлж өгсөн байдаг ба түүнийг хэрэглэхэд маш хялбар. Энэ функцыг ашиглан бүхэл тоон массивыг эрэмбэлэх жишээг доор үзүүллээ.

#include <stdio.h>
#include <stdlib.h>
int comp(const void*a,const void*b){
int *x=(int*)a;
int *y=(int*)b;
return *x-*y;
}
int main(){
int n;
int a[100];
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(a[0]),comp);
for(int i=0; i<n; i++)
printf("%d ",a[i]);
return 0;
}

Monday, January 12, 2009

Java

Хэдэн сарын өмнө ComputerTimes сэтгүүл дээр гарсан Жавагийн талаар гарсан нийтлэлийг Объект Хандалтат Програмчлал хамтдаа үзэх гэж байгаа найзууддаа зориулаад энэ нийтлэлийн ач холбогдлыг бодон нийтэллээ.


Java бол Sun Microsystems корпорацийн бүтээсэн програмчлалын хэл бөгөөд хамгийн анх 1995 онд
түүнийг олон нийтэд танилцуулагджээ. Анх хийгдэхдээ Sun-ийн Java платформ дээр ажиллахаар байсан юм. Жава-г бүтээхдээ С ба С++ хэлийн онцлог, бичиглэлийг хүчтэй тусган авчээ. Гэхдээ хамгийн гол нь обьект хандалтат загвар дээр түлхүү анхаарсан ба доод түвшний програмчлалын боломжийг бага оруулсан байна.

Java прог
рам нь бит биш байт коднуудад хөрвүүлэгдэн ажилладаг бөгөөд энэхүү байт коднуудыг зөвхөн Java Virtual Machine (JVM) хэмээх систем ажиллуулдаг юм. Харин JVM нь платформ болгонд зориулагдан тусдаа хийгдсэн байдаг тул таны бичсэн програм, код аль ч үйлдлийн систем, платформ дээр ажиллах болж байгаа нь түүний хамгийн өвөрмөц онцлог юм.

1995 онд Sun нь Java-гийхаа гол хөрвүүлэгч, Virtual Machine, Class-ийн гол гол сангуудыг бүтээжээ. Харин одоо дэлхий дээр хамгийн их хүчээ авч байгаа систем болоод байгаа бөгөөд GNU (General Public License) гэсэн үнэгүй лицензтэй болсноор түүнийг хэн дуртай нь үнэгүй татан авч ашиглах боломжтой болжээ.

Түүх

Анх 1991 онд James Gosling гэгч нөхөр Жава хэлний үндэс суурийг тавьжээ. Тэрээг уг хэлийг өөрийн төсөлд ашиглахаар төлөвлөж байсан байна. Анх энэ хэлийг Oak (Царс) хэмээн нэрлэж байсан бөгөөд Царс маань урган том болсоор бусад хүмүүсийн анхаарлыг татаж эхэлсэн байна. Удалгүй нэрээ сольж, Green болсон ба удалгүй Жава хэмээх нэрээ олсон байна. Gosling нь анхнаасаа өнөөгийн жавагийн амжилт олж байгаа гол онцлогийг олж анхаарсан байна. Тэр нь өөрийн гэсэн Virtual Machine-тай C/C++ хэлтэй төсөөтэй програмчлалын хэл бүтээх байжээ.

Албан ёсоор Java 1.0 хэл нь 1995 онд бүтээгдсэн бий болсон бөгөөд хамгийн гайхамшигтай уриа болох Write Once, Run Anywhere (Нэг удаа бич, Хаа сайгүй ашигла) хэмээх уриаг гаргасан юм. Энэ нь жава кодыг аль ч платформ дээр ажиллуулах боломжийг олгох зохион байгуулалттай байлаа.

Жавагийн хамгаалалтын түвшинг хэрэглэгч хүн хүссэнээрээ өөрчлөх боломжтой ба зарим тохиолдолд сүлжээ болоод файл руу хандах эрхийг нь цаанаас нь хаачихсан нь хүмүүст ихээр таалагдсан юм. Ийм болохоор ихэнхи броузерууд Java Applet-г ажиллуулах боломжийг өөртөө нэмсэн байна. Яагаад гэвэл Java Applet нь хэрэглэгч хүнд ямар ч аюул учруулахгүй байсан байна. Өөрөөр хэлбэл програмист хүн Java Applet-ийг ашиглан хэрэглэгчдийн компьютерт халдах боломжийг тун сайн хаажээ.
Java - анхны зохиогчид "Green" багийхан
Ер нь бол Жава маш богино хугацаанд олон нийтийг олон нийтийг хамарч эхэлсэн ба түүний хамгийн гол уриа болох бүх платформ дээр ажиллах гэсэн нь хамгийн ихээр таалагдсан юм. Java-гийн гол хувилбар болох Java 2.0 гарснаас хойш түүний хүчин чадал, нэр хүнд огцом нэмэгджээ. Энэ үеэс тусгай платформуудад зориулагдсан хувилбарууд гарах болсон нь програм хөгжүүлэгчдэд бүр их эрх чөлөөг мэдрүүлсэн юм. Жишээлбэл J2EE хэмээх багц нь том корпораци, байгууллагын түвшинд програм бичих боломжийг олгож байсан бол J2ME нь жижиг электрон төхөөрөмжүүд, тэр дундаа гар утсанд зориулагдсан програм бичих, харин J2SE нь жирийн компьютер дээр ажиллах програм бичих зориулалттай байлаа. 2006 оны үеэс эхлэн Жава програмчлалын систем нь Java EE, Java ME, Java Se гэж 3 хуваагдах болсон юм.

1997 онд Sun Microsystems нь ISO/IEC, JTC1 гэх мэтийн стандартуудын болзлыг хангав. Сүүлд нь Ecma байгууллага нь Java-гийн стандартуудыг тогтоосон ба энэ бүхэн түүний хөгжилд ихээхэн хувь нэмэр оруулсан нь гарцаагүй. Энэ үед Sun корпораци нь Java-гийхаа бүхий л код, багаж хэрэгслүүдийг нийтэд үнэ төлбөргүйгээр дэлгэв. Энэ нь Microsoft-ыхны хувьд байж болшгүй үзэгдэл байсан бол Sun нь алс ирээдүйг олж харжээ. Гэхдээ Sun нь ашиг олж байсан бөгөөд жишээ нь Java Enterprise системдээ зориулсан тусгай лиценз бүхий бүтээгдэхүүнийг борлуулах замаар орлогоо бүрдүүлж байв.

2006 оны 11 сарын 13нд Sun нь Java-гийхаа ихэнх хэсгийг GNU лицензтэй болгож, хэн дуртай нь татаж авч ашиглах боломжтой болгов. Харин 2007 оны 5 сарын 8нд Java-гийн нууц байсан гол гол файлууд, цөм хэсгийг хийж дуусгасан ба тэдгээрийгээ нээлттэй эхтэй болгосон байна. Ингэснээр Жава нь даянд дэлхийн програм хөгжүүлэгчдийн өмч болсон байна.

Философи


Үндсэн зорилго

Java-г анх хийж эхлэхээс 5 үндсэн дүрмийг баримталж ирсэн байна. Үүнд:

1. Жава бол обьект хандалтад програмчлалын арга зүйтэй.
2. Жава бол ижил програмыг хэд хэдэн үйлдлийн систем дээр ажиллуулахыг зөвшөөрнө.
3. Жава бол компьютрийн сүлжээг дээд зэргээр ашиглахаас гадна бүхий л боломжуудыг хангаж өгнө.
4. Жава бол алс зайд байгаа кодыг нууцлал хамгаалалттайгаар ажиллуулах боломжтой байна.
5. Жава бол бусад объект хандатат програмчлалын хэлүүдийн бүхий л сайн талуудыг өөртөө агуулна.

Үйлдлийн системээс хамаарахгүй ажиллах нь

Зөвхөн энэ чанараас болж өдөр тутам олон зуун мянган програм хөгжүүлэгчид Жава руу урваж байгаа нь нэгэнтээ ил болжээ. Өөрөөр хэлбэл таны бичсэн програм бүхий л үйлдлийн систем, платформ, тоног төхөөрөмж дээр ажиллах боломжтой гэдэг бол үнэхээр гайхамшиг.

Жава дээр бичсэн код нь ихэнх Жаватай нийцтэй үйлдлийн систем, тоног төхөөрөмж дээр ажиллах боломжтой юм. Програмаа нэг удаа бичээд хөрвүүлээд л авсан бол түүнийгээ хаа сайгүй ажиллуул гэсэн үг шүү дээ.

Энэ хүү гайхамшигт боломжийг хэрхэн хангадаг вэ?

Java compiler буюу Жава хөрвүүлэгч нь Жава дээр бичигдсан кодыг бүтэн машины хэл болох битэд хөрвүүлдэггүй юм байна. Харин хагас боловсруулсан бүтээгдэхүүн гэдэг шиг хагас хөрвүүлж Java Bytecode гаргаж авдаг ажээ. Энэ кодыг зөвхөн Java Virtual Machine ажиллуулж дөнгөдөг юм. Тэгэхээр JVM нь ихээхэн чухал үүрэгтэй юм байна. JVM - ийг тухайн үйлдлийн системд зориулан тусгайлан бичсэн байдаг. Тэгэхээр энэхүү VM маань эцсийн бүтээгдэхүүн болох машин дээр ажиллах боломжтой бит кодыг үүсгэдэг байна. Бас VM нь тоног төхөөрөмжийн график хэсэг, санах ой, сүлжээ гэх мэт амин чухал зүйлсийг удирдана. Ихэнх тохиолдолд Java Bytecode нь саадгүй ажилладаг боловч зарим хэт онцгой машин дээр JIT хэмээх хөрвүүлэгч шаардлагатай болдог. Тэгэхээр таны бичсэн код тань JVM хэмээх системээр дамжиж байж хэрэгждэгийг ойлгож авсан байх. Тэгэхээр програмын ажиллагаа яалтчгүй удаан байхаас аргагүй болж байгаа юм. Яагаад гэвэл C/C++ дээр бичсэн код нь шууд машины бит кодонд хөрвүүлэгдсэн байдаг тул ажиллагааны хувьд маш хурдан байдаг бол Жавагийн эх код нь заавал ЖаваВиртуалМашинаар дамжина. Энэ үүднээс удаан ажилладаг гэсэн шүүмжлэлийг байнга сонсдог байсан бөгөөд энэ нь түүний гол сул тал байлаа. Гэхдээ сүүлийн үеийн JVM нь төрөл бүрийн технологи, аргуудыг хэрэглэснээр дутахгүй хурдан ажилладаг болоод байна. Гэхдээ орчин үеийн тоног төхөөрөмжүүд тооцоолох чадвар нэмэгдсэнээр энэхүү дутагдал онцын мэдэгдэхээ болиод байгаа юм.

Жишээ нь хурдыг нэмэгдүүлэх нэг арга бол Just-in-Time(JIT) буюу Яг цагт гэсэн хөрвүүлэлтийн арга юм. Энэ бол програм яг ажиллах үед нь ЖаваБайткодыг машины код руу хөрвүүлнэ гэсэн үг. Ингэснээр програм илүү хурдан ажиллах бололцоотой болдог. Гэвч энэ арга нь Overhead буюу хэт ачаалалд орох эрсдэлтэй. Иймээс сүүлийн үеийн VM-ууд динамик маягийн холимог аргыг хэрэглэдэг болоод байна. Энэхүү динамик арга нь програмын амин чухал хэсгүүдийг хэрхэн хөрвүүлэхээ сайтар тооцоолж чаддаг юм. Ингэснээр эцсийн дүндээ таны бичсэн код C/C++ дээр бичсэнээс дутахгүй хурдан ажиллаж чадах билээ.

Хурдыг нэмэгдүүлэх өөр нэг арга бол статик хөрвүүлэгч ашиглах явдал юм. Энэ хөрвүүлэгч нь шулуухан машины эх код руу хөрвүүлчихдэг. Өөрөөр хэлбэл Жавагийн сонгодог байткод үүсгэхгүй гэсэн үг юм. Ийм статик хөрвүүлэгчийн жишээ гэвэл GCJ юм. Гэвч ингэх юм бол өвөрмөц онцлог огтхон ч үр дүнгүй болчихож байгаа юм. Ийм арга хэрэглэх нь заавал Жава дээр бичих огтхон ч шаардлагагүй болж байгаа бөгөөд C/C++ дээр бичиж байгаагаас огтхон ч ялгаагүй болж байна.

Хөгжүүлэлт

SunMicroSystems нь JavaStandardEdition хэмээх платформын лицензийг албан ёсоор эзэмшдэг юм байна. Энэ платформ нь MicrosoftWindows, Linux, Solaris гэсэн үйлдлийн системүүд дээр ажиллана. Бусад платформуудад зориулсан Жавагийн орчныг бүрдүүлэгч системүүд бас бий.

Жава брэнд нь шулуун дардан замаар явсангүй. Мэдээж Microsoft-той зүйл бүрээр тэрсэлдэж байсан нь ойлгомжтой. Тухайлбал Java нь Microsoft-ийн үйлдлийн систем дээр ажилладаг болохын тулд ихээхэн саадыг давсан юм. Учир нь Microsoft нь Жава ажиллахад шаардлагатай RMI болон JNI интерфэйсүүдийг хаачихсан юм. Мэдээр Sun-ыхан шүүхэд зарга мэдүүлсэн бөгөөд 1997 онд 20 сая долларыг төлүүлж чаджээ. Гэсэн ч Windows нь анх ирэхдээ Жавагүй ирдгийг бид бүгд мэднэ. Бас сүүлийн үеийн InternerExplorer нь JavaApplet-ийг дэмждэггүй шүү дээ. Заавал 3дагч нэмэлт Plug-In суулгах шаардлагатай болдог. Гэхдээ та дуртай үедээ интернэтээс RunTime орчныг бий болгогч дэд системүүдийг татан авч болно.

Платформ хамаарахгүй ажилладаг чанар нь Enterprise маягийн томоохон програм хөгжүүлэгчдэд онцгой таалагдсан юм. Яагаад гэвэл ийм чиглэлийн лицензтэй програм хангамжууд асар өндөр үнэтэй байдаг шүү дээ. Түүнчлэн Enterprise чиглэлийн системүүд нь олон платформ болоод янз бүрийн орчинд ажиллах дэд системүүдээс бүрдэх шаардлагатай байдаг юм. Тэгвэл Жавад энэ бүхэн бүгд бий. Сервэр талдаа гэвэл Жишээ нь: servlet хэмээх вэб серверийг нэрлэж болох юм. Enterprise орчинд JavaBeans байж болно. Жава нь нээлттэй эхтэй болохоор дэлхийн шилдэг систем хөгжүүлэгчид өөр өөрсдийн тусгай системүүдийг бүтээж байгаа билээ. Хамгийн сүүлд GlassFish хэмээх төсөл нэн амжилттай хэрэгжиж байгаа бөгөөд энэ нь JavaEE орчинд үнэхээр тансаг зүйл хийж болохоор хэмжээнд ирээд байна.

Санах ойг автоматаар удирдах нь

Жавагийн үнэхээр өвөрмөц онцогийн нэг бол санах ойг автоматаар удирдах аргачлал юм. Энэ боломжийн хүчээр програмчин хүн гар аргаар санах ойг удирдах нүсэр ажлаас чөлөөлөгдөж байгаа билээ. Бусад хэлнүүд дээр объектийг үүсгэхийн тулд юуны өмнө хэрэгцээт санах ойг бий болгож авах, обьектоо хэрэглэж дууссаны дараа суллах гэх мэтийн ажиллагааг хийдэг шүү дээ. Хэрэв програмчин хүн объектоо суллаж, устгахаа мартсан бол санах ойн тэр хэсгийг ашигласан тэр чигээрээ үлдчихдэг. Програм гацах, алдаа гарах мэтэд санах ойг иймэрхүү байдлаар эзлээд үлдчих тохиолдол зөндөө гардаг. Бас санах ойг суллах гэж оролдох үедээ алдаа гаргах, дахин дахин оролдох гэх мэтэд гацаах ноцтой алдаанууд гарах нь түгээмэл байдаг.

Харийн Жава дээр бол үүнийг сайхан шийдэж өгчээ. Автомат хог цэвэрлэгч гэсэн систем байдаг бий. Програмчин хүн объект үүсгэлээ гэхэд түүнийг зааж байдаг ямар нэгэн хувьсагч, эзэмшигч заавал үүсдэг. Энэ нь уг объектыг удирдах, ашиглах үүрэгтэй. Тэгвэл объектыг устгалаа гэхэд зөвхөн энэ объектын заагч хувьсагчийг устгачихдаг. Энэ үед заагчгүй объект санах ойд үлдчихнэ гэсэн үг. Харин JavaGarbageCollection(Жавагийн хог цэвэрлэгч) нь иймэрхүү эзэнгүй санах объект санах ойд байгаа эсэхийг автоматаар шалгаж байдаг. Эзэнгүй объект тааралдвал. Түүнийг санах ойгоос бүрэг чөлөөлж бүрмөсөн устгана.

Syntax буюу бичиглэл

Java-гийн хувьд syntax нь бараг тэр чигээр C++ юм. C++ -ээс ялгаатай зүйл нь гэвэл тэрээр тэр чигтээ объект хандалтат тул энэ талд нэмэгдсэн ганц нэг зүйлс бий. Гэхдээ мэдээж C++ -тэй усны дусал шиг адилхан байна гэж юу байхав. Объект хандалтат тул бүх коднууд ямар нэгэн объектэд харьяалагдах бөгөөд бүгд class дотор бичигдэнэ. Зөвхөн бодит өгөгдлийн төрлүүд (тоон утгууд, boolean утга, тэмдэгт) л class дотор бичигдэхгүй байж болдог нь түүний ганц зөрчил юм.

Анхны програм "Hello World!"
public class Hello{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
Энэ жава програм нь ажиллахын тулд заавал Hello.java нэртэй файлд хадгалагдах ёстой. Яагаад гэвэл классын маань нэр Hello байна шүү дээ. Дараа нь энэхүү кодыг Bytecode буюу хагас машины хэлэн хөрвүүлэх болно. Бидэнд Java Compiler хэрэг болно. Хөрвүүлсний дараа Hello.class файл үүссэн байх ёстой.

Хэрэглэгчийн Функц

Бид С хэлийг ашиглан өмнө тулгарсан бодлогыг бодох бүртээ sqrt(x), strcmp(s1,s2), pow(x,y) гэх мэт функцуудтэй алхам тутамдаа тааралдаж,
ашиглаж ирсэн билээ. Харин хэрэглэгч өөрийн сонирхолд нийцүүлэн, олон давтагдах үйлдэлийг товчлох, бичлэгийг хэмнэх зорилгоор функц үүсгэн ашиглаж болдог. Ямар ч програмчлалын хэлэнд функц үүсгэн ашиглах ерөнхий зарчим нь адилхaн байдaг.

С хэлний функцын ерөнхий бичлэг нь:
<Буцаах утгын төрөл><Функцийн нэр>(<Төрөл><Зарлалт>)
<Хувьсагчдыг зарлах>
{
<Дотооод хувьсагчдыг зарлах>
<Командууд>
...
return (Буцаах утга);
}
Хэрвээ функц утга буцаах шаардлагүй бол түүний нэрийн өмнө void түлхүүр үгийг бичиж өгөх буюу ямар ч түлхүүр үг бичихгүй байж болно. (void гэсэн түлхүүр үгийг бичиж өгөөгүй үед return 0; гэсэн бичлэгийг ашигласан байдгийг анзаарсан байх.)
Функц руу утга дамждаг бол тухайн хувьсагчдыг функцийн нэрийн ард хаалтан дотор төрөлийн хамт бичнэ.
Хэрэв функц утга хүлээн авдаггүй бол хаалтан дотор юу ч бичихгүй.

Харин одоо функц ашиглан бодсон бодолтыг сонирхъё.
SPOJ-ын бодлогын архив
2222. Бутархай
Бодлогын дугаар: CSMS0010

Энгийн бутархайн хүртвэр нь хуваариасаа бага бол зөв бутархай гэнэ. Мөн өгөгдсөн бутархайгаас хүртвэр болон хуваариараа бага бөгөөд түүнтэй тэнцүү бутархай байхгүй бол анхны бутархайг үл хураагдах бутархай гэнэ. Хүртвэр болон хуваарийнх нь нийлбэр n-тэй тэнцүү байх хамгийн их утгатай зөв, үл хураагдах бутархайг ол.
Input

ганц n бүхэл тоо байна (3 <= n <= 1000)
Output

олдсон бутархайн хүртвэр болон хуваарийг гаргана
Example

Input:
10

Output:
3 7

Input:
23

Output:
11 12

Өгүүлбэрээс бутархайн хуваарь, хүртвэрийг нийлбэр нь n, тэдгээрийн ялгавар нь хамгийн бага, ХИЕХ нь 1-тэй тэнцүү байхаар авах нь тодорхой байна. Хүртвэрийг n/2-оос эхлэн нэг нэгээр бууруулж, хуваарийг нэг нэгээр нэмэгдүүлэх үйлдлийг ХИЕХ нь 1 болтол хийх шийдлийг сонгоё. Харин ХИЕХ=1 эсэхйиг шалгахдаа Евклидийг алгоритмийг ашиглан 2 тооны ХИЕХ-ыг олох функц үүсгэн ашиглая.

#include <stdio.h>
long int XIEX(long int a,long int b)
{
while(a!=0 && b!=0)
{
if(a>b) a%=b;
else b%=a;
}
if (a!=0 && b==0) return a;
if (b==0 && a!=0) return b;
}
void main()
{
long int n;
long int x,y;
scanf("%ld",&n);
for(x=n/2; x>0; x--)
{
y=n-x;
if(XIEX(x,y)==1)/**/
{
printf("%ld %ld\n",x,y);
break;
}
}
}

Рекурсив Функц

Програмчлалах үед хэргэгчийн функц нь шууд болон шууд бус аргаар өөрөө өөрийгөө дуудах боломж байдаг ба үүнийг рекурс хэмээн нэрийддэг. Рекурсийг ямар нэг түвшин дэх үзэгдэл нь түүний өмнөх түвшиний үзэгдэлээр тодорхойлогдох үйл явц гэж тодорхойлж болох юм.

Рекурсыг ашигласанаар програмчлалын кодчилолыг бага хэмжээтэй болгох, мод, граф мэт шаталсан зохион байгуулалттай бүтцүүтэй ажиллах боломжийг бүрдүүлж өгдөг ба програмын бичих, ойлгоход тун хялбархан болгодог.

Рекурсийг ашигласан хамгийн энгийн жишээ болох өгөгдсөн тооны факториалыг олох програмын рекурс ашиглан бичье.


#include <stdio.h>
int fact(int a){
if(a==1) return 1;
return a*fact(a-1);
}
main(){
int n;
scanf("%d",&n);
printf("%d",fact(n));
return 0;
}

fact функцийн { } хаалтан дотор байгаа бичиглэлийн эхний мөрийг рекурс дуусах нөхцөл гэж нэрлэдэг. Харин 2-р мөрөнд а тоог а-1 тооны факториалаар үржүүлсэн утгыг буцааж байгаа ба энэ нь fact функц нь ажиллах явцдаа а-1ийн факторалын олох fact функцийн дахин дуудаж байгаа хэрэг. Рекурс функц өөрөө өөрийгөө дуудахдаа өмнөх утгаа компьютрийн стек санах ойд хадгалж байдаг. Харин төгсгөх нөхцөлд хүрмэгцээ өмнөх санах ойд хадгалсан утгуудаа дэс дараалан үржүүлж утгаа fact функцээр дамжуулан буцаана.

Харин одоо арай өөр рекурс шийдэлтэй програмыг бичиж үзье.
Өгсөн 10-тын тооллын системийн тоог хэрэглэгчээс авсан дурын k тооллын систем рүү (16-тын тооллын систем хүртэл. Хэрэв хүсвэл 16-таас илүү тоолын системд хөрвүүлэхээр бичиж болно.) хөрвүүлж хэвлэх програмыг доор сийрүүлэв.

#include <stdio.h>
long convert(long n,int k){
if(n){/*Энэ мөр нь рекурс функцийн төгсгөх
нөхцөл болж байна. n=0 болмогц convert
функц өөрөө өөрийгөө дуудахаа зогсооно.
n>0 үед л биелэнэ гэсэн үг */
convert(n/k,k);/*Энэ хэсэг функц өөрөө
өөрийгөө дуудаж байна.*/
switch(n%k){
case 0:printf("0"); break;
case 1:printf("1"); break;
case 2:printf("2"); break;
case 3:printf("3"); break;
case 4:printf("4"); break;
case 5:printf("5"); break;
case 6:printf("6"); break;
case 7:printf("7"); break;
case 8:printf("8"); break;
case 9:printf("9"); break;
case 10:printf("A"); break;
case 11:printf("B"); break;
case 12:printf("C"); break;
case 13:printf("D"); break;
case 14:printf("E"); break;
case 15:printf("F"); break;
}
}
}
int main(){
long n;
int k;
printf("N naturgal toog oruul\n");
scanf("%ld",&n);
printf("Huvirgah toollin systemiig oruul\n");
scanf("%d",&k);
convert(n,k);
return 0;
}

Функц маань төгсгөх нөхцөлд хүрмэгцээ санах ойд хадгалсан тэмдэгтүүдээ буцаан хэвлэж байгааг анзаарсан байх. Тоонуудыг тоолын системүүдэд шилжүүлэх талаар урьд өмнө нь бичиж байсан учраас энэ талаар дэлгэрэнгүй бичилгүй орхилоо. Хэрэв хүсвэл энд дарж үзэж болно.