REM КАЛЬКУЛЯТОР КОНЦЕНТРАЦИИ ВЕЩЕСТВ !Start ИНИЦИАЛИЗАЦИЯ !gr.open 255,0,150,200,0,1 !gr.open 255,204,153,51,0,1 !gr.open 255,0,0,0,0,1 gr.open 255,255,255,255,0,1 gr.screen sw,sh key=0 Gosub SUB_1 %К ЗАГРУЗКЕ КНОПОК backcol=1 posindexKur=1 % Начальная позиция курсора dim tchk[5] % Массив переменных определяющих была ли нажата точка в том или ином поле spol=(sh/3)*2-(sh/80+sh/40) % переменная определяющая высоту экрана за исключением клавиатуры Gosub SUB_5 % К ЗАГРУЗКЕ ПОЛЕЙ ВВОДА И ЗАГОЛОВКА dim inpPolevv[qoPolevv] % Массив определяющий были ли введенны в то или иное поле данные !End !Start ОСНОВНОЙ ЦИКЛ DO Gosub SUB_3 % К обработчику событий кнопок Gosub SUB_4 % АНИМАЦИЯ НАЖАТИЙ КНОПОК Gosub SUB_6 !! Gosub SUB_7 Gosub SUB_8 Gosub SUB_9 Gosub SUB_10 !! !enpr++ gr.render UNTIL ENPR=3 END !End !Start НАСТРОЙКИ И ОТОБРАЖЕНИЕ КНОПОК SUB_1: ! НАСТРОЙКИ ! Количество кнопок по-горизонтали cox=3 !Количество кнопок по-вертикали coy=4 !Ширина таблицы кнопок w=sw/1.2 !w=sw-10 !Высота таблицы кнопок !h=sw/1.2 h=sh/3 !Отступ границы по высоте mh=10 !Отступ границы по ширине mw=10 !Начало по коорд. х x0=sw/2-w/2+mw/2 !x0=10 !Начало по коорд. у !y0=sh/2-h/2+mh/2 y0=sh-h !Толщина линий tl=2 !ВНЕШНИЙ ВИД !Форма кнопок овальные -0 прямоугольные -1 kvov=0 !Смещение тени xshad=3000 yshad=3000 !ЦВЕТА !Цвет бордюра aline=0 % альфа-канал бордюра rline=0 % канал красного gline=255 % канал зеленого bline=0 % канал синего !Цвет поля кнопки asq=255 % альфа-канал поля rsq=255 % канал красного gsq=255 % канал зеленого bsq=255 % канал синего !rsq=rnd()*125 !gsq=rnd()*125 !bsq=rnd()*125 !Цвет нажатой кнопки abq=0 % альфа-канал поля rbq=200 % канал красного gbq=200 % канал зеленого bbq=200 % канал синего !Цвет символов кнопки asym=255 % альфа-канал rsym=25 % канал красного gsym=25 % канал зеленого bsym=25 % канал синего !Цвет символов нажатой кнопки asympr=255 % альфа-канал rsympr=255 % канал красного gsympr=0 % канал зеленого bsympr=0 % канал синего ! КОНЕЦ НАСТРОЙКИ dim buts[cox*coy],butl[cox*coy],lt[cox*coy],tp[cox*coy],rt[cox*coy],bt[cox*coy] !ОТОБРАЖЕНИЕ БОРДЮРА И ПОЛЯ КНОПОК t=1 for i=0 to coy-1 for j=0 to cox-1 tp[t]=(h/coy)*i+y0 bt[t]=tp[t]+(h/coy)-mh lt[t]=(w/cox)*j+x0 rt[t]=lt[t]+(w/cox)-mw gr.set.stroke tl gr.color aline,rline,gline,bline,0 Gr.rect butl[t], lt[t], tp[t], rt[t],bt[t] gr.color abq,rbq,gbq,bbq,1 Gr.paint.get papubut gr.color asq,rsq,gsq,bsq,1 Gr.paint.get pastabut shad=1 !Тень под кнопками gr.color 100,0,0,0,1 if kvov=1 & shad=1 then Gr.rect shadob, lt[t]+tl+xshad, tp[t]+tl+yshad, rt[t]-tl+xshad, bt[t]-tl+yshad elseif kvov=0 & shad=1 Gr.oval shadob,lt[t]+tl+xshad, tp[t]+tl+yshad, rt[t]-tl+xshad, bt[t]-tl+yshad endif !Форма кнопок if kvov=1 then Gr.rect buts[t], lt[t]+tl, tp[t]+tl, rt[t]-tl,bt[t]-tl elseif kvov=0 Gr.oval buts[t],lt[t]+tl, tp[t]+tl, rt[t]-tl, bt[t]-tl endif !! if lt[i]-mw/2xtch & tp[i]-mh/2ytch & key=0 then %2 gr.color 255,0,0,0,0 gr.rect tchpole,lt[t]-mw/2,tp[t]-mh/2,rt[t]+mw/2,bt[t]+mh/2 !gr.rect tchpole,lt[t],tp[t],rt[t],bt[t] !! GOSUB SUB_2 % К отобр. символов t++ next j next i RETURN !END !Start ОТОБРАЖЕНИЕ СИМВОЛОВ НА КНОПКАХ SUB_2: !вызов происходит из SUB_1 if bool=0 then dim symb[cox*coy] array.load txsym$[],"7","8","9","4","5","6","1","2","3",".","0","ytch & key=0 then key=1 indexKur=i sindexkur$=int$(i) for j=1 to qoPolevv gr.hide oKursorvv[j] next j gr.show oKursorvv[i] endif next i for i=1 to cox*coy if lt[i]-mw/2xtch & tp[i]-mh/2ytch & key=0 then %2 key=1 dbtch=i i=cox*coy endif %2 next i else key=0 dbtch=0 endif %1 RETURN !End !Start ОБРАБОТЧИК СОБЫТИЯ НАЖАТИЙ КНОПОК SUB_4: ! АНИМАЦИЯ НАЖАТИЙ КНОПОК !Изменение цвета if dbtch<>0 & kk=0 then !gr.hide buts[dbtch] gr.modify buts[dbtch],"paint",papubut gr.modify symb[dbtch],"paint",pasypr backcol=dbtch !print dbtch print txsym$[dbtch] kk=1 gr.render elseif dbtch=0 then gr.modify buts[backcol],"paint",pastabut gr.modify symb[backcol],"paint",pasysta endif if flag=0 then kk=0 endif RETURN !End !Start ОТОБРАЖЕНИЕ ПОЛЕЙ ВВОДА, КУРСОРА И ЗАГОЛОВКА SUB_5: indexKur=1 qoPolevv=5 dim oPolevv[qoPolevv],tpoPolevv[qoPolevv],btoPolevv[qoPolevv],rtoPolevv[qoPolevv],ltoPolevv[qoPolevv],txtoPolevv[qoPolevv],digittxtoPolevv[qoPolevv] dim sdigittxtoPolevv$[qoPolevv], oKursorvv[qoPolevv],indexKur[qoPolevv],tempKurs[qoPolevv],galka[qoPolevv] array.load stxtopolevv$[],"Количество ПЕРВОЙ смеси:","Концентрация ПЕРВОЙ смеси в % :","Количество ВТОРОЙ смеси:","Концентрация ВТОРОЙ смеси в % :","Конечная концентрация получаемой смеси в % :" gr.text.size sh/30 gr.set.stroke 1 gr.text.size sh/40 gr.color ,0,0,0,1 gr.text.align 2 gr.text.draw txoCapshion,sw/2,sh/80+sh/40/2,"Калькулятор концентрата v.2" for i=1 to qoPolevv !! tpoPolevv[i]=(spol/qoPolevv)*(i-1)+(sh/80+sh/40) btoPolevv[i]=tpoPolevv[i]+(spol/qoPolevv)-10 ltoPolevv[i]=sw/40 rtoPolevv[i]=ltoPolevv[i]+(sw-20) !! tpoPolevv[i]=(spol/qoPolevv)*(i-1)+(sh/80+sh/40) btoPolevv[i]=tpoPolevv[i]+(spol/qoPolevv)-10 ltoPolevv[i]=sw/2-(sw/1.1)/2-anr rtoPolevv[i]=ltoPolevv[i]+(sw/1.1) gr.color ,150,150,150,1 gr.paint.get paGrey gr.color ,0,20,20,0 gr.paint.get paGreen gr.rect oPolevv[i],ltoPolevv[i],tpoPolevv[i],rtoPolevv[i],btoPolevv[i] gr.text.size sh/50 gr.color ,0,0,0,1 gr.text.align 2 !gr.color ,255,255,255,1 gr.text.draw txtoPolevv[i],sw/2,btoPolevv[i]-(btoPolevv[i]-tpoPolevv[i])+sh/50,stxtopolevv$[i] gr.text.size sh/30 gr.color ,255,255,255,1 gr.color ,0,0,0,1 gr.text.align 1 gr.text.draw digittxtoPolevv[i],sw/10,btoPolevv[i]-(btoPolevv[i]-tpoPolevv[i])+sh/30*2,sdigittxtoPolevv$[qoPolevv] gr.text.size sh/40 gr.color ,255,255,255,1 gr.color ,0,0,0,1 gr.text.align 3 gr.text.draw galka[i],sw/1.05,btoPolevv[i]-(btoPolevv[i]-tpoPolevv[i])+sh/40,chr$(10003) gr.hide galka[i] gr.color ,175,0,0,1 gr.rect oKursorvv[i],ltoPolevv[i],tpoPolevv[i],rtoPolevv[i]/12,btoPolevv[i] gr.hide oKursorvv[i] next i gr.show oKursorvv[1] RETURN !End !Start ВВОД ДАННЫХ В ПОЛЯ ! ВЫЗОВ ИЗ SUB_4 SUB_6: !! if dbtch<>0 then txsymL$=txsymL$+txsym$[dbtch] endif !! EnTime=clock() if dbtch=0 then elseif len(sdigittxtoPolevv$[indexKur])>25+tchk[indexKur] & (txsym$[dbtch]<>"0 & (StTime+1000<=EnTime | kkk=0) then if kkk=0 then StTime=clock() endif kkk=1 if txsym$[dbtch]="=1 & tchk[indexKur]=0 then sdigittxtoPolevv$[indexKur]=right$(sdigittxtoPolevv$[indexKur],len(sdigittxtoPolevv$[indexKur])-1) sdigittxtoPolevv$[indexKur]="0."+sdigittxtoPolevv$[indexKur] tchk[indexKur]=1 endif return !End !Start ВЫЧИСЛЕНИЯ SUB_7: if indexKur=posindPole then for i=1 to qoPolevv inpPolevv[i]=0 gr.modify oPolevv[i],"paint",paGreen gr.hide galka[i] next i c1=0 c2=0 c=0 v1=0 v2=0 endif inpPolevv[indexKur]=1 gr.show galka[indexKur] for i=1 to qoPolevv if sdigittxtoPolevv$[i]="" then inpPolevv[i]=0 !if posindPole<>0 then gr.modify digittxtoPolevv[posindPole],"text","" gr.hide galka[i] endif next i array.sum allInpPolevv,inpPolevv[] if allInpPolevv=4 then for i=1 to qoPolevv if inpPolevv[i]=1 then if i=1 then v1=val(sdigittxtoPolevv$[i]) if i=2 then c1=val(sdigittxtoPolevv$[i]) if i=3 then v2=val(sdigittxtoPolevv$[i]) if i=4 then c2=val(sdigittxtoPolevv$[i]) if i=5 then c=val(sdigittxtoPolevv$[i]) else sdigittxtoPolevv$[i]="" endif next i Array.search inpPolevv[],0,posindPole if posindPole=1 & (c-c1)<>0 then fq=(v2*(c2-c))/(c-c1) if posindPole=2 & v1<>0 then fq=(c*(v1+v2)-c2*v2)/v1 if posindPole=3 & (c-c2)<>0 then fq=(v1*(c1-c))/(c-c2) if posindPole=4 & v2<>0 then fq=(c*(v1+v2)-c1*v1)/v2 if posindPole=5 & (v1+v2)<>0 then fq=(c1*v1+c2*v2)/(v1+v2) fq$=str$(fq) !gosub SUB_8 gr.modify digittxtoPolevv[posindPole],"text",fq$ gr.modify oPolevv[posindPole],"paint",paGrey endif RETURN !End !Start ПРОВЕРКА ОШИБОК ВВОДА SUB_8: !Вызов из SUB_7 if c1>100 then Popup "Концентрация ПЕРВОЙ смеси не должна быть выше 100%",,, 1 fq$="" endif if c2>100 then Popup "Концентрация ВТОРОЙ смеси не должна быть выше 100%",,, 1 fq$="" endif if c>100 then Popup "Конечная концентрация получаемой смеси не должна быть выше 100%",,, 1 fq$="" endif !! if fq<0 then Popup "Проверьте правильность введенных данных",,, 1 fq$="" endif !! if c1