Çözüldü C++ Program Yazma Ödevi

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

zeus11

Femtopat
Katılım
22 Haziran 2020
Mesajlar
6
Merhaba böyle bir program yazmam gerek. Nereden başlayacağıma yardımcı olursanız devamını getiririm:

Bir araba, a-b noktaları arasında, düz bir yolda ve rüzgârsız bir havada yol alırken km. Başına sabit bir miktarda benzin harcamaktadır. Bu araba, rüzgârlı bir havada, rüzgâra karşı hareket ederken %15 daha fazla, rüzgârla aynı yönde hareket ederken %10 daha az yakıt tüketmektedir. Aracın, hızı ve yönü sabit olan rüzgârlı bir havada, a noktasından çıkıp önce b noktasına gitmesi ve sonra aynı yoldan tekrar a noktasına dönmesi (a-b-a) için gerekli yakıt miktarını litre ve mesafeyi km. Cinsinden bulan "yktmaliyet" adlı bir sınıf oluşturulacaktır.
1-) sınıfa özgü değişkenlere, o sınıfın alt sınıfları ve izinli olarak tanımlanan fonksiyonlar dışında erişim mümkün olmayacaktır.
2-) sınıftan nesne türetilirken parametre verilmemişse, constructor, km. Başına tüketilen yakıt miktarını 80 ML. Ve a-b arası mesafeyi 100 km. Olarak belirleyecek, parametre verilmişse, bunu km. Başına tüketilen yakıt miktarı olarak ele alacak ve a-b arası mesafeyi 100 km. Olarak belirleyecektir.
3-) hiçbir fonksiyon inline olarak yazılmayacaktır.
4-) sınıf için '+' ekleme ve '=' atama operatörleri tanımlanıp implementasyonu yapılacaktır.
5-) sonucu mesajla kullanıcıya göstermek için kullanılacak "ykthesapla" adlı bir friend fonksiyon tanımlanıp implementasyonu yapılacaktır.
6-) gidiş için oluşturulan nesne, dönüş için oluşturulacak olan nesneye de atanarak aynı olması sağlanacaktır.
7-) basit bir örnek ile sınıfların (oluşturulması, eklenmesi ve atanması şeklinde) çalışması main() fonksiyonu içerisinde gösterilecektir.
 
Son düzenleyen: Moderatör:
Çözüm
C++'a dair bir fikrim yok ancak Python ile bildiğim kadarıyla yol göstermek isterim. Öncelikle sınıfın içerisine değişkenler atayarak rüzgar yönü, arabanın gittiği yön, kaç kilometre ile gittiğini ve diğer bilgileri buraya yazınız ardından sınıfı içerisine metodlar oluşturun. Örneğin, rüzgarsız yolda giden bir araç için sınıfın içerisinde oluşturduğunuz değişkenlerden yalnızca arabanın kaç kilometre ile gittiğini ve kaç kilometre yol aldığını çarpıp sonucu yazdıran bir metot yazabilirsiniz. Veya rüzgarın yalnızca A noktasından B noktasına sabit hızla olduğunu düşünürsek sen bu kısımda A'dan B'ye giden araç için yakıt tüketimini yakıt tüketimini %10 azaltacak bir değer yazdırabilirsin, ayrıca A'dan B'ye gidip B'den de A'ya yolun yarısını giden bir araç için %10 azaltıp %5 artırıp bunu yazan metodu yazabilirsin. Umarım mantık olarak oturmuştur. Sınıflar kavraması zor fakat anlaşıldıktan sonra bir hayli kullanışlıdır, birkaç farklı kaynaktan video izlemeni de tavsiye ederim gelişmene büyük katkı sağlayacaktır.
Hocam bu dediğinizde hoş bir durum değil. Muhtemelen ödeviniz ve size verilen eğitimde öğrenmeniz gereken bir ders bu. Hali hazırda sürekli yardım alarak ve araştırma güdünüzü yok sayıp devam etmenizi hiç önermem. Geçen gün C# Otomasyon ödevim vardı ve 2-3 günümü ayırıp hocanın kaynaklarından da yararlanıp yapabildim ve bana çok şeyde kattı. Ayrıca ödevi verenin de bir şey öğretmeden sizden bunu yapmanızı isteyeceğini sanmıyorum.

Ama misal class konusunda bir şeye takılırsınız yardım istersiniz ve çözülür, ödevi direk buraya yazıp nasıl yapıcam demek.. 🙂
Ödevi yapıp atarmısınız demek istememiştim. Sınıfları tam olarak bilmediğim için başlangıcı nasıl yapacağım demek istemiştim. Başka ödevlerle uğraştığım için ödevin süresinin bir gün olduğunu 12de biteceğini akşamüstü öğrendim. Yani 2-3 günüm bile yoktu. Hocanın istediği şekilde değilde kendi kafama göre ama hocanın istediği sonuçları veren bir şeyler yapmaya çalışacağım. Olduğu kadar artık.
 
Ödevlerinizi böyle yaptırmanızın size bir faydası yok aksine siz ve diğer arkadaşlarınız daha fazla zarar görmesine sebep oluyorsunuz. Hocanız büyük ihtimalle İnternet'te verdiği ödevi aratacaktır karşısına böyle bir sonuç çıktığı zaman bir kişi için herkesin laf yemesine ve daha zor ödevlerle karşılaşmanız sonucunu verecektir. Daha önce yaşadığım için söylüyorum.
 
C++'a dair bir fikrim yok ancak Python ile bildiğim kadarıyla yol göstermek isterim. Öncelikle sınıfın içerisine değişkenler atayarak rüzgar yönü, arabanın gittiği yön, kaç kilometre ile gittiğini ve diğer bilgileri buraya yazınız ardından sınıfı içerisine metodlar oluşturun. Örneğin, rüzgarsız yolda giden bir araç için sınıfın içerisinde oluşturduğunuz değişkenlerden yalnızca arabanın kaç kilometre ile gittiğini ve kaç kilometre yol aldığını çarpıp sonucu yazdıran bir metot yazabilirsiniz. Veya rüzgarın yalnızca A noktasından B noktasına sabit hızla olduğunu düşünürsek sen bu kısımda A'dan B'ye giden araç için yakıt tüketimini yakıt tüketimini %10 azaltacak bir değer yazdırabilirsin, ayrıca A'dan B'ye gidip B'den de A'ya yolun yarısını giden bir araç için %10 azaltıp %5 artırıp bunu yazan metodu yazabilirsin. Umarım mantık olarak oturmuştur. Sınıflar kavraması zor fakat anlaşıldıktan sonra bir hayli kullanışlıdır, birkaç farklı kaynaktan video izlemeni de tavsiye ederim gelişmene büyük katkı sağlayacaktır.
 
Çözüm
Öncelikle hocanıza söyleyin sınıf ismi öyle konmaz. YakitMaliyet ya da Yakit_maliyet konulması çok daha uygundur. Kısaltmalar yapılsa da ilk harfin büyük olması alışkanlıktır. Kitaplarda iyi programcı alışkanlığı diye geçer. Birisi kodu gördüğünde bu bir sınıf diyebilir bu şekilde.

Aracın, hızı ve yönü sabit olan rüzgârlı bir havada, a noktasından çıkıp önce b noktasına gitmesi ve sonra aynı yoldan tekrar a noktasına dönmesi (a-b-a) için gerekli yakıt miktarını litre ve mesafeyi km. cinsinden bulan "yktmaliyet" adlı bir sınıf oluşturulacaktır.
Sınıflar sadece bir işi yapmaz. Bunun için fonksiyon kullanılır. Sınıfın bir fonksiyonu bu işi yapar/yapabilir.

Ya hocanda, ya sende, ya da bende bir sorun var. Parametre olarak mesafe ve yakıt maliyetini alıyor. Çıktı olarak da bunu veriyor. Sadece cout kullan o zaman. Rüzgar var mı, yok mu nereden anlayacağım ben? Onu da parametre olarak alan bir sınıf tasarladım. Anladıklarıma göre işini fazlasıyla görmesi gerek.

Artı operatörünü hiç anlamadım. Zaten sınıf oluşturuyorsunuz. Her nesne bir araç olacak. Yol ekleme gibi bir şey mi yoksa?

