Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Karakter dizi fonksiyonları

Benzer bir sunumlar


... konulu sunumlar: "Karakter dizi fonksiyonları"— Sunum transkripti:

1 Karakter dizi fonksiyonları
Diziler devam.. Karakter dizi fonksiyonları

2 String (karakter dizi) fonksiyonları
string.h başlık dosyasını kullanılarak karakter dizileri işlemek için belirli fonksiyonlar kullanabilirsiniz E.g. #include <string.h> strcpy yararlı bir fonksiyondur

3 strcpy char sDestinationString[ 10 ] ;
Sonlandırıcı boşluk karakterini dahil ederek bir karakter diziyi bir başkasına kopyalamanıza izin verir. Ör: char sDestinationString[ 10 ] ; strcpy( sDestinationString, “Class 1”); “Class1”i, boşluk dahil, İLK parametreye yani sDestinationString’e kopyalar. Hiçbir sınır kontrolü gerçekleştirilmez Hedef karakter dizinin yeterince büyük olduğundan emin olmak sizin sorumluluğunuzdadır.( Boşluk karakteri dahil!)

4 Diziler ve Fonksiyonlar
Sıradan bir değişkenle olduğu gibi, bir diziyi bir fonksiyona geçirebilirsiniz.

5 Dizileri fonksiyonlara göndermek
Bir diziyi bir fonksiyona göndermek için, fonksiyona dizinin adını parantezler olmadan geçirin. Parametreleri listelediğiniz yer olan fonksiyon tanımlamasında, dizinin tipini, dizi adını (isteğe bağlı) ve parantezleri belirlersiniz; bununla birlikte, dizinin boyutlarını BELİRLEMEYEBİLİRSİNİZ (eğer belirlerseniz, derleyici emin olmak için bunun > 0 olup olmadığını kontrol eder ve eğer değilse bir hata bildirir) Fonksiyon prototipinde, bir dizinin beklendiğini belirtmelisiniz

