Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++] Połączenie dwóch programów w jeden

mlody.elek 04 Maj 2009 12:59 2601 9
  • #1 04 Maj 2009 12:59
    mlody.elek
    Poziom 11  

    Witam.
    Mam problem z połączeniem dwóch programów w jeden, więc proszę o pomoc. Zależy mi aby uzyskać program z menu, z którego wybieram konwersje lub wyjście, jeśli ma być konwersja to podaje liczbę do konwersji i po otrzymaniu wyniku powracam do menu ale bez czyszczenia ekranu.

    Pierwszy program - przelicza podaną liczbę binarną na dziesiętną, o to kod:

    Code:
    #include <vcl.h>
    
    #pragma hdrstop
    #pragma argsused
    //---------------------------------------------------------------------------


    #include <iostream>
    using namespace std;

    int bin_to_dec(const string & bin) //zwraca 0 jesli string jest pusty
    {
      int dec = 0;
      string::size_type i = bin.size();
      while(i--)
        if(bin[i] == '1')
          dec += 1 << (bin.size() - i - 1);
        else
          if(bin[i] != '0') //jesli cos w stringu znajduje sie cos innego niz 0 lub 1 fk. zwraca 0
            return 0;

      return dec;
    }

    int bin_dec()
    {
      cout << "Podaj liczbe binarnie: ";
      string bin;
      getline(cin, bin);

      cout << "Liczba binarna " + bin + " to dziesietnie: " << bin_to_dec(bin) << endl;

      string s;
      getline(cin, s);
    }

    int main()
    {

    bin_dec();
    }
    to działa ok.
    Dodaję go do tego co miałem wcześniej i nie działa jak bym chciał :(

    Oto kod całości:
    Code:
    #include <vcl.h>
    
    #pragma hdrstop
    #pragma argsused
    #include <iostream>
    #include <conio.h>

    using namespace std;
    int reszta;
    int wynik[20];
    int liczba;
    char ch;

    int bin_to_dec(const string & bin) //zwraca 0 jesli string jest pusty
    {
      int dec = 0;
      string::size_type i = bin.size();
      while(i--)
        if(bin[i] == '1')
          dec += 1 << (bin.size() - i - 1);
        else
          if(bin[i] != '0') //jesli cos w stringu znajduje sie cos innego niz 0 lub 1 fk. zwraca 0
            return 0;

      return dec;
    }


    int binnadec()
    {
      cout << "Podaj liczbe binarnie: ";




      string bin;
      getline(cin, bin);
      cout << "Liczba binarna " + bin + " to dziesietnie: " << bin_to_dec(bin) << endl;
      string s;
      getline(cin, s);
    }

    int decnabin()
    {
      cout<<"Podaj liczbe dziesietnie: ";
      cin>>liczba;
      cout<<" "<<endl;
      {
         int i=0;
         while (liczba>1)
         {
            reszta=liczba % 2;
            if(reszta>0)wynik[i]=reszta;
            liczba=liczba / 2;
            i=i+1;
            if(liczba<2)
            {wynik[i]=liczba;break;}
         }
         cout<<"twoja liczba binarnie to "<<endl;
         for(int j=i;j>=0;j--)
          cout<<" "<<wynik[j];  }

       cout<<" "<<endl;
    }

    void main()
    {

     cout<<"        Program do konwersji liczb dzisietnych na binarne i odwrotnie"<<endl;
     cout<<" "<<endl;
        cout<<"Jaka konwersja"<<endl;
        cout<<"dziesietny -> binarny nacisnij 1"<<endl;
        cout<<"binarny -> dziesietny nacisnij 2"<<endl;
        cout<<endl;
        cin>>ch;

        cout<<endl;
        cout<<"Wybrales - "<<ch<<endl;
        cout<<" "<<endl;

        if(ch=='1')decnabin();
        if(ch=='2')binnadec();

        cout<<" "<<endl;

        cout<<"Aby zakonczyc nacisnij dowolny klawisz"<<endl;
        getch();

    }




    Teraz jeszcze kilka słów objaśnienia:
    1. pierwsza czesc - konwersja dec->bin działa
    2. nie działa konwersja bin->dec choc jako samoistny program (tak jak na w pierwszym kodzie) działa - tu jest właśnie problem
    3. nie mam pomysłu na menu - może jakieś porady
    4. całość kompiluje pod Borland C++ Builder Version 6.0 / sysem operacyjny XP SP2

    Poprawna część programu
    [c++] Połączenie dwóch programów w jeden

    Część z błędem - wybieram 2 i zatwierdzam enterem i dostaje coś takiego:
    [c++] Połączenie dwóch programów w jeden

    Dzięki za zainteresowanie.

    Poprawiłem temat (Regulamin, p. 11.1).
    [Dr.Vee]

  • #2 04 Maj 2009 13:47
    Eagle
    Poziom 23  

    Witam,

    Najwidoczniej getline nie lubi się z iostream czyli cin i cout.
    W Twoim przypadku getline zwracał pusty string dlatego nie działało.

    Proponuję następującą zmianę w decnabin()

    Code:

    (...)
      string bin;
     // getline(cin, bin);
      cin >> bin;
    (...)



    Pozdrawiam
    Eagle

    P.S.

    Jeśli definiujesz funkcję która ma coś zwracać

    Code:

    int decnabin()


    to powinieneś coś zwracać instrukcją return,
    lub zdeklarować iż nie będziesz nic zwracać

    Code:

    void decnabin()

  • #3 04 Maj 2009 13:55
    KowalD
    Poziom 17  

    i pomysl co zwroci (albo co powinna ;)) Twoja funkcja bin_to_dec, gdy jako argument przekazesz np string= "000" ...

  • #4 04 Maj 2009 14:00
    Dr.Vee
    VIP Zasłużony dla elektroda

    Eagle napisał:

    Najwidoczniej getline nie lubi się z iostream czyli cin i cout.
    W Twoim przypadku getline zwracał pusty string dlatego nie działało.

    Proponuję następującą zmianę w decnabin():


    Też nie będzie działać.

    Problem w tym, że w menu wczytujesz tylko jeden znak:
    Code:
    cin >> ch
    Dzięki buforowaniu wejścia z klawiatury użytkownik musi zakończyć linię enterm, żeby program otrzymał na wejściu choć ten jeden znak.

    I tak użytkownik wpisuje np. '1' i enter, a program dostaje do bufora cin znaki: '1', '\n'. Wczytując jeden znak zostawiasz '\n' w buforze. Zarówno getline jak i cin >> string zakończą wczytywanie na tym znaku.

    Pozdrawiam,
    Dr.Vee

  • #5 04 Maj 2009 17:47
    Eagle
    Poziom 23  

    Witam,

    Rozumiem po waszych odpowiedziach, iż żaden z Was nie skompilował problemu.
    ----------------------
    KowalD

    Skompilował z poprawką jak wyżej, wynik na ekranie :

    Liczba binarna 0000 to dziesietnie: 0

    Możesz rozwinąć co miałeś na myśli ?

    ----------------------
    Dr.Vee

    Być może problem leży w bibliotekach ja testowałem z (VC6) ale wydaje się że działa tak samo jak u autora pytania. Jak widzisz na załączonych obrazkach autor wybiera czy chce dokonać konwersji z BIN z DEC. Tak więc do zmiennej "ch" nie dostaje \n a ostatni naciśnięty znak, gdyby było jak piszesz nie został by spełniony warunek w if.

    Problem dotyczył getline która to zwracała pusty string zamiast podanego, przyczyny nie znam, ale problem rozwiązał cin.

    Pozdrawiam

    Eagle

  • #6 04 Maj 2009 18:05
    Dr.Vee
    VIP Zasłużony dla elektroda

    Eagle napisał:
    Dr.Vee

    Być może problem leży w bibliotekach ja testowałem z (VC6) ale wydaje się że działa tak samo jak u autora pytania. Jak widzisz na załączonych obrazkach autor wybiera czy chce dokonać konwersji z BIN z DEC. Tak więc do zmiennej "ch" nie dostaje \n a ostatni naciśnięty znak, gdyby było jak piszesz nie został by spełniony warunek w if.

    W zmiennej ch jest pierwszy wczytany znak, ale w buforze wejściowym pozostaje reszta wiersza (pusta), którą następnie odczyta getline lub cin >> string.

    Pozdrawiam,
    Dr.Vee

  • #7 04 Maj 2009 22:24
    KowalD
    Poziom 17  

    a jak jako argument przekazesz np. "0710" to wynik tez wyjdzie 0... w takim programie to nie problem... ale i tak jest niemilo... jak dla mnie :)...

  • #8 08 Maj 2009 12:27
    mlody.elek
    Poziom 11  

    Po modyfikacji wg propozycji Eagle
    Kod:

    Code:

    (...)
      string bin;
     // getline(cin, bin);
      cin >> bin;
    (...)


    działa jak trzeba. Wielkie dzięki Eagle
    Zmieniłem jeszcze menu z pętli for na swicht/case i nawet mogło by tak zostać ale jak stwierdził KowalD
    Cytat:
    a jak jako argument przekazesz np. "0710" to wynik tez wyjdzie 0... w takim programie to nie problem... ale i tak jest niemilo... jak dla mnie Smile...

    ogólnie nie stanowi to wielkiego problemu ale jak może jakieś propozycje na uniknięcie takiej sytuacji?
    Dodam iż programista ze mnie kiepski więc ewentualne podpowiedzi powinny nie być za bardzo zawiłe

    Dzięki za pomoc w pozbyciu się problemu.

  • #9 08 Maj 2009 13:33
    Dr.Vee
    VIP Zasłużony dla elektroda

    Użyj funkcji strtoul (nagłówek cstdlib) - załatwi Ci poprawne parsowanie liczb binarnych i dziesiętnych za jednym zamachem.

    Poszukaj w google man strtol i poczytaj sekcję EXAMPLES żeby zobaczyć, jak tej funkcji się prawidłowo używa. W przypadku błędu możesz zgłosić wyjątek.

    Pozdrawiam,
    Dr.Vee

  • #10 08 Maj 2009 20:59
    mlody.elek
    Poziom 11  

    Dzięki Dr.Vee!
    Wolną chwilą po bawię się tą funkcją ale czuję że może załatwić mi całość, tzn konwersje dec->bin i odwrotnie, muszę tylko rozgryść jak jej poprawnie użyć...

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME