"C" Sorusu

Katılım
20 Mart 2020
Mesajlar
1.080
Makaleler
1
Çözümler
5
1649334780114.png

C dilinde yazılmıştır.

5. satırı anlayamadım, yardımcı olabilir misiniz ? Kendi yaptığım işleme göre 0,1,2,3,4 çıkıyor. Fakat cevabı 10,8,6,8,10.
1649335868309.png
Bu da bir başka soru. Cevabı "6 3 2 2" şeklinde. 2.fonksiyonun main fonksiyona etki etmediği söyleniyor çözümde ama neden etki etmiyor onu anlamadım. Öyleyse 3. fonksiyon neden çalışıyor ?
 
Son düzenleme:
Kodu yazmanıza rağmen paylaşmamanız büyük cesaret.
for döngüsünün ilk satırına bakarsanız o karışık işlem aslında dizi[BURADA], yani bir index olarak verilmiş.

Birden fazla işlem varken direkt main etki etmiyor demek pek doğru değil.
İlk fonksiyon bir sayı alıp o sayının 1 artırılmış halini döndürür. Aldığı yerdeki değişkeni değiştirmez. Çünkü siz sayının değerini gönderiyorsunuz.
İkinci fonksiyon bir sayı alıp ona kendi (fonksiyon) içinde 2 değerini atar. Aldığı yerdeki değişkeni değiştirmez.
Üçüncü fonksiyon ise bir pointer alıyor. Bu pointer'ı bir array gibi kullanıp (ki sıfırıncı index'e eriştiği için array olmasa da çalışır) o array'in sıfırıncı index'li elemanının değerini artırıyor. Burada pointer olarak aldığı için değişkenin kendisi gelmiş oluyor. Yani değer değişiyor.

Yazdırılan şeylere de bakmanız gerek. İlkinde x yazdırılıyor ama ondan önce x değeri fonksiyondan dönen değere atanıyor.
İkincide fonksiyondan dönen değer kullanılmıyor, zaten dönen değer de yok. Bu yüzden y değişkeni etkilenmiyor.
Üçüncüde fonksiyondan döndürülen değer direkt yazdırılıyor. Ondan sonra direkt arr[0] yazdırılsa farklı değer elde edilir.
Dördüncüde ise pointer olarak alındığı için değeri gerçekten değişiyor.

Pointer konusunu güzelce öğrenmeniz gerek.
 
Son düzenleme:
Kendi yaptığım işleme göre 0,1,2,3,4 çıkıyor.
Siz baya yanlış bir işlem yapıyorsunuz. Öncelikle tek tek tüm satırları açıklayayım sonrasında neden 10 8 6 8 10 olduğunu zaten siz rahatça anlarsınız.


C:
#include <iostream>

int main(int argc, char** argv) {
    int arr[] = {2, 4, 6, 8, 10};
    int i = 0, N = sizeof(arr)/sizeof(int); /*dizenin boyutu hesaplanıyor burada, yani içerisinde kaç adet veri olduğu hesaplanıyor */
 
   
    for (int i = 0; i < N; i++) {
        arr[i] = arr[ (2 * N - (i+1)) % N]; /* buradaki döngüde dizenin içerisindeki bazı sayılar diğer noktalara kopyalanıyor. Örneğin i = 0 için; arr[0] = arr[ (2 * 5 - 1) % 5 ] | arr[0] = arr[ 9 % 5] | arr[0] = arr[4]; olmuş oluyor. arr[4] = 10.  i = 4 için; arr[4] = arr[0] burada yaptığımız işlem bu. */
       
    }
   
    for(int i = 0; i <= N; i++) { //sıradan array yazdırma döngüsü
        printf("%d ", arr[i]);
    }
   
    return 0;
}

5. satır yani for döngüsünün içerisinde bulunan dize işlemini kodun içinde de anlattım ama görmezseniz diye;

" Buradaki döngüde dizenin içerisindeki bazı sayılar diğer noktalara kopyalanıyor. Örneğin i = 0 için; arr[0] = arr[ (2 * 5 - 1) % 5 ] | arr[0] = arr[ 9 % 5] | arr[0] = arr[4]; olmuş oluyor. arr[4] = 10. i = 4 için; arr[4] = arr[0] burada yaptığımız işlem bu."
 
Siz baya yanlış bir işlem yapıyorsunuz. Öncelikle tek tek tüm satırları açıklayayım sonrasında neden 10 8 6 8 10 olduğunu zaten siz rahatça anlarsınız.


C:
#include <iostream>

int main(int argc, char** argv) {
    int arr[] = {2, 4, 6, 8, 10};
    int i = 0, N = sizeof(arr)/sizeof(int); /*dizenin boyutu hesaplanıyor burada, yani içerisinde kaç adet veri olduğu hesaplanıyor */
 
 
    for (int i = 0; i < N; i++) {
        arr[i] = arr[ (2 * N - (i+1)) % N]; /* buradaki döngüde dizenin içerisindeki bazı sayılar diğer noktalara kopyalanıyor. Örneğin i = 0 için; arr[0] = arr[ (2 * 5 - 1) % 5 ] | arr[0] = arr[ 9 % 5] | arr[0] = arr[4]; olmuş oluyor. arr[4] = 10.  i = 4 için; arr[4] = arr[0] burada yaptığımız işlem bu. */
     
    }
 
    for(int i = 0; i <= N; i++) { //sıradan array yazdırma döngüsü
        printf("%d ", arr[i]);
    }
 
    return 0;
}

5. satır yani for döngüsünün içerisinde bulunan dize işlemini kodun içinde de anlattım ama görmezseniz diye;

" Buradaki döngüde dizenin içerisindeki bazı sayılar diğer noktalara kopyalanıyor. Örneğin i = 0 için; arr[0] = arr[ (2 * 5 - 1) % 5 ] | arr[0] = arr[ 9 % 5] | arr[0] = arr[4]; olmuş oluyor. arr[4] = 10. i = 4 için; arr[4] = arr[0] burada yaptığımız işlem bu."
Anladım, çok teşekkürler. Ben arr[0] = 4 olarak yapmıştım. Doğal olarak yanlış bulmuşum :).
Kodu yazmanıza rağmen paylaşmamanız büyük cesaret.
for döngüsünün ilk satırına bakarsanız o karışık işlem aslında dizi[BURADA], yani bir index olarak verilmiş.

Birden fazla işlem varken direkt main etki etmiyor demek pek doğru değil.
İlk fonksiyon bir sayı alıp o sayının 1 artırılmış halini döndürür. Aldığı yerdeki değişkeni değiştirmez. Çünkü siz sayının değerini gönderiyorsunuz.
İkinci fonksiyon bir sayı alıp ona kendi (fonksiyon) içinde 2 değerini atar. Aldığı yerdeki değişkeni değiştirmez.
Üçüncü fonksiyon ise bir pointer alıyor. Bu pointer'ı bir array gibi kullanıp (ki sıfırıncı index'e eriştiği için array olmasa da çalışır) o array'in sıfırıncı index'li elemanının değerini artırıyor. Burada pointer olarak aldığı için değişkenin kendisi gelmiş oluyor. Yani değer değişiyor.

Yazdırılan şeylere de bakmanız gerek. İlkinde x yazdırılıyor ama ondan önce x değeri fonksiyondan dönen değere atanıyor.
İkincide fonksiyondan dönen değer kullanılmıyor, zaten dönen değer de yok. Bu yüzden y değişkeni etkilenmiyor.
Üçüncüde fonksiyondan döndürülen değer direkt yazdırılıyor. Ondan sonra direkt arr[0] yazdırılsa farklı değer elde edilir.
Dördüncüde ise pointer olarak alındığı için değeri gerçekten değişiyor.

Pointer konusunu güzelce öğrenmeniz gerek.
Öncelikle teşekkürler. Neden degistir2 kullanıldığında değişmediğini anladım. Peki aldığı yerdeki değeri değiştiren bir degistir2 fonksiyonu nasıl olurdu ? Bir de pointerları öğrenebileceğim bir kaynak tavsiyeniz var mıdır?
İlk satırda ise ne demek istediğinizi anlamadım, kodu ben yazmadım ki.
 
Son düzenleme:
Peki aldığı yerdeki değeri değiştiren bir degistir2 fonksiyonu nasıl olurdu ?
degistir3'le aynı şekilde. Pointer dediğimiz şey işaretçi. Eğer siz void degistir2(int y) derseniz, bu fonksiyona girilen değişkenin sadece değeri alınır. Fakat pointer olarak kullanırsanız, void degistir2(int *y) şeklinde kullanırsanız, bu değişkenin bellekteki yerine işaret eder. Dolayısıyla bu değer üzerinde yaptığınız her değişiklik bellekteki o değişkene iletilir. Dolayısıyla değişkeni oynamış olursunuz.

Bu bahsettiklerimden ilki call by value, diğeri call by reference olarak arattığınızda rahatça bulabileceğiniz durumlar.
 
İlk satırda ise ne demek istediğinizi anlamadım, kodu ben yazmadım ki.
Kodu ilk yazan siz değilsiniz ama çalıştırdığınızı yani bilgisayar üzerinde yazdığınızı söylemişsiniz. Konuya gelip kodu çalıştırmak isteyen herkes tekrar yazmalı sayenizde.

Aşağıdaki şekilde olurdu. Pointer bilmediğiniz için neden yıldız koyduğumu bilmiyorsunuz.
Çağırırken de parametre olarak &x şeklinde verilmesi gerekirdi.
Pointer'larla güzel şeyler yapılabildiği için ikinci şekilde de erişilebilirdi. Bir integer pointer'ını array gibi kullanıp modifiye etme.
Kod:
#include <stdio.h>

void degistir(int* x) {
    *x = 17;
}

void degistir2(int* x) {
    (x - 1)[1] = 18;
}

int main() {
    int x = 5;
   
    degistir(&x);
    printf("%d ", x);
   
    degistir2(&x);
    printf("%d ", x);
   
    return 0;
}

Süresine bakarak düzgün bir eğitim olduğunu düşünüyorum.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Kodu ilk yazan siz değilsiniz ama çalıştırdığınızı yani bilgisayar üzerinde yazdığınızı söylemişsiniz. Konuya gelip kodu çalıştırmak isteyen herkes tekrar yazmalı sayenizde.
C dilinde yazılmıştır, derken onu kast etmemiştim. Yani yazarken C kullanmışlar diye ek bir belirteyim diye öyle yazdım. Olimpiyat soruları zaten bunlar kendi yazdığımı ima etmeme gerek yok ki.
Aşağıdaki şekilde olurdu. Pointer bilmediğiniz için neden yıldız koyduğumu bilmiyorsunuz.
Çağırırken de parametre olarak &x şeklinde verilmesi gerekirdi.
Pointer'larla güzel şeyler yapılabildiği için ikinci şekilde de erişilebilirdi. Bir integer pointer'ını array gibi kullanıp modifiye etme.
Kod:
#include <stdio.h>

void degistir(int* x) {
    *x = 17;
}

void degistir2(int* x) {
    (x - 1)[1] = 18;
}

int main() {
    int x = 5;
 
    degistir(&x);
    printf("%d ", x);
 
    degistir2(&x);
    printf("%d ", x);
 
    return 0;
}

Süresine bakarak düzgün bir eğitim olduğunu düşünüyorum.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Teşekkür ederim tekrardan. Pointerlar dışında genel olarak hakim olmam gereken konular nelerdir sizce bu tip soruları çözebilmek için ?
degistir3'le aynı şekilde. Pointer dediğimiz şey işaretçi. Eğer siz void degistir2(int y) derseniz, bu fonksiyona girilen değişkenin sadece değeri alınır. Fakat pointer olarak kullanırsanız, void degistir2(int *y) şeklinde kullanırsanız, bu değişkenin bellekteki yerine işaret eder. Dolayısıyla bu değer üzerinde yaptığınız her değişiklik bellekteki o değişkene iletilir. Dolayısıyla değişkeni oynamış olursunuz.

Bu bahsettiklerimden ilki call by value, diğeri call by reference olarak arattığınızda rahatça bulabileceğiniz durumlar.
Teşekkür ederim :).
 
Teşekkür ederim tekrardan. Pointer'lar dışında genel olarak hakim olmam gereken konular nelerdir sizce bu tip soruları çözebilmek için?
Bu tip sorular geniş bir tanım. Matematik operatörlerini biliyorsunuz gibi duruyor. Pointer'lar dışında dert olacak bir konu aklıma pek gelmiyor.

İnternetteni platformlardan C soruları çözüyorsanız burada güzel bir liste var.
 
Bu tip sorular geniş bir tanım. Matematik operatörlerini biliyorsunuz gibi duruyor. Pointer'lar dışında dert olacak bir konu aklıma pek gelmiyor.

İnternetteni platformlardan C soruları çözüyorsanız burada güzel bir liste var.

Uzun zamandır Java ile kendi çapımda basit Android uygulamaları geliştiriyordum. Biraz ara vermiştim şimdi C kullanmaya başlayınca biraz farklılıklar oluşuyor. Ona alışmaya çalışırken zorlanıyorum. Site için teşekkürler.
 

Technopat Haberler

Yeni konular

Geri
Yukarı