Skip to main content

c හා c++ ප්‍රෝග්‍රැමිං - 7

ඉහත සාකච්ඡා කළ කරුණු ඉදිරියේදී උදාහරණවලදී ප්‍රායෝගිකවම ඔබට සිදුකර බලාගත හැකියි. දැන් අප සලකා බලමු උදාහරණවල නිතරම දක්නට ලැබෙන printf() හා scanf() යන කමාන්ඩ් දෙක ගැන කෙටියෙන්. ඇත්තටම මෙම කමාන්ඩ් දෙක ප්‍රායෝගික "සත්‍ය" GUI ප්‍රෝග්‍රෑම්වලදී එතරම්ම වැදගත් නොවුණත්, කොන්සෝල් ප්‍රෝග්‍රෑම්වලදී නැතිවම බැරිය. මෙම කමාන්ඩ් දෙක ෆන්ක්ෂන් (function) ලෙසයි හැඳින්විය යුත්තේ (තව මොහොතකින් ෆන්ක්ෂන් ගැන කතා සාකච්ඡා කෙරේ).

printf() යන ෆන්ක්ෂන් එකෙන් කරන්නේ එහි වරහන තුළ ලියා ඇති යමක් තිරයේ දිස් කිරීම බව ඔබට දැනටමත් අවබෝධවී ඇති. එහි සරලතම ආකාරය නම්, ඔබ යම් ප්‍රකාශනයක් වරහන තුළ උදෘත ඇතුලේ ලිවීමයි (පහත ස්ටේට්මන්ට් එක බලන්න).

printf(“This is just a sample text.”);

නිකංම ප්‍රකාශයක් සමග එස්කේප් කෝඩ්/සීක්වන්ස් අවශ්‍ය නම් ලිවිය හැකියි. ඔබ මීට පෙර දැක්කා \n යන එස්කේප් කෝඩ් එක. ඊට අමතරව තවත් එස්කේප් කෝඩ් කිහිපයක් ඇති අතර ඒවා පහත දැක්වේ.

එස්කේප් කෝඩ් එක
එහි තේරුම
\f
Form feed - ඊළඟ පිටුවට යෑම
\n
New line - ඊළඟ පේලියට යෑම
\r
Carriage return - ඉන්න පේලියේම මුලට යෑම
\t
Tab - ටැබ් ස්පේස් එකක් තැබීම
\\
Backslash - බැක්ස්ලෑෂ් අකුර දිස් කිරීම
\’
Single quote - තනි උඩුකොමාව දිස් කිරීම
\”
Double quote - ද්විත්ව උඩුකොමාව දිස් කිරීම
\b
Backspace - බැක්ස්පේස් එක ක්‍රියාත්මක කිරීම
\nnn
Octal number - ඔක්ටල් නිරූපණ ක්‍රමයෙන් ඉලක්කමක් පෙන්වීම

උදාහරණයක් ලෙස ඔබ මීට කලින් ලියපු hello_world.c ප්‍රෝග්‍රෑම් එකේ printf() ස්ටේමන්ට් එක printf(“Hello \r you\n”); ලෙස සකසා කම්පයිල් කර බලන්න. ඔබට එය රන් කරන විට තිරයේ පෙනේවි youlo යන වචනය. එසේ වීමට හේතුව සිතාගත හැකියි නේද? ප්‍රෝග්‍රෑම් එක රන් වී printf() කමාන්ඩ් එක රන් වන විට, පළමුව Hello යන වචනය ලියයි. ඉන්පසුව \r යන්න හමු වේ. එහි ප්‍රතිපලයක් ලෙස ඊළඟ වචනය/අකුරු ලියවෙන්නේ නැවතත් එම පේලියේම මුල සිටයි. ඉතිං \r ට පසුව ඇති you යන වචනය Hello යන්න උඩින් ලියැවේ. එවිට you යන්නෙහි ඇති අකුරු 3 විසින් Hello යන්නෙහි මුල් අකුරු 3 ඉවත් වේ. ඉතිරි අකුරු වන lo එලෙසම පවතීවි. එහෙත් you වෙනුවට දිගු වචනයක් තබුණේ නම්, පරණ අකුරු කිසිවක් නොපෙනෙනු ඇත (you වෙනුවට දිගු වචනයක් ලියා ප්‍රෝග්‍රෑම් එක කම්පයිල් කර බලන්න).

ඉහත hello_world ෆයිල් එකේම \r වෙනුවට \t, \f, \b යන එස්කේප් කෝඩ් ආදේශකර බලන්න. ඒවායෙන් සිදුවන දේ ඔබටම බලා ගත හැකියි. තවද, \” යන්න ලියූ විට ද්විත්ව උඩුකොමාවක් දිස් වේවි. ඔබ අසාවි ඉතිං අමුතුවෙන් බැක්ස්ලෑෂ් එකක් මොකටද නිකංම ද්විත්ව උඩුකොමාව ලිව්ව නම් හරිනෙ කියා මොකද ? යන්න දර්ශනය කිරීමට \? ලෙස නොලියා නිකංම ? ලෙසනෙ ලියන්නෙ. නැත. නිකංම ද්විත්ව උඩු කොමාවක් printf() තුල ලිවිය නොහැකියි. ඊට හේතුව දැනටමත් ද්විත්ව උඩුකොමාව විශේෂ රාජකාරියක් වෙනුවෙන් printf() භාවිතා කරනවානෙ (එනම් ඔබ ලියන සියලු දේ () තුළ ලියන්නේ " “ තුලයි). ඉතිං \ යන්නෙන් තමයි එම විශේෂ රාජකාරිය ඉස්මතු නොකර නිකංම එය දර්ශනය කරන ලෙස කම්පයිලරයට කියා සිටින්නේ. එලෙසමයි \\ යන්නත්. දැනටමත් \ යන්න එස්කේප් කෝඩ් ලිවීමේ රාජකාරිය කරන නිසා, ඔබට \ යන්න සංඛේතයක් ලෙස තිරයේ දර්ශනය කිරීමට අවශ්‍ය නම් \\ ලෙස ලිවිය යුතු වෙනවා. එලෙසම \’ ගැනත් සිතන්න.

printf() ෆන්ක්ෂන් එක තුළ ලිවිය හැක්කේ එක් " “ පමණයි. එම උදෘතය තුළ ඔබට ඕනෑ තරම් දේවල් ලිවිය හැකියි. ඒ අනුව, printf(“one string”, “another string”); ලෙස කොමා යොදා ලිවිය නොහැකියි. එහෙත් අවශ්‍ය නම්, printf(“one string” “another string”); ලෙස කොමා නොයොදා " “ කිහිපයක් ලිවිය හැකියි. තවද, හැමවිටම printf() අපේක්ෂා කරන්නේ අක්ෂර (string) නම් දත්ත වර්ගයයි (මෙය සී හි සම්මත දත්ත වර්ගයක් නොවන අතර ඒ ගැන අප තවම සලකා බලා නැති බවද සිහි තබා ගන්න; එහෙත් නමින්ම කියවෙන පරිදි මෙම දත්ත වර්ගය අකුරු හා ඉලක්කම් නියෝජනය කරන බව තේරුම් ගන්න). එනිසා පහත ආකාරයෙන් printf() ෆන්ක්ෂන් එකක් ලිවිය නොහැකියි.

#include <stdio.h>

int main()
{
int myvar = 20;
printf(myvar);
return 0;
}

ඔබ ඉහත ප්‍රෝග්‍රෑම් එක කම්පයිල් කරන විට එරර් මතු වේවි (එනම්, කම්පයිල් නොවේවි). ඊට හේතුව printf() තුල අපේක්ෂා කරන්නේ ස්ට්‍රිං දත්ත වර්ගය වුවත් ඔබ ඊට ලබා දී තිබෙන්නේ char දත්ත වර්ගයයි. එසේනම්, කොහොමද ඔබේ ප්‍රෝග්‍රෑම් එක තුල තිබෙන වේරියබල් එකක ගබඩා වී තිබෙන දත්තයක් තිරයේ දිස් කරන්නේ? එය printf() මඟින්ම සිදු කිරීමට උපක්‍රමයක් සලසා දී ඇත. උදාහරණයක් ලෙස, ඉහත කෝඩිං එක පහත ආකාරයට වෙනස් කළ යුතු වේ.

#include <stdio.h>

int main()
{
int myvar = 20;
printf("%d", myvar);
return 0;
}
කුමක්ද සිදු කළ වෙනස්කම? printf() එකේ සුපුරුදු ලෙස " “ තුල යමක් ලියා ඇත. ඊට අමතරව කොමාවක් යොදා වේරියබල් එකේ නම ලියා ඇත. මෙහිදී " “ තුළ ඔබට කැමති ප්‍රකාශයක් ලිවිය හැකියි. එහෙත් එම ප්‍රකාශය තුළ යම් තැනකට ඔබේ වේරියබල් එකක ඇති දත්තයද ඇතුලු කිරීමට අවශ්‍ය නම් %d වැනි කොටසක් අදාල තැන ලිවිය යුතුය. ඉන්පසු එම අදාල වේරියබල් එක තමයි කොමාවෙන් පසුව ලියන්නෙත්. ඉහත උදාහරණයේදී " “ තුළ නිකංම %d යන්න ලියා ඇත. එහි තේරුම කොමාවෙන් පසුව ලියා ඇති myvar යන ඉන්ටීජර් ඩේටා ටයිප් වේරියබල් එකේ දත්තය උකහා ගෙන %d වෙනුටද දර්ශනය කරන්න කියාය. මේ ආකාරයට වේරියබල් එකක් නොව ඕනෑම ගණනක් දර්ශනය කළ හැකියි. උදාහරණයක් ලෙස පහත ප්‍රෝග්‍රෑම් එක රන් කර බලන්න.

#include <stdio.h>

int main()
{
int vwidth = 20, vheight = 30, vdepth = 10;
printf("The height is %d, the width is %d, the depth is %d", vheight, vwidth, vdepth);
return 0;
}

මෙහිදී vwidth, vheight, vdepth ලෙස ඉන්ටීජර් ටයිප් වේරියබල් 3ක් සාදා ඊට යම් යම් අගයන්ද ලබා දී ඇත. ඉන්පසු printf() ෆන්ක්ෂන් එක තුළ එම දත්තයන් 3 දර්ශනය කරනවා දිගු ප්‍රකාශනයක් ලෙස. මෙහිදී පළමුවෙන්ම හමුවන %d යන්නට පළමුවෙන්ම ඇති vheight යන්න ආදේශ වේ. මේ ආකාරයට පිළිවෙලින් ඇති %d වලට පිළිවෙලින් ඒ දක්වා ඇති වේරියබල් ආදේශ වේ. එහි ප්‍රතිපලයක් ලෙස, ඉහත ප්‍රකාශය The height is 30, the width is 20, the depth is 10 ලෙස දර්ශනය වේවි.

ඇත්තටම %d ට අමතරව %u, %f, %c ලෙස තවත් ඒවා 3ක් තිබෙනවා. මේවා format specifiers හෝ conversion specifier ලෙස හැඳින්වෙනවා. දර්ශනය කරන දත්ත වර්ගය අනුව යෙදිය යුතු ස්පෙසිෆයර් එක වෙනස් වෙනවා. short, int, long යන ඒවා සඳහා %d යෙදිය හැකිය. float හා double සඳහා %f යෙදිය හැකියි. unsigned short, unsigned int, unsigned long සඳහා %u යෙදිය හැකි අතර, char සඳහා %c යෙදිය හැකියි. පහත උදාහරණය බලන්න.

#include <stdio.h>

int main()
{
int myvar = 20;
char mychar = ‘z’;
float myfloat = 200.13;
printf("The char is %c, the integer is %d, and the float is %f", mychar, myvar, myfloat);
return 0;
}

scanf() ෆන්ක්ෂන් එකෙන් කරන්නේ කීබෝඩ් එකෙන් ඇතුලු කරන දත්ත වේරියබල්වලට ගබඩා කර ගැනීමයි. පළමුව අවශ්‍ය කරන වේරියබල් ටික ඩික්ලෙයාර් කළ යුතුයි. ඉන්පසුව පහත දැක්වෙන පරිදි scanf() ෆන්ක්ෂන් එක ලිවිය යුතුයි. එනම්, පළමුව සුදුසු ස්පෙසිෆයර් එකක් " “ තුළ ලියා, කොමාවකට පසුව & සමග අදාල වේරියබල් එකේ නම ලිවිය යුතුය. එවිට, ඔබට කීබෝඩ් එකේ දත්තය ඇතුලු කිරීමට අවස්ථාවක් ලැබෙන අතර, එසේ ඇතුලු කරන දත්තය අදාල වේරියබල් එකේ ගබඩා වේ.

int myInt;
scanf(“%d”, &myInt);

ඔබට අවශ්‍ය නම්, එකවර දත්තයන් කිහිපයක් ලබා ගෙන වේරියබල් කිහිපයකට එකවර ඒවා ගබඩා කරන ලෙසද ඉහත කෝඩිං එක වෙනස් කළ හැකියි. පහත උදාහරණය බලන්න. මෙවිට කීබෝඩ් එකෙන් දත්තයන් ඇතුලු කරන විට පළමුව පළමු දත්තය ලියා හිස්තැනක් තියා (එනම් ස්පේස් කී එක ප්‍රෙස්කර) ඊළඟ දත්තය ලියා ආදී ලෙස හිස් තැන් තිය තියා අදාල දත්තයන් ටික ඇතුලු කළ යුතුය. මෙවිට ඔබ වැඩිපුර දත්තයන් ඇතුලු කළත් ඉන් ගැටලුවක් වෙන්නේ නැහැ මොකද ප්‍රෝග්‍රෑම් එක විසින් උකහා ගන්නේ ඊට අවශ්‍ය කරන දත්ත ටික පමණයි. ඔබට ඇතුලු කරන්නට තිබෙන්නේ දත්තයන් 2ක් නම් (පහත උදාහරණයේදී මෙන්), එහෙත් ඔබ දත්තයන් 10ක් ඇතුලු කළත්, ප්‍රෝග්‍රෑම් එක විසින් ලබා ගන්නේ මුල්ම දත්තයන් දෙක පමණි (අනෙක් වැඩිපුර දත්තයන් නිකංම නොසලකා හැරේ).

#include <stdio.h>

int main() {
int num1, num2;
printf("Enter two numbers: ");
scanf("%d \n %d",&num1,&num2);
printf("The product of two numbers is %d \n", num1*num2);
}

ඊටත් වඩා දත්තයන් ඇතුලු කිරීමට හොඳම ක්‍රමය තමයි, එක් එක් දත්තය ඇතුලු කර එන්ටර් කී එක එබීම. එනම්, පළමු දත්තය ඇතුලු කර එන්ටර් කරන්න; දෙවැනි දත්තය ඇතුලු කර එනටර් කරන්න; මේ ආදි ලෙස දිගටම කරන්න. මෙහිදී ප්‍රෝග්‍රෑම් එකට අවශ්‍ය දත්ත ගණන ඇතුලු කරන තෙක් ඔබට දත්ත ඇතුලු කිරීමට අවස්ථාව ලබා දේ. ඊට අවශ්‍ය අවසාන දත්තයද ලැබුණු පසුව ඉබේම ඔබට දත්ත ඇතුලු කිරීමට අවස්ථාව අවසාන කරනවා. මෙහි ඇති වාසිය එයයි (එනම්, බොරුවට ප්‍රෝග්‍රෑම් එකට අවශ්‍ය ප්‍රමාණයට වඩා දත්ත ඇතුලු කිරීමට ඇති අවස්ථාව අහිමි වීම).


Comments

Popular posts from this blog

Let's Learn Sinhalese in English 17 (final)

I will show you the Sinhala alphabet. I recommend learning it too.   Following picture shows the Sinhala vowels . Beside (in front of) each letter is the name of the letter and below each letter is the sound it represents. The first 12 vowels are very important. The following picture shows the consonants of Sinhala alphabet (not in the conventional order and format). I have crossed out some letters which are redundant and useless (I vehemently support removing these pesky letters from the operating alphabet ). Actually you should remember all the letters, but I suggest you to use only the letters that are not crossed out. Sinhala alphabet is phonetic (that is, each letter shall have one dedicated sound only), therefore it is easier to use than English alphabet. Consonant letters cannot be sounded on their own, and you have to use vowels to aid in them to be pronounced. In English, you just place the vowel just after the constant. For example: ...

ඉලෙක්ට්‍රෝනික්ස් II (Electronics) - 6

විශේෂ ප්‍රතිරෝධක ඉහත සාකච්ඡා කළ නියත හා විචල්‍ය ප්‍රතිරෝධක හැරුණහම , තවත් සුවිශේෂී ජනප්‍රිය ප්‍රතිරෝධක වර්ග කිහිපයක්ද තිබෙනවා . මේවා ආලෝකය , උෂ්ණත්වය වැනි විවිධ භෞතික රාශින්ට සංවේදී ප්‍රතිරෝධකයි . මේ අතරින් සුලභම වර්ගය තමයි ආලෝකයට සංවේදී ප්‍රතිරෝධක වර්ගය . මේවා ප්‍රකාශ - ප්‍රතිරෝධක (photoresistor) හෝ “ආලෝකයට සංවේදී ප්‍රතිරෝධක” (Light Dependent Resistor – LDR) ලෙස හැඳින් වෙනවා . එහි සාමාන්‍ය භාහිර හැඩය පහත දැක්වේ .   මෙම ප්‍රතිරෝධයේ හිස මත තිබෙන්නේ ආලෝකයට ඉතා සංවේදී කැඩ්මියම් සල්ෆයිඩ් (CdS), ලෙඩ් සල්ෆයිඩ් (PbS), කැඩ්මියම් සෙලිනයිඩ් (CdSe) ආදී යම් රසායනික ද්‍රව්‍යයකි . එම ද්‍රව්‍යයන්වල ඉතා ඉහල ( බොහෝවිට 500k ohm වැනි ) ප්‍රතිරෝධි අගයන් තිබේ . එහෙත් ඒ මතට ආලෝකය වැටෙන විට , ප්‍රතිරෝධි අගය සීඝ්‍රයෙන් පහළ යයි ( බොහෝවිට ඕම් 500 වැනි ). මෙහිදී කිව යුතු වැදගත් කරුණ නම් , ඉහත සඳහන් කළ ( හා නොකළ ) ආලෝක සංවේදී රසායනික ද්‍රව්‍ය එකම ආකාරයෙන් ආලෝකයට සංවේදී නොවේ . සමහර ඒවා “ආලෝකයේ රතු පැත්තට” ( ඒ කියන්නේ දිගු තරංග ආයාම සහිත ආලෝකයට ) සංවේදිතාව දක්වන අතර , තවත් සමහර ඒවා “ආලෝකයේ නිල් / ද...

දෛශික (vectors) - 1

එදිනෙදා ජීවිතයේදිත් විද්‍යාවේදිත් අපට විවිධාකාරයේ අගයන් සමඟ කටයුතු කිරීමට සිදු වෙනවා . ඉන් සමහරක් නිකංම සංඛ්‍යාවකින් ප්‍රකාශ කළ හැකි අගයන්ය . අඹ ගෙඩි 4 ක් , ළමයි 6 දෙනෙක් ආදී ලෙස ඒවා ප්‍රකාශ කළ හැකියි . තවත් සමහර අවස්ථාවලදී නිකංම අගයකින් / සංඛ්‍යාවකින් පමණක් ප්‍රකාශ කළ නොහැකි දේවල් / රාශි (quantity) හමු වේ . මෙවිට “මීටර්” , “ තත්පර” , “ කිලෝග්‍රෑම්” වැනි යම් ඒකකයක් (unit) සමඟ එම අගයන් පැවසිය යුතුය ; නැතිනම් ප්‍රකාශ කරන අදහස නිශ්චිත නොවේ . උදාහරණයක් ලෙස , “ මං 5 කින් එන්නම්” යැයි කී විට , එම 5 යනු තත්පරද , පැයද , දවස්ද , අවුරුදුද ආදි ලෙස නිශ්චිත නොවේ . මේ දෙවර්ගයේම අගයන් අදිශ (scalar) ලෙස හැඳින්වේ . අදිශයක් හෙවත් අදිශ රාශියක් යනු විශාලත්වයක් පමණක් ඇති දිශාවක් නැති අගයන්ය . ඔබේ වයස කියන විට , “ උතුරට 24 යි , නැගෙනහිරට 16 යි” කියා කියන්නේ නැහැනෙ මොකද දිශාව යන සාධකය / කාරණය වයස නමැති රාශියට වැදගත්කමක් නැත . එහෙත් සමහර අවස්ථා තිබෙනවා අගයක් / විශාලත්වයක් (magnitude) මෙන්ම දිශාවක්ද (direction) පැවසීමට සිදු වන . මෙවැනි රාශි දෛශික (vector) ලෙස හැඳින්වේ . උදාහරණයක් ලෙස , ඔබ යම් “බලයක්...