Başka ödevlerle uğraştığım için ödevin süresinin bir gün olduğunu 12'de biteceğini akşamüstü öğrendim. Yani 2-3 günüm bile yoktu.

Ödevin teslim tarihi geçtiğine göre nasıl olması gerektiğini anlatmıştır. Bu bilgiyi bizimle de paylaşır mısın?

C++:
#include <iostream>
#include <iomanip>

using namespace std;

class YakitMaliyet {

    friend ostream& operator<<(ostream& out, const YakitMaliyet& obj) {
        out << setprecision(2) << fixed << right;

        out << "Yol uzunlugu: " << setw(24) << obj.distance << endl;
        out << "Normal yakit tuketimi: " << setw(15) << obj.fuel << endl;
        out << "Ruzgara karsi yakit tuketimi: " << setw(8) << obj.getRuzgarEngeli() + obj.fuel << endl;
        out << "Ruzgar destekli yakit tuketimi: " << setw(6) << obj.getRuzgarDestegi() + obj.fuel << endl;
        out << "Ruzgar engeli: " << setw(23) << obj.getRuzgarEngeli() << endl;
        out << "Ruzgar destegi: " << setw(22) << obj.getRuzgarDestegi() << endl;
        out << "Gidiste harcanan yakit: " << setw(14) << obj.gidisHesapla() << endl;
        out << "Geliste harcanan yakit: " << setw(14) << obj.gelisHesapla() << endl;
        out << "Toplam harcanan yakit: " << setw(15) << obj.gidisGelisHesapla() << endl << endl;

        return out;
    }

public:
    YakitMaliyet(int fuel = 80, int distance = 100, bool windy = false) {
        if (0 > distance) {
            throw invalid_argument("Mesafe sifirdan kucuk olamaz.");
        }

        if (0 > fuel)
            throw invalid_argument("Yakit tuketimi sifirdan kucuk olamaz.");

        this->distance = distance;
        this->fuel = fuel;
        this->windy = windy;
    }

    YakitMaliyet& operator=(const YakitMaliyet& other) {
        this->distance = distance;
        this->fuel = fuel;
        this->windy = windy;
    }

    /*friend void yakitHesapla() {

    }*/

    //rüzgarlı ise hep gidiş durumunda aleyhe işleyecek şekilde kabul ettim
    double gidisHesapla() const {
        if (windy) {
            return (static_cast<double>(distance) * fuel + WIND_BLOCK * distance);
        }
        else {
            return (static_cast<double>(distance) * fuel);
        }

    }

    double gelisHesapla() const {
        if (windy) {
            return (static_cast<double>(distance) * fuel + WIND_SUPPORT * distance);
        }
        else {
            return (static_cast<double>(distance) * fuel);
        }
    }

    double gidisGelisHesapla() const {
        return (gidisHesapla() + gelisHesapla());
    }

    double getRuzgarDestegi() const {
        if (windy) {
            return (WIND_SUPPORT * distance);
        }
        else {
            return 0;
        }
    }

    double getRuzgarEngeli() const {
        if (windy) {
            return (WIND_BLOCK * distance);
        }
        else {
            return 0;
        }
    }

    void setDistance(int distance) {
        this->distance = distance;
    }

    int getDistance() const {
        return distance;
    }

    void setFuel(int fuel) {
        this->fuel = fuel;
    }

    int getFuel() const {
        return fuel;
    }

    void setWindy(bool windy) {
        this->windy = windy;
    }

    const bool getWindy() const {
        return windy;
    }

private:
    int distance;
    int fuel;
    bool windy;
    static constexpr auto WIND_SUPPORT{ 10.0 / 100 };
    static constexpr auto WIND_BLOCK{ -15.0 / 100 };
};

int main() {

    YakitMaliyet araba1;
    YakitMaliyet araba2{ 65, 137, true };
    YakitMaliyet araba3{ 23, 41, false };

    YakitMaliyet araba4 = araba3;

    cout << araba1 << araba2 << araba3 << araba4 << endl;


    return 0;
}
 
Uyarı! Bu konu 6 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı