|
C++ dan anlayanlara sorularım
-
-
valla size basit gelio ama bn hiç bu programlamayı yapamıyorum -
bu soruları cevaplandırabilecek kimse yokmu kendimce denemeye çalışsamda bieşy yapamıyorum -
1. Soru
#include<stdio.h>
#include<conio.h>
main()
{
int sayi,toplam=0,i;
for (i=1;i<=15;i++)
{
printf("%d. sayiyi giriniz:",i);
scanf("%d",&sayi);
toplam+=sayi;
}
if (toplam=>100)
printf("Gecti");
else
printf("Kaldi");
getch();
}
-
2. Soru
#include<stdio.h>
#include<conio.h>
main()
{
int hiz,yol,zaman;
printf("Arabanin hizini gir(km/saat):");
scanf("%d",&hiz);
printf("Gidilecek yolu gir(km):");
scanf("%d",&yol);
zaman=yol/hiz;
printf("Bu arac %d km yolu, %d km hizla, %d saatte gider.",yol,hiz,zaman);
getch();
}
3.Soru
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
main()
{
int yas;
char adsoyad[50];
printf("Adi ve soyadini gir:");
gets(adsoyad);
printf("Dogum yilini gir:");
scanf("%d",&yas);
yas=2009-yas;
printf("Ad/Soyad:");
puts(adsoyad);
printf("Yasi:%d",yas);
getch();
}
-
4.Soru
#include<stdio.h>
#include<conio.h>
main()
{
int i;
for (i=70;i>=1;i--)
{
printf("%d\n",i);
}
getch();
}
5. Soru tam olarak ne istedin ? -
Alper# ALLAH senden razı olsun çok saol sayende yarın kesin geçerim :)
5. soruyu bnde tam olarak bilmiorum ama arkadaş öyle söylemişti -
+1 -
STEEP41 birşey değil.
quote:
Orijinalden alıntı: amone
eğer bunun dersini aldığınız halde bu soruları cevaplayamıyorsanız zaten mezun olmamanız ülkemiz açısından daha sağlıklı olur diye düşünüyorum
amma bedavacı bir nesil yetişiyor
STEEP41 yalnız amone çok haklı. -
sayın alper kardeşim şimdi kızacaksın ama senin yaptığın iyilik belki bu arkadaşa kötülük olur diye düşünüyorum -
arkadaşlar bu dev c++ da ben compile ettikten sonra run yapmıyor. nasıl yapcaz bunu -
bi de ben bu komutların ne işe yaradığını nereden öğreneem bi yardımcı olsanız -
@Alper
for (i=70;i>=1;i--)
Elbette gayet güzel çalışır. Fakat şöyle yapsaydık:
for (i=70; i; i--)
Gene gayet güzel ve çoğu zaman daha hızlı çalışırdı. Peki nedir, nasıldır mesele..
Modern derleyicilerin çoğu kodu optimize edebilir. Bu durumda ne olur. İlk örnekte, sayı int olduğu için, 1 den küçük olması veya negatif olması demektir. Derleyici bu noktada
dec i; // iyi bir azalt
cmp i, 1; // i bire eşitmi
jl for_dongusu // Eğer küçükse for döngüsünü devam ettir.
gibi bir kod üretecektir. Diğer örnekte ise
dec i; // i yi bir eksilt
jnz for_dongusu; // Sıfır olmadıysa for döngüsünü devam ettir..
gibi bir kod üretebilecektir. Basitçe, cmp işlevi için gereken CPU yükü ortadan kalkar. Zira, inc gibi işlevler, zero flag denen hardware bileşenini etkiler ve jnz komutu doğrudan bu flaga göre dallanır.
Elbette bu senin kodunun yanlış, verimsiz vs. olduğunu göstermiyor. Üstelik senin verdiğin örnek böyle yeni başlayan birisi için çok daha anlaşılır bir örnek. Niyetim burada böyle bir meselenin olduğunu, hazır fırsat çıkmışken dile getirmek sadece..
< Bu mesaj bu kişi tarafından değiştirildi skoylu -- 12 Şubat 2010; 9:28:22 >
-
Birde sık sık şöyle bir şeyler görüyorum:
for (i=70;i>=1;i--)
{
printf("%d\n",i);
}
Evet bu gayet legal. Velakin bu yazım C nin çok iyi anlaşılmadığı intibasını uyandırıyor bende. C for komutunun pek iyi anlaşılmadığı, diğer dillerdeki, bilhassa BASIC teki FOR ... NEXT ile karıştırıldığını düşünüyorum.
Neden ve nasıl derseniz, şunu bir inceleyin:
for (i=70; i>=1; printf("%d\n", i--));
Bu yazım C for komutunun doğasına daha uygundur aslında. For ne iştir, tekrar bir düşünün, belki bir faydası olur, C yi anlama bakımından.. -
Hocam ona bakarsanız bütün programı tek satırda karman çorman da yazabiliriz. Ama iyi kod yazmanın şartlarından biride herkesin anlayabileceği okunaklı kodlar yazmak değilmidir. Hatta performanstan ödün versek bile.Birde benim merak ettiğim birşey var yukarıdaki yazdıklarınızla alakalı.Yanlış anlamayın sınamak için değil öğrenmek için.
Sıklıkla karşıma çıkar.Diyelimki elimizde bir vektör veya liste var.Biz for içinde her elemana sırasıyla işlem yapacağız. size() fonksiyonu eleman sayısını döndürüyor olsun.
Bu ile:
for(i = 0;i < liste.size();i++) {
... }
bu arasında:
int boyut = liste.size();
for(i = 0;i < boyut;i++) {
... }
hız bakımından fark varmıdır? Derleyici akıllılık edip yukarıdaki kodu alttaki forma çevirir mi?
Not: Derleyici g++
Bu arada; eskiden başka bir nick ile ceviz.net'e yazarmıydınız? -
Kodu tek satırda arap saçı gibi yazmak değil bahsettiğim.
Bahsettiğim şey, for komutunun pek iyi anlaşılmıyor olduğu. C deki for komutu, bir sayça komutu değildir, while usulü dönüglerin bir diğer formudur. Bunu anlamak, pek çok yerde daha iyi kullanmayı sağlar.
Basitçe, python daki for komutu bir arrayın her elemanını teker teker çağırır. Basicte ki ise, bir sayaç yürütür. Ama C için durum çok daha farklıdır.
Bu kavram kargaşası pek çok durumda, for komutunun hatalı kullanılmasına sebep olur. Belki netice değişmez ama, olmadık yerlerde olmadık sorunlar yaşanması gayet mümkündür ve gerçekleşir.
Okunur ve anlaşılır kod yazmak teriminin aslında çok daha farklı bir açılımı vardır. Pek çok yeni kullanıcı bir kaç satır az yazdım ahada diyebilmek gibi garip bir saplantı ile, çorba gibi kodlar yazmayı tercih eder. Fakat, unutulur ki, assembler ile demo kasmıyoruz. Elimizde pek çokları kabul etmesede üst seviye bir dil var ve bunun işletmesi en nihayetinde derleyici tarafından belirlenecek. Eğer siz karmakarışık bir şeyler yazarsanız, derleyici onu tamamen farklı algılayabilir. Dahası, derleyicinin yapacağı optimizasyonlar ile bu kod çakışabilir.
Kodu açık ve basit olarak yazmak, derleyicinin ne yapmak istediğinizi daha iyi anlamasını sağlar. Bu da sorunları vs. son derece azaltır. Elbette büyük bir kodu böyle karma çorman yazdıktan sonra bunu nasıl debug edeceğiniz, nasıl hatasını gidereceğiniz vs. sorunlar da, çorbaya sağlam bir tuz biber olacaktır.
Tekrar edeyim şimdi. For komutunda, verdiğim örnek gibi bir düzenleme yapmayı, o komutu böyle kullanmayı dikte etmeye çalışmıyorum. Dikkat çekmek istediğim, for komutunun bu şekilde kullanılabildiği ve bunun gayet C for komutu ruhuna uygun olduğu. Bu örnek üzerinden for komutunun o üçüncü parametresinin aslında ne iş olduğunu gösterebilmek. Dikkat ettiyseniz, örnek için "aslında böyle olmalı, bu daha iyidir" filan demedim, sadece, şu örneğe iyi bakın, for komutun ne olduğuna dair algınız değişebilir ve düzelebilir dedim.
ceviz.net i hatırlamıyorum, ama olabilir, hafızam pek zayıftır... Eski model bir dinozoruz nede olsa, ram ımız kb cinsinden sayılıyor herhalde.
< Bu mesaj bu kişi tarafından değiştirildi skoylu -- 12 Şubat 2010; 11:29:58 >
-
Galiba sadece ilk cümleyi okuyup haşinle cevap yazmışsınız. Öyle ki arada sorduğum soru bile cevapsız kalmış.
Neyse sorun değil zaten soru sormak huyum değil sadece bilgisine güvendiğim insanlara sorarım yoksa kendim araştırıp bulmayı tercih ederim.Benim bilgiye her zaman saygım var.Kusur ettiysek affola. -
Estağfurullah, ne kusur edesiniz ki?
Ayrıca yazayım diyordum, araya başka şeyler girdi.
Burada ne yapmışsınız:
for(i = 0;i < liste.size();i++) {
... }
Diğeri ise şu:
int boyut = liste.size();
for(i = 0;i < boyut;i++) {
... }
Her ikisi de, aslen biraz sorunlu bir yaklaşım. Bu soruya cevap verebilmek kolay değil.
Eğer listenin elemanları üzerinde iterasyon yapılacaksa, bunun bu şekilde yapılması biraz düşündürücü. Bu iş için C++ STL ile iterator denen kavram ortaya konmuştur herşeyden önce ve böyle yapılması en akıllıcası olur.
Diğer yandan, sorunuza biraz daha sade bakarsak. liste.size bir metod değilde, bir fonksiyon olsun. Ki aslen öyledir, şu şekilde bir fonksyion
int liste_size(liste_object liste);
halindedir. Bu liste object metotda "this" olarak transfer edilir ve C++ bunu güzelce saklar.
Eğer for döngüsü dönerken liste boyu sabit kalıyorsa, o zaman bunu önce bir boyut adlı değişkene koymak basitçe bir "cache" işlemidir ve performansı artırır. Zira, döngü içinde her defasında liste_size() fonksiyonu çağrılıp durulması (bir sürü stağa veri it, stack çerçevesi oluştur vs. vs.) gerekmez. Fakat döngü işlerken listenin boyu değişiyorsa?
Yahu ne değişecek, neden değişsin ki?
Bu düşünce, nesneye yönelimin doğasına aykırıdır. Buna siz veya başkası karar vermez, buna karar verecek olan listenin kendisidir. Yani, her defasında gidip bu kontrolü yapmak zorunludur. Listenin boyu sizin için bir veridir. Nesneye yönelim derki, veriyi kapsülleyeceksiniz, saklayacaksınız. Sizin bu değeri almanız, onun bir snapshotunu almanız demektir. Fakat, listenin bir snapshotunu almış değilsiniz. O zaman bu cache ettiğiniz boyut tutarlı bir veri değildir, kaynak çakışmasına vs. sebep olabilir. Fakat doğru yol her defasında listenin boyunu sormak değildir genede. Çünkü, listenin boyu siz for döngüsünün içinde işlem yaparkende değişebilir. Doğru yöntem, bahsettiğimiz şekilde iteration olgusunu hayata geçirmektir.
Bu, basitçe nesnelerin anlaşılmış olsa bile, nesneye yönelimin pek hazmedilememiş olduğunu gösterir.
-
Bugün bir zaman makinesi icat edilmiş olsun. Bu zaman makinesi ile 31 Aralık 2000 tarihine seyahat etmek istiyorsunuz. Ancak, bu zaman makinesinin mucitleri, kıllık/heyecan olsun diye, sadece ama sadece, içinde bulunduğunuz tarihten kaç gün geriye gitmek istediğinizi girebileceğiniz bir giriş ekranına sahip. Neyse ki, aynı zamanda size yardımcı olabilmesi için, bir C++ kaynak kodu girebileceğiniz bir editöre sahip. Bu editöre C++ kodunu yazıp derlediğinizde sistem kaç gün geriye gidilmesi gerektiğini hesaplamakta ve zaman yolculuğunu başlatmakta. Hadi bu C++ kodunu yazınız.
İpuçları:
i. 2000 yılından içinde bulunduğumuz tarihe kadar kaç gün geçtiğini hesaplamanız gerekiyor.
ii. 2000 yılından içinde bulunduğumuz yıla kadar olan her yılın artık yıl olup olmadığını hesaplayan bir fonksiyon yazmalısınız.
iii. İçinde bulunduğumuz yılın da artık yıl olup olmadığını artık bilebildiğimize göre, içinde bulunduğumuz gün ve ay bilgini kullanarak, yıl başından beri kaç gün geçtiğini bulan bir fonksiyona daha ihtiyacımız var.
iv. Artık ana fonksiyon içerisinde bir döngü kurarak C++ kaynak kodunu bitirebiliriz.
Şöyle bir sorum var. Yardımcı olabilirseniz sevinirim.
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X