Bir tipdə olan dəyişəni, başqa tipdə olan dəyişənə mənimsətmək, proqramlaşdırmada tez-tez istfadə olunur. Amma bəzən mənimsədilən dəyişənin tipi, hədəf tipdən fərqli olur. Məsələn, string int çevrilməsi heç vaxt avtomatik yerinə yetirilə bilməz. Avtomatik çevrilmənin qaydalarını yadınıza salın, belə vəziyyətdə qaydaların heç biri ödənmir. Hətta açıq tip mənimsətmədən də istifadə edə bilmərik. Bəs, məsələn simvol olaraq sadəcə rəqəmlərdən ibarət olan bir string dəyişəni tam tipə necə çevirək? Niyə də olmasın? Məsələn,
String str = ―4589‖;
dəyişənini bir tam tipdə olan dəyişənə mənimsətmək istəyə bilərik. Burada mənasız bir
çey yoxdur. Nəticə etibarilə, str dəyişəni sadəcə rəqəmlərdən ibarətdir. Bu halda int a = str; və ya int a = (int) str;
ifadələrinin hər biri xətaya səbəb olacaq. Deməli, alternativ çıxış yolu lazımdır. .NET Framework işərisində gələn Convert sinfi məhz bu iş üçün nəzərdə tutulub. Bu sinfin içərisində müxtəlif metodlar var ki, bu şəkildə uyumsuz tiplər arasında çevrilməni təmin edir (hələki sinif və metod anlayışınız yoxdur, narahat olmayın, rahat nəfəs alın və hələki müəyyən şeyləri əzbərləyin). Həmin metodlar aşağıdakılardır:
ToByte(qiymət) – parametrinə ötürülən qiyməti byte tipinə çevirir və geri qaytarır. ToInt16(qiymət) – parametrinə ötürülən qiyməti short tipinə çevirir və geri qaytarır. ToInt32(qiymət) – parametrinə ötürülən qiyməti int tipinə çevirir və geri qaytarır.
ToInt64(qiymət) – parametrinə ötürülən qiyməti long tipinə (yəni 64 bitlik int- ə) çevirir və geri qaytarır.
ToDouble(qiymət) – parametrinə ötürülən qiyməti double tipinə çevirir və geri
qaytarır.
ToUInit32(qiymət) – parametrinə ötürülən qiyməti uint tipinə çevirir və geri qaytarır.
ToString(qiymət) – parametrinə ötürülən qiyməti string tipinə çevirir və geri qaytarır.
Buraya hamısını yazmadım. Digərlərini də adlarına görə müəyyənləşdirmək üçün, çox kiçik məntiq lazımdır. İndi bir nümunəyə baxaq:
using System; class Soft
{
public static void Main()
{
string str1 = "64"; string str2 = "10";
int eded = Convert.ToInt32(str1); //(1) int quvvet = Convert.ToInt32(str2); //(2) long netice = 1;
for (int i = 0; i < quvvet; i++)
{
netice = netice * eded;
}
Console.WriteLine("64 ededinin 10-cu quvveti: " + netice);
Console.ReadKey();
}
}
Bu proqram eded adlı dəyişənin quvvet adlı qüvvətini hesablayır. A dədinin N – ci qüvvəti, a ədədini N dəfə öz-özünə vurmaq deməkdir. Məsələn, 10 ədədinin 4-cü qüvvəti 10^4 = 10*10*10*10 = 10000 edir. Buna görə də dövr qurduq və hər dövrdə eded dəyişənini özünə vurduq. Burada xüsusilə (1) və (2) sətirlərinə diqqət edin. str1 və str2 dəyişənlərinin hər biri string tipdədir. Ona görə str1-i tam ədədə çevirmək üçün
int eded =Convert.ToInt32(str1);
şəklində kod yazdıq. Bu kodun mənası belədir: ―str1 dəyişəninin qiymətinin bir tam ədəd versiyasını əldə et və onu eded adlı dəyişənə mənimsət‖. (2) kod sətri də eyni cür işləyir. Beləliklə, proqramın nəticəsi aşağıdakı kimi olur:
64 ededinin 10-cu quvveti: 1152921504606846976
Bu nöqtəyə qədər ədədləri əvvəlcədən daxil edirdik. İndi proqram açılanda klaviaturadan daxi edilən məlumatlar üzərində işləyək. Məsələn klaviaturadan daxil edilən ədədin faktorialını hesablayan proqram yazaq. Klaviaturada olan hər şey bir simvol olduğu üçün, klaviaturadan daxil edilənlər əslində birbaşa string kimi qəbul olunur. Ona görə də klaviaturadan daxi edilən məlumatı əvvəlcə tama çevirməliyik. Klaviaturanı oxumaq üçün Console sinfindəki statik ReadLine() metodundan istifadə edilir. Bu metod klaviaturadan daxil olunan simvolları yan-yana düzür və ―Enter‖ düyməsi basılanda yan-yana düzülmüş simvolları bütov string kimi geri qaytarır.
Bir ədədin faktorialı, 1-dən həmin ədədə qədər (həmin ədəd də daxil olmaqla) olan ədədlərin hasilinə bərabərdir. Məsələn 4! = 1 * 2 * 3 * 4 = 24 edir. Beləliklə, faktorial hesablayan proqrammımız aşağıdakı kimi olacaq:
using System; class Soft
{
public static void Main()
{
string klaviatura; // (1) Console.Write("Eded daxil edin: "); klaviatura = Console.ReadLine(); //(2)
int eded = Convert.ToInt32(klaviatura); //(3) long netice = 1;
for (int i= 1; i <= eded; i++)
{
netice = netice * i;
}
Console.WriteLine(eded + "! = " + netice); Console.ReadKey();
}
}
Bu proqramda (1) sətri bir string dıyişən təyin edir, bu dəyişən klavituradan daxi olunanları özündə saxlayacaq. (2) sətri bu dıyişənə klaviaturadan daxil olunanları mənimsədir. (3) sətri bu dəyişənin və deməli klaviaturadan daxil olunanların qiymətini tam ədəd kimi eded dəyişəninə mənimsədir. Nəhayət faktorial hesablanır və ekran nəticəsi aşağıdakı kimi olur:
Eded daxil edin: 5 5! = 120
QEYD: 0! = 1;
Diqqətli olmağımız gərəkən bəzi nüanslar var. Deməli Məsələn ToInt32 metodu hansısa dəyişəni ―zorla‖ tam ədədə çevirir. Yuxarıda string dəyişənlərin qiymətləri ancaq rəqəmlərdən ibarət idi və bu rəqəmlərin əmələ gətirdiyi tam ədəd, int tipinin qiymətlər diapazonunu aşmır. Bununla belə aşağıdakı proqrama baxaq:
using System; class Soft
{
public static void Main()
{
string s1 = "Laliko"; //(1)
string s2 = "878964568415894561986451845"; //(2)
int eded = Convert.ToInt32(s1); eded = Convert.ToInt32(s2); Console.ReadKey();
}
}
Burada (1) sətrinə fikir verək. ―Laliko‖ ifadəsi, bir tam ədəd kimi necə təsvir olunsun axı? Bu sətir bizə ―FormatException‖ xətasını verəcək. Yəni format düzgün deyil. (2) sətrində isə str2 dəyişəninin qiyməti ancaq rəqəmlərdən ibarət olsa da, onun qiyməti int tipinin diapazonunu aşır. Bu isə bizə ―OverflowException‖ xətasını verəcək.
Dostları ilə paylaş: |