C/C++ Reverse Array Elements from K to N C++ nasıl yapılır?

Biraz daha sakin yaklaşabiliriz arkadaşlar çocuk heves etmiş öğrenmek istiyor. Tabi öğrenmeyi öğrenmesi önemli de.
1702544972537.png

Testcaseler'e göre yazıyorum deyip doğru mu yazdım diye soruyor. Test case ne biliyor mu acaba? Öğretmeye çalışıyorlar ne yapması gerektiğini bilmem kaç konudur. İlk konusu değil, ikinci konusu değil.

23 Eylül'den beri bir şeylerle uğraşıyor ama hala fonksiyonlara gelmemiş. 60 günde fonksiyon kullanmaya başlamamış yani daha.
1702545138672.png

Bu konudaki array tanımlama uyarısı bir önceki konusunda da @Vavien. tarafından yapılmıştı.
Ondan bir önceki konusunda da @Dynamics tarafından yapılmıştı.
1702545211024.png

Üçüncü konusu bu aynı hatayı yapmaya devam ettiği.
 
Eki Görüntüle 2052257
Testcaseler'e göre yazıyorum deyip doğru mu yazdım diye soruyor. Test case ne biliyor mu acaba? Öğretmeye çalışıyorlar ne yapması gerektiğini bilmem kaç konudur. İlk konusu değil, ikinci konusu değil.

23 Eylül'den beri bir şeylerle uğraşıyor ama hala fonksiyonlara gelmemiş. 60 günde fonksiyon kullanmaya başlamamış yani daha.
Eki Görüntüle 2052258
Bu konudaki array tanımlama uyarısı bir önceki konusunda da @Vavien. tarafından yapılmıştı.
Ondan bir önceki konusunda da @Dynamics tarafından yapılmıştı.
Eki Görüntüle 2052262
Üçüncü konusu bu aynı hatayı yapmaya devam ettiği.
Olsun ya ben elimden geldiğince yardım etmeye çalışayım demiştim. İlerleyişini çok düşünmeye gerek yok sınav senesi olabilir az zamanı vardır. Tabi kurallara daha uygun gitmek iyi olabilir.
 
Ya da sabit boyutu olan bir şey oluşturacaksın, elinde Max limiti olan bir array olacak. Ondan büyük input almayacak.

Şunu görünce devamını okuyasım gelmiyor.

Algoritmik problemler sunan sitelerde (derleyici olarak GCC'yi destekleyen) boyut olarak bir değişkenin kullanıldığı diziler kullanmak bu tür mecralarda çok hor görülen bir durum değil, hatta alışılagelmiş bir durum. Bahsettiğim şey özellikle "rekabetçi programlama" (competitive programming) için daha geçerli çünkü kodu hızlı yazıp diğer yarışmacıların önüne geçmek önemli (LeetCode, Codeforces vb.). Hâl böyle olunca bazı uygun görülmeyen pratikler tercih edilebiliyor. :) Öne geçmek uğruna nasıl kodlar yazıldığını görseniz...

Ki benim de tercih ettiğim bir yöntem oluyor açıkçası, bu tür problemleri çözerken değişken boyutlu dizi tanımlamak. Vektör tanımlamaktan daha kolay geliyor çünkü, dizi boyutu parametresini okuduktan hemen sonra hızlıca dizimi tanımlamak hoşuma gidiyor; sizin okuma isteğinizi kaçıran kısımdan bahsediyorum. :)

Bu yazdıklarımdan dediklerinize katılmadığım anlaşılmasın. Doğru pratiğin altını çiziyor olmanız çok hoş.
 
Böyle soru soran siteler input'u kendi alıp size "çağrılan fonksiyonu yaz" diyorlar.
Hepsi öyle yapmıyor, birkaç örnek sitenin sistemleri şu şekilde:
  • LeetCode'da sistem her zaman sizin dediğiniz gibi işliyor. Ayrıca LeetCode'daki derleyici sanırsam Clang ve bundan dolayı değişken boyutlu diziye derleyici hata veriyor.
  • HackerRank'te tercihe bağlı, problemi hazırlayan kişi karar verebiliyor.
  • Codeforces'ta böyle bir şey yok. Kodu tamamen siz yazmak durumundasınız.
  • CodeChef'in sistemi de Codeforces'a benziyor.
 
