Məntiqi Operatorlar
Məntiqi operatorlar bool tipli dəyişənlər üzərində işləmək və klassik məntiq əməliyyatlarını yerinə yetirmək üçündür. Məsələn ―mətbəxə gedib mənə bir bıçaq VƏ bir çəngəl gətirin‖ cümlərində klassik məntiq (VƏ) özünü göstərir. Bu məntiqə əsasən mətbəxdən bıçaq tapmasanız mənə çəngəl gətirməməlisiniz ya da çəngəl olmasa mənim üstümə sadəcə bıçaqla gəlməməlisiniz. Əgər ikisi də varsa onda ikisini də gətirməlisiniz. Əgər mən cümləni ―mətbəxə gedib mənə bir bıçaq VƏ YA bir çəngəl gətirin‖ şəklində ifadə etmiş olsaydım, onda mətbəxdə bıçaq yoxdursa mənə çəngəli, əgər çəngəl yoxdursa onda bıçağı, əgər hər ikisi varsa hər ikisini gətirməli idiniz. Məntiqi operatorlar da bu məntiqlə işləyir. Əgər bir azca diskret riyaziyyat anlayışınız varsa, onda məntiqi operatorları siz artıq bildiniz. C# -da məntiqi operatorlar aşağıdakılardır:
Operator Mənası Diskret riyaziyyatda
& VƏ Konyunksiya
|
|
VƏ YA
|
Dizyunksiya
|
^
|
XOR
|
mod(2)-ə görə cəm
|
!
|
İnkar
|
İnkar
|
&&
||
|
Şərtə bağlı VƏ
Şərtə bağlı VƏ YA
|
|
& məntiqi operatorunun operandları qeyd olunduğu kimi, bir bool tipdə dəyişənlər və ya sabitlər olmalıdır. Bu operator yalnız o zaman true qiymət qaytarır ki, operandların hər ikisi true olsun. | operatoru o zaman yanlış qiymət qaytarır ki, operandların hər ikisi yanlış olsun. ^ operatoru o zaman doğru qiymət qaytarır ki, operantlardan biri false olduqda digəri true olsun. ! operatorunu vahid operatorlar hissəsində qeyd etmişdik. Bu operator tək bir operand tələb edən məntiqi operatordur. Operatorun məntiqi dəyişənə tətbiqinin nəticəsi, həmin dəyişənin əks qiymətinin əldə olunmasına səbəb olur. Yəni
!true = false və
!false = true
Diskret riyaziyyatda true və false yerinə 1 və 0 – dan istifadə olunur. Odur ki, true = 1, false = 0 qəbul olunur. Məntiqi operatorların operandları bool tipində olduğu kimi, bu operatorların da nəticəsi bool tipindədir. Aşağıdakı cədvər məntiqi operatorları və onların müvafiq məntiqi dəyişənlərə tətbiqinin nəticəsini əks etdirir:
a
|
b
|
a & b
|
a | b
|
a ^ b
|
!a
|
true
|
true
|
true
|
true
|
false
|
false
|
true
|
false
|
false
|
true
|
true
|
false
|
false
|
true
|
false
|
true
|
true
|
true
|
false
|
false
|
false
|
false
|
false
|
true
|
Aşağıdakı proqram baxaq. Bu proqram 10 ilə 50 arasındakı, sonuncu rəqəmi 0 ilə 6 olan cüt ədədləri əks etdirəcək. Məlumdur ki, cüt ədət 2-ə tam bölünən ədədlərdir.
using System; class Soft
{
public static void Main()
{
for (int i = 10; i < 50; i++)
{
if((i % 2 == 0) & (i % 10 == 0 | i % 10 == 6))
Console.WriteLine(i);
}
Console.ReadKey();
}
}
Proqramın nəticəsi aşağıdakı kimi olur:
If ifadəsinin içərisinə fikir verin.
(i % 2 == 0) & (i % 10 == 0 | i % 10 == 6))
Ifadəsinin mənası o deməkdir ki, ―2 - ə tam bolünən eyni zamanda (VƏ) sonuncu
rəqəmi 0 VƏ YA 6 olan ədədləri ekranda çap et‖.
Növbəti misala baxaq. Bu proqram daxil edilən iki tam ədədin ƏKOB – nu tapacaq. a və b ədədlərinin ƏKOB – u elə c ədədinə deyilir ki, bu ədəd a və b ədədlərinin hər ikisiniə tam bölünən ədədlərin ən kiçiyi olsun.
using System; class Soft
{
public static void Main()
{
Console.Write("Birinci ededi daxil edin: ");
int eded1 = Convert.ToInt32(Console.ReadLine());
Console.Write("Ikinci ededi daxil edin: ");
int eded2 = Convert.ToInt32(Console.ReadLine()); int max;
if (eded1 >= eded2) max = eded1;
else
max = eded2; bool saxla = true;
for (int i = max; i < 1000000; i++)
{
if (saxla == true)
{
if ((i % eded1 == 0) & (i % eded2 == 0))
{
i);
Console.WriteLine(eded1 + " ve " + eded2 + " ededlerinin EKOB - u: " +
saxla = false;
}
}
}
Console.ReadKey();
}
}
Məlumdur ki, iki ədədin ƏKOB – u o ədədlərin böyük olanından kiçik ola bilməz. Çünki kiçik olsa, artıq həmin ədəd böyük olan ədədə tam bölünməz. Buna görə də, əvvəlcə daxil edilən iki ədədin ən böyüyünü max adlı dəyişənə mənimsətdik. Sonra bu max ədədindən 1000000 – a qədər dövr qurduq və həm eded1-ə həm də eded2-ə tam bölünən ə ədi ekranda əks etdirdik. Aydındır ki, bu ədəd ən kiçik bölünən ədəd olacaq. Çünki biz aşağıdan yuxarıya doğru gedirik. İlk bölünmədə artıq digər elementlərin yoxlanılmağı bizi maraqlandırmadığı üçün dövrü saxlamalıyıq. Bunun üçün də əlavə bir saxla adlı bool dəyişəndən istifadə etdik. Beləliklə proqramın nəticəsi aşağıdakı kimi olacaq:
Şərtə Bağlı Məntiqi Operatorlar
Şərtə bağlı məntiqi operatorlar && və || operatotlarıdır. Bu operatorlar da uyğun olaraq & və | operatoları kimi işləyir. Lakin onlardan kiçik bir fərqləri var. Məsələn, konkret olaraq & operatoruna baxaq. Əvvəlki cədvəldən də göründüyü kimi & operatorunun nəticəsinin false olması üçün operandların heç olmasa hansısa birinin false olması kifayətdir. Yəni, soldakı operand false olarsa, sağdakının nə olmasından asılı olmayaraq cavab false olacaq. Amma & operatoru soldakının cavabı nə olarsa olsun sağdakını da nəzərə alır. Yəni soldakının false olmağı, ümumi nəticənin false olmağı deməkdir, amma & operatoru haqqsızlıq olmasın deyə sağdakə operandı nəzərə alır. Amma belə baxanda soldakı operand false olarsa, sağdakını nəzərə almağa nə lüzum var? Onsuz da cavab false olacaq. Niyə əlavə vaxt itirib sağdakı operandın cavabının hesablanması üçün əməliyyat yerinə yetirək? Məhz bu işi yerinə yetirmək üçün & operatoruna alternativ olan && operatoru mövcuddur. Beləliklə && operatoru əgər soldakı operand false olarsa sağ tərəfə ümumiyyətlə ―baxmır‖. Əgər sol operand true olarsa, məlumdur ki, sağdakı hökmən nəzərə alınacaq. Bu fərqi aşağıdakı proqram daha gözəl ifadə edir. Bu proqramda b dəyişəninin a – nın böləni olub-olmadığı yoxlanılır.
using System; class Soft
{
public static void Main()
{
int a = 10; int b = 0;
if((b!= 0) & (a % b == 0)) Console.WriteLine("b, a - nin bolenidir");
Console.ReadKey();
}
}
if((b!= 0) & (a % b == 0)) sətrinə fikir verək. Əvvəlcə b dəyişəninin sıfırdan fərqli olmağı yoxlanılır (b!= 0). Çünki sıfıra bölmə yoxdur. Sonra isə a dəyişənin b - ə qalıqsız bölünüb-bölünmədiyi yoxlanılır (a % b == 0). Bu münasibətdə b!= 0 şərti səhvdir, beləliklə if kontrol ifadəsinin şərti ödənmir və deməli b, a – nın böləni deyil. Lakin, & operatoru öz ənənəsinə sadiq qalaraq sağ tərəfi də nəzərə alır və a % b == 0 əməliyyatı yerinə yetirilməyə çalışır. b sıfır olduğu üçün isə, bu hissədə sıfıra bölmə xətası ilə qarşılaşırıq:
Lakin, & operatorunun yerinə && yazsaydıq, b! = 0 şərti səhv olduğu üçün sağ tərəf nəzərə alınmayacaqdı, deməli a % b == 0 əməliyyatı hesablanmayacaq və proqram bizə xəta verməyəcəkdi. Proqramın tam halı aşağıdakı kimi olacaqdır:
using System; class Soft
{
public static void Main()
{
int a = 10;
int b = 0;
if((b!= 0) && (a % b == 0)) Console.WriteLine("b, a - nin bolenidir");
else Console.WriteLine("b, a - nin boleni deyil"); Console.ReadKey();
}
}
|| operatoru üçün də tamamilə eyni sözləri demək olar. Yəni ||operatoruna görə, əgər sol tərəf true olarsa, sağ tərəfin nə olmasından asılı olmayaraq ümumi nəticə true olacaq. Göründüyü kimi bu operatorlar bəzi hallarda ancaq bir tərəfi – bir operandı nəzərə alır. Buna görə onlara şərtə bağlı operatorlar deyilir. Onu da qeyd edək ki, köhnə nəzəriyyələrdə bu operatorlara ―qısa qapanma məntiqi operatorlar‖ da deyilir.
Dostları ilə paylaş: |