Arama butonu
Bu konudaki kullanıcılar: 1 misafir
18
Cevap
1318
Tıklama
0
Öne Çıkarma
C++ dan anlayanlara sorularım
S
15 yıl
Onbaşı
Konu Sahibi

Arkadaşlar yarın bilgisayar programlama dersinden sınavım var ve sınav soruları elimde ama C++ dan anlamadığım için yapamıyorum. Sevabına şu 5 soruyu cevaplandırabilirmisiniz

1- Klavyeden girilen 15 sayının toplamı 100den büyükse geçti değilse kaldı yazan program?

2- Klavyeden bir arabanın hızı ve gideceği yol miktarı giriliyor. Arabanın bu yolu kaç saatte alacağını bulan program?

3- Ekrana Adınızı soyadınızı ve doğum yılınızı yazan program?

4- Ekrana aşağıdaki gibi çıktı veren program?

70
69
68
67
.
.
.
1

5- Klavyeden girilen 20 sayının çarpımlarının tek mi çift mi olduğunu bulan program?

Sorular bunlar yardımlarını bekliyorum ünide gemi makinaları okuyorum ama bu ders bana çok ters gelio anlayanınız varsa lütfen yardım edin.

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



S
15 yıl
Onbaşı
Konu Sahibi

valla size basit gelio ama bn hiç bu programlamayı yapamıyorum


Bu mesaja 1 cevap geldi.
S
15 yıl
Onbaşı
Konu Sahibi

bu soruları cevaplandırabilecek kimse yokmu kendimce denemeye çalışsamda bieşy yapamıyorum


Bu mesaja 1 cevap geldi.
A
15 yıl
Yarbay

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();
}


Bu mesaja 1 cevap geldi.
A
15 yıl
Yarbay

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();
}


Bu mesaja 1 cevap geldi.
A
15 yıl
Yarbay

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 ?


Bu mesaja 1 cevap geldi.
S
15 yıl
Onbaşı
Konu Sahibi

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



O
15 yıl
Yarbay

+1



A
15 yıl
Yarbay

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ı.


Bu mesaja 1 cevap geldi.
M
15 yıl
Teğmen

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


Bu mesaja 1 cevap geldi.
L
15 yıl
Er

arkadaşlar bu dev c++ da ben compile ettikten sonra run yapmıyor. nasıl yapcaz bunu


Bu mesaja 1 cevap geldi.
L
15 yıl
Er

bi de ben bu komutların ne işe yaradığını nereden öğreneem bi yardımcı olsanız


Bu mesaja 1 cevap geldi.
S
15 yıl
Yüzbaşı

@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 >
Bu mesaja 1 cevap geldi.
S
15 yıl
Yüzbaşı

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..


Bu mesaja 1 cevap geldi.
G
15 yıl
Yarbay

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?


Bu mesaja 1 cevap geldi.
S
15 yıl
Yüzbaşı

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 >
Bu mesaja 1 cevap geldi.
G
15 yıl
Yarbay

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.


Bu mesaja 1 cevap geldi.
S
15 yıl
Yüzbaşı

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.



H
5 yıl
Er

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.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.