c++ etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c++ etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

 
Bilgisayar içerisinde tüm veriler bitler ile temsil edilir. Her bit yalnızca 0 veya 1 değerini alabilir. Çoğu sistemde 8 bit bir baytı oluşturur. Byte, char tipi için standart depolama birimidir. Diğer veri tipleri daha çok sayıda baytlar içinde saklanır. Bit operatörleri operandlarının bitlerini yönetmek için kullanılır. Bit operatörleriyle genellikle işaretsiz tamsayılar (unsigned int) kullanılır. Bit işlemleri doğası gereği makine-bağımlı olduğundan dolayı bu programlar sizin sisteminizde doğru olarak çalışmayabilir.

Bit operatörleri şunlardır: AND(&), OR( | ), EXCLUSIVE OR(^), sola kaydırma(<<), sağa kaydırma(>>) ve tümleyen(~).

AND(&): İki operandın ikisinin de ilgili bitlerinde 1 varsa sonuçtaki bitler 1 yapılır.

OR( | ): İki operandın ilgili bitlerinden en az biri 1 ise sonuçtaki bitler 1 yapılır.

EXCLUSI ve OR (^): Operandların ilgili bitlerinden yalnızca biri 1 ise sonuçtaki bitler 1 yapılır.

Sola kaydırma (<<): İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sola kaydırır. Sağdan itibaren 0 ile doldurulur.

Sağa kaydırma(>>): İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sağa kaydırır. Soldan itibaren yapılacak doldurma işlemciye bağlıdır.

Tümleyen (~): Tüm sıfır bitleri 1, tüm 1 bitleri 0 yapar

İşaretsiz (unsigned) Tam Sayıyı Bit olarak Yazdırma

Bit operatörlerini kullanırken, değerleri ikilik sistemde yazdırmak bu operatörlerin etkilerini gösterebilmek için oldukça kullanışlıdır.

Aşağıdaki örnek, unsigned bir tam sayıyı her biri 8 bitten oluşan gruplarla ikilik gösterimde yazdırmaktadır.

#include <stdio.h>

void displayBits(unsigned int value);

int main(){
unsigned int x;
printf("%s","Enter a nonnegative int: ");
scanf("%u",&x);
displayBits(x);
}

void displayBits(unsigned int value){
unsigned int c; // sayıcı

//displayMask'ı tanımlama ve 31 biti solo kaydırma
unsigned int displayMask = 1 << 31;

printf("%10u = ",value);
for(c=1;c<=32;++c){
putchar(value & displayMask ? '1' : '0');
value <<=1; // 1 ile değeri sola kaydırma

if(c % 8 == 0) { // 8 bitten sonraki yerin çıkışı
putchar(' ');
}
}
putchar('\n');
}
Ekran Çıktısı:

Enter a nonnegative int:65000
      65000 = 00000000 00000000 11111101 11101000

displayBits fonksiyonu value ve displayMask değişkenlerini birleştirmek için bit AND operatörünü kullanır. Sıklıkla bit AND operatörü maske (belirli bitleri 1 değerine ayarlanmış bir tam sayı değeri) adı verilen bir operant kullanılır. Maskeler diğer bitleri seçerken bazı bitleri değer içinde saklamak için kullanılır. displayBits fonksiyonunda maske değişkeni displayMask şu değere atanmıştır;

1 << 31 (10000000 00000000 00000000 00000000)

Sola kaydırma operatörü, 1 değerini displayMask içindeki en düşük değerlikli (en sağdaki) bitten en yüksek değerlikli (en soldaki) bite doğru kaydırır ve sağdan itibaren bitleri o ile doldurur.
putchar(value & displayMask ? '1' : '0');

değişkenin en solundaki bit değerinin 0 ya da 1 olarak çıkarılmasına karar verir. value ve displayMask "&" kullanılarak birleştirilirse value değişkeninde en soldaki bit dışındaki bitler saklanır çünkü 0 ile biten bitler birbirine geçiş sağlar. Eğer en soldaki bit 1 ise value ve displayMask gerçek bir değer alır ve 1 ekrana yazılır aksi durumda 0 yazılır. Ardından value değişkeni bir sola kaydırılır value <<=1 ile. Atanmamış değişken value'da bu adımlar her bit için tekrarlanır .

Bitsel AND Operatörü (&)


Kullanılan iki operandın bitleri 1 ise, bitsel AND'in çıkışı 1'dir. Operandlardan herhangi biri 0 ise, bitsel AND'in çıkışı 0'dır.

12 ve 25 tamsayılarının bit düzeyinde AND işlemini inceleyelim:

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bit Operation of 12 and 25
  00001100
& 00011001
  ________
  00001000  = 8 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a&b);
    return 0;
}

Çıktı:

Output = 8

Bitsel OR Operatörü (|)


Kullanılan operadlardan en az biri 1 ise, bitsel Or'ın çıkışı 1'dir.

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bitwise OR Operation of 12 and 25
  00001100
| 00011001
  ________
  00011101  = 29 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a|b);
    return 0;
}


Çıktı:

Output = 29

Bitsel XOR (exclusive OR) Operatörü (^)


İki operandaki bitler zır ise, bitrsel XOR'un çıkışı 1 olur.

12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bitwise XOR Operation of 12 and 25
  00001100
^ 00011001
  ________
  00010101  = 21 (In decimal)
Örnek:

#include <stdio.h>
int main() {
    int a = 12, b = 25;
    printf("Output = %d", a^b);
    return 0;
}

Çıktı:

Output = 21


Shift Operatörleri


C'de iki tane shift operatörü vardır: Right shift ve left shift


Rigth Shift Operatörü(>>)


Sağa kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sağa kaydırır. 

212 = 11010100 (In binary)
212>>2 = 00110101 (In binary) [Right shift by two bits]
212>>7 = 00000001 (In binary)
212>>8 = 00000000 
212>>0 = 11010100 (No Shift)

Left Shift Opetatörü(<<)


Sola kaydırma operatörü, tüm bitleri belirli sayıda belirtilen bit kadar sola kaydırır. Sola kaydırma operatörü tarafından boşaltılan bit konumları 0 ile doldurulur.
212 = 11010100 (In binary)
212<<1 = 110101000 (In binary) [Left shift by one bit]
212<<0 = 11010100 (Shift by 0)
212<<4 = 110101000000 (In binary) =3392(In decimal)
Örnek

#include <stdio.h>
int main() {
    int num=212, i;
    for (i=0; i<=2; ++i) {
        printf("Right shift by %d: %d\n", i, num>>I);
    }
    printf("\n");

    for (i=0; i<=2; ++i) {
        printf("Left shift by %d: %d\n", i, num<<i);    
    }

    return 0;
}

Çıktı:



Right Shift by 0: 212
Right Shift by 1: 106
Right Shift by 2: 53

Left Shift by 0: 212
Left Shift by 1: 424
Left Shift by 2: 848




C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:


Kaynaklar:
https://www.bilgigunlugum.net/prog/cprog/2c_veri
https://www.programmingsimplified.com/c/source-code/c-program-convert-decimal-to-binary
https://www.programiz.com/c-programming/bitwise-operators
https://www.javatpoint.com/bitwise-operator-in-c
Deitel Deitel C/C++


Bu bölüm en eğlenceli bölümlerden birisi. Bu bölümde kendi fonksiyonlarımızı yazacağız. Yani modüler programlamaya giriş yapacağız.  Hadi başlayalım.

Fonksiyon Nedir?


C'de altprogramlara fonksiyon denir. Her fonksiyon faydalı bir takım işlemleri yerine getirmek için tasarlanır ve çağrılır. Fonksiyonların, onları çağıran fonksiyonlardan altıkları girdileri ve yine onları çağıran fonksiyonlara gönderdikleri çıktıları vardır. 

Fonksiyonlar bir programı modüllere ayırmamıza izin verir. Fonksiyon tanımlarında tanımlanan tüm değişkenler yerel değişkenlerdir (yalnızca içerisinde tanımlandıkları fonksiyon içinde erişilebilirler).


Fonksiyon Tanımlamaları 

C'de fonksiyon tanımlama işleminin genel biçimi şöyledir:

[geri dönüş değerinin türü] <Fonksiyonun İsmi> ([Parametreler]) 
{
...
}

Yukarıdaki gösterimde <...> ile gösterilen ifadeler zorunlu olarak bulunması gerekenleri; [...] bulunması zorunlu olmayan, isteğe bağlı ifadeleri göstermektedir. Örneğin:

float fonk(){
    .   
    .
    .
}


Yukarıdaki fonksiyonun geri dönüş değerinin float olduğunu ve parametre almadığını görüyoruz.

Bir fonksiyonun parametresi ve/veya geri dönüş değeri olmayabilir. Parametresiz fonksiyonlarda fonksiyon parantezleri içine ya hiçbir şey yazılmaz ya da void anahtar sözcüğü yazılır. Örneğin:

float a1(void){                    float a1(){
    .                                  .
    .                                  .
    .                                  .
}                                  }


Yukarıdaki iki tanımlama biçiminde de a1 fonksiyonunun parametresiz olduğu anlatılmaktadır, dolayısıyla eşdeğerdir.

Fonksiyon tanımlanırken geri dönüş değerinin türü yerine hiçbir şey yazılmazsa C derleyicisi geri dönüş değerinin türünün int olduğunu varsayar. Örneğin:

y1(){
    .   
    .    
    .
}

y1 fonksiyonunun parametresi yoktur; ancak geri dönüş değeri int türündendir. 


   ! C'de  fonksiyon içinde fonksiyon tanımlanmaz.. !


float fonk1(){
    ...
    int fonk2(){
        ...            /* Hatalı tanımlama */
    }
    ...
}

Yukarıdaki tanımlamada fonk2 'nin fonk1'in içinde tanımlandığını görüyoruz; bu nedenle tanımlama işlemi geçersizdir. İki fonksiyonun aşağıdaki örnekte olduğu gibi tanımlanması gerekmektedir:

float fonk1(){
    .
    .
    .
}

int fonk2(){
    .   
    .    
    .
}



Fonksiyonların Çağrılması


Bir fonksiyon çağrıldığında programın akışı fonksiyonu çalıştırmak üzere bellekte fonksiyon kodunun bulunduğu böyleye atlar; fonksiyonun çalışma işlemi bittikten sonra da akış tekrar çağıran fonksiyonun kalınan yerinden devam eder.


Fonksiyonlar ancak tanımlanmış fonksiyonların içerisinde çağrılabilirler. Örneğin:

main(){
    int a = 100, b =200;    
    printf("a= %d b = %d\n",a,b);
}
printf("merhaba\n"); // hata ! Burada fonksiyon çağrılmaz

fonk(){
    int x = 10, y = 20;
    printf("x= %d y = %d\n",x,y);
}


Burada printf, main ve fonk isimleri fonksiyonların içinde doğru biçimde çağrılmıştır. Ancak iki fonksiyonun arasında hiçbirinin içinde olmayacak biçimde çağrılmış olan: printf("merhaba\n"); geçersizdir. 

Örnekler:


1) Girilen iki sayıyı toplayan program:

#include <stdio.h>
int addNumbers(int a, int b);         // function prototype

int main()
{
    int n1,n2,sum;

    printf("Enters two numbers: ");
    scanf("%d %d",&n1,&n2);

    sum = addNumbers(n1, n2);        // function call
    printf("sum = %d",sum);

    return 0;
}

int addNumbers(int a, int b)         // function definition   
{
    int result;
    result = a+b;
    return result;                  // return statement
}


Ekran Çıktısı:

Enters two numbers: 2
3
sum = 5

2) Girilen sayının karesini al program:

#include<stdio.h>  
int kareal(int);  
void main()  
{  
    int sayi, kare;
    printf("Karesi alınacak olan sayiyi girinizi: ");  
    scanf("%d",&sayi);
    kare = kareal(sayi);
    printf("%d sayisinin karesi = %d\n",sayi,kare);
    
    
}  
int kareal(int sayi)  
{  
    return sayi*sayi;  
}  


Ekran Çıktısı:

Karesi alınacak olan sayiyi girinizi: 3
3 sayisinin karesi = 9

3) Girilen sayının tek mi çift mi olduğunu bulan program

#include<stdio.h>  
int cift_tek(int);  
void main()  
{  
 int n,flag=0;  
 printf("\ngirilen sayinin tek mi cift mi ?");  
 printf("\nsayi giriniz: ");  
 scanf("%d",&n);  
 flag = cift_tek(n);  
 if(flag == 0)  
 {  
    printf("\nsayi tek");  
 }  
 else   
 {  
    printf("\nsayi cift");  
 }  
}  
int cift_tek(int n)  
{  
    if(n%2 == 0)  
    {  
        return 1;  
    }  
    else   
    {  
        return 0;  
    }  
}

Ekran Çıktısı:

girilen sayinin tek mi cift mi ?
sayi giriniz: 3
sayi tek

4) İki değerin yerini değiştiren program (swap):

#include<stdio.h>
// function prototype, also called function declaration
void swap(int a, int b);          
 
int main()
{
    int m = 22, n = 44;
    // calling swap function by value
    printf(" values before swap  m = %d \nand n = %d", m, n);
    swap(m, n);                         
}
 
void swap(int a, int b)
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    printf(" \nvalues after swap m = %d\n and n = %d", a, b);
}

Ekran Çıktısı:

values before swap  m = 22 
and n = 44 
values after swap m = 44
 and n = 22


5) Bir dizi döndürecek fonksiyon kullanarak bazı değerlerin maksimum ve minimumunu bulan program: ( bu örnekte pointer kullanılmıştır. İlerleyen konularda pointerlara değineceğiz.)

# include <stdio.h>
# define max 10
int *maxmin(int ar[], int v);
int main()
{
  int  arr[max];
int n,i, *p;
  printf("Number of values you want to input: ");
  scanf("%d",&n);
  printf("Input %d values\n", n);
  for(i=0;i<n;i++)
    scanf("%d",&arr[i]);
  p=maxmin(arr,n);
printf("Minimum value is: %d\n",*p++);
printf("Maximum value is: %d\n",*p);
}
int *maxmin(int arra1[], int v)
{
  int i;
static int result_mm[2];
result_mm[0]=arra1[0];
result_mm[1]=arra1[0];
for (i=1;i<v;i++)
{
if(result_mm[0] > arra1[i])
    result_mm[0]=arra1[i];
if(result_mm[1]< arra1[i])
  result_mm[1]= arra1[i];
}
return result_mm;
}

Ekran Çıktısı:

Number of values you want to input: 4
Input 4 values
3
5
7
8
Minimum value is: 3
Maximum value is: 8












Kaynaklar:

A'dan Z'ye C Programlama Kılavuzu
https://www.programiz.com/c-programming/c-functions
https://www.javatpoint.com/functions-in-c
https://fresh2refresh.com/c-programming/c-function/
https://www.w3resource.com/c-programming-exercises/function/index.php
  Bu yazımızda do...while döngülerine, break ve continue ifadeleri ile ilgili bilgi vereceğiz ve örneklerle bu ifadeleri pekiştireceğiz. Hadi başlayalım.

do...while Tekrarlama İfadesi

do...while tekrarlama ifadesi while ifadesine benzerdir. while ifadesinde, döngü devam koşulu, döngü gövdesi icra edilmeden önce döngü başında kontrol edilir. do...while ifadesi döngü devam koşulunu döngü gövdesi yapıldıktan sonra kontrol eder. Yani do...while döngülerinde kontrol sonda olduğu için döngü içindeki deyimler en az bir kere işlem görür. Genel biçimi aşağıda verilmiştir.

do
    deyim
while(koşul);
...

do döngünün başını gösteren bir anahtar sözcüktür. Döngünün iç bölgesi do anahtar sözcüğünden while anahtar sözcüğüne kadar olan bölgedir. Diğerlerinde olduğu gibi, tek bir deyim için bloklamaya gerek yoktur, fakat birden fazla deyim için bloklama yapılır. Örneğin:

do{
    deyim1
    deyim2
    ...
}while(koşul);
...



do...while döngüsünün gövdesi bir kez yürütülür.
 Test Expression doğruysa döngünün gövdesi yeniden yürütülür ve Test Expression bir kez daha değerlendirilir. Bu işlem Test Expression yanlış olana kadar devam eder. Test Expression yanlış ise döngü sona erer.





Aşağıdaki örneği inceleyelim:

do{
    printf("(E)vet ya da (H)ayır\n");
    ch = getch();
}while((ch = toupper(ch)) != 'E' && ch != 'H');

Bu örnekte kullanıcı E,e,h,H harflerinden birini girmeye zorlanmaktadır. Bu harflerden biri girilmediği sürece döngü devam edecektir. Bir örnek daha yapalım.

#include <stdio.h>
int main(void){
    unsigned int counter = 1;
    do{
        printf(" %u ",counter);
    }while(++counter <=10);
}

Ekran çıktısı:

1 2 3 4 5 6 7 8 9 10

break ve continue İfadeleri

break ve continue ifadeleri kontrol akışını değiştirmek için kullanılır.

break İfadesi

break anahtar sözcüğü döngüleri sonlandırarak program akışını döngünün dışındaki ilk deyime taşır. Örneğin:

for(;;){
    ...   
    ch = getchar();
    if(ch =='q')
        break;
}
...

Burada klavyeden girilen karakter 'q' olduğunda break anahtar sözcüğü ile döngü kırılmaktadır. for(;;) sonsuz bir döngü olduğundan çıkış da ancak break ile mümkün olabilir.

...
while(k<100){
    ...   
    if(sample()<0) break;
    ...
}
...

Bu örnekte ise sample() fonksiyonunun geri dönüş değeri sıfırdan küçük ise döngü kırılmaktadır. Aşağıdaki örnekte de 0'dan 100'e kadar olan tamsayıları ekrana yazdırılıyor.

k=0;
for(;;){
    if(k>=100) break;
    printf("%d\n",++k);
}


continue İfadesi

continue anahtar sözcüğü o anda içinde bulunan yinelemeyi keserek bir sonraki yinelemeye geçilmesine neden olur. Aşağıdaki örneği inceleyelim.

do{
    ch = getchar();
    if(isupper(ch))
        continue;
    ...
}while(ch!='q');

Bu örnekte girilen harf, büyük harf ise işlem yapma, büyük harf değilse işlemleri gerçekleştir. Girilen harf 'q' ise döngüden çıkar.


Örnekler

1) Girilen sayıların toplamını bulan ve 0 girildiğinde döngüden çıkan program

// Program to add numbers until the user enters zero

#include <stdio.h>
int main() {
  double number, sum = 0;

  // the body of the loop is executed at least once
  do {
    printf("Enter a number: ");
    scanf("%lf", &number);
    sum += number;
  }
  while(number != 0.0);

  printf("Sum = %.2lf",sum);

  return 0;
}

Ekran Çıktısı:

Enter a number: 1.5
Enter a number: 2.4
Enter a number: -3.4
Enter a number: 4.2
Enter a number: 0
Sum = 4.70


2)  

#include<stdio.h>  
#include<stdlib.h>  
void main ()  
{  
    char c;  
    int choice,dummy;    
    do{  
    printf("\n1. Print Hello\n2. Print Javatpoint\n3. Exit\n");  
    scanf("%d",&choice);  
    switch(choice)  
    {  
        case 1 :   
        printf("Hello\n");   
        break;  
        case 2:    
        printf("Javatpoint\n");  
        break;  
        case 3:  
        exit(0);   
        break;  
        default:   
        printf("please enter valid choice\n");      
    }  
    printf("do you want to enter more?\n");   
    scanf("%d",&dummy);  
    scanf("%c",&c);  
    }while(c=='y');  
}    


Ekran Çıktısı

1. Print Hello
2. Print Javatpoint
3. Exit
1
Hello
do you want to enter more?
y

1. Print Hello
2. Print Javatpoint
3. Exit
2
Javatpoint
do you want to enter more?
n

3) 1'den 10'a kadar sayıları yazan program

#include<stdio.h>  
int main(){    
    int i=1;      
    do{    
        printf("%d \n",i);    
        i++;    
    }while(i<=10);   
    return 0;  
   

Ekran Çıktısı

1
2
3
4
5
6
7
8
9
10


4)  Girilen sayının çarpım tablosundaki değerleri yazan program

#include<stdio.h>  
    int main(){    
    int i=1,number=0;    
    printf("Enter a number: ");    
    scanf("%d",&number);    
    do{    
        printf("%d \n",(number*i));    
        i++;    
    }while(i<=10);    
    return 0;  
}    

Ekran Çıktısı


Enter a number: 5
5
10
15
20
25
30
35
40
45
50

5) Max 10 sayı alan ve bunları toplayan program. Kullanıcı negatif sayı girdiğinde döngüden çıkan program.


// Program to calculate the sum of numbers (10 numbers max)
// If the user enters a negative number, the loop terminates

#include <stdio.h>

int main() {
   int i;
   double number, sum = 0.0;

   for (i = 1; i <= 10; ++i) {
      printf("Enter n%d: ", i);
      scanf("%lf", &number);

      // if the user enters a negative number, break the loop
      if (number < 0.0) {
         break;
      }

      sum += number; // sum = sum + number;
   }

   printf("Sum = %.2lf", sum);

   return 0;
}

Ekran Çıktısı

Enter n1: 2.4
Enter n2: 4.5
Enter n3: 3.4
Enter n4: -3
Sum = 10.30


6) Max 10 sayı alan ve bunları toplayan program. Kullanıcı negatif sayı girdiğinde toplamaya eklemeyen program.

// Program to calculate the sum of numbers (10 numbers max)
// If the user enters a negative number, it's not added to the result

#include <stdio.h>
int main() {
   int i;
   double number, sum = 0.0;

   for (i = 1; i <= 10; ++i) {
      printf("Enter a n%d: ", i);
      scanf("%lf", &number);

      if (number < 0.0) {
         continue;
      }

      sum += number; // sum = sum + number;
   }

   printf("Sum = %.2lf", sum);

   return 0;
}

Ekran Çıktısı

Enter n1: 1.1
Enter n2: 2.2
Enter n3: 5.5
Enter n4: 4.4
Enter n5: -3.4
Enter n6: -45.5
Enter n7: 34.5
Enter n8: -4.2
Enter n9: -1000
Enter n10: 12
Sum = 59.70





Bir sonraki derse ulaşmak için: C'de Fonksiyonlar #C4
Bir önceki derse ulaşmak için: C'de Program Kontrolü - switch-case #C3.2


Kaynaklar:

A'dan Z'ye C programlama
Deitel Deitel C ile programlama
https://www.programiz.com/c-programming/c-do-while-loops
javatpoint.com/do-while-loop-in-c
https://www.programiz.com/c-programming/c-break-continue-statement