Dziesiątkowy na trójkowy


//*************************************************************************

//           PROGRAM WCZYTUJE Z PLIKU TEKSTOWEGO LICZBY. TE LICZBY SA PO DWIE W

//           JEDNYM WIERSZU, A ODDZIELONE SA OD SIEBIE SPACJA np. 8192 271

//               - liczby sa podane w systemie liczenia dziesietnym 

//               - konwertuje te liczby na system trojkowy 

//               - zapisuje je do pliku wynik1_trojkowy.txt też parami i oddzielone spacja

//*************************************************************************

 

#include<iostream>

#include<fstream>

 

using namespace std;

 

 

 int main()

 {

               

    int a;   // zmienna na wczytanie 1 liczby ze strumienia danych czyli z pliku

        

    int b; // zmienna na wczytanie 2 liczby z tego samego wiersza danych

 

    int a3[7];   // w tym wierszu deklaruje tablice jednowymiarowa a3[7]

                       // jest ona o rozmiarze 7, czyli na maksymalnie 7 elementow

  

// UWAGA!! Obliczylam ten rozmiar tablicy Nizej wytłumaczenie jak to zrobilam

 

// w tablicy a3[7] beda sie znajdowac reszty z dzielenia liczby a przez 3 i dlatego nazwalam ja a3

// najtrudniej jest przewidziec rozmiar tablicy, bo nie wiem ile bedzie miec elementow czyli reszt z dzielenia przez 3

// rozmiar takiej tablicy zależy od tego jak duze sa liczby w pliku z danymi

// jest na to wzor matematyczny, ale najpierw trzeba zobaczyc plik tekstowy z danymi i poszukac najwiekszej liczby

// zobaczylam, ze w pliku najwieksza liczba to 2186 i teraz wykorzystam wzor, czyli

// L=k^n-1 gdzie  L-liczba najwieksza w pliku, k - system liczenia o podstawie k czyli w naszym przypadku k=3, n - rozmiar tablicy

// podstawiam moje dane do wzoru i otrzymuje: 2186=3^n-1  wyliczam n:  3^n=2187  to n=7  bo 3 do potegi 7 wynosi 2187

// oznacza to, ze wystarczy mi tablica 7 elementowa

 

     int b3[7];    // najwieksza wartosc liczby b zapisanej w pliku z danymi wynosi 1000

 

// podstawiam do wzoru 1000=3^n-1 przenosze 1 na lewa strone rownania mam 1001=3^n wyliczam n: n=7 bo 3 do potegi 7 wynosi 2187

// nie moge przyjac, ze n=6 bo 3 do potegi 6 jest 729 a wiec za mala wartosc dlatego musze wziac tablice 7 elementowa

 

   int i;            //zmienna pomocnicza numerujaca elementy w tablicy a3[7] 

                       // i=0 wskazuje na pierwszy element , i=1 na drugi element itd

               

       

     ifstream odczyt("dwie_liczby_dziesietny.txt");  

     ofstream zapis("wynik1_trojkowy.txt");          

   

  while(!odczyt.eof())            // dopóki nieprawda, ze natrafilismy na koniec pliku   

  {

     

    odczyt>>a;   // czyta pierwsza liczbe zapisana w systemie dziesietnym 

  

      i=0;              // inicjuje zmienna i wartoscia 0,

                          // bo zaczynam wprowadzanie danych do pierwszej komorki tablicy a3[7]

      

     do         // wybieram petle do-while czyli rob-dopoki

                  // wykonuja sie polecenia a dopiero na koncu jest sprawdzany warunek                                // podany przy while

         {

 

 

    a3[i]=a%3;   // do pierwszego elementu tablicy wprowadzam wartosc reszty z                                                dzielenia liczby a przez 3

    a=a/3;          // natomiast liczbie a przypisuje jej wartosc calkowita z dzielenia przez 3

                     // operator matematyczny '/' oznacza dzielenie calkowite

                                 czyli ze jego wynik jest czescia calkowita z dzielenia przez 3 

                             // a/3  tak jest w C++  napisane znane nam  a div 3

i++;     // zwiekszam -i- o jeden

                               bo bede wpisywac do nastepnej komorki tablicy a3[i]                               

    

}

while (a!=0);      // wykonuj dopoki a jest rozne od zera  Jest srednik na koncu

 

 

while (i>0)    // wybieram petle while aby zapisac do pliku zamieniona liczbe a na                                          system trojkowy

                      // wypisuje po jednej cyfrze z tablicy a3[7], czyta od ostatniego                                                   wprowadzonego elementu do pierwszego 

                       // warunek i>0 bo skonczylam w petli do-while na jakiejs

                                  ( nie mozna jej okreslic) wartosci -i-

{

i--;      // na poczatku cofam -i- o jeden bo w ostatnim przebiegu petli do-while                                    przeszlam do nastepnej komorki tablicy a3[7]

                          // ale nic nie wpisalam gdyz liczba a juz byla =0

zapis<<a3[i];

}

 

zapis<<" ";     // robie spacje zeby potem dopisac liczbe b

           

      

 

    odczyt>>b;   // czyta druga liczbe zapisana w systemie dziesietnym

   

                          // i wszystko tak samo jak dla liczby a

    i=0;

    do

    {

    b3[i]=b%3;

    b=b/3;

    i++;

    }

    while (b!=0);

    

    

    while(i>0)

    {

    i--;

    zapis<<b3[i];

    }

   

    zapis<<endl;      // daje przejscie do drugiej lini czyli do drugiego wiersza

     

       

  } 

     

     odczyt.close();

     zapis.close();

     return 0;

 }

Trójkowy na dziesiątkowy


//*************************************************************************

//           PROGRAM WCZYTUJE Z PLIKU TEKSTOWEGO LICZBY. TE LICZBY SA PO DWIE W

//           JEDNYM WIERSZU, A ODDZIELONE SA OD SIEBIE SPACJA np. 1102 221

//               - liczby sa podane w systemie liczenia trojkowym (nie w dziesietnym)

//               - zamienia liczby z systemu trojkowego na dziesietny i je sumuje

//               - sume (w dziesietnym) zapisuje do pliku wynik2_dziesietny.txt

//*************************************************************************

 

 

 

#include<iostream>

#include<fstream>

#include<cmath>  // bo bede potegowac a tam jest funkcja pow (liczba, wykladnik potegi)

 

using namespace std;

 

 int main()

 {

               

    string a;   // zmienna na wczytana 1 liczbe ze strumienia danych czyli z pliku

             // poniewaz interesuja mnie cyfry tej liczby to deklaruje ja jako string 

    string b;   // zmienna na wczytanie 2 liczby z tego samego wiersza danych

 

int c;   // zmienna na ilosc cyfr w liczbie a

int d;   // zmienna na ilosc cyfr w liczbie b

 

int suma;  // deklaracja zmiennej suma, na sume dzisietna liczby a oraz liczby b

int a10;     // zmienna a w systemie dziesietnym

int b10;     // zmienna b w systemie dziesietnym     

               

    int i;     // zmienna bardzo wazna!!! wykorzystam ja gdy bede zamieniac liczbe

                // z systemu trojkowego na dziesietny

               // czyli gdy bede podnosic do potegi 3, bo -i- to jest wykladnik potegi

               // np. 3 do potegi 0, 3 do potegi 1, 3 do potegi 2 

               // -i- jest tym 0,1,2,

     

     ifstream odczyt("dwie_liczby_trojkowy.txt"); 

     ofstream zapis("wynik2_dziesietny.txt");      

   

  while(!odczyt.eof())  

  {

    suma=0;        // zeruje wartosc zmiennej suma zeby jakies "smieci" sie nie dodawaly

    a10=0;

    b10=0;

    

    odczyt>>a;   // czyta pierwsza liczbe zapisana w systemie trojkowym 

    c=a.size();     // oblicza jej dlugosc czyli ile ma cyfr

    

     i=0;    // w rzedzie jednosci jest 3 do potegi 0  dlatego -i- przypisalam 0

    

       

for (int j=c-1; j>-1; j--)   // w petli for jest zamiana liczby napisanej w systemie

                                                       // trojkowym na liczbe w systemie dziesietnym

                                     // czyli jest tutaj konwersja z systemu trojkowego na dziesietny

                                     // w petli for rozpoczynam obliczenia od jednosci, potem dziesiatki,                                           setki itd 

                                    // tak wiec rozpoczynam "od konca" od ostatniej cyfry do pierwszej

                                    // i dlatego -j- maleje

    {

    a10=a10+(a[j]-'0')*pow(3,i);      // odejmuje'0' bo pamietam o kodzie ASCII

                                                         // pow(3,i) to funkcja, ktora czytamy 3 do potegi -i-

   

    i++;      // zwiekszam -i- o jeden gdy przechodze do nastepnego rzedu:                                                    dziesiatek, setek itd

    }

 

 

 

    odczyt>>b;   // czyta druga liczbe zapisana w systemie trojkowym

    d=b.size();    // oblicza jej dlugosc czyli ile ma cyfr

 

     i=0;     // wyjasnienia identyczne jak dla liczby a

    

        for (int j=d-1; j>-1; j--)

    {

    b10=b10+(b[j]-'0')*pow(3,i);

   

        i++;

    }

   

    

    

    suma=suma+a10+b10;       // sumuje liczby a oraz b (ich wartosci w systemie                                                                           dziesietnym)   

                           

    zapis<<suma<<endl;

      

  } 

     

     odczyt.close();

     zapis.close();

     return 0;

 }