Toshkent davlat iqtisodiyot universiteti raqamli iqtisodiyot fakulteti Java dasturlash tili fanidan Mustaqil ish Mavzu: Javada ma’lumotlarni bir turdan boshqa turga o’tkazish



Yüklə 4,3 Mb.
səhifə1/6
tarix04.09.2023
ölçüsü4,3 Mb.
#121309
  1   2   3   4   5   6
At-83 Shodiyev Sunnatbek i


TOSHKENT DAVLAT IQTISODIYOT UNIVERSITETI
Raqamli iqtisodiyot fakulteti
Java dasturlash tili
fanidan
Mustaqil ish
Mavzu: Javada ma’lumotlarni bir turdan boshqa turga o’tkazish

Bajardi: Shodiyev Sunnatbek


Tekshirdi:Zoirov.O’

Har bir asosiy ma'lumot turi ma'lum miqdordagi bayt xotirani egallaydi. Bu har xil turdagi ma'lumotlar bilan bog'liq operatsiyalarga cheklov qo'yadi. Quyidagi misolni ko'rib chiqing:



Ushbu kodda biz xatolikka duch kelamiz. Bayt turi ham, int turi ham butun sonlarni ifodalasa ham. Bundan tashqari, bayt tipidagi o'zgaruvchiga tayinlangan a o'zgaruvchisining qiymati bayt turi uchun qiymatlar oralig'ida (-128 dan 127 gacha). Biroq, biz kompilyatsiya vaqtida xatolikka duch kelamiz. Chunki bu holda biz faqat bir baytni egallagan o'zgaruvchiga 4 baytni egallagan ba'zi ma'lumotlarni belgilashga harakat qilamiz.

Biroq, dastur bunday konvertatsiya qilishni talab qilishi mumkin. Bunday holda, siz turni o'zgartirish operatsiyasidan foydalanishingiz kerak (operatsiya ()):



turdagi konvertatsiya: int turidan bayt turiga
System.out.println(b); // 4
Turni o'zgartirish operatsiyasi qavslar ichida qiymat o'zgartirilishi kerak bo'lgan turni ko'rsatishni o'z ichiga oladi. Masalan, (bayt)a operatsiyasida int tipidagi ma'lumotlarni bayt tipiga o'tkazish sodir bo'ladi. Natijada bayt turi qiymatini olamiz.
Aniq va yashirin konversiyalar
Har xil turdagi ma'lumotlar bir xil operatsiyaga jalb qilinganda, har doim ham turni o'zgartirish operatsiyasidan foydalanish shart emas. Transformatsiyalarning ayrim turlari bilvosita, avtomatik ravishda amalga oshiriladi
Avtomatik konversiyalar

Rasmdagi o'qlar qaysi turdagi konversiyalarni avtomatik ravishda amalga oshirish mumkinligini ko'rsatadi. Chiziqli strelkalar aniqlikni yo'qotgan holda avtomatik konversiyalarni ko'rsatadi.

Kengaytiruvchi transformatsiyalar (kengaytirish) hech qanday muammosiz avtomatik tarzda amalga oshiriladi - ular ob'ektning xotirada tasvirini kengaytiradi. Masalan:

baytdan intga aylantirish
Bunda xotirada 1 baytni egallagan bayt tipidagi qiymat 4 baytni egallagan int turiga kengaytiriladi.

Kengaytirilgan avtomatik transformatsiyalar quyidagi zanjirlar bilan ifodalanadi:

bayt -> qisqa -> int -> uzun

int -> double

qisqa -> float -> double

char -> int

Aniq konversiyalarni avtomatik yo'qotish
Ba'zi konvertatsiyalar bir xil bit chuqurlikdagi ma'lumotlar turlari o'rtasida yoki hatto kattaroq bit chuqurligi bo'lgan ma'lumotlar turidan kichikroq bit kengligidagi ma'lumotlar turiga avtomatik ravishda amalga oshirilishi mumkin. Bular quyidagi konversiya zanjirlari: int -> float, long -> float va long -> double. Ular xatosiz ishlab chiqariladi, lekin biz konvertatsiya paytida ma'lumotlarning yo'qolishiga duch kelishimiz mumkin.

