İntegrali kendiniz kağıt üzerinde çözüp onu programa uyarlayacaksınız. |
1. resim === http://s1310.hizliresim.com/1g/g/tl9by.jpg 2. resim === http://o1310.hizliresim.com/1g/g/tl9cb.jpg 2. matrisin 3. sütun 3.satırında 2 yazıyor 4 yazmama rağmen 4.satırdada 1 yazıyor gene 4 yazmama rağmen Acaba diyorum benim compiler'ımda mı bir sorun var dev-c++ kullanıyorum sizin önerebileceğiniz başka, kullanımı kolay compiler var mıdır yada siz ne kullanıyorsunuz bu arada ilgilendiğiniz için teşekkür ederim. EDIT: int dizi[100][100], dizi1[100][100], sonuc[100][100] // sizin yazdığınız int a,b,i,j,dizi[a] ,dizi1[a] ,sonuc[a] ; //benim yazdığım sanırım [a] yazdığım için bu sorun ortaya çıktı. Teşekkürler sorunu çözdüm :) |
Sorunu cozdugune sevindim. Kodu biraz degistirmistim. Kendin bulman daha iyi oldu. Derleyici olarak mingw kullaniyorum ama visual studio u Tavsiye ederim. En azindan hatalari gormende yardimci olur. |
arkadaşlar birisi bana yardım etsin tek tek girilen 4 basamaklı sayının değerlerini alt alta yazan program dedi hocam ama modülle yapılacak ![]() |
Modulus operatörünü kast ettiğini anlamam 5 dk. mı aldı ![]() |
Hocam "breadth-first traversal" hakkında biliyorsan eğer bilgi verebilirmisin |
conio.h asla kullanmamalısın. Platforma bağlıdır ve ben öğretmen olsam bunu yazana sıfır puan verirdim. |
Ödev değilse bir proje için yapıyorsan belleği dinamik olarak yönet. Stack olarak verme. |
Bir bilgi vereyim, printf fonksiyonunu şu şekilde asla kullanmayın: printf("Merhaba dünya!"); Bu güvenli değildir, karakter sayısını bile istemez. şöyle kullanın printf("%s","Merhaba"); bu da çok güvenli değildir. Bu yüzden bunu kullanın: cguvenlik = (char*)calloc/*malloc burada olmamalı*/(100,sizeof(char)); //Daha da fazla güvenli snprintf(cguvenlik,50,"Version: %s",SURUM);puts(cguvenlik); En güvenli yöntemlerden birisi en son verdiğimdir. Malloc un kullanılmamasının sebebi ise ayrılan bellekte eğer son karakter \0(null sonlandırıcı) değilse puts konsol ekranına istenmeyen karakterleri yazabilir. Veya kullanırsanız snprintf fonksiyonundaki karakter sayısını yazdıracağınız karakter dizisinin karakter sayısıyla eşit tutun. |
Ödev :) sağ ol tavsiye için ben araştırıyım onu bi :) |
@Fatih54102 printf() neden güvenli değil acaba biraz teknik olarak konuyu açabilir misiniz? snprintf() için malloc/calloc ile ayırdığınız yeri free ile boşaltmanız gerekmez mi? |
gerekir boşaltmak onu da C++ ise destructor içinde eğer c ise de çıkıştan önce yaparlar diye özellikle belirtmedim. printf güvenli olmamasının sebebi overflow olabilir ve bir sorun oluşsa bile uygulama çalışmaya devam eder. --- printf("%s",carr); bunu dememin sebebi ise daha farklı, aslında bu da güvensiz ama düz printf kullanımı kadar değil. düz printf kullanımının ilk güvenlik sebebini yukarıda belirttim. Diğer sebep (daha çok sebebi var): örneğin şöyle bir şey yazdırmak gerekiyor: char test[] = "Yuzde isareti su sekilde gosterilir: %"; bunu yazdırmak istersek sizin bildiğiniz yoldan printf(&test[0]); veya printf(test); ama çıktıda % işareti argüman olarak algılanıp va_list e katılır (printf fonksiyonunda) ve bozuk karakter/farklı karakter gösterilir % yerine Çıktı: "Yuzde isareti su sekilde gosterilir: " Bu tür sorunların olmaması için en doğru yollardan biri yukarıda dediğim hafıza ayırma metodu. Eğer yapamazsanız aşağıdaki doğru olmayan yöntemi kullanın. (Projelerde asla printf ve scanf kullanılmamalı zaten) printf("%s",test); böyle yapınca çıktı doğru düzgün olarak verilir. İşte bu tür saçmalıklarla programcıların uğraşmaması için C++ cout adındaki güvenli fonksiyonunu getirdi. --- Ayrıca Scanf ve Gets kullanılması çok daha büyük sorun(Microsoft nispeten daha fazla güvenli _s fonksiyonlarını geliştirdi. Ancak microsoft ya işte sadece msvc ile çalışır bu yüzden platform/derleyici bağımsız değildir. Kullanmayın) . Gerekirse fgets veya bahsettiğim güvenli yöntemi kullanın. Günümüz projelerinde zaten bu gibi nedenlerden ve yeniliklerden dolayı C++ kullanılır. Ama C++ daha üst seviye dildir ve asm den daha uzaktır. Bu yüzden hızı yavaş ve kapladığı boyut da büyüktür, bu yüzden gömülü sistemlerde vb. tercih edilmez. Yani kısaca ödevler haricinde proje yapacaksanız bilgisayarlar için C++ kullanın. |
Overflow olmasına bir örnek verebilir misiniz?
Burada ki sorun dilden çok kullanıcıdan kaynaklı bence. Orada bir daha % kullanması gerekirdi. Ama dediğiniz gibi güvenli değil. Ayrıca yukarıda verdiğiniz kodu biraz değiştirdim ama yine çözüm olmadı % li verdiğiniz örnek için.
Bu kod çıktı olarak "aaa " sonucunu vermektedir. Yani snprintf'in pek faydası olmadı % için :(.
cout'da sandığımız kadar güvenli değil aslında. Bunun içinsehttp://ddili.org/makale/neden_d.html buradaki makalenin "Biraz haksızca sataşarak merhaba" bölümünü okumanızı tavsiye ederim. Küçük bir not: C ile sadece burada sorular sorulduğu zaman kod yazıyorum. Onun dışında ki projelerimde C++ ile geliştirme yapıyorum. |
cout bir fonksiyon değildir. |
Evet değil oradaki fonksiyon dememin sebebi bitshift operatörü ile operatör overloading yapılınca içinde bulunduran bir fonksiyonu çağırıp fonksiyon gibi işlev yapmasındandır. Bu tür ayrıntıları yazsam mesajlar çok uzun oluyor o yüzden. |
Tek hata bu olsa cevap vermeye gerek yoktu ama... printf("Merhaba dünya!"); Bunun hiçbir şekilde dezavantajı yok. Stringlerin sonunda zaten null olduğu için karakter sayısını almasına da gerek yok. printf("%s","Merhaba"); Bu da aynı şey. Kaç karakter olduğunu zaten bilir. Bunların stack overflow ile hiçbir alakası yok. Bu örnekteki stringler zaten ne stack ta ne de heap te tutulur. Stringleri çalışma zamanında kopyalamanın ne gibi bir avantajı var? Ya da malloc neden olmaz, neden calloc? String kopyalayan fonksiyonlar zaten otomatik olarak null ekler. Belleği önceden sıfırlamaya gerek yok. Bunun tek isnistası karakterleri tek tek koplayalarken ortaya çıkar. O zaman null u manuel olarak eklemek gerekir. Bu benim sık sık yaptığım birşey mesela. O güvenli denilen fonksiyonlar illegal olan bölgeye yazmıyor ama kopyalamayı eksik bırakıyor. Bunun neresi güvenli? % ile yazılan format karakterlerini hatasız yazdığınız sürece ve yeterli belleği ayırdığınız sürece güvensiz diye birşey yoktur. C ile program yazıyorsanız bu tür şeylere dikkat edeceksiniz. C' nin felsefesi budur. Ne kadar yetki o kadar sorumluluk. Python değil bu. Son olarak c++ c' den yavaş değil. Makina diline uzak ta değil. |
En basit örneği buffer overflow. Araştırırsanız bulacaksınız. --- O bölümü biraz değiştirirsek mesela: (pseudo kod)
yani burada da kullanıcı nın %% gibi bir şey kullanması lazım. Bu da uygun değil. --- char surum[] = "aaa %"; char *cguvenlik = (char*)calloc(100,sizeof(char)); //Daha da fazla güvenli snprintf(cguvenlik,50,surum); puts(cguvenlik); aslında snprintf(cguvenlik,50,"%s",surum); gibi kullanılması lazım. Ama zaten fazla işlem gücü gerektiren bu blokta bunu da ekleyince daha fazla süre geçeceği için kullanmamıştım. Bu gibi durumlarda ikinci belirttiğim kullanılmalı. --- O makaleyi okumuştum, D gerçekten güzel bir dil fakat C++ bile makine diline bu kadar uzakken D çok daha uzak. Makaleyi yazan adam doğru söylemiş fakat düşük seviyeye inince hata göstermemesinin bile iyi sonuçları olabiliyor. Yani burada kontrolü bence programcıya bırakmak lazım. (projelerde bu işi kolaylaştırmak için küçük bir template fonksiyon hazırlanabilir) Ama sonuçta evet stdout için writeln , cout a göre daha uygun (Eğer d dili kullanılıyorsa) . |
arkadaşlar c de girdiğim değerleri yer değiştirecek bir programa ihtiyacım var... mesela....: 1 2 3 4 5 diye girdik..ekrana....:5 4 3 2 1 diye yazacak...Basit program istiyorum..yardımcı olursanız sevinirim... |
printf("Merhaba dünya!"); Bunun hiçbir şekilde dezavantajı yok. Stringlerin sonunda zaten null olduğu için karakter sayısını almasına da gerek yok. Normal şartlarda evet, fakat birisi disassemble edip büyük bir projenizi 1 dakika içinde değiştirdiğinde bu sözleri bir daha edemezsiniz. --- printf("%s","Merhaba"); Bu da aynı şey. Kaç karakter olduğunu zaten bilir. Bunların stack overflow ile hiçbir alakası yok. Bu örnekteki stringler zaten ne stack ta ne de heap te tutulur. evet bilir fakat yukarıdakinden güvenlidir. overflow için ise isterseniz örneğini verebilirim. --- Stringleri çalışma zamanında kopyalamanın ne gibi bir avantajı var? Ya da malloc neden olmaz, neden calloc? String kopyalayan fonksiyonlar zaten otomatik olarak null ekler. Belleği önceden sıfırlamaya gerek yok. daha fazla güvenlik için. şöyle yapılsa: cguvenlik = (char*)calloc(15,sizeof(char)); snprintf(cguvenlik,8,"test123");puts(cguvenlik); test123\0#temiz alan# adam ileriki aşamalarda memcpy(mesela iki str ve karakterbirleştirip , veya binary bloğunu temiz alana taşımak isteyebilir) ile bir şeyler taşıyabilir bu durumda sonlandırıcı eklemekle uğraşmamak için zaten hazır olan sonlandırıcılar kullanılır. daha sonra adresi bellekte tutmadan basit bir for döngüsü ile attığı şeylere ulaşabilir) malloc da kullanılabilir fakat bu sefer de pozisyon tutmak gerekir. --- O güvenli denilen fonksiyonlar illegal olan bölgeye yazmıyor ama kopyalamayı eksik bırakıyor. Bunun neresi güvenli? Burada anlatılmak isteneni anlamadım. --- % ile yazılan format karakterlerini hatasız yazdığınız sürece ve yeterli belleği ayırdığınız sürece güvensiz diye birşey yoktur. C ile program yazıyorsanız bu tür şeylere dikkat edeceksiniz. C' nin felsefesi budur. Ne kadar yetki o kadar sorumluluk. Python değil bu. işlemci kullanıcıdan aldığı her metindeki % leri %% olarak mı değiştirsin? Ekstra zaman kaybı. diğer arkadaşa verdiğim cevabı okuyun. --- Son olarak c++ c' den yavaş değil. C++ ın çoğu fonksiyonu C den daha yavaştır. C++ ı C++ yapan özellikleri çıkartınca zaten hız farkı kalmaz. |
Bu mesajda bahsedilenler: @baranbula