//*************************************************************************
// 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;
}
//*************************************************************************
// 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;
}