Öğrenmeyi öğrenmeden bu işlere girme. Biz sana ne kadar yardımcı olsak da sen öğrenmedikten sonra gerisi boş. Ödevlerini de genelde buradakiler yapmış oluyor bir şeyleri bilmiyorum dediğin için. Ortaokul, lise olimpiyatlarında sorulan sorularda bile senin o öğrenmekten korktuğun kısımları soruyorlar. Fonksiyonları öğrenmedim diye bir bahane olmaz. Hele birkaç hafta sonra açtığın konuda bunu tekrar, inatla demen hiç olmaz.

İkincisi, sana inatla önceki konunda dinamik allokasyon yapman gerektiğini söyledim. Sen ise hala test case'lere göre yazdığını savunuyorsun, tıpkı önceki konundaki gibi. Test case'leri denemen için programının adam akıllı çalışması lazım. Programın adam akıllı çalışması için de bir şeyleri öğrenip doğrusuna göre programını düzeltmen lazım.

Üçüncüsü, "f++" ile "++f" farkını biliyor musun? Yani operatörler prefix ve postfix olarak kullanılınca ne olacağını? Aynı olduğunu mu düşünüyorsun?
Ben neden öğrenmemek için ısrar edeyim ki?Sadece kodlar benim anlayabileceğim seviyede olsun istemiştim.Yoksa neden buraya konu açaym ki?Dediğiniz gibi yapmak isteseydim ChatGPT nin kodlarını kullanır ödevi geçerdim.

Eki Görüntüle 2052257
Testcaseler'e göre yazıyorum deyip doğru mu yazdım diye soruyor. Test case ne biliyor mu acaba? Öğretmeye çalışıyorlar ne yapması gerektiğini bilmem kaç konudur. İlk konusu değil, ikinci konusu değil.

23 Eylül'den beri bir şeylerle uğraşıyor ama hala fonksiyonlara gelmemiş. 60 günde fonksiyon kullanmaya başlamamış yani daha.
Eki Görüntüle 2052258
Bu konudaki array tanımlama uyarısı bir önceki konusunda da @Vavien. tarafından yapılmıştı.
Ondan bir önceki konusunda da @Dynamics tarafından yapılmıştı.
Eki Görüntüle 2052262
Üçüncü konusu bu aynı hatayı yapmaya devam ettiği.
Hocam 2 ay boyunca durmadan devam ettiğimi nereden biliyorsunuz?Ayrıca açtığım konuların çoğunda cevabı kendim buluyorum.Konuların başlıklarına dikkat ederseniz farklı konular olduğunu anlayabilirsiniz.

Olsun ya ben elimden geldiğince yardım etmeye çalışayım demiştim. İlerleyişini çok düşünmeye gerek yok sınav senesi olabilir az zamanı vardır. Tabi kurallara daha uygun gitmek iyi olabilir.
Teşekkürler.

Biraz daha sakin yaklaşabiliriz arkadaşlar çocuk heves etmiş öğrenmek istiyor. Tabi öğrenmeyi öğrenmesi önemli de.
Döngüyü kurduğunuz şekil, k ile n-1 arasındaki eleman sayısı çift olduğunda diziyi iki kez tersine çeviriyor. Bu, f >= k koşulunuzun, tersine çevirdiğiniz aralığın orta noktasına ulaştığınızda döngüyü durdurmamasından kaynaklanıyor. Ortadan sonra bir kez daha çeviriyorsunuz yani. Ve düzgün çevrilmemiş oluyor.


C++:
    for (int f = k, j = n - 1; f < j; ++f, --j)
    {
        int temp = array[f];
        array[f] = array[j];
        array[j] = temp;
    }

Bu şekilde döngüyü düzgün kurabilirsiniz.
Bu kodu 2 for şeklinde nasıl göstere biliriz peki?
 
Son düzenleme:
.
Algoritmik problemler sunan sitelerde (derleyici olarak GCC'yi destekleyen) boyut olarak bir değişkenin kullanıldığı diziler kullanmak bu tür mecralarda çok hor görülen bir durum değil, hatta alışılagelmiş bir durum. Bahsettiğim şey özellikle "rekabetçi programlama" (competitive programming) için daha geçerli çünkü kodu hızlı yazıp diğer yarışmacıların önüne geçmek önemli (LeetCode, Codeforces vb.). Hâl böyle olunca bazı uygun görülmeyen pratikler tercih edilebiliyor. :) Öne geçmek uğruna nasıl kodlar yazıldığını görseniz...

Ki benim de tercih ettiğim bir yöntem oluyor açıkçası, bu tür problemleri çözerken değişken boyutlu dizi tanımlamak. Vektör tanımlamaktan daha kolay geliyor çünkü, dizi boyutu parametresini okuduktan hemen sonra hızlıca dizimi tanımlamak hoşuma gidiyor; sizin okuma isteğinizi kaçıran kısımdan bahsediyorum. :)

Bu yazdıklarımdan dediklerinize katılmadığım anlaşılmasın. Doğru pratiğin altını çiziyor olmanız çok hoş.

VLA kullanmak hiçbir durumda mantıklı değil, örneğin kullanıcı varsayılan stack boyutundan fazla olacak şekilde bu yöntemle bir dizi oluşturursa yazdığın algoritma kusursuz dahi olsa stack overflow sebebiyle program patlayacak. Tecrübesiz biri için sorunun ne olduğunu bulmak hiç de kolay olmayacak.
 
VLA kullanmak hiçbir durumda mantıklı değil, örneğin kullanıcı varsayılan stack boyutundan fazla olacak şekilde bu yöntemle bir dizi oluşturursa yazdığın algoritma kusursuz dahi olsa stack overflow sebebiyle program patlayacak. Tecrübesiz biri için sorunun ne olduğunu bulmak hiç de kolay olmayacak.

Bahsettiğiniz konuda haklısınız ancak mesajda değindiğim sitelerin stack boyut limiti "yeterince büyük" ayarlanıyor ve böylece bahsettiğiniz hatayla büyük ihtimalle karşılaşmıyorsunuz. Örneğin ben Codeforces'ta uzunca bir süre soru çözdüm, hiç karşılaşmadığımı söyleyebilirim. Belki unuttuğum 1-2 tane durum vardır. Ha, sıra kodumu kendi bilgisayarımda büyük girdilerle denemeye gelince sıkıntı çekiyordum mesela, stack limitinin yetersizliğinden dolayı. O zaman vektör kullanma ihtiyacı duyuyordum.

VLA kullanmak hiçbir durumda mantıklı değil.

Eliniz alışınca kullanasınız geliyor, inanın ki. :) Bazen konfor (el alışkanlığı), mantığın önüne geçiyor. Örneğin, uzun uzun vector<vector<...>> yazmaya üşendiğimde tercih ettiğim bir yöntem oluyor. Mantıklı olduğunu savunmuyorum, sadece bazı durumlarda rahatlık sağladığını belirtiyorum.
 
Biraz daha sakin yaklaşabiliriz arkadaşlar çocuk heves etmiş öğrenmek istiyor. Tabi öğrenmeyi öğrenmesi önemli de.
Döngüyü kurduğunuz şekil, k ile n-1 arasındaki eleman sayısı çift olduğunda diziyi iki kez tersine çeviriyor. Bu, f >= k koşulunuzun, tersine çevirdiğiniz aralığın orta noktasına ulaştığınızda döngüyü durdurmamasından kaynaklanıyor. Ortadan sonra bir kez daha çeviriyorsunuz yani. Ve düzgün çevrilmemiş oluyor.


C++:
    for (int f = k, j = n - 1; f < j; ++f, --j)
    {
        int temp = array[f];
        array[f] = array[j];
        array[j] = temp;
    }

Bu şekilde döngüyü düzgün kurabilirsiniz.
Sizin kodunuz mantığını anladım ama 2 döngü şeklinde nasıl yaza bileceğimi çözemedim.Şimdi gördüm de sanırım f = k değil de f = k -1 olsa daha doğru olmaz mı ?
 

Technopat Haberler

Yeni konular

Geri
Yukarı