/*************************************************************************** * * * Copyright (C) 2005 Piotr Wawrzyniak (piti@piti.vsv.pl * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ //The class and functions responsible for conversions to various numbering styles #include"system_zapisu.h" #include using namespace std; extern int ignore_formating; extern int language; //constructor r_numerow::r_numerow(int a, int b, int c, int d, int e) { zwroc_num_etykiet[0]=a; zwroc_num_etykiet[1]=b; zwroc_num_etykiet[2]=c; zwroc_num_etykiet[3]=d; zwroc_num_etykiet[4]=e; domyslny_styl_numeracji=2; } int r_numerow::ustaw_zmienna_numer_etykietki(char *etykieta) { if(etykieta[0]==':'&&strlen(etykieta)>=3&&!ignore_formating) { switch (etykieta[1]) { case 'r': zwroc_numer_etykiety(0); break; case 'R': zwroc_numer_etykiety(1); break; case 'a': zwroc_numer_etykiety(2); break; case 'l': zwroc_numer_etykiety(3); break; case 'L': zwroc_numer_etykiety(4); break; default: zwroc_numer_etykiety(domyslny_styl_numeracji); } } else zwroc_numer_etykiety(domyslny_styl_numeracji); return 0; } int r_numerow::set_up_all(int roman,int Roman,int arabic,int letters,int Letters,int def) { zwroc_num_etykiet[0]=roman; zwroc_num_etykiet[1]=Roman; zwroc_num_etykiet[2]=arabic; zwroc_num_etykiet[3]=letters; zwroc_num_etykiet[4]=Letters; domyslny_styl_numeracji=def; return 0; } int r_numerow::set_up_all(int what, int what_number) { if(what==5) { domyslny_styl_numeracji=what_number; return 0; } else { zwroc_num_etykiet[what]=what_number; return 0; } } int r_numerow::zwroc_numer_etykiety(int numer) { zeruj_numer_etykietki(); //wartosci_num_etykiet[numer]++; // zwroc_num_etykiet[numer]++; switch(numer) { case 0: if(int_na_rom_char(zwroc_num_etykiet[0],0)) return 2;;//Był problem z zalokowaniem pamięci break; case 1: if(int_na_rom_char(zwroc_num_etykiet[1],1)) return 2;;//Był problem z zalokowaniem pamięci break; case 2: if(int_na_char(zwroc_num_etykiet[2])) return 2;//Był problem z zaalokowaniem pamięci break; case 3: if(int_na_lit_char(zwroc_num_etykiet[3],0)) return 2;//Był problem z zaalokowaniem pamięci break; case 4: if(int_na_lit_char(zwroc_num_etykiet[4],1)) return 2;//Był problem z zaalokowaniem pamięci break; }; zwroc_num_etykiet[numer]++; return 0; } int r_numerow::int_na_char(int a) { kol_liczb *pierwszy=NULL; kol_liczb *ostatni=NULL; kol_liczb *pomocnicza=NULL; // kol_liczb *poprzedni=NULL; int b=a; int d; float c; while(b>0.1) { c=b/10; pomocnicza=new kol_liczb; if (!pomocnicza) { if(language==0) { cout<<"Problem z zaalokowaniem wolnej pamięci"<next=pierwszy->prev=NULL; } else { ostatni->next=pomocnicza; pomocnicza->prev=ostatni; pomocnicza->next=NULL; ostatni=pomocnicza; } d=(int)c; pomocnicza->liczba=b-d*10; //cout<liczba<liczba<liczba) { case 0: numer_etykietki[b]='0'; numer_etykietki[b+1]='\0'; break; case 1: numer_etykietki[b]='1'; numer_etykietki[b+1]='\0'; break; case 2: numer_etykietki[b]='2'; numer_etykietki[b+1]='\0'; break; case 3: numer_etykietki[b]='3'; numer_etykietki[b+1]='\0'; break; case 4: numer_etykietki[b]='4'; numer_etykietki[b+1]='\0'; break; case 5: numer_etykietki[b]='5'; numer_etykietki[b+1]='\0'; break; case 6: numer_etykietki[b]='6'; numer_etykietki[b+1]='\0'; break; case 7: numer_etykietki[b]='7'; numer_etykietki[b+1]='\0'; break; case 8: numer_etykietki[b]='8'; numer_etykietki[b+1]='\0'; break; case 9: numer_etykietki[b]='9'; numer_etykietki[b+1]='\0'; break; }; pierwszy=pomocnicza; pomocnicza=pomocnicza->prev; delete pierwszy; b++; } return 0; } int r_numerow::int_na_rom_char(int liczba,int mal_duz) { char tablica_liczb_rzymskich[33][5]={"i","ii","iii","iv","v","vi","vii","viii","ix","x","x","xx","xxx","xl","l","lx","lxx","lxxx","xc","c","c","cc","ccc","cd","d","dc","dcc","dccc","cm","m","m","mm","mmm"}; int ile_cyfr=0; kol_liczb *pierwszy=NULL; kol_liczb *ostatni=NULL; kol_liczb *pomocnicza=NULL; // kol_liczb *poprzedni=NULL; int b=liczba; int d; float c; if(liczba>3899) { if(language==0) { cout<<"Przekroczony maksymalny zakres dla liczb rzymskich. Maksymalnie można przypisać 3899"<0.1) { c=b/10; pomocnicza=new kol_liczb; if (!pomocnicza) { if(language==0) { cout<<"Bład!. Problemy z zaalokowaniem pamięci!"<next=pierwszy->prev=NULL; } else { ostatni->next=pomocnicza; pomocnicza->prev=ostatni; pomocnicza->next=NULL; ostatni=pomocnicza; } ile_cyfr++; d=(int)c; pomocnicza->liczba=b-d*10; //cout<liczba<liczba; // cout<<(ile_cyfr-1)*10+pomocnicza->liczba; if(pomocnicza->liczba)//Tutaj tak musi być bo jeśli liczba wychodziła 0 to były szopki //cout<liczba-1]; strcat(numer_etykietki,tablica_liczb_rzymskich[(ile_cyfr-1)*10+pomocnicza->liczba-1]); // cout<liczba; pierwszy=pomocnicza; pomocnicza=pomocnicza->prev; delete pierwszy; ile_cyfr--; } //If mal_duz=1 then change small roman number to capital ones if (mal_duz==1) { int unsigned dupa=0; while(dupanext=pierwszy->prev=NULL; } else { ostatni->next=pomocnicza; pomocnicza->prev=ostatni; pomocnicza->next=NULL; ostatni=pomocnicza; } d=(int)c; pomocnicza->liczba=b-d*26; b=d; } while(b>1/26); pomocnicza=ostatni; while(pomocnicza) { strcat(numer_etykietki,tablica_liter[pomocnicza->liczba]); pierwszy=pomocnicza; pomocnicza=pomocnicza->prev; delete pierwszy; } //If mal_duz=1 then change small letter r to capital ones if(mal_duz==1) { int unsigned dupa=0; while(dupa