Bunu nasil uyarlayabilirim ? (c++)

Başlatan empax, 13 Nisan 2009 - 21:45:21

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

empax

Merhaba arkadaslar. Daha once okulda yazdigimiz c++ kodunu degistirmek istiyorum. Yardimci olursaniz cok sevinirim  :)

Bahsi gecen kodlar "Dinamik Stack hafizasindan kopyala" seklinde... Bunu "Dinamik Stack hafizasindan sil" seklinde uyarlayabilirmiyiz ? Tabiki rica etsem  :)

Okulda yaptigimiz:
#include <iostream.h>

#include <stdio.h>

struct elem { int key; elem *next; } *SP1=NULL, *TEMP=NULL, *SP2=NULL;

void push (int n, elem *&START);

int pop(int &n, elem *&START);

void main()

{

int choice;

int n;

do {

cout<<"\nMenu:\n";

cout<<"1 - Push into SP1.\n";

cout<<"2 - Pop All (Pointer SP1).\n";

cout<<"3 - Copy SP1 to SP2.\n";

cout<<"4 - Pop All (Pointer SP2).\n";

cout<<"5 - Exit.\n";

cout<<"Enter your choice: ";

cin>>choice;

switch (choice)

{

case (1):

cout<<"n= ";

cin>>n;

push(n, SP1);

break;

case(2):

while(pop(n, SP1)) cout<<n<<"\t";

break;

case(3):

while(pop(n, SP1))

push(n, TEMP); // Move SP1 to TEMP (reversed).



while(pop(n, TEMP))

{

push(n, SP2);

push(n, SP1);

}

cout<<"SP1 copied to SP2\n";

break;

case(4):

while(pop(n, SP2)) cout<<n<<"\t";

break;



}

}

while (choice!=5);

}

void push (int n, elem *&START)

{

elem * p=START;

START=new elem;

START->key=n;

START->next=p;

}

int pop(int &n, elem *&START)

{

if (START)

{

elem * p=START;

START=START->next;

n=p->key;

delete p;

return 1;

} else return 0;

}
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

newhollandd

#1
Koley gele:) bende senın yazdıgın kodun işlevini ogrenmeye calisyorum.

yvz

#2
pop zaten siliyor. Kast ettiğin bir öğeyi silip gerisini bırakmaksa eğer, normal kopyalama işleminde silmek istediğini bir if komutuyla kopyalamanın dışında bırakarak yapabilirsin bunu.

örneğin t senin silmek istediğin key değeri olsun :
...
case(3):

while(pop(n, SP1))
                {
                       if (n!=t){
                 push(n, TEMP); // Move SP1 to TEMP (reversed).
                       }

                }

while(pop(n, TEMP))

{

push(n, SP2);    //silme işlemi için buna gerek kalmıyor tabii

push(n, SP1);

}

cout<<"Bilmem ne deleted\n";

break;
...


Bu arada newhollandd ile okul arkadaşısınız galiba. Tastamam aynı kodları gördüğünüze göre :)

empax

#3
yardimin icin tesekkurler yvz@  :)
Evet ayni okuldanmisiz msn'den tanistik az once  :D
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

empax

1 hata var. Hatayi cozemedim yvz@ sebebini soyleyebilirmisin acaba?

#include <iostream.h>

#include <stdio.h>

struct elem { int key; elem *next; } *SP1=NULL, *TEMP=NULL, *SP2=NULL;

void push (int n, elem *&START);

int pop(int &n, elem *&START);

void main()

{

int choice;

int n;

do {

cout<<"\nMenu:\n";

cout<<"1 - Push into SP1.\n";

cout<<"2 - Pop All (Pointer SP1).\n";

cout<<"3 - Copy SP1 to SP2.\n";

cout<<"4 - Pop All (Pointer SP2).\n";

cout<<"5 - Exit.\n";

cout<<"Enter your choice: ";

cin>>choice;

switch (choice)

{

case (1):

cout<<"n= ";

cin>>n;

push(n, SP1);

break;

case(2):

while(pop(n, SP1)) cout<<n<<"\t";

break;
case(3):

while(pop(n, SP1))
                {
                       if (n!=t){
                 push(n, TEMP); // Move SP1 to TEMP (reversed).
                       }

                }

while(pop(n, TEMP))

{

push(n, SP2);    //silme işlemi için buna gerek kalmıyor tabii

push(n, SP1);

}

cout<<"Bilmem ne deleted\n";

break;
case(4):

while(pop(n, SP2)) cout<<n<<"\t";

break;



}

}

while (choice!=5);

}

void push (int n, elem *&START)

{

elem * p=START;

START=new elem;

START->key=n;

START->next=p;

}

int pop(int &n, elem *&START)

{

if (START)

{

elem * p=START;

START=START->next;

n=p->key;

delete p;

return 1;

} else return 0;

}
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

yvz


empax

burada;
                       if (n!=t){

error C2065: 't' : undeclared identifier
(MS Visual c++ 6.0 kullaniyorum)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

yvz

t'yi tanımlamadın mı kendi kodun içinde? ben sadece örnek yazmıştım yukarıda. Ayrıca dayanamayıp derledim ubuntu konsoldan, g++ ile ve gördüm ki birkaç ufak hata daha var. Bence stack yapısı ve linked listlerle haşır neşir olan biri bunları kolayca çözebilir. Üstelik google'da bununla ilgili bir sürü örnek bulabilirsiniz.

Yine de:

ilk önce #include <iostream>sonra using namespace std;tabii bir de int main{...
int t;
...
return 0;}

empax

Kafam durdu galiba  :) Saatide 3 ettik.
En iyisi buna yarin tekrar bakmak.
Iyi geceler yvz@  :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

suskun

@empax bilgisayar müh. mi okuyorsun?

Erdem

Bence bu akıllara zarar bir c++ kodu olmuş :) yvz arkadaşımızın da belirttiği gibi

#include <iostream>

ve main'in doğru int main () {}

olacak. Uzun süredir c++ ile uğraşmadığım için kodla ilgili çok fazla yorum yapamayacağım ama dinamik olarak c++ ile bellek tahsisi yapmak bir sürü bellek sızıntılarına neden olacağı için c++'de kullanılan bir şey değildir.  Yapılsa bile bu şekilde yapılmaz. new ile bellek tahsisi yaptığımızda delete ile silmezsek ya da program bu noktaya gelmezse bellek sızıntısı olur.

Yığıt (stack), LIFO (Last In-First Out) (son giren ilk çıkar) prensibiyle çalışan dinamik bir veri nesnesidir. Tüm bunları size yaptırmaya çalıştırmaları da standart kütüphanede bulunan topluluklardan std::vector std::list'in çalışma mantığını  anlatmak. (en azından teorik olarak öyle olmalı :)

Örnek bir yığıt:


#if !defined YIGIT_H
#define YIGIT_H

const int yigitmaksimum = 16;

class TamsayiYigit
{
public:
    TamsayiYigit () : enust_ (0) {}
    void Ekle (int sayi);
    int Cikar ();
    int Tepedeki () const;
    bool DoluMu () const;
    bool BosMu () const;

private:
    int elemanlar_ [yigitmaksimum];
    int enust_;
};

#endif

// yigit.cpp

#include "yigit.h"
#include <iostream>
#include <stdexcept>
using std::cout;
using std::cin;
using std::cerr;

void TamsayiYigit::Ekle (int sayi)
{
    // Taşmaya izin verme
    if (enust_ >= yigitmaksimum)
    throw std::range_error ("Yigit maksimum sinirina ulasti\n");
    elemanlar_ [enust_] = sayi;
    ++enust_;
}

int TamsayiYigit::Cikar ()
{
    // Boş bir yığıttan eleman çıkarmaya kalkma
    if (enust_ <= 0)
    throw std::range_error ("Yigit bosken nesne cikaramam\n");
    --enust_;
    return elemanlar_ [enust_];
}

int TamsayiYigit::Tepedeki () const
{
    // Boş bir yığıtın en üstündeki elemanı öğrenmeye kalkma
    if (enust_ <= 0)
    throw std::range_error ("Bos yigitin en ust elemani ogrenilemez\n");
    return elemanlar_ [enust_ - 1];
}

bool TamsayiYigit::DoluMu () const
{
    return (enust_ == yigitmaksimum);
}

bool TamsayiYigit::BosMu () const
{
    return (enust_ == 0);
}

int main ()
{
    try
    {
    int sayi;
    TamsayiYigit tamsayi;
    tamsayi.Ekle (1);
    tamsayi.Ekle (8);
    cout << "Bir sayi girin:";
    cin >> sayi;
   
    cout << "Cikarilan sayi: " << tamsayi.Cikar () << "\n";
    cout << "Cikarilan sayi: " << tamsayi.Cikar () << "\n";
    cout << "Cikarilan sayi: " << tamsayi.Cikar () << "\n";
    }
   
    catch (std::exception const & hata)
    {
    cerr << "HATA :" << hata.what () << "\n";
    return 1;
    }

    catch (...)
    {
    cerr << "HATA :" << "Bilinmeyen bir hata var\n";
    return 1;
    }
}


bir tane daha bu biraz daha c++ stili:


#include <algorithm>
#include <assert.h>

template <class T>
class Yigit
{
    T * nesneler_;
    int buyukluk_;
    int tepe_;

    void buyult()
    {
    int const eski_buyukluk = buyukluk_;
    buyukluk_ = ((buyukluk_ == 0)
    ? 2
    : buyukluk_ * 3 / 2);

    T * yeni_nesneler = new T[buyukluk_];
    std::copy(nesneler_,
    nesneler_ + eski_buyukluk,
    yeni_nesneler);

    delete[] nesneler_;
    nesneler_ = yeni_nesneler;
    }

public:

    Yigit()
    :
    nesneler_(0),
    buyukluk_(0),
    tepe_(-1)
    {}

    ~Yigit()
    {
    delete[] nesneler_;
    }

    // push
    void ekle(T const & nesne)
    {
    ++tepe_;

    if (tepe_ == buyukluk_)
    {
    buyult();
    }

    nesneler_[tepe_] = nesne;
    }

    // pop
    T cikart()
    {
    assert(tepe_ >= 0);
    --tepe_;
    return nesneler_[tepe_ + 1];
    }

    T & tepe()
    {
    return nesneler_[tepe_];
    }

    // Bu da sabit Yigit nesneleri icin
    T const & tepe() const
    {
    return nesneler_[tepe_];
    }

};

#include <iostream>

using std::cout;

int main()
{
    int const adet = 3;
    Yigit<int> yigit;

    for (int i = 0; i != adet; ++i)
    {
    cout << "Ekliyorum: " << i << '\n';
    yigit.ekle(i);
    }

    for (int i = 0; i != adet; ++i)
    {
    cout << "Cikarttim: " << yigit.cikart() << '\n';
    }
   
    yigit.ekle (8);
    int const tepedeki = yigit.tepe();
    yigit.cikart();
    cout << "Cikarttim: " << tepedeki << '\n';

}


C++ konusunda sorularınızı, merak ettiklerinizi bu konuda gerçekten kendini yetiştirmiş arkadaşların bulunduğu  c dili haber grubunda sorabilirsiniz. Ben uzun süredir c++ ile uğraşamıyorum ve uğraşacak fazla vaktim de yok.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik