Bitwise Operatorler ve Dizilere Giris#

Ders videosu:

from IPython.display import YouTubeVideo
YouTubeVideo('1TwYzGpd034', width=700, height=400)

Odev Cozumleri#

Bir onceki derste verilen Odev 1 ve Odev 2’nin cozumleri:

  • 1-1

#include <stdio.h>

int main(){
    int T;
    scanf("%d", &T);

    for(int i = 0; i < T; i++){
        int X;
        scanf("%d", &X);

        int basamakSayisi = 0, basamakToplami = 0;

        // 125267
        // 12526
        // 1252
        // 125
        // 12
        // 1
        // 0 


        for(int C = X; C > 0; C = C / 10){
            basamakSayisi++;
            basamakToplami = basamakToplami + C % 10;
        }

        printf("%d %d\n", basamakSayisi, basamakToplami);
    }

    return 0;
}
  • 1-2

#include <stdio.h>

int main(){
    int N;
    scanf("%d", &N);
    while(N >= 0){
        for(int satir = 0; satir < N; satir++){
            for(int karakter = 0; karakter < N; karakter++){
                printf("*");
            }
            printf("\n");
        }
        printf("\n");
        
        scanf("%d", &N);
    }
    return 0;
}
  • 2-1

#include <stdio.h>

int main(){
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);

    if(a >= b && a >= c)
        printf("%d", a);
    else if(b >= a && b >= c)
        printf("%d", b);
    else if(c >= a && c >= b)
        printf("%d", c);

    return 0;
}
  • 2-2

#include <stdio.h>

int main(){
    int ay;
    scanf("%d", &ay);

    switch(ay){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            printf("31");
            break;
        case 2:
            printf("28");
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            printf("30");
        default:
            printf("Dogru bir ay girmediniz");
    }
}
  • 2-3

#include <stdio.h>

int main(){
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);

    int ortalama = a + b + c;
    char harf;

    if(ortalama >= 3*90)
        harf = 'A';
    else if(ortalama >= 3*80)
        harf = 'B';
    else if(ortalama >= 3*70)
        harf = 'C';
    else if(ortalama >= 3*60)
        harf = 'D';
    else if(ortalama >= 3*40)
        harf = 'E';
    else
        harf = 'F';

    printf("%c", harf);
}

Bitwise Operatorler#

Bitwise operatorler, ikili taban, two’s complement ve shifting operatorleri hakkinda konu anlatimi

Bitwise#

#include <stdio.h>

int main(){             
    int a = 2, //       00000000 00000000 00000000 00000010
        b = 6; //       00000000 00000000 00000000 00000110

                // | -> 00000000 00000000 00000000 00000110 -> 6
                // & -> 00000000 00000000 00000000 00000010 -> 2
                // ^ -> 00000000 00000000 00000000 00000100 -> 4


    printf("%d\n", (a | b)); // veya,  or
    printf("%d\n", (a & b)); // ve,    and
    printf("%d\n", (a ^ b)); // ya da, xor
    return 0;
}

Shifting#

#include <stdio.h>

int main(){
    int x;
    scanf("%d", &x);

    // a << b, 00001111 => (15<<2) = 00111100 = 60
    // a >> b, 00011110 => (30>>2) = 00000111 = 7

    // 1 = 00000001 => (1<<5) = 00100000 = 32
    for(int i = 0; i < (1<<x); i++){
        printf("%d ", i);
    }

    printf("\n----------------------------------------\n");

    for(int c = (1<<x); c > 0; c = (c >> 1)){
        printf("%d ", c);
    }
    return 0;
}

Ternary#

#include <stdio.h>

int main(){ 

    // expr ? st1 : st2 = if(expr) st1 else st2


    int sayi;
    scanf("%d", &sayi);
    /*
    if(sayi % 2 == 0)
        printf("CIFT");
    else 
        printf("TEK");
    */
    printf(sayi % 2 == 0 ? "CIFT" : "TEK");
    
    return 0;
}

Diziler#

Dizi

#include <stdio.h>

int main(){
    int a[] = {5, 2, 4, 3, 2}; // 00000101 00000010 00000100 00000011 00000010
            // 0, 1, 2, 3, 4
    int n = sizeof(a) / sizeof(a[0]);


    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }
    printf("\n");

    char str[] = "Hello World!\n";

    printf(str);


    
    int length = sizeof(str) / sizeof(str[0]);

    for(int i = 0; i < length; i++){
        printf("%c", str[i]);
    }
    printf("\n");
    return 0;
}

Statik bir degisken olarak tanimlanan bir dizinin boyutunun kullanici tarafindan run-time esnasinda girdi olarak verilmesi tavsiye edilen bir programlama bicimi olmasa da C99 standardindan beri mumkundur. Bu kullanim biciminin run-time stack hafiza alokasyonu acisindan sorun yaratma ihtimali olmasina ragmen kucuk programlarda sorun teskil etmemektedir. Fakat yine de bir array’in boyutu run-time esnasinda belirlenecekse en dogru metod malloc ile array icin heap uzerinde dinamik hafiza alokasyonu olusturmaktir. Simdilik ama daha basit olan ilk metodu tercih edip, dinamik hafiza alokasyonuna ilerleyen derslerde deginecegiz.

#include <stdio.h>

int main(){
    int n;
    scanf("%d", &n);

    int arr[n];

    arr[0] = 5;
    arr[n - 1] = 10;
    
    for(int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

Ornek Program - Bir dizinin elemanlarinin siralamasini tersine cevirmek#

#include <stdio.h>

// Kullanicidan aldiginiz diziyi ters cevirip bastirin

// Ornek Girdi:
// n = 7
// 1 5 23 52 1 2 6

// Ornek Cikti:
// 6 2 1 52 23 5 1


int main(){
    int n;
    scanf("%d", &n);
    
    int arr[n];

    for(int i = 0; i < n; i++){
        scanf("%d", &arr[i]);
    }


    for(int i = n - 1; i >= 0; i--){
        printf("%d ", arr[i]);
    }
    return 0;
}