#-*- coding: utf-8 -*-
#NaStyaConv 1.2 for python s60 1.4.5
#by Niceblack
#Lertmind Studio
#
import appuifw as aw
import e32
ru=lambda z: z.decode('utf-8')
def pb(x):
t.color=(0,0,0)
t.add(u'\n' + x)
def pg(x):
t.color=(0,180,0)
t.add(u' ' + x)
def pt(x):
t.color=(0,0,200)
t.set(ru(x))
rim=[u'I',u'V',u'X',u'L',u'C',u'D',u'M']
mir=[1,5,10,50,100,500,1000]
mir2=[1,4,5,9,10,40,50,90,100,400,500,900,1000]
rim2=[u'I',u'IV',u'V',u'IX',u'X',u'XL',u'L',u'XC',u'C',u'CD',u'D',u'CM',u'M']
#Перевод целых чисел
def nsconv(num,c0,c1):
num=num.lower()
r=0
for s in num:
if s.isdigit():
r=r*c0+ord(s)-ord('0')
else:
r=r*c0+ord(s)-ord('a')+10
if not r:
return '0'
res=''
while r:
x=r%c1
if x<10:
x+=ord('0')
else:
x+=ord('a')-10
res=chr(x)+res
r/=c1
return res
#Перевод дроби
def drob(n,c0,c1,k):
n=list(n.lower())
for i in range(len(n)):
if n[i]>'9':
n[i]=ord(n[i])-ord('a')+10
x=0
for i in range(len(n)):
x+=float(n[i])/(c0**(i+1))
m=''
for i in range(k):
u=int(x*c1)
if u>9:
for c in range(26):
if u==c+10:
m+=chr(c+97)
break
else:
m+=str(u)
x=x*c1-u
return m
#0 - удачно
def testcc(n,c):
if c<2 or c>36:
return 1
n=n.lower()
for s in n:
if s=='.': continue
if s.isdigit():
k=int(s)
else:
k=ord(s)-ord('a')+10
if k>=c:
return 2
return 0
#Основной перевод
def cc():
n0=aw.query(ru('Число:'),'text')
if n0==None: return
n0=n0.lower()
for s in n0:
if (not s.isalnum()) and (s!='.'):
aw.note(ru('Недопустимая запись!'))
return
num=n0.split('.')
cc1=aw.query(ru('Из c/c'),'number',10)
if cc1==None: return
t=testcc(n0,cc1)
if t:
if t==1:
aw.note(u'2<=c/c<=36 !')
else:
aw.note(ru('Эта с/с недопустима в этом числе'))
return
del t
cc2=aw.query(ru('В c/c'),'number',2)
if cc2==None: return
if not (2<=cc2<=36):
aw.note(u'2<=c/c<=36 !')
return
if cc1==cc2:
aw.note(ru('Не надо быть гением ))'))
if len(num)>=2:
k=aw.query(ru('Цифр после запятой:'),'number',5)
if k==None: return
else:
k=1
num.append('0')
pt(' <Конвертер с/с>')
pb(ru('Число:'))
pg(u'\n ' + n0)
pb(ru('Из с/с:'))
pg(str(cc1))
pb(ru(' В с/с:'))
pg(str(cc2))
pb(ru('Результат:'))
pg(u'\n%s.%s' % (nsconv(num[0],cc1,cc2), drob(num[1],cc1,cc2,k)))
pb(ru('----------\n -> 8:'))
pg('%s.%s' % (nsconv(num[0],cc1,8), drob(num[1],cc1,8,k)))
pb(ru(' -> 10:'))
pg('%s.%s' % (nsconv(num[0],cc1,10), drob(num[1],cc1,10,k)))
pb(ru(' -> 16:'))
pg('%s.%s' % (nsconv(num[0],cc1,16), drob(num[1],cc1,16,k)))
t.set_pos(0)
#NOD
def nod(a,b):
a,b=int(a),int(b)
if a==0 or b==0:
return 1
while a!=b:
if a>b:
a-=b
else:
b-=a
return a
#Перевод в дробь
def period():
n0=aw.query(ru('Число:'),'text')
if n0==None: return
num=n0=n0.lower()
for s in n0:
if (not s.isdigit()) and (s!='.'):
aw.note(ru('Недопустимая запись!'))
return
n0=n0.split('.')
if len(n0)!=3:
aw.note(ru('Необходимы две точки!'))
return
n,d,p=n0
if not p:
p='0'
c0=aw.query(ru('Из c/c'),'number',10)
if c0==None: return
t=testcc(num,c0)
if t:
if t==1:
aw.note(u'2<=c/c<=36 !')
else:
aw.note(ru('Эта с/с недопустима в этом числе'))
return
del t,num
pt(' <Период -> Дробь>')
pb(ru('Число:'))
pg(u'\n %s.%s(%s)' % (n,d,p))
pb(ru('Из с/с:'))
pg(str(c0))
pb(ru('Результат:'))
x=int(nsconv(d,c0,10))*c0**-len(d)
y=c0**len(d)*(c0**len(p)-1)
z=int(nsconv(p,c0,10))+int(x*y)
if y and z:
NOD=nod(y,z)
pg(u'\n%s + %d/%d' % (nsconv(n,c0,10), z/NOD, y/NOD))
else:
pg(u'\n0 + 0')
###
def rimara():
n0=aw.query(ru('Римское число:'),'text')
n0=n0.upper()
n=list(n0)
for i in range(len(n)):
if n[i] not in rim:
aw.note(ru('Неверная запись!')); return
pt(' <Рим. -> Араб.>')
pb(ru('Римское число:'))
pg(u'\n' + n0)
for i in range(len(n)):
for b in range(7):
if n[i]==rim[b]:
n[i]=mir[b]
s=n[-1]
for i in range(2,len(n)+1):
if n[-i]<n[-i+1]:
s-=n[-i]
else:
s+=n[-i]
pb(ru('Арабское число:'))
pg(u'\n' + str(s))
###
def ararim():
n=aw.query(ru('Арабское число:'),'number',1)
if n==None: return
if not 0<n<4000:
aw.note(ru('Диапазон от 1 до 3999!')); return
pt(' <Араб. -> Рим.>')
pb(ru('Арабское число:'))
pg(u'\n' + str(n))
s=''
for i in range(13):
while n>=mir2[-i-1]:
n-=mir2[-i-1]
s+=rim2[-i-1]
pb(ru('Римское число:'))
pg(u'\n' + s)
###
def inhex():
text=aw.query(ru('Текст для конвер.:'),'text')
if text==None: return
hext=text.encode('cp1251').encode('hex')
pt(' <Текст -> HEX>')
pb(ru('Текст:'))
pg(u'\n' + text)
pb(ru('Ascii-код:'))
pg(u'\n%d' % (int(hext[:2],16)))
for i in range(2,len(hext),2):
pg(u'%d' % (int(hext[i:i+2],16)))
pb(ru('Hex:'))
pg(u'\n' + hext[:2])
for i in range(2,len(hext),2):
pg(hext[i:i+2])
###
def inascii():
hext=aw.query(ru('Hex для конвер.:'),'text')
if hext==None: return
hext=hext.lower()
for s in hext:
if not (('0'<=s<='9') or ('a'<=s<='f')):
aw.note(ru('Неверная запись!'))
return
text=str(hext)
pt(' <Hex -> Текст>')
pb(ru('Hex:'))
pg(u'\n' + hext)
pb(ru('Ascii-код:'))
pg(u'\n%d' % (int(hext[:2],16)))
for i in range(2,len(hext),2):
pg(u'%d' % (int(hext[i:i+2],16)))
pb(ru('Текст:'))
pg(u'\n' + text.decode('hex').decode('cp1251'))
###1,2,3,5,8...
def fib(n):
f1=f2=1
for z in range(n):
f1,f2=f2,f1+f2
if n<0:
return 0
return f2
###
def infib():
num=aw.query(ru('Число:'),'number')
if num==None: return
pt(' <Dec -> Fib>')
pb(ru('Число:'))
pg(u'\n' + str(num))
pos=[]
if num==0:
pos=[-2]
while num:
i=0
while num>=fib(i):
i+=1
num-=fib(i-1)
pos.append(i-1)
pb(ru('Сумма:\n'))
for i in pos:
pg(str(fib(i)))
if pos[-1]!=i:
pg('+')
s=""
for i in range(pos[0]+1):
if i in pos:
s='1'+s
else:
s='0'+s
if not s:
s='0'
pb(ru('Фибоначчи:'))
pg(u'\n%s' % s)
###
def fromfib():
n=aw.query(ru('Число (fib):'),'text')
if n==None: return
pt(' <Fib -> Dec>')
pb(ru('Фибоначчи:'))
pg(u'\n' + n)
pb(ru('Сумма:\n'))
if int(n)==0:
pg(u'0')
r=0
for c in range(len(n)):
if int(n[-c-1]):
r+=fib(c)
pg(str(fib(c)))
if c!=len(n)-1:
pg('+')
pb(ru('Число:'))
pg(u'\n%d' % r)
###1,1,2,6,24,120...
def fak(n):
r=1
for i in range(2,n+1):
r*=i
return r
###
def infak():
num=aw.query(ru('Число:'),'number')
if num==None: return
pt(' <Dec -> Fak>')
pb(ru('Число:'))
pg(u'\n' + str(num))
if num==0:
pb(ru('Факториальное:'))
pg(u'\n0')
return
pos=[]
while num:
i=1
while num>=fak(i):
i+=1
num-=fak(i-1)
pos.append(i-1)
res=[]
for i in range(pos[0]):
res.append(0)
for i in pos:
res[-i]+=1
s=""
for i in res:
if i<=9:
s+=str(i)
elif i<=35:
s+=chr(ord('A')-10+i)
else: #На будущее
s+="[%d]" % i
pb(ru('Факториальное:'))
pg(u'\n%s' % s)
###
def fromfak():
n=aw.query(ru('Число (fak):'),'text')
if n==None: return
pt(' <Fak -> Dec>')
pb(ru('Факториальное:'))
pg(u'\n' + n)
r=0
for c in range(1,len(n)+1):
if int(n[-c]):
r+=fak(c)*int(n[-c])
pb(ru('Число:'))
pg(u'\n%d' % r)
###
def info():
i=aw.popup_menu([ru('Выход'),ru('Помощь'),ru('О программе')],ru('Инфо/Exit'))
if i==None: return
if i==0:
aw.app.set_exit()
if i==1:
pt(' <Помощь>')
pb(ru(' Меню>Преобразовать:'))
pg(ru('\nКонвертация чисел из одной системы счисления (с/с) в другую с основанием от 2 до 36.\n Допустимый ввод: латинский алфавит, цифры и точка.\n Пункты вывода:\n1. Число - число :)\n2. Из с/с - основание данного числа\n3. В с/с - основание, в которое преобразуется число\n4. Результат - да, да, он самый\n5. ->8, 10, 16 - результат в популярных системах счисления'))
pb(ru(' Меню>Пeриод->Дробь:'))
pg(ru('\nПеревод числа с периодом в обыкновенную дробь в 10 с/с. Период пишите после второй точки.\n Например:\nНужно нам перевести 3.ff(a) по основанию 16. Пишем 3.ff.a и получаем 3 + 767/768.'))
pb(ru(' Меню>Рим.<->Араб.:'))
pg(ru('Перевод между римскими и арабскими числами. У римлян не было нулей) и в стандартном виде записать число можно до 3999.'))
pb(ru(' Меню>Ascii<->Hex:'))
pg(ru('\nКонвертация текста ASCII в кодировке Windows-1251 в 16-ричное представление (hex) и обратно. Ascii-код - десятичное представление символов. Ввод hex-текста без пробелов.'))
pb(ru(' Меню>Фибоначчиева:'))
pg(ru('Перевод из десятичной в фибоначчиеву с/с и обратно. Базис фибоначчиевой с/с числа фибоначчи, а алфавит 0 и 1.\n Например:\n100 (fib)->3 (dec), 12 (dec)->10101 (fib).\nЗдесь я использую развернутую форму записи (где нет 11 подряд), для перевода в свернутую замените все 100 на 011.'))
pb(ru(' Меню>Факториальная:'))
pg(ru('Перевод из десятичной в факториальную с/с и обратно. Базис факториальной с/с факториал чисел от 1. При этом, в первом разряде можно использовать только цифры 0 и 1, в каждом последующем на один больше.\n Например:\n54321 (fak)->719 (dec),720 (dec)->100000 (fak).'))
t.set_pos(0)
if i==2:
pt(' <О программе>')
pb(u' NaStyaConv')
pg(u'\n[Numeral System Converter]')
pb(ru(' Версия:'))
pg(ru('\n1.3'))
pb(ru(' Автор:'))
pg(ru('\nNiceblack aka Lertmind'))
pb(ru(' Контакты:'))
pg(ru('\nICQ: 246940976\nE-mail: lertmind@gmail.ru'))
t.set_pos(0)
aw.app.screen='full'
aw.app.body=t=aw.Text()
t.font=u'LatinBold19'
t.color=0x0
pb(ru(' NaStyaConv v.1.3'))
t.font=u'LatinBold12'
pb(ru(' ---------------------\n\nЛевая софт-клавиша'))
pg(ru('\nВычисления'))
pb(ru('\nПравая софт-клавиша'))
pg(ru('Справка/выход'))
aw.app.exit_key_handler=info
aw.app.menu=[(ru('Преобразовать'),cc),
(ru('Период->Дробь'),period),
(ru('Араб.<->Рим.'),
((ru('Араб.>Рим.'),ararim),
(ru('Рим.>Араб.'),rimara))),
(u'Ascii<->Hex',
((u'Ascii>Hex',inhex),
(u'Hex>Ascii',inascii))),
(ru('Фибоначчиева'),
((u'Dec>Fib',infib),
(u'Fib>Dec',fromfib))),
(ru('Факториальная'),
((u'Dec>Fak',infak),
(u'Fak>Dec',fromfak)))]
lock = e32.Ao_lock()
lock.wait()
NaStyaConv 1.3.1 (pys60)