Gdzie popełniłem błąd? Konwerter systemów liczbowych w C++. Omija krok funkcji case.

0

Witam. Jestem nowicjuszem jeśli chodzi o programowanie. Na studiach dostałem za zadanie napisać taki oto program:
"Napisz program, który będzie pobierał od użytkownika liczbę w jednym z kodów liczbowych i przeliczał ją na pozostałe. Użytkownik powinien mieć do wyboru następujące kody: dziesiętny, dwójkowy, trójkowy, ósemkowy i szesnastkowy."

Po morderczych próbach wyskrobałem w Dev-C++ program, jednak nie działa on prawidłowo. Użyłem w nim funkcji 'case' i to najprawdopodobniej z nią jest problem. Przy podaniu znaku innego niż 1, otrzymuję komunikat o wprowadzeniu błędnego znaku, który powinien występować tylko, gdy podamy coś innego niż 1 i 2. Nie mam pomysłu, w czym tkwi problem. Poszczególne komponenty, a więc pętle liczące z kodu dziesiętnego na dowolny i z dowolnego na dziesiętny działają bez problemu. Bardzo proszę o pomoc, program jest mi niezbędny do zaliczenia przedmiotu. Spakowany program umieszczam w załączniku. Z góry dziękuję za pomoc, pozdrawiam :)

Kod programu ze zmianami zaproponowanymi przez Woodoo, dzięki :)
Jednak teraz przypadek 2 nie wykonuje się, w kompilatorze wyskakuje komunikat o niezadeklarowaniu funkcji getch()

/* Program pozwalajacy na konwersje systemow liczbowych */

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>

using namespace std;

int main()
/* Sprawdzwenie , czy wpisujemy odrazu w kodzie dziesietnym */
{
    int typ;
    
    cout << "Czy wpisujesz liczbe w systemie dziesietnym? 1-tak 2-nie\n";
    cin >> typ;
    
    /* Wybor kroku - pierwszy gdy zaczynamy odrazu od liczby w systemie 10, drugi kiedy liczba jest w innym systemie */
    
    switch (typ)
    {
      case 1:                                               // Przypadek dla liczby w systemie dziesietnym           
      {
      
      int licz=0, liczba ,podstawa;                          //Deklaracje zmiennych dla kroku 1
      char hex[]="0123456789ABCDEF";
      
      cout << "Podaj liczbe calkowita: ";                      //Prosba o liczbe, pobranie jej oraz utworzenie tablicy do jej zapisu
      cin >> liczba;
      int *tab=new int[liczba];
      
      do {
        cout << "Podaj podstawe systemu [2..16]: ";                 //Prosba o podanie podstawy, pobranie tej zmiennej
        cin >> podstawa;
        
        if (podstawa<2 || podstawa>16)                             // Zabezpieczenie przed wpisaniem niedozwolnej podstawy
        cout << "Podano zla wartosc.\n";
        
        } while (podstawa<2 || podstawa>16);                     //Warunki doboru podstawy i liczby
          while (liczba>0)
        {
          *(tab+licz++)=liczba%podstawa;                        //Przeliczanie na wybrany system
          liczba/=podstawa;
          }
            char *tab2=new char[licz];                                            //Dodatkowa tablica pozwalajaca wypisac poszczegolne znaki od konca
            for (int q=licz-1;q>=0;--q) cout<<(*(tab2+q)=hex[*(tab+q)]);
 
            delete [] tab;
            delete [] tab2;
            system("pause>nul"); break;
            }
            
/* Przypadek drugi - dla liczby podawanej w systemie innym niz dziesietny */
          
      case 2:
      { 
    
    int wynik, liczba, wykladnik;                   // Deklaracja zmiennych
    wynik = '1';
    while (wykladnik > 0) 
     {
       wynik *= liczba;
       wykladnik--;
        }
   
       return wynik;
       

       int main(int argc, char *argv[]);
        {
         string liczba;        // liczba
         int podstawa;         // podstawa
         int dlugoscLancucha;   
         int wynik = 0;
         int potega(int podstawa, int i);        
         

         cout << "Podstawa systemu liczbowego: ";                  //Zapytanie o system liczbowy w ktorym wpisujemy
         cin >> podstawa;
         
         cout << "\nLiczba w systemie " << podstawa << ": ";       //Prosba o wpisanie liczby
         cin >> liczba;
   
         dlugoscLancucha = liczba.size()-1;                        // ilosc cyfr liczby - 1, bo liczymy od zera
   
         for (int i = dlugoscLancucha, j = 0; i >= 0; i--, j++)
         
         wynik += int(liczba[j] - '0') * potega(podstawa,i);                // konwersja znaku na liczbe int(liczba[j] - '0'), odejmujemy od znaku liczby kod ascii znaku 0
         
         cout << "\nLiczba " << liczba << " w systemie 10: " << wynik << endl << endl;            //Wypisuje liczbe w systemie dziesietnym
    
         int licz=0,liczba2,podstawa2;                               //wprowadzenie nowych zmiennych do przel. na inne systemy
         char hex[]="0123456789ABCDEF";
 
         cout<<"\n\nPodaj liczbe uzyskana w systemie 10: ";          // Prosba o przepisanie wczesniej podanej liczby
         cin>>liczba2;                                               // Zapisanie jej jako liczba2
         
         int *tab=new int[liczba2];                                  // Utworzenie nowej tablicy, w której zapisujemy liczbe
         do 
         {
         cout<<"\nPodaj podstawe systemu [2..16]: ";                       //  Prosba o podanie nowej, wyjsciowej podstawy systemu oraz jej zapis
         cin>>podstawa2;
         
         if (podstawa2<2 || podstawa2>16) cout<<"\nPodano zla wartosc.\n";               // Zabezpieczenie przed wprowadzeniem nieodpowiedniej podstawy
         
         } while (podstawa2<2 || podstawa2>16);                                       // Warunki poprawnosci podstaw i liczb
           while (liczba2>0)
           {
             *(tab+licz++)=liczba2%podstawa2;                                        // Pętla przeliczająca
             liczba2/=podstawa2;
             }
              char *tab2=new char[licz];                                             // Utworzenie kolejnej tablicy w celu odczytania przeliczenia od konca
              for (int q=licz-1;q>=0;--q) cout<<(*(tab2+q)=hex[*(tab+q)]);           // Wypisanie liczby
              
              delete [] tab;
              delete [] tab2;
              cin.get();
              break;
              }
                      
      default: cout << "Wpisales bledny znak!"; break;
      }    
       getch();     
      
}
}     

Pastebin: http://4programmers.net/Pastebin/1217

0

Wklej kod na forum, nikomu się nie chce tego ściągać/wypakowywać

0

Po pierwsze: nie analizowałem w ogóle kodu, ale to, co rzuciło mi się w oczy i być może ma wpływ na działanie :

Zamiast:

#include "iostream"
#include "stdio.h"
#include "fstream"
#include "conio.h"
#include "math.h"

dajesz :

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>

I co to za twór:

system("pause>nul");

?

Jak chcesz zatrzymać ekran to zamiast tego wpisz:

cin.get();
0

Tak nakręciłeś że sam się pogubiłeś.

#include <iostream>
#include <iomanip>
using namespace std;

const int MaxSize=2048;
char dig[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main()
  {
   while(true)
     {
      cout<<"np. 16 2 AF9"<<endl;
      cout<<"Podaj system liczby system docelowy liczba (!-koniec): ";
      unsigned S,s;
      if(cin>>S>>s)
        {
         if((2<=S)&&(S<=36)&&(2<=s)&&(s<=36))
           {
            char Tb[MaxSize+1]={0}; // pierwsza cyfra - 0
            unsigned count=1; // mamy jedną cyfrę
            cin>>ws;
            while(true)
              {
               int chr=cin.get();
               if((chr=='\n')||(chr==EOF)) break;
               unsigned P=(unsigned)(strchr(dig,chr)-dig);
               if((0<=P)&&(P<S))
                 {
                  for(unsigned i=0;i<count;++i) // liczbę z Tb mnożymy przez S i dodajemy P
                    {
                     P+=S*Tb[i]; // pomnożona kolejna cyfra
                     Tb[i]=P%s; // wyliczona nowa cyfra
                     P/=s; // wyliczone przenoszenie
                    }
                  // teraz dopisujemy przenoszenie
                  while((P)&&(count<MaxSize))
                    {
                     Tb[count++]=P%s; // kolejna cyfra
                     P/=s; // przenoszenie
                    }
                  if(count>=MaxSize)
                    {
                     cout<<"Zbyt maly bufor"<<endl<<endl;
                     break;
                    }
                 }
               else
                 {
                  cout<<"Niepoprawna cyfra: "<<chr<<endl<<endl;
                  break;
                 }
              }
            for(unsigned i=0;i<count;++i) Tb[i]=dig[Tb[i]]; // przeksztalcamy na znaki
            for(unsigned i=0,k=count-1;i<k;++i,--k) // odwracamy kolejność
              {
               char ch=Tb[i];
               Tb[i]=Tb[k];
               Tb[k]=ch;
              }            
            Tb[count]=0; // dopisujemy znak końca napisu
            cout<<Tb<<endl<<endl;
           }
         else cout<<"Nieodpowiedni system"<<endl<<endl;
        }
      else
        {
         cin.clear();
         if(cin.get()=='!') break;
         cout<<"Blad wprowadzania"<<endl;
        }
      cin.sync();
     }
   return 0;
  }

Znacznie mniej kodu przekształca z dowolnego systemu na dowolny liczby dowolnej długości (np 500 cyfr).

0

A to dlatego, że getch() jest w conio.h. Ale Ty chcesz pisać w C++, więc lepiej nie używać nagłówków z C ;) Jak dołączasz dla cpp nagłówki, to nie będą one się kończyły .h :)

0

A, i teraz tak patrzę : u sibie nigdzie ni uzywasz plików, więc nagłówek fstream można pominąć, nie jest Ci potrzeby ;) - chyba, że masz zamiar jakos dalej to rozbudować o zapis/odczyt z pliku

0

Woodoo - Dziękuję za pomoc, wyjaśnienia i wskazówki :) Nie, póki co, nie będę rozbudowywał tego programu, chociaż kiedyś, może dla rozwinięcia umiejętności spróbuję :)
_13th_Dragon - Wielkie dzięki :) Twój program działa bez zarzutu :) Ogromnie mi pomogłeś :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1