C pointerlara giriş

Merhaba.

Bu yazı C’de pointerları çalışırken aldığım notlardır.

Bu pointerların vikipediadaki tanımı:

Programlama dillerinde bellek adreslerini saklayan değişkenlere verilen genel isim. Bir programlama dilinde herhangi bir değişkeni tanımladığınızda hafızada ona bir yer ayrılır. İşaretçiler bu hafıza alanlarının adreslerini tutarlar

Bu konuyu anlamamda yardımcı olan şeylerin başında değişkenlerin tanımı geliyor. İşte birbaşka tanım

Değişkenler, bir bilgisayar programında değerleri saklamak için kullanılan, bilgisayar bellek konumlarına verdiğiniz adlardır.

Hepinizin zaten bildiği gibi bir bir programlama dilinde değişken tanımladığımızda değeri memory’e konulur.İsmi ilede Bu değişkenin değerini memory’den alırız.

Basitçe aşağıdaki gibi yazacağımız bir program ile memory’deki yerimizi görelim.

#include <stdio.h>

int main() {

short age = 20;
printf("Address of age variable %p \n", &age);
return 0;
}

Çıktı tabiki her çalıştırdığımızda farklı olucaktır.

Örnek çıktı:

Address of age variable 0x7ffe5886c856

Bu örnekte 0x7ffe5886c856 değeri bizim ram bellek üzerinde short tipindeki age değişkenimiz için işletim sisteminin ayırdığı alan.

Pointer

Pointer, başka bir değişkenin adresini, yani bellek konumunu(az önce ekrana yazdırdık) tutarlar.

Pointerlar değişkenler gibi tanımlanırlar.Sadece başlarında *(asteriks) işareti bulunur.

Hemen bir örnek yapalım.

short *age_p;    /* pointer to an short */
printf("Address of age_p variable %p \n", &age_p);

Daha önce üzerinde çalıştığımız programa yukarıdaki satırları ekliyorum.

Address of age variable 0x7ffe1b87255e
Address of age_p variable 0x7ffe1b872560

Gördüğünüz gibi age_b memory’de farklı bir yerde.Aralarındaki fark değişken direk veriyi tutuyor.Pointer ise asıl verinin durduğu değişkenin adresini tutuyor.

Şu ana kadar elimizde short tipinde bir değişken ve onun adresini tuması için tanımladığımız bir pointer var. Aşağıdaki blokta yapacağımız tanımlama ile artık memory’de age_p’nin içerisinde age değişkeninin adresi duruyor. Başına * işareti koayarak değerini yazarsanı veya değiştirirseniz. Aslında age değişkeninin değerini değiştireceksiniz.

age_p = &age;
printf("Value of age_p pointer %d \n", *age_p);

Valıe of age_p pointer 20

Programın son halinde ise memory aşağıdaki gibi olucaktır.

Programın son halinde ram bellek temsili.

Gördüğünüz gibi aslında pointer olarak tanımladığımız değişken asıl değeri tutan değişkenin adresini tutuyor. * işareti ilede eriştiğimizde bu alana gidip buradaki değer ile işlem yapıyor.

Basitçe neden pointler kullanıyoruz.

— Aklımıza gelen ilk madde bellek tasarrufu.Anlaşılır olması açısından bu örneği short gibi küçük bir veri tipi ile yaptık. Peki ya daha büyük veri tipleri ile çalışsaydık.Bunları fonksiyonlara parametre olarak geçtiğimiz zaman compiler bu veriyi memory üzerinde kopyalayacaktır. Buda büyük objelerde bellekteki verimi düşürecektir. Bunu yerine eğer referansını geçerseniz fonksiyonun içerisindeki işlem doğrudan memory’deki yerinde yapılacaktır.Memory’deki tekrarları engellememizi sağlar. Ayrıca bknz( https://metinagaoglu.com/call-by-value-call-by-reference )

İterasyon sırasında hızı artırabilirler: örneğin bir arrayi gezmek isterseniz, indis değerini yinelemek için sadece bir for döngüsü yazarsınız, ancak gerçekte bellek adresini artırmış olursunuz. Dolayısıyla, performansa duyarlı bir kodlama yapıyorsanız, önce indisi artırmak ve ardından bellek adresini güncellemek yerine, pointer ile doğrudan bir sonraki bellek konumuna gidip performans iyileştirmesine erişebilirsiniz.

Yapılan değişiklikler her yerde aynıdır: bağımsız thread’ler ile çalışan bir programınız olduğunu varsayalım.Her biri için aynı verilerin kopyasını oluşturmak yerine, onlara orijinal verilerin adresini sağlarsınız ve böylece değerde herhangi bir değişiklik yapılırsa, her thread en son güncellemeleri alır.

Şimdilik bu kadar.Pointerlar ile ilgili aritmetiği vb. gibi konulardada özet yazılar yazmayı planlıyorum.

Kaynaklar

https://www.tutorialspoint.com/cprogramming/c_pointers.htm

https://www.quora.com/Why-we-use-POINTERS-in-programming-whats-the-practical-use

Call by value & call by reference

Selamlar

Bu konu hakkında yazılmış birçok makale var.Bende kendim daha iyi anlamak için kendi bloguma karalama tarzında bir yazı yazacağım.

Yazdığımız programlama dillerinde hepimiz fonksiyonlar/metodlar tanımlıyoruz. Bunlara parametre geçiyoruz bazen dönüş değeri olarak , bazen ise verdiğimiz parametreler üzerinde değişiklik yapıp sonucunu alıyoruz.

Programlama dillerinde, fonksiyonlar iki şekilde çağrılabilir: Call by Value ve Call by Reference.

Genelde fonksiyon method tanımlamalarınıza extra bildirmediğiniz sürece “reference by value” yaklamşımı kullanılır. Bizde ilk önce bunu bir örnek ile göreceğiz.

Call by value

Buraya kadar tamam. Normal şartlarda bu nasıl gerçekleşiyor basit bir örnek yapalım.İlk örneğimizde 2 değişkeni birbiriyle değiştiren klasik bir swap fonksiyonu yazcağız.Örneğimizi inceleyelim.

#include <stdio.h>


void swap(int a,int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {

    int a = 50 , b = 20;
    printf("a: %d \t b: %d \n",a,b);

    /* calling a function to swap the values */
    swap(a, b);

    printf("a: %d \t b: %d \n",a,b);

    return 0;
}

Yukarıdaki kodu incelersek standart bir swap fonksiyonumuz var. Ancak bunu çağırsak bile çıktı değişmiyor. a ve b değişkenlerimiz değerlerini koruyorlar.

metinagaoglu@linux-mint:~/Desktop/C/refs$ ./ref
a: 50 b: 20
a: 50 b: 20

Reference by value’da bir değişkenin değerini bufonksiyonun parametresine kopyalar. Bu nedenle, ana işlevin parametresinde yapılan değişiklikler bağımsız değişkeni etkilemez.Saddece fonkssiyonun içerisinde geçerliğidir.Aynı değerden memory’de 2 tane vardır. Parametre olarak geçilenler direk değerleri kopyalanmıştır.

Yaptığınız değişiklikler kopyalanan değerler üzerinde yapılır.Foksiyon dışındakiler etkilenmez.Fonksiyo çalıştıkran sonra kopya silinir ve memory’de sizin geçtikleriniz aynen duruyordur. Bu yüzden çıktılarımız aynı.

Call by Reference

Call by reference ta ise fonksiyona parametre olarak referencelarını geçiyoruz.Yani memory’de nerde olduklarını. Fonksiyonun içerisinde ise bu değerler ile memory’deki yerini bildiğimiz değişkendeki değerlerle gene istediğimiz işlemi yapabiliyoruz. Diğer yaklaşımdan farklı değerler kopyalanmadığı için yaptıklarınız her değişiklik değeri değiştiriyor.

Az önce yaptığımız swap fonksiyonunu şimdide call by reference ile yazalım.

#include <stdio.h>

void swap(int *a,int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}

int main() {

int a = 50 , b = 20;
printf("a: %d \t b: %d \n",a,b);

/* calling a function to swap the values */
swap(&a, &b);

printf("a: %d \t b: %d \n",a,b);


return 0;
}

Bu seferki durumda ise gördüğünüz gibi main içerisinde swap fonksiyonmuza & işareti ile referansını geçtik. İçeride ise parametre olarak geçilen değerin referansı ile memorydeki adresine ulaştık ve o değerler üzerinde işlem yaptık.

metinagaoglu@linux-mint:~/Desktop/C/refs$ ./ref
a: 50 b: 20
a: 20 b: 50

Tabiki biz bu yazıda gene kolayına kaçtık ve 2 integer değişkeni kullandık.Ancak örnekleri bununla sınırl tutmayın.Elimizde bir array veya linkedlist vs türünde büyük bir değer varsa ve bunu üzerinde işlem yapıcaksak şeklindede düşünebilirsiniz.

Ne olduğunu kabaca anladığımıza göre biraz avantaj ve dezavantajlarından bahsedelim.

Call by value avantajları

  1. Parametre olarak geçilen ana değişkenler değişmez.
  2. Takibatı ve debug yapması daha kolaydır.Ana değişkendeki değerleri değiştirmediği için fonksiyon içinde daha rahat geçici işlem vs yapılabilir.

Dezavantajları

  1. Hafıza açısından verimli değildir.Aynı değişken için oluşturulmuş iki adet kopya vardır..

Call by reference avantajları

  1. Fonksiyon argümanın değerini değiştirebilir.
  2. Bellek alanından tasarruf etmenize yardımcı olur. Tek bir değeri tutmak için yinelenen veriler oluşturmaz.
  3. Bu yöntemde işlem yapılan parametrenin bir kopyası yoktur. Bu nedenle çok hızlı işlenir.

Dezavantajları

  1. Referans alan bir fonksiyonunu parametresinin boş olmadığından emin olması gerekir.
  2. Çok iş parçacıklı programlarla çalışırken tehlikelidir.
  3. Takibatı ve debug’ı bi nebze daha zordur.

Göz atmanızı tavsiye ettiğim kaynaklar:

https://stackoverflow.com/questions/40185665/performance-cost-of-passing-by-value-vs-by-reference-or-by-pointer

https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/

https://www.guru99.com/call-by-value-vs-call-by-reference.html

C programlama dilinde string fonksiyonları

Herkese merhaba , önceki yazımda c ile char veri tipini görmüştük.Bu yazıda ise string manipülasyonu yapan birkaç fonksiyondan bahsedeceğiz.

strcat()

İlk fonksiyonumuz strcat(contcatenates).Strcat iki char tipindeki değişkeni birleştirmeye yarar.2 tane parametre alır.Hedef ve kaynak.

char *strcat(char *destination, const char *source)

Strcat () fonksiyonu, hedef string’i ve kaynak stringini birleştirir ve sonuç hedef değişkeninde saklanır.

Hemen örnekle görelim.

#include <stdio.h>
#include "string.h"

int main() {
    char str1[50] = "My name is", str2[] = "metin";

    strcat(str1,str2);

    puts(str1);
    puts(str2);
    return 0;
}

Sonuç

My name ismetin
metin

Dikkat etmemiz gereken nokta arkadaşlar birleştirilen string 1. parametrede kalmaktadır.

2. nokta ise strcat() , destionation string yan 1. parametrenin boyutu source stringini saklayacak kadar büyük olmalıdır. Değilse, segmentasyon hatası hatası alırsınız.

C strcmp()

Diğer göreceğiniz fonksiyon string compare, parametre olarak verilen 2 string karşılaştırır.Eğer birbirleri ile aynı ise 0 döndürür.

int strcmp (const char* str1, const char* str2);

Strcmp () işlevi iki char değişken alır ve geriye integer döndürür.

İki stringin ilk karakteri eşitse, iki stringin de sonraki karakteri karşılaştırılır. Bu işem iki string değerin karakterleri birbirleri ile farklı olana veya boş bir ‘\ 0’ karakterine ulaşılana kadar devam eder.

Hemen örneğimizi yapalım.

#include <stdio.h>
#include "string.h"

int main() {
char var1[] = "eth0";
char var2[] = "eth0";
char var3[] = "wan";

//comparing var1 and var2
if( strcmp(var1,var2) == 0 ) {
printf("These variables are same \n");
}

//comparing var1 and var3
if( strcmp(var1,var3) != 0 ) {
printf("These variables are not same \n");
}

}

Sonuç

These variables are same
These variables are not same

C strcpy()

String copy fonksiyonu olan strcpy() fonksiyonuna göz atalım.Fonksiyon strcat gibi önce char tipnide destionation sonrada source parametresi alıyor.

char* strcpy(char* destination, const char* source);

Strcpy () foksiyonu, source parametresi ile gelen string’i (boş karakter dahil) destination değişkenine kopyalar.

#include <stdio.h>
#include "string.h"

int main() {

char str1[20] = "PHP";
char str2[15];

strcpy(str2,str1);
puts(str2);
return 0;
}

Çıktı

PHP

Gördüğümüz gibi başta boş olan str2 değişkeni copy komutundan sonra ekrana kopyalandığı değeri veriyor.

C strlen()

Son göreceğimiz fonksiyon ise string length fonksiyonu.bu fonksiyon parametre olarak verilen string değerin uzunluğunu unsigned size_t olarak geri döner.

#include <stdio.h>
#include "string.h"

int main() {

char var1[20]="C programming";
char var2[20]={'P','r','o','g','r','a','m','\0'};

int len = strlen(var1);

// using the %zu format specifier to print size_t
printf("Length of string var1 = %zu \n",strlen(var1));
printf("Length of string var2 = %zu \n",strlen(var2));

return 0;
}

Çıktı

Length of string var1 = 13
Length of string var2 = 13

Strlen () fonksiyonunun uzunluğu hesaplarken \0 null karakterini saymadığını unutmayın.Bu kısmını kullanıcdan soyutlar.

Not: bu yazıda ele aldığımız fonksiyonlar <string.h> içerisinde tanımlıdır.Kullandığımız kodlarda bunu include ettiğimize dikakt edin.

Teşekkürler…

C programlama dilinde stringler

Selam , bu yazıda C programlama dilindeki char veri türünden bahsedeğiz.Aslında yapısı itibariyle üst seviyedeki programlama dillerinden farklıdır.Özellikle farklı dilden geçenlerin zorlandığı bir konu olduğunu düşünüyorum.Lafı çok uzatmadan başlıklara inelim.

Aslında C programlama dilindeki stringler sıfır karakter \0 ile sonlandırılmış bir karakter dizisidir. Örneğin:

char c[] = "c string";

Derleyici, çift tırnak işaretleri içine alınmış bir dizi karakterle karşılaştığında, varsayılan olarak sonuna bir null karakteri \ 0 ekler.

Bir string nasıl tanımlanır?

C’de string değişkenelri aşağıdaki şekilde tanımlayabilirsiniz.

    char c[] = "abcd";

    char c[50] = "abcd";

    char c[] = {'a', 'b', 'c', 'd', '\0'};

    char c[5] = {'a', 'b', 'c', 'd', '\0'};

Stringlere sonradan değer atama

Diziler ve diziler C’dek tanımlandıktan sonra atama operatörünü desteklemezler. Örneğin

char name[100];
name = "Metin";  // Error! array type is not assignable.
string_example1.c:16:17: warning: initializer-string for array of chars is too lon

Kullanıcıdan string okuma

Kullanıcıdan string okumak için scanf () fonksiyonunu kullanabilirsiniz.

Scanf() fonskyinonuda dikakt etmeniz gereken boşlukla (boşluk, satırsonu, sekme vb.) karşılaşana kadar karakter dizisini okur.

Örnek 1: scanf() ile string okuma

#include <stdio.h>
int main()
{
    char name[20];
    printf("Enter name: ");
    scanf("%s", name);
    printf("Your name is %s.", name);
    return 0;
}

Output

Enter name: Metin Ağaoğlu
Your name is Metin.

Metin Ağaoğlu yukarıdaki programa girilmiş olsa da, name değişkeninde sadece “Metin” saklandı. Metin’den sonra boşluk ile karşılaştığı için okumayı durdurdu..

Bir string satırı nasıl okunur?

Bir string satırını okumak için fgets() fonksiyonunu kullanabilirsiniz. Sonrasında görüntülemek için puts () fonksiyonunu çağırabilirsiniz.

Örnek 2: fgets() ve puts()

#include <stdio.h>
int main()
{
    char name[30];
    printf("Enter name: ");
    fgets(name, sizeof(name), stdin);
    printf("Name: ");
    puts(name);
    return 0;
}

Burada, kullanıcıdan bir dizge okumak için fgets () işlevini kullandık.

fgets (isim, sizeof (isim), stdlin); // dizeyi oku

Sizeof (isim) değeri 30 olur. Dolayısıyla, girdi olarak isim dizgisinin boyutu olan en fazla 30 karakter alabiliriz.

Dizeyi yazdırmak için puts (name); kullandık.

String değişkenlerini fonksiyonlara parametre olarak geçme

C’de stringler, dizilere benzer şekilde bir fonksiyona parametre olarak aktarılabilir. Hemen bir örnek yapıp bunu görüntüleyelim.

Stringi fonksiyona parametre geçirme

#include <stdio.h>
void displayString(char str[]);

int main()
{
    char str[50];
    printf("Enter string: ");
    fgets(str, sizeof(str), stdin);             
    displayString(str);     // Passing string to a function.    
    return 0;
}
void displayString(char str[])
{
    printf("String Output: ");
    puts(str);
}

Sonraki yazıda ise C’deki string leri fonksiyonlar ile nasıl müdahele edip üzerinde işlem yaparız bunu ele alacağız.

Teşekkürler…

Kaynak: https://www.programiz.com/c-programming/c-strings

Golang hash fonksiyonlari

Merhaba arkadaşlar

Golang ile temel ve yaygın kullanılan hash algoritlamarını nasıl kullanabileceğimizle ilgili bir örnek paylaşmak istedim.

package main


import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"fmt"
)

func main() {

string := "Golang hash"

hmd5 := md5.Sum([]byte(string))
hsha1 := sha1.Sum([]byte(string))
hsha256 := sha256.Sum256([]byte(string))

fmt.Printf(" MD5: %x\n", hmd5)
fmt.Printf(" SHA1: %x\n", hsha1)
fmt.Printf("SHA256: %x\n", hsha256)
}

Golang’te Değişken türleri ve tanımlamaları

Her programın bazı verileri ve bilgileri bellekte saklaması gerekir. Veriler, belirli bir bellek konumunda saklanırlar.

Değişken dediğimiz şeyler, verilerin saklandığı bir hafıza konumuna verilen uygun bir isimdir. Bir adın dışında her değişkenin de ilişkili bir türü vardır.

Değişken türleri(int,string) ilgili veri kümelerini kategorilere ayırır, ram bellek üzerinde saklanma biçimlerini, tutabilecekleri değer aralığını ve üzerlerinde yapılabilecek işlemleri tanımlamaktadırlar.

Kısa bir girişten sonra go da nasıl değişken tanımlarız incelemeye başlayalım.

Var anahtar sözcüğü ile değişken tanımlama

İlk inceleyeceğimiz tür var anahtar sözcüğü ile oluşturulan olucaktır.Burda dikkatini çeken şey tiplerin değişken isimlerinden sonra gelmesi olabilir.Çoğu programlama dilinden farklı olarak golang’te öncelikle değişken adı sonra türü gelmektedir.Aşağıdaki örneği inceleyelim.

var a int
var b bool
a = 15
b = false

Short-hand notation (:=) ile değişken tanımlama

a := 15
b := false

Bu şekilde bir tanımlama yaptığınız zaman sadece bir deklarasyon yapmakla kalmayıp aynı zamanda bir değer ataması yapmış oluyorsunuz; ancak bazı göz ardı etmememiz gereken hususlar var. Örneğin, yukarıdaki yöntemle aynı değişkeni iki kez tanımlayın aynı değeri atadığınız zaman Go Compiler size hata veriyor. Yine aynı şekilde short-hand notation ile değişkenleri fonksiyonların dışında tanımlayamıyorsunuz.

Go, Statik olarak yazılan bir dil olmasına rağmen, beyan ettiğiniz her değişkenin türünü açıkça belirtmenizi gerektirmez.

Başlangıç değeri olan bir değişkeni bildirdiğinizde, Golang otomatik olarak değişkenin türünü sağ taraftaki değerden alır. Bu nedenle, bildirim sırasında değişkeni başlatırken türü belirtmeniz gerekmez.

Çoklu değişken tanımlamaları

var (
  x int
  b bool
)

var (
  firtname , lastname string
  age int8
)

Ayrıca çoklu değişkeni tek satırdada tanımlayabilirsiniz.

a, b := 20, 16

Zero values

Golang’te tanımladığınız değiikene herhangir bir değer atamazsanız değişken türüne göre boş değer atanacaktır.Aşağıdaki tabloda tipine göre başlayacağı sıfır değerlerini görebilirsiniz.

TypeZero values
boolfalse
string“”
int, int8, int16 vs.0
float32, float640.0

Değişken Türleri

Go’da değişken tanımlamayı inceledikten sonrada şimdi değişken tiplerimi inceleyelim.

Boolean

Boolean tipi aslında hepimizin aşina olduğu içerisine mantıksal olarka true ve false tutan değişken tipidir.

Sayısal Tipler

Go, int,float gibi diğer programlama dillerinden iyi tanıdğımız değişken tipine sahiptir. Bu tür makineniz için uygun uzunluğa sahiptir, yani 32 bitlik bir makinede 32 bit ve 64 bitlik bir makinede 64 bittir.

Uzunluk hakkında açık olmak istiyorsanız, int32 veya uint32 ile de buna sahip olabilirsiniz. (İmzalı ve imzasız) tamsayıların tam listesi int8, int16, int32, int64 , uint8, uint16, uint32, uint64‘tür.

Ayrıca küsuratlı sayılar için kullanabileceğimiz float32 ve float64 türleride golang’te mevcuttur.

Örneğin kullanıcınızın yaşını tutacaksanız int8 ile daha kısa bi aralık belirleyip belleğinizi daha verimli kullanabilirsiniz.

Not: u ile başlayan veri tipleri bir çok dilden bildiğimiz üzere unsigned(sinyalsiz)’dir yani 0’dan küçük-eksi değer alamaz.

Strings
Bir diğer önemli değişken türü ise gene hepimizin aşina olduğu stringlerdir.

s := "Hello World!"

Go’daki string, çift tırnak içine alınmış bir dizi UTF-8 karakteridir (”). Tek tırnak (’) kullanırsanız, bir karakter (UTF-8 ile kodlanmış) anlamına gelir; Bu, Go’da bir string değildir.Yeni başlayanların genellikle en çok hata yaptığı noktadır.O yüzden dikkat etmenizde fayda var.

Bir değişkene string atandıktan sonra içerisinden karakter değiştirilemez

C’den gelen insanlar için; Go’da aşağıdaki işlem hata verecektir.

var s string = "test"
s[0] = 'c' ← Birinci karaktei ’c’ ile değiştir. Fakat bu bir hatadır

Eğer böyle birşey yapma ihtiyacınız varsa aşağıdaki kod’u incelemenizi öneririm.

s := "test"
c := []rune(s)
c[0] = 'c'
s2 := string(c)
fmt.Printf("%s\n", s2)

Şimdi adım adım kod’ta ne yaptığımıza bir bakalım.

  • İlk Önce rune(Unicode kod noktalarını temsil ederler.) ile string’imizi rune array’ine dönüştürdük.
  • Daha sonra bu array’in ilk elemanını değiştirdik.(Tek tırnak kullanıldığına dikkat edin.)
  • Daha sonra rune tipinde değer tutan array’imizi tekrar string’e çevirip ekrana yazdırdık.

Runes

Rune, aslında int32 için bir alias’dır UTF-8 kod noktasıdır.

Rune değişmez değerleri yalnızca 32 bit tam sayı değerleridir (ancak türsüz sabitlerdir, bu nedenle türleri değişebilir). Unicode kod noktalarını temsil ederler. Örneğin, rune değişmez değeri ‘a’ aslında 97 sayısıdır.

fmt.Println([]rune("cafe")) // [99 97 102 233]

Rune tipi ile ilgili ileride daha detaylı yazı hazırlamayı düşünüyorum.Rune türü ile ilgili daha detaylı bilgi için aşağıdaki kaynaklara göz atabilirsiniz

Visual Basic Hesap Makinesi

Visual Basic ile hesap makinesi için 4 buton 2 textbox 2 tane label oluşturuyoruz.Textbox’a sayılar girilcek aradaki label basılan butonun işlemini yazıcak(+.- gibi).

Kısaca textbox + label + textbox + label => son label’da ise işlemin sonucu yazıcak

Butonların kod yapısı

Private Sub bolme_Click(Index As Integer)
Label1 = "+"
Label2 = Val(txt1) + Val(txt2)
End Sub

Butona basıldığıda Label’i yani textbox’ların arasındakini + yaptık 2. satırda ise label2 yi yani textboxların sonundakini txt1 ve txt2 ye girilen sayıların toplamına eşitledik.

Bu buton gibi 4 buton yapıp onlarında işlemini  –  * / yaptığınız zaman txt1 ve txt2 ye girilen sayılar bastığınız butona göre işlemlendirip labellara yazdırılacak.Kodları alırken koddaki label isimleri ve textbox isimlerinin aynı olduğuna dikkat edin.

Programın Son hali aşağıdaki gibidir

Private Sub Command1_Click(Index As Integer)

End Sub

Private Sub bolme_Click(Index As Integer)
Label1 = "/"
Label2 = Val(txt1) / Val(txt2)
End Sub

Private Sub carpma_Click(Index As Integer)
Label1 = "*"
Label2 = Val(txt1) * Val(txt2)
End Sub

Private Sub cikar_Click(Index As Integer)
Label1 = "-"
Label2 = Val(txt1) - Val(txt2)
End Sub

Private Sub Form_Load()

End Sub

Private Sub topla_Click(Index As Integer)
Label1 = "+"
Label2 = Val(txt1) + Val(txt2)
End Sub

C++ Karar Yapıları

İf komutu anlaşılması ve yazımı en basit olanıdır.İf komutu bir grup komutun koşullu olarak yütülmesi amacıyla kullanılır.Buna bir örnek verecek olursak düşünün bir sınav yapılıyor ve 50 üzeri alan geçicek altında olan ise kalıcak dilerseniz bu örneğimizi programımıza dökelim:Ama önce if else komutunun temel yapısınız ve sözdizimini görelim

İf Else Temel Yapısı

if (koşul)
{
//Koşul doğruysa çalışıcak olan blok
}else{
//Koşul false dönerse çalışıcak olan blok
}

Temel yapıyı gördüğümüze göre ilk örneğimize geçelim

Örnek-1

#include 
main()
{
int not;
cout <<"Notunuzu Giriniz:";
cin >>not;
if(not >=50)
{
cout << "Geçtiniz";
}else
{
cout << "Kaldınız";
}
}

Örneğimizi incelediğimizde kullanıcıdan notunu girmesini isedilk daha sonra bunu not değişkenine atadık karar yapıları ile geçip veya kaldığını belirledik

Örnek-2

#include 
main()
{
int yas;
cout <<"Kaç yaşındasınız";
cin >>yas;
if (yas <= 25)
cout << "Gençsiniz";
if (yas > 25 && yas <=50)
cout <<"Orta yaştasınız";
if (yas >=50 && yas <=60)
cout << "yaşlısınız";
return 0;
}

Örneğimizde birden fazla if yapısı ile programımızda kontrol sağladıkŞimdide iç içe if else yapısını görelim

İç İçe İf-Else yapısı

#include 
main()
{
int not;
cout <<"Notunuzu Giriniz";
cin >> not;
 if(not > 50)
  cout << "Geçtiniz";
 if (not < 50)
{
  if (not == 50)
  cout << "Koşullu Geçtiniz";
  else
  cout << "Sınıfta kaldınuız";

}
}

? komutu

Kendine özgü bir  yazılımı ve mantıksal kullanımı vardır.Fakat tüm if-else komutları yerine kullanılmaz.Yalnızca karşılaştırma sonrası,tek komut kullanılan uygulamalar için geçerlidir.Bu yapı  PHP programlama dilindede mevcuttur.

Örnek

int sayi;
cout <<"Bir Sayı Giriniz";
cin >> sayi;
cout << (sayi%2==!?"tek":"çift");

İf else yapısında olduğu gibi program True döndürürse ilkini False döndürürse ikinci bloğu çalıştırıcaktır.

Switch-case Komutları

Swtich-case deyimi işlev bakımından if deyimine çok benzemektedir.Çok sayıda if işlem bloğu kullandığımızda programın okunurluğu azalacak ve programı izlemek zorlaşıcaktır.Programımızın bir değerini birçok değerle karşılaştırmak gerektiğinde switch komutunu kullanıcağız.Switch deçeneği ile değiişkenin durumuna göre birçok durum içerisinden bir tanesini gerçekleştirir.İstersekte if deyimi ile swtich caseyi kullanabiliriz.Switch in yapıtığı iş kısaca ifadenin değierini sırayla sabitlerle karşılaştırmak ve her satırı işlemektir.

Sözdizimi

switch (Kontrol Değeri)
{
 case Sabit1:
 //koşul uyuyo ise çalışacak kodlar
 break;
  case Sabit2:
 //koşul uyuyo ise çalışacak kodlar
 break;
default:
//hiçbir koşul uymasssa çalışacak olan kodlar.
break;
}

Daha iyi anlamak açısından örneğimizi inceleyelim. Örnek:1

#include 
main()
{
int i;
cout << "1 ile 5 arasında bir sayı giriniz";
cin >>i;
switch (i)
 {
  case 1:
  cout<<"1 girdiniz";
  break;

  case 2:
  cout <<"2 girdiniz";
  break;

  default:
  cout <<"Sayı 1 ile 2 den farklı"
 }
}

Görmüş olduğunuz gibi i değişkenine bağlı olarak program işiyor.Case lerin aldığı değere göre kendinden sonra gelen komutlar işleniyor.Programımızda değikene 1 değerini verdiğimizi farzedelim.Case 1 adlı satırı geçip ondan sonraki komut dizisini işleme soktuk.Bu işlemin tamamlanması için break; komutu kullanılıyor.Break komutu derleyiciye switch komutundan çıkması için talimat verir.Birçok karşılaştırma olduğunda switch ye ihtiyaç duyuyoruz. Böyle bir programı if-else ilede yapabilirdik ancak switch case ile takibi daha kolay.

Visual Basicde İf Else Yapısı

Her programlama dilinde olduğu gibi visual basic tede karar yapılar hayati öneme sahiptir.Mantık aynıdır ancak sözdizimleri farklılık gösterebiliyo.En basit şekilde Visual Basicte İf-Else yapısı aşağıdaki gibidir.

Private Sub Command1_Click()
not = 0
not= InputBox("Kaç kilosun")
If sayi < 50 Then
MsgBox kilo, 48, "Kaldın"
Else
MsgBox kilo, 32, "Geçtin"
End If
End Sub

Yukarıdaki örnekte not değişkeninin 0 a atadık daha sonra kullanıcıdan not ortalamasını girmesini istedik girdiği sayıya göre if else yapısıyla geçip kaldığını belirttik.Genel olarak visual basicde if-else sözdizimi aşağıdaki gibidir

If Koşul Then
//Koşul True ise gerçekleşicek işlemler
Else
//Koşul False dönerse gerçekleşicek işlemler
End If

İf Else yapısı ile şifre sorgulama uygulamasının kodları aşağıdaki gibidir.

 Dim sifre As String
        Label2.Text = ""
        sifre = TextBox1.Text
        If sifre = "a1b2c3" Then
            Label2.Text = "Sifre dogru"
        Else
            Label2.Text = "Sifre yanlis"
        End If

Örnekte Şifre adında string değişken tanımlıyoruz.Textboxtan değer alıp şifre değişkenine atıyoruz.Daha Sonra şifre istediğimiz değerse ona göre mesaj şifre yanlışsa ise olumsuz mesaj yazdırıyoruz

Operatörler ile İf-Else Yapısı

Dim yas As Integer
        Dim yas As Integer
        Label2.Text = ""
        yas = TextBox1.Text
        If yas <= 6 And yas >= 65 Then
            Label2.Text = "Ücretsiz Geçiş"
        Else
            Label2.Text = "Ücretli Geçiş"
        End If
End Sub

Örneği incelediğimizde yas değişkeni 6 dan küçük ve(And) 65 ten büyükse label a ücretsiz geçiş yazdırdı.False değeri döndüğünde ise ekrana ücretli geçiş yazıcaktır.Son Olarak İç içe İf-Else örneği verip yazıyı bitirelim.

Dim ort As Integer
        Label2.Text = ""
        ort= TextBox1.Text
        If ort> 50 Then
            If ort< 75 Then
                Label2.Text = "BB ile Geçtin"
            Else
                Label2.Text = "AA ile geçtin"
            End If
        Else
            Label2.Text = "Kaldın"
        End If
    End Sub
 

Örneği İncelediğimizde ort adında Integer değişken tanımladık ve ilk önce bunun 50 den büyük ve küçük olma durumunu kontrol ettik 50 den büyükse geçme notunuz 50 den küçükse kaldığınız label’a yazdırdık.

Visual Basic Vize Soruları

Üniversitede okurken bize bu tarz sormuşlardı.Belki işinize yarar diye paylaşıyorum.

1.   Aşağıdaki değişken tiplerinden hangisi 2 byte’lık işaretli tam sayı tipidir ve aldığı değerler 32767 ile  -32765 arasındadır?

a) Byte                  b) İnteger                   c) Long                       d) Decimal

2.  Aşağıdakilerden hangisi nesnenin dizideki kaçıncı eleman olduğunu belirten parametredir?

a) Change             b) Click                      c) Locket                    d) İndex

  1. Girilen  text kutusu içerisindeki değeri sayısal değere çeviren komut hangisidir?

a) Dim                  b) İnteger                   c) Val                          d) Public

4. Aşağıdakilerden hangisi değeri true olduğunda text kutusuna birden fazla satır girilebileceğini gösteren properties özelliğidir.?

a) Multiline           b) Alignment             c) Locket                    d) MaxLength

5.   Aşağıdakilerden hangisi bir butona basıldığında algılanarak sonuca aktarılmasını sağlar?

a) Change()           b) Click()                   c) DblClick()              d) KeyPress

6.   Dim’in hangi amaçla kullanıldığını kısaca anlatın ve bir örnek verin.

7.   VB’in standart kontrol elemanlarının dışında, toolbox’a kontrol elemanı eklemek için yapılması gereken işlemleri ve hangi uzantılı dosyaları ekleyebileceğimizi kısaca yazın.

  1. 5 takımlı bir ligde girilen sayıdaki (sıradaki) takımın hangisi olduğunu bize verecek ve bu takımın puanını gösterecek programı yapın (takımların isimleri önemli değil).

9.   Shift, ctrl ve alt tuşlarına basıldığını algılayan ve hangi tuşa basıldığını yazdıran küçük bir program parçası yazın.

NOT: İlk 5 soru 6 puan,  6 ve 7. sorular 15 puan, 8 ve 9. sorular 20 puandır.

CEVAP ANAHTARI

  1. b
  2. d
  3. c
  4. a
  5. a
  6. Dim değişken tanımlamada kullanılan bir komuttur. Örnek : “Dim Adı As String”
  7. Kontrol elemanlarını Project menüsündeki Components seçeneği ile açılan pencereyi kullanarak ekleriz. Kontrol elemanı dosyasının uzantısı OCX’ dir.

text1 = “”

if shift AND vbShiftmask Then Text1= “Shift Tuşu Basılı”

if shift AND vbCtrlmask Then Text1= Text1+“Control Tuşu Basılı”

if shift AND vbAltmask Then Text1= Text1+“Alt Tuşu Basılı”