Tip Dönüştürmeler

Download Report

Transcript Tip Dönüştürmeler

BPR151 ALGORİTMA VE
PROGRAMLAMA - I
Öğr. Gör. Bayram AKGÜL
[email protected]
http://bmyo.bartin.edu.tr/akgul
Bugünkü konular
• Tip Dönüştürme
– Belirtmeden Tip Dönüştürme
– Belirterek Tip Dönüştürme
• Convert sınıfı
• Parse(string) Metodu
• TryParse(string) Metodu
2
Tip Dönüştürme
• C#'ta düşük kapasiteli bir değişken, sabit
ya da değişken ve sabitlerden oluşan
matematiksel ifade daha yüksek kapasiteli
bir değişkene atanabilir.
• Buna belirtmeden tip dönüşümü denir.
• Aşağıdaki tabloda belirtmeden otomatik tip
dönüşümü ile ilgili ilişki verilmiştir.
3
Sayısal Veri Tipleri ve Özellikleri
Veri tipi
Aralık
boyut
sbyte
1 byte
-128 : 127
byte
1 byte
0 : 255
short
2 byte
-32768 : 32767
ushort
2 byte
0 : 65535
int
4 byte
-2147483648 :2147483647
uint
4 byte
0 : 4294967295
long
8 byte
-9223372036854775808 :
9223372036854775807
ulong
8 byte
0 : 18446744073709551615
4 byte
1.175494e-38 :3.402823e+38
double (15-16 basamak)
8 byte
2.225074e-308 :1.797693e+308
decimal (28-29 basamak)
8 byte
float
(7 basamak)
4
Değişken Tipi Kategorileri
Veri Tipi Kategori
Son Ek
bool
Boolean
char
İşaretsiz, Sayısal, Tam sayı
byte
İşaretsiz, Sayısal, Tam sayı
sbyte
İşaretli, Sayısal, Tam sayı
short
İşaretli, Sayısal, Tam sayı
ushort
İşaretsiz, Sayısal, Tam sayı
int
İşaretli, Sayısal, Tam sayı
uint
İşaretsiz, Sayısal, Tam sayı
U veya u
long
İşaretli, Sayısal, Tam sayı
L veya l
ulong
İşaretsiz, Sayısal, Tam sayı
UL veya ul
float
Sayısal, virgüllü sayı
F veya f
double
Sayısal, virgüllü sayı
D veya d
decimal
Sayısal, decimal
M veya m
5
Belirtmeden Tip Dönüştürme Tablosu
Kaynak
Hedef
sbyte
short, int, float, long, double, decimal
byte
short, ushort, int, uint, long, ulong,
float, double, decimal
short
int, long, float, double, decimal
ushort
int, uint, long, ulong, float, double,
decimal
int
long, float, double, decimal
uint
long, ulong, float, double, decimal
long, ulong float, double, decimal
char
ushort, int, uint, long, ulong, float,
double, decimal
float
double
6
Belirtmeden Tip Dönüştürme Matrisi (a = b; tablosu)
HEDEF (a)
sbyte
KAYNAK (b)
sbyte
byte
short
ushort
char
int
uint
long
ulong
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
float double decimal
byte
-
short
-
-
ushort
char
-
-
-
int
-
-
-
-
uint
-
-
-
-
-
long
-
-
-
-
-
-
ulong
-
-
-
-
-
-
-
float
-
-
-
-
-
-
-
-
double
-
-
-
-
-
-
-
-
-
decimal
-
-
-
-
-
-
-
-
-
7
Belirtmeden Tip Dönüştürme
üzerine Notlar
• byte, sbyte, short ve ushort türündeki
değişkenlerle yapılan matematiksel
işlemlerde oluşan matematiksel ifade
sonucu int leşir
• char türünü kendisinden daha kapasiteli bir
sayısal türe belirtmeden dönüştürebiliriz.
– Bu durumda ilgili karakterin Unicode karşılığı
ilgili sayısal değişkene atanacaktır.
• double ve decimal belirtmeden hiçbir tipe
dönüştürülemez!
8
Belirterek Tip Dönüştürme
• Belirterek tip dönüşümü genellikle derleyicinin izin
vermediği durumlarda kullanılır.
• Belirterek tip dönüşümüyle küçük tipin büyük tipe
dönüştürülmesi sağlanabilse de aslında bu
gereksizdir, çünkü aynı şeyi belirtmeden tip
dönüşümüyle de yapabilirdik
• Örnek:
int a=5;
byte b=(byte)a; // normal
Örnek 2:
int a=500;
byte b=(byte)a; // ne olur ?
9
Tip dönüştürmede veri kaybı
int a = 16909320;
// 00000001 00000010 00000100 00001000
byte b = (byte)a;
Console.WriteLine(b);
• Ekrana 8 yazacaktır.
10
Convert sınıfı
• System isim alanının altındaki Convert sınıfı
içinde tür dönüşümü yapabileceğimiz birçok
metot bulunur.
• Bu metotlarla hemen hemen her türü her
türe dönüştürebiliriz.
• Bunun için değişken türlerinin sınıf
karşılıklarını bilmeliyiz.
• Değişken türleri ve Sınıf isimlerinin
karşılıkları aşağıdaki tabloda listelenmiştir.
11
Veri Tipi
bool
byte
sbyte
short
ushort
int
uint
long
ulong
float
double
decimal
char
Sınıf İsmi
Boolean
Byte
SByte
Int16
UInt16
Int32
UInt32
Int64
UInt64
Single
Double
Decimal
Char
12
Convert.ToXXX(x)
•
•
•
•
•
•
•
•
•
•
•
•
•
Convert.ToBoolean(x)
Convert.ToByte(x)
Convert.ToSbyte(x)
Convert.ToInt16(x)
Convert.ToUInt16(x)
Convert.ToInt32(x)
Convert.ToUInt32(x)
Convert.ToInt64(x)
Convert.ToUInt64(x)
Convert.ToSingle(x)
Convert.ToDouble(x)
Convert.ToDecimal(x)
Convert.ToChar(x)
• XXX yerine
herhangi bir veri
tipi yazılabilir.
Parantez içine de
herhangi veri
tipindeki bir değer
yazılabilir.
13
Convert.ToBoolean(x)
• Burada parantez içindeki değerin sayısal değeri 0
ise sonuç false değilse true olur.
• Sayı haricindeki diğer değerler her zaman hata
verecektir.
bool
bool
bool
bool
bool
bool
bool
b1
b2
b3
b4
b5
b6
b7
=
=
=
=
=
=
=
Convert.ToBoolean(132);
Convert.ToBoolean("-132");
Convert.ToBoolean(0);
Convert.ToBoolean("a123");
Convert.ToBoolean("True");
Convert.ToBoolean("False");
Convert.ToBoolean("Deneme");
• b1 ve b5’in değeri True
• b3 ve b6’nin değeri False
• b2 , b4 ve b7 hata verir. (True veya False haricindeki tüm
stringlerde hata verir.)
14
Convert.ToByte(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı byte tipine dönüştürür.
• Eğer sayısal değer byte sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
byte
byte
byte
byte
byte
byte
byte
byte
b1
b2
b3
b4
b5
b6
b7
b8
=
=
=
=
=
=
=
=
Convert.ToByte(123);
Convert.ToByte(1234);
Convert.ToByte("-123");
Convert.ToByte("123");
Convert.ToByte("123.12");
Convert.ToByte(123.12);
Convert.ToByte(0);
Convert.ToByte("sds");
• b1 ve b4 ve b6’nın değerleri 123, b7’in değeri 0 diğerleri
hata verir.
15
Convert.ToSByte(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı sbyte tipine dönüştürür.
• Eğer sayısal değer sbyte sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
sbyte
sbyte
sbyte
sbyte
sbyte
sbyte
sbyte
sbyte
b1
b2
b3
b4
b5
b6
b7
b8
=
=
=
=
=
=
=
=
Convert.ToSByte(123);
Convert.ToSByte(1234);
Convert.ToSByte("-123");
Convert.ToSByte("1234");
Convert.ToSByte(0);
Convert.ToSByte("sds");
Convert.ToSByte("123.12");
Convert.ToSByte(123.12);
• b1 ve b8’in değerleri 123, b3’ün değeri -123, b5’in
değeri 0 diğerleri hata verir.
16
Convert.ToInt16(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı short tipine dönüştürür.
• Eğer sayısal değer short sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
short
short
short
short
short
short
short
short
short
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToInt16(123);
Convert.ToInt16(1234);
Convert.ToInt16("-123");
Convert.ToInt16("1234");
Convert.ToInt16(0);
Convert.ToInt16("sds");
Convert.ToInt16("12323434");
Convert.ToInt16("123.12");
Convert.ToInt16(123.12);
• b6, b7 ve b8 hata verir, diğerlerinde sorun olmayacak.
17
Convert.ToUInt16(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı ushort tipine dönüştürür.
• Eğer sayısal değer ushort sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
ushort
ushort
ushort
ushort
ushort
ushort
ushort
ushort
ushort
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToUInt16(123);
Convert.ToUInt16(1234);
Convert.ToUInt16("-123");
Convert.ToUInt16("1234");
Convert.ToUInt16(0);
Convert.ToUInt16("sds");
Convert.ToUInt16("12323434");
Convert.ToUInt16("123.12");
Convert.ToUInt16(123.12);
• b3, b6, b7 ve b8 hata verir, diğerlerinde sorun
olmayacak.
18
Convert.ToInt32(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı int tipine dönüştürür.
• Eğer sayısal değer int sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
int
int
int
int
int
int
int
int
int
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToInt32(123);
Convert.ToInt32(1234);
Convert.ToInt32("-123");
Convert.ToInt32("1234");
Convert.ToInt32(0);
Convert.ToInt32("abc");
Convert.ToInt32("123234342344323");
Convert.ToInt32(123.4);
Convert.ToInt32("123.4");
• b6, b7 ve b9 hata verir, diğerlerinde sorun olmayacak.
19
Convert.ToUInt32(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı uint tipine dönüştürür.
• Eğer sayısal değer uint sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
uint
uint
uint
uint
uint
uint
uint
uint
uint
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToUInt32(123);
Convert.ToUInt32(1234);
Convert.ToUInt32("-123");
Convert.ToUInt32("1234");
Convert.ToUInt32(0);
Convert.ToUInt32("abc");
Convert.ToUInt32("123234345645642344323");
Convert.ToUInt32(123.4);
Convert.ToUInt32("123.4");
• b3, b6, b7 ve b9 hata verir, diğerlerinde sorun
olmayacak.
20
Convert.ToInt64(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı long tipine dönüştürür.
• Eğer sayısal değer long sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
long
long
long
long
long
long
long
long
long
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToInt64(123);
Convert.ToInt64(123423423423423423445456234234433);
Convert.ToInt64("-123");
Convert.ToInt64("1234");
Convert.ToInt64(0);
Convert.ToInt64("abc");
Convert.ToInt64("12323434234432334455344565465464");
Convert.ToInt64(123.4);
Convert.ToInt64("123.4");
• b2, b6, b7 ve b9 hata verir, diğerlerinde sorun
olmayacak.
21
Convert.ToUInt64(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı ulong tipine dönüştürür.
• Eğer sayısal değer ulong sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
ulong
ulong
ulong
ulong
ulong
ulong
ulong
ulong
ulong
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToUInt64(123);
Convert.ToUInt64(123423423423423423423456232344433);
Convert.ToUInt64("-123");
Convert.ToUInt64("1234");
Convert.ToUInt64(0);
Convert.ToUInt64("abc");
Convert.ToUInt64("12323434234432334534523443465464");
Convert.ToUInt64(123.42);
Convert.ToUInt64("123.4");
• b2, b3, b6, b7 ve b9 hata verir, diğerlerinde sorun
olmayacak.
22
Convert.ToSingle(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı float tipine dönüştürür.
• Eğer sayısal değer float sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
float
float
float
float
float
float
float
float
float
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToSingle(123);
Convert.ToSingle(123423423423423423423454566234433);
Convert.ToSingle("-123");
Convert.ToSingle("1234");
Convert.ToSingle(0);
Convert.ToSingle("abc");
Convert.ToSingle("12323434234432334534545643465464");
Convert.ToSingle(123423.423);
Convert.ToSingle("123234.342");
• b2, b6 ve b7 hata verir, diğerlerinde sorun olmayacak.
23
Convert.ToDouble(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı double tipine dönüştürür.
• Eğer sayısal değer double sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
double
double
double
double
double
double
double
double
double
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToDouble(123);
Convert.ToDouble(1234234234234234234245543456234433);
Convert.ToDouble("-123");
Convert.ToDouble("1234");
Convert.ToDouble(0);
Convert.ToDouble("abc");
Convert.ToDouble("12323434234432334534543465443535464");
Convert.ToDouble(123423.423);
Convert.ToDouble("123234.342");
• b2, b6 ve b7 hata verir, diğerlerinde sorun olmayacak.
24
Convert.ToDecimal(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı decimal tipine dönüştürür.
• Eğer sayısal değer decimal sınırlarının dışında ise taşma
hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
decimal
b1
b2
b3
b4
b5
b6
b7
b8
b9
=
=
=
=
=
=
=
=
=
Convert.ToDecimal(123);
Convert.ToDecimal(12342342342342342342345623443345);
Convert.ToDecimal("-123");
Convert.ToDecimal("1234");
Convert.ToDecimal(0);
Convert.ToDecimal("abc");
Convert.ToDecimal("123423423423423423423456234433435");
Convert.ToDecimal(123423.423);
Convert.ToDecimal("123234.342");
• b2, b6 ve b7 hata verir, diğerlerinde sorun olmayacak.
25
Convert.ToChar(x)
• Parantez içerisine girilen her hangi bir sayısal veya
rakamlardan oluşmuş yazıyı char tipine dönüştürür.
• Eğer sayısal değer char (0-65535) sınırlarının dışında ise
taşma hatası verir.
• Eğer dönüştürülemeyecek bir değer ise tip dönüştürme
hatası verir.
char
char
char
char
char
char
char
char
b1
b2
b3
b4
b5
b6
b7
b8
=
=
=
=
=
=
=
=
Convert.ToChar(123);
Convert.ToChar(123423423);
Convert.ToChar("1234");
Convert.ToChar(0);
Convert.ToChar("abc");
Convert.ToChar("a");
Convert.ToChar(1234.423);
Convert.ToChar("12.3");
• b1, b4 ve b6 geçerli, diğerleri hata verir!
26
Tip.Parse(string)
• String tipini parse metodunu kullanarak herhangi
bir tipe dönüştürebiliriz.
• Örnek:
– int a = int.Parse(“123”);
– uint a = uint.Parse(“123”);
– double b = double.Parse(“123.12”);
• Burada dikkat edilmesi gerekenler:
– parantez içindeki string in dönüştürülmek istenen tipe
uygun yazılmış olmasıdır.
– Tam sayılar için sayı virgüllü olmamalıdır!
– İşaretsiz sayılar için sayı negatif olmamalıdır!
– Rakamların başında veya sonunda boşluk olabilir, fakat
aralarında boşluk olmamalıdır!
27
Parse Örnek
using System;
class Program
{
/* inch’i santimetreye dönüştürme */
static void Main()
{
double inch;
double santimetre;
string değer;
Console.Write("inch gir: ");
değer = Console.ReadLine(); // girilen değeri okuyor
inch = double.Parse(değer); // tip dönüştürülüyor
santimetre = inch * 2.54;
Console.WriteLine("{0} inch {1} santimetre eder"
,inch, santimetre);
}
}
28
Tip Dönüştürme Üzerine Nolar
Console.Write("inch gir: ");
string değer = Console.ReadLine(); // girilen değeri okuyor
double inch = double.Parse(değer); // tip dönüştürülüyor
• Yukarıdaki kod ile kullanıcıdan inch girilmesi
isteniyor.
– Kullanıcının uygun bir sayı gireceği varsayılıyor.
– Peki ya kullanıcı rakamlar yerine harf girerse ne
olacak?
– veya girilen sayı double sınırları dışında ise ne
olacak?
– Çok Basit: Hata verecek
29
tip.TryParse()
• TryParse() metodunu kullanın!
double inch;
Console.Write("inch gir: ");
string değer = Console.ReadLine(); // girilen değeri okuyor
double.TryParse(değer, out inch); // tip dönüştürülüyor
•
•
•
•
Bu durumda girilmiş yazı double tipine dönüştürülebilirse,
dönüştürülüp inch değişkenine atanmış olacak.
Eğer dönüştürülemeyecek ise, yani geçersiz bir sayı veya
sınırlar dışında ise inch değişkeni 0 olarak kalacaktır.
TryParse diğer tüm tipler için de geçerlidir.
TryParse metodu tipi dönüştürmeye başlamadan önce geçerli
olup olmadığını kontrol eder.
30
TryParse örnek:
using System;
class Program
{
/* inch’i santimetreye dönüştürme */
static void Main()
{
double inch;
double santimetre;
string değer;
Console.Write("inch gir: ");
değer = Console.ReadLine(); // girilen değeri okuyor
double.TryParse(değer, out inch); // tip dönüştürülüyor
santimetre = inch * 2.54;
Console.WriteLine("{0} inch {1} santimetre eder"
, inch, santimetre);
}
}
31
DINLEDIĞINIZ IÇIN
TEŞEKKÜRLER…
Öğr. Gör. Bayram AKGÜL
32