Masalan:


// 2.14748365E9
Aniq konvertatsiyalar
Boshqa barcha ibtidoiy turdagi konversiyalar turni o'zgartirish operatsiyasini aniq qo'llaydi. Odatda bu kattaroq bit chuqurligi bo'lgan turdan pastroq bit kengligidagi turga toraytiruvchi konvertatsiya (toraytirish):

Konvertatsiya paytida ma'lumotlarning yo'qolishi
Aniq konvertatsiyalarni qo'llashda ma'lumotlar yo'qolishiga duch kelishimiz mumkin. Masalan, quyidagi kodda bizda hech qanday muammo bo'lmaydi:

5 raqami bayt tipidagi qiymatlar oralig'ida yaxshi, shuning uchun konversiyadan so'ng b o'zgaruvchisi 5 ga teng bo'ladi. Ammo quyidagi holatda nima bo'ladi:

Natijada 2 raqami bo'ladi. Bunday holda, 258 raqami bayt turi uchun diapazondan tashqarida (-128 dan 127 gacha), shuning uchun qiymat kesiladi. Nima uchun natija aynan 2 raqami?

Ikkilik tizimda 258 ga teng bo'lgan a soni 00000000 00000000 00000001 00000010 ga teng bo'ladi. Bayt qiymatlari xotirada atigi 8 bitni egallaydi. Shuning uchun int ning ikkilik ko'rinishi o'ngga 8 ta raqamga, ya'ni 00000010 ga qisqartiriladi, bu kasrda 2 raqamini beradi.

Ratsional sonlarni butun sonlarga qisqartirish
O'zgaruvchan nuqta qiymatlarini butun qiymatlarga o'tkazishda kasr qismi kesiladi:

Bu erda b qiymati 56 bo'ladi, garchi 57 56,9898 ga yaqinroq bo'lsa ham. Bunday hodisalarning oldini olish uchun Java matematik kutubxonasida joylashgan yaxlitlash funktsiyasidan foydalanishingiz kerak:

Tranzaksiya o'zgarishlari
Har xil turdagi qiymatlarda qo'shish va mahsulot kabi turli xil operatsiyalarni qo'llash kerak bo'lgan holatlar odatiy hol emas. Bu erda ham ba'zi qoidalar qo'llaniladi:

agar operatsiya operandlaridan biri double tipidagi bo'lsa, ikkinchi operand ham double turiga o'tkaziladi

agar oldingi shart bajarilmasa va operatsiya operandlaridan biri float turiga ega bo'lsa, ikkinchi operand float tipiga o'tkaziladi.

agar oldingi shartlar bajarilmasa, operatsiya operandlaridan biri long turiga ega bo'lsa, ikkinchi operand long turiga aylantiriladi.

aks holda, operatsiyaning barcha operandlari int turiga aylantiriladi

Transformatsiyaga misollar:



Ikkilamchi turdagi qiymat operatsiyada ishtirok etganligi sababli, boshqa qiymat ham qo'sh turdagi turga o'tkaziladi va ikkita qiymat yig'indisi a + b qo'sh turni ifodalaydi.

Yana bir misol:



Bayt va qisqa turdagi ikkita o'zgaruvchilar (double, float yoki long emas), shuning uchun ular qo'shilganda int turiga aylantiriladi va ularning a+b yig'indisi int qiymatini ifodalaydi. Shuning uchun, agar biz bu yig'indini bayt tipidagi o'zgaruvchiga belgilasak, u holda biz yana bayt turini o'zgartirishimiz kerak.
Ba'zida bir turdagi o'zgaruvchiga boshqa turdagi o'zgaruvchiga qiymat berish zarur bo'lganda vaziyatlar yuzaga keladi. Masalan:

int i = 11;


bayt b = 22;
i = b;
Java-da konversiyalarning ikki turi mavjud - avtomatik konvertatsiya (yo'q) va turdagi casting (aniq konvertatsiya).

Java Photo-da transformatsiyaning ikki turi

1. Avtomatik Java turini o'zgartirish
Birinchi avtomatik konvertatsiyani ko'rib chiqing. Ikkala tur ham mos bo'lsa, ularni o'zgartirish Java tomonidan avtomatik ravishda amalga oshiriladi. Masalan, oldingi misolda ko'rsatilganidek, bayt tipidagi qiymat har doim int tipidagi o'zgaruvchiga berilishi mumkin.

Avtomatik turdagi konvertatsiya qilish uchun ikkita shart bajarilishi kerak:

ikkala tur ham mos kelishi kerak
maqsad turi uzunligi manba turi uzunligidan kattaroq bo'lishi kerak
Bunday holda, kengaytmali konvertatsiya mavjud.

Quyidagi diagrammada Java-da kengaygan konvertatsiya ko'rsatilgan:

Java fotosuratidagi ibtidoiy turlar uchun mos konvertatsiyalar sxemasi

Qattiq chiziqlar ma'lumotlarni yo'qotmasdan amalga oshirilgan konversiyalarni bildiradi. Chiziqli chiziqlar konvertatsiya paytida aniqlik yo'qolishi mumkinligini ko'rsatadi.

Misol uchun, int ma'lumotlar turi har doim bayt turining barcha haqiqiy qiymatlarini saqlash uchun etarlicha katta, shuning uchun bu holda aniq translatsiya operatorlari talab qilinmaydi. Konvertatsiyani kengaytirish nuqtai nazaridan raqamli ma'lumotlar turlari, shu jumladan butun va suzuvchi nuqta bir-biriga mos keladi. Shu bilan birga, raqamli turlarni char yoki mantiqiyga avtomatik ravishda o'zgartirish yo'q. Char va mantiqiy turlari ham bir-biriga mos kelmaydi.

Nima uchun, masalan, bayt turi avtomatik ravishda (so'zsiz) char turiga o'tkazilmasligini bir oz tushuntirib o'tish joiz, garchi bayt turi 8 bit kengligida va char turi 16 bit bo'lsa ham.Shunday narsa qisqa matnni aylantirish uchun ham amal qiladi. belgiga kiriting. Buning sababi shundaki, bayt va qisqa imzolangan ma'lumotlar turlari, char esa imzosiz. Shuning uchun, bu holda, siz aniq castni ishlatishingiz kerak, chunki siz kompilyatorga nimani xohlayotganingizni va char turiga o'tishda bayt va qisqa turlarning belgi bitlari qanday ishlanishini aniq aytishingiz kerak.

Char qiymatining xatti-harakati ko'p hollarda butun son tipidagi qiymat bilan bir xil bo'ladi, shuning uchun char qiymati int yoki uzun qiymat talab qilinadigan har qanday joyda ishlatilishi mumkin. Eslatib o'tamiz, char turi imzosiz, shuning uchun har ikkala turdagi diapazoni 16 bit bo'lsa ham, u qisqa turdan farq qiladi.

2. Java Type Casting


Avtomatik turdagi konvertatsiya qilishning barcha qulayliklariga qaramay, u barcha shoshilinch ehtiyojlarni qondira olmaydi. Misol uchun, bayt o'zgaruvchiga int qiymatini belgilashni xohlasangiz nima bo'ladi? Ushbu konvertatsiya avtomatik ravishda amalga oshirilmaydi, chunki bayt turi int turidan qisqaroq. Ushbu turdagi konvertatsiya ba'zan toraytiruvchi konvertatsiya deb ataladi, chunki qiymat maqsadli ma'lumotlar turiga mos kelish uchun aniq toraytirilgan.

Ikkita mos kelmaydigan ma'lumotlar turini aylantirish uchun siz translatsiyadan foydalanishingiz kerak. Cast - bu faqat aniq turdagi konvertatsiya. Tip quyishning umumiy shakli quyidagicha:

(maqsad_turi) qiymati
bu yerda target_type belgilangan qiymatni aylantirish uchun turni belgilaydi.

Masalan, quyidagi kod parchasi intni baytga aylantiradi:

int i = 11;
bayt b = 22;
b = (bayt)i;
Keling, suzuvchi nuqta qiymatlarini butun sonlarga aylantirish misolini ko'rib chiqaylik. Ushbu misolda suzuvchi nuqta qiymatining kasr qismi shunchaki o'chiriladi (kesish operatsiyasi):

ikki barobar d = 3,89;


int a = (int) d; // Natija 3 bo'ladi
Ko'proq sig'imli tamsayı turini kamroq sig'imli tamsayı turiga o'tkazishda yuqori bitlar shunchaki o'chiriladi:

int i = 323;


bayt b = (bayt) i; //Natija 67 bo'ladi
Kattaroq suzuvchi nuqta qiymatini butun songa o'tkazishda eng muhim bitlar kesiladi va o'chiriladi:

juft d = 38988987779,89;


qisqa s = (qisqa) d; //Natija -1 bo'ladi
3. Ifodalardagi turlarni avtomatik ravishda ko'tarish
Belgilash operatsiyalaridan tashqari, ifodalarda ma'lum turdagi konvertatsiyalar ham amalga oshirilishi mumkin.

Java tilida quyidagi qoidalar mavjud:

Agar operandlardan biri double turiga ega bo'lsa, ikkinchisi ham double tipiga o'tkaziladi.
Aks holda, agar operandlardan biri float tipida bo'lsa, ikkinchisi ham float tipiga o'tkaziladi.
Aks holda, agar operandlardan biri long turiga ega bo'lsa, ikkinchisi ham long turiga aylantiriladi.
Aks holda, ikkala operand ham int turiga aylantiriladi.
Birlashtirilgan topshiriq ifodalarini (+=,-=,*=,/=) chiqarish shart emas.
Mana bir misol:

b1 (bayt) o'zgaruvchisini 2 (int) ga ko'paytirish intga olib keladi. Shuning uchun, agar siz natijani b2 (bayt) o'zgaruvchiga belgilashga harakat qilsangiz, kompilyatsiya xatosi paydo bo'ladi. Ammo birlashtirilgan tayinlash operatoridan (*=) foydalanilganda, bu muammo yuzaga kelmaydi:



Quyidagi misolda kompilyatsiya xatosi ham sodir bo'ladi - bayt tipidagi raqamlar qo'shilganiga qaramay, operatsiya natijasi qisqa emas, int turi bo'ladi.
umumiy sinf IntegerDemo1 {
umumiy statik void main(String[] args) {
Quyidagi misol avvalgisiga o'xshaydi, lekin birlashtirilgan tayinlash operatoridan foydalanadi, unda translatsiya avtomatik ravishda amalga oshiriladi:

umumiy sinf IntegerDemo2 {


umumiy statik void main(String[] args) {

Qattiq chiziqlar ma'lumotlarni yo'qotmasdan amalga oshirilgan konversiyalarni bildiradi. Chiziqli chiziqlar konvertatsiya paytida aniqlik yo'qolishi mumkinligini ko'rsatadi.

Avtomatik konvertatsiya


Xo'sh, keling, "avtomatik konvertatsiya" nima ekanligini tushunishga harakat qilaylik.

Esda tutingki, biz o‘zgaruvchilarning turlarini ko‘rib chiqqanimizda (“Java’da o‘zgaruvchilar. O‘zgaruvchini yaratish” maqolasida) biz o‘zgaruvchi “konteyner” turi bo‘lib, unda qiymat keyinchalik dasturda foydalanish uchun saqlanishi mumkinligini aytdik. . Shuningdek, biz har bir o'zgaruvchining o'ziga xos qiymatlari diapazoni va u egallagan xotira miqdori haqida gapirdik. Bu erda yozilgan belgi:



Shunday qilib, biz aslida erishayotgan narsamiz. Bundan tashqari, sizga haqiqiy qiymatlar diapazonini va egallagan xotira miqdorini berish oson emas edi 🙂
Keling, taqqoslaylik, masalan:
1. bayt va qisqa. bayt qisqaroqdan kichikroq haqiqiy qiymatlarga ega. Ya'ni, bayt kichikroq qutiga o'xshaydi va short - kattaroq quti. Va bu qisqacha baytni sarmoya qilishimiz mumkinligini anglatadi.
2. bayt va int. baytda intga qaraganda kichikroq haqiqiy qiymatlar diapazoni mavjud. Ya'ni, bayt kichikroq qutiga o'xshaydi va int kattaroq qutidir. Va bu biz baytni int-ga investitsiya qilishimiz mumkinligini anglatadi.
3.int va uzun. int ning amaldagi qiymatlar diapazoni longga qaraganda kichikroq. Ya'ni, int kichikroq qutiga o'xshaydi va long kattaroq qutidir. Bu shuni anglatadiki, biz intni uzoq vaqt ichida joylashtira olamiz.

№1 misol
Kod raqami 1 - agar siz ushbu kodni kompyuteringizda ishlatsangiz, konsolda 15 raqami ko'rsatiladi.




1
2
3
4
5
6
7
8

class Test {
public static void main(String[] args) {
byte a = 15;
byte b = a;
System.out.println(b);
}
}

Kod raqami 2 - agar siz ushbu kodni kompyuteringizda ishlatsangiz, konsolda 15 raqami ko'rsatiladi.

1
2
3
4
5
6
7
8

class Test {
public static void main(String[] args) {
byte a = 15;
int b = a;
System.out.println(b);
}

Shuning uchun, vaziyat nazorat ostida ekanligini "to'g'ridan-to'g'ri aytishingiz" kerak:






Bu erda b dan oldin (int) qo'shdik. Agar a o'zgaruvchisi, masalan, bayt tipida bo'lsa, qavs ichida (bayt) bo'lar edi. Umumiy formula quyidagicha ko'rinadi:



Unda "b ning (kattaroq) qiymatini menga kerak bo'lgan (maqsadli) int turidagi o'zgaruvchiga aylantiring" deyiladi.

Agar biror narsa noto'g'ri bo'lsa.


Hozirgacha biz nima qilayotganimizni aniq bilgan holda vaziyatlarni ko'rib chiqdik. Ammo idishga sig'maydigan narsani qo'yishga harakat qilsangiz nima bo'ladi?
Ma'lum bo'lishicha, idishda faqat "mos" narsa qoladi. Masalan, suzuvchi nuqtali raqamlarning kasr qismi "kesiladi":
// 1-misol
System.out.println(b); // konsol 11 raqamini ko'rsatadi
}
}
Shuni esda tutish kerakki, kasr qismi yumaloq emas, balki tashlanadi.

Ammo chegaradan tashqarida bo'lgan raqamni qo'yishga harakat qilsak nima bo'ladi? Misol uchun, agar baytda (bayt oralig'i -128 dan 127 gacha) 128 raqamini qo'ying? Sizningcha, biz 1 ta olamizmi? Yo'q. Biz -128 olamiz:

sinf testi {


umumiy statik void main(String[] args) {
double a=128;
bayt=(bayt)a;
System.out.println(b); // konsolda biz -128 ni ko'ramiz
}

Ushbu konvertatsiya paytida o'zgaruvchining qiymatini hisoblash mumkin, ammo dasturchining maqsadi qiymat diapazondan tashqarida bo'lgan vaziyatga yo'l qo'ymaslikdir, chunki bu dasturning noto'g'ri ishlashiga olib kelishi mumkin.



Yüklə 4,3 Mb.

Dostları ilə paylaş:
  1   2   3   4   5   6




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə