Federico Valverde
Hectopat
- Katılım
- 20 Mart 2020
- Mesajlar
- 1.080
- Makaleler
- 1
- Çözümler
- 5
dizi[BURADA], yani bir index olarak verilmiş.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.Kendi yaptığım işleme göre 0,1,2,3,4 çıkıyor.
#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;
}
Anladım, çok teşekkürler. Ben arr[0] = 4 olarak yapmıştım. Doğal olarak yanlış bulmuşumSiz 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."
Ö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?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ındadizi[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.
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.Peki aldığı yerdeki değeri değiştiren bir degistir2 fonksiyonu nasıl olurdu ?
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.İlk satırda ise ne demek istediğinizi anlamadım, kodu ben yazmadım ki.
#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;
}
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.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.
Teşekkür ederim tekrardan. Pointerlar dışında genel olarak hakim olmam gereken konular nelerdir sizce bu tip soruları çözebilmek için ?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.
Teşekkür ederimdegistir3'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.
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.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.