6 Dizileri fonksiyonlara göndermek örnek
Aşağıdaki gibi bir dizi verilmiştir: int iStudentGrades[10]; Fonksiyon tanımlaması şöyledir: void ArrayPrint(int iArrayToPrint[ ],int iElementsCount ) { int i ; for (i = 0; i <= iElementsCount - 1; i++ ) printf( “%d”, iArrayToPrint[ i ]; } /* ArrayPrint fonksiyonunun sonu */

7 Dizileri gönderme örneği, devam
Fonksiyon prototipi şunun gibidir: void ArrayPrint( int [ ], int ); NOT: prototipteki parantezler içinde bir dizi belirtmelisiniz! Aksi taktirde bir derleme-zamanı hatası alırsınız. Dizideki elemanların sayısını geçirdiğimize de dikkat edin. Aksi taktirde fonksiyon dizi içindeki elemanların sayısını bilmeyecektir. Dizinin dışına yazmayı engellemeyi garanti edemez! Şimdilik, elemanların sayısını kontrol etmek için daha kolay bir yol yok.

8 Dizileri gönderme örneği, devam
Fonksiyonu çağırdığınız zaman, yalnızca dizinin adını geçirirsiniz. Örneğin, aşağıdaki gibi bir kod verilir: int main() { #define STUDENTS_COUNT 10 int iStudentGrades[STUDENTS_COUNT ]; /* call the function */ /* fonksiyonu çağır */ ArrayPrint( iStudentGrades, STUDENTS_COUNT ); return 0; }

9 Bir fonksiyondaki dizileri değiştirmek
Varsayılan olarak, C’de bir fonksiyona geçirilen bir dizinin içeriğini değiştirirsen bu değişiklikler fonksiyonu çağıran blog’a yansıtılacaktır. Fonksiyona geçirilen bir dizinin elemanlarına yaptığınız herhangi bir değişiklik yukarıya doğru yayılacaktır. Örneğin eğer öğrenci notları dizisini fonksiyon içinde değiştirirsek, dizi ana blok içinde de değişecektir! Yalnızca diziler üzerindeki çalışmalar geçirilir (bağımsız elemanlar geçirilmez)

10 UYARI Planlanmadığı sürece bir dizi içindeki elemanları değiştirmemeye özen gösterin Giriş parametrelerini değiştirmemekle ilgili genel prensibi hatırlayın Eğer bir dizinin elemanlarını yalnızca bir fonksiyon içinde ustalıkla yönetmek istiyorsanız, bunu yapmadan önce dizinin bir kopyasını alın (boyutlar sabitse) ve kopyayı kullanın. Şimdilik, bir diziyi kopyalamak için fonksiyon içinde benzer bir dizi bildirmek ve dizinin elemanlarını giriş parametreleri ile doldurmak için bir for döngüsü kullanmak zorundasınız Bunu yalnızca dizinin uzunluğunu biliyorsanız yapın

11 Dizi kopyalamaya örnek :
#define SIZE 10 void ArrayChange( int iInputArray[ ] ) { int i, iNewArray[ SIZE ] ; for (i = 0; i <= SIZE - 1; i++ ) iNewArray[ i ] = iInputArray[ i ]; }/* i for’unun sonu */ /* şimdi iNewArray’in elemanlarını değiştir */ }/* ArrayChange fonksiyonunun sonu */

12 Bir Önceki Örneği Değiştirilebilir Özelliklerle Kullanmak
Madem ki diziler bir fonksiyon içinde değiştirilebiliyor ve değişiklikler dışarıya yansıtılıyor, bir diziyi bir başkasına kopyalayan bir fonksiyon oluşturabiliriz Bu bir fonksiyona iki dizinin geçirilmesi ve dışarda kullanmak için birinin ötekine kopyalanmasıdır. Bu temel olarak strcpy()’nin yaptığı şeydir.

13 Bir diziyi kopyalamak örnek 2:
void MakeCopy( int iDestinationArray[], int iSourceArray[], int iElementsCount ) { int i ; for (i = 0; i <= iElementsCount - 1; i++ ) iDestinationArray[ i ] = iSourceArray[ i ]; }/* i for’unun sonu */ } /* MakeCopy fonksiyonunun sonu */ Ana blok (main ) içinde çağrılırsa, ikinci diziyi fonksiyona geçirilen ilk diziye kopyalamış olursunuz!

14 Koruma C bir diziyi değiştirilemez yapabileceğiniz bir mekanizma sağlar. Bildirimden önce fonksiyonunuzun tanımlaması ve prototipinde “const” (sabit) anahtar kelimesini kullanın. Örneğin: Prototip: void ArrayPrint( const int [ ], int ); Tanımlama void ArrayPrint( const int iArrayToPrint[ ], int iElementsCount ) { … }

15 CONST’un pek çok şekli #define!
Değişikliklerinizin yukarıya doğru yayılmasını önlemek için const (sabit) kullanımına ek olarak, #define yerine bunu kullanabilirsiniz! Örneğin, şunun yerine #define SIZE 10 Bunu kullanabilirsiniz const int SIZE = 10 ;

16 #define’a karşı const’un faydaları
#define’lar gibi const (sabit) değişkenleri de değiştirilemez Bununla birlikte, const (sabit) değişkenler derleyiciler tarafından bilinir Bunları nöbetçiler içine koyabilriz, imlecinizi değerler için üzerlerinde tutabilirsiniz, vb. Hata bulmak için çok iyi

17 #define’a karşı const’un faydaları devam
#define’lar derleme zamanına kadar derleyiciler tarafından bilinmezler çünkü: önişlemci kodunuz boyunca derleyicinin ona bakma şansı bile olmadan #define’lar için basit bir yer değiştirme yapar Bu önişlemci isimler üzerinde bir “bul ve değiştir” yapıyor ve onu bulduğu yerde değer ile değiştiriyor demektir. Hataları ayıklarken farkı görmek için const (sabit) ve #define’lara bakmaya çalışın.

18 İsimlendirme ipucu #define yerine const kullanırken, #define kullanırken yaptığınız gibi isimdeki bütün harfleri hala büyük yazmanız gerekiyor. (fonksiyon parametreleri içindeki hariç)

19 Structs (YapIlar)

20 Structures (Yapılar) Yapılar birbiriyle ilişkili değişkenlerin aynı isim altında toplanmasıdır. Dizilerden farklı olarak, yapılar pek çok farklı tipte değişkeni içerebilir.

21 structure definitions (yapı tanımlamaları)
Struct anahtar kelimesi: derleyiciye bir yapı tanımladığınızı söyler struct student { char firstName[10]; char lastName[10]; int exam1; int exam2; int final; }; Yapı etiketi: yapı tanımlamasını isimlendirmek için kullanılır Yapının üyeleri Noktalı virgülü unutma

22 yapı tanımı (devam) Yapı tanımı yeni bir tip yapar.
Değişkenleri depolamak için hafızada boşluk ayırmaz. Yapılar karmaşık (yada türetilmiş) veri tipine bir başka örnektir.

23 Bir dizinin iki üyesi aynı ismi paylaşamaz.
Üyeler Bir yapı’nın üyeleri basit veri tipleri (tamsayı, karakter, vb.) veya karmaşık veri tipleri (diziler, diğer yapılar) olabilir. Kendisinin bir başka örneğini içeremez (bunun için işaretçi kullanmanız gerekir) Bir dizinin iki üyesi aynı ismi paylaşamaz.

24 Yapı değişkenlerini bildirmek
Yapı bir kez bildirildiğinde, kendi yeni tipimizde değişkenler tanımlayabiliriz. struct student {currentStudent, class[50];} Bir öğrenci kaydını tutan değişken Struct anahtar kelimesi Struct etiketi 50 öğrencinin kaydını tutacak dizi

25 Alternatif tanımlama / bildirim
struct student { char firstName[10]; char lastName[10]; int exam1; int exam2; int final; } currentStudent, class[50]; struct student { char firstName[10]; char lastName[10]; int exam1; int exam2; int final; }; struct student currentStudent, class[50]; Bunlar aynı şeyi yapar

26 Yapıları = = veya != kullanarak karşılaştıramazsınız.
Yapı karşılaştırması Yapıları = = veya != kullanarak karşılaştıramazsınız. Böyle yapmaya çalışmak yazım hatasına neden olur Bunun yerine yapıları karşılaştıracak kod yazmalısınız.

27 Yapıları başlangıç değerine getirmek
Yapıları başlangıç durumuna getiren yazım dizilerin yazımıyla benzerdir. struct student currentStudent = {“Bart”, “Simpson”,55, 64}; currentStudent değişkenini bildirir ve firstName, lastName, exam1, exam2’ yu verilen değerlerle başlangıç durumuna getirir. final ise hiçbir değer belirtilmediği için 0 olarak başlangıç durumuna getirilmiştir.

28 Bir yapının üyelerine erişmek
Bir yapının üyelerine erişmek için yapı üye operatörü (nokta operatörü) kullanırız (işaretçileri kullanan başka bir yöntem vardır) currentStudent.exam1, currentStudent değişkeni içinde, üye exam1’de depolanan değeri işaret eder Bir yapının değerlerine erişmek için değişkenleri kullanabileceğiniz herhangi bir yerde bu gösterimi kullanabilirsiniz.

29 Yapıları fonksiyonlara göndermek
Tüm yapıları bir fonksiyona gönderebilirsiniz. Dizilerden farklı olarak, bir yapı bir fonksiyona değer ile çağrım kullanılarak gönderilir (başka bir deyişle, eğer yapının değerini bir fonksiyon içinde değiştirirseniz, bu değişiklik çağıran fonksiyona yansıtılmaz)

30 typedef typedef anahtar kelimesi daha önce tanımlanmış veri tipleri için eşanlamlı kelimeler (veya takma isim) oluşturan bir mekanizma sağlar. Deyim: typedef struct student Student; struct student tipi için eşanlamlısı olarak yeni bir tip “Student” tanımlar. typedef eşanlamlısı bir kez tanımlandı mı, değişkenlerinizi şu şekilde bildirebilirsiniz: Student class[50];

31 typedef (devam) typedef eşanlamlısının ilk harfini büyütmek iyi bir pratiktir.

32 typedef (devam) typedef struct { char firstName[10];
typedef deyimini struct tanımlaması ile birleştirebilirsiniz. Örneğin: typedef struct { char firstName[10]; char lastName[10]; int exam1; int exam2; int final; } Student; Not: ayrı bir yapı etiketine ihtiyaç duymayı engelliyoruz struct tanımlanıp, yeni tanımlanan tipin diğer adı Student yapılabilir.

33 24.02.2019 #include <stdio.h> struct student {
char firstName[10]; char lastName[10]; int exam1; int exam2; int final; }; int main () { struct student currentStudent; float average; printf("Enter your first name: "); scanf ("%s", currentStudent.firstName); printf("Enter your last name: "); scanf ("%s", currentStudent.lastName); printf("First exam score: "); scanf ("%d", &currentStudent.exam1); printf("Second exam score: "); scanf ("%d", &currentStudent.exam2); printf("Final exam score: "); scanf ("%d", &currentStudent.final); /*final has double the weight of either exam*/ average = (float)(currentStudent.exam1 + currentStudent.exam2 + currentStudent.final * 2) / 4.0; printf ("Thanks %s %s, you have received a %.2f in this class.\n", currentStudent.firstName, currentStudent.lastName, average); return 0; }


"Karakter dizi fonksiyonları" indir ppt

Benzer bir sunumlar


Google Reklamları