Displaying the amount entered on lines DCCHECKBOX

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Displaying the amount entered on lines DCCHECKBOX

#1 Post by Eugene Lutsenko »

How do I make a mark in at DCCHECKBOX display the sum of all previously marked positions?
Image

Code: Select all

   g = g + s
   s = 1
   @++g, 0 DCGROUP oGroup2 CAPTION 'Задайте число признаков в сочетаниях:' SIZE 79.0, 13.6
   @s+0.2,  2 DCSAY "       1"  PARENT oGroup2;                @s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  1 = "+ALLTRIM(STR(C(izN, 1))) PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(01) PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr02  PROMPT ' 2' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  2 = "+ALLTRIM(STR(C(izN, 2))) EDITPROTECT {||.NOT.mNCochPr02} HIDE {||.NOT.mNCochPr02} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(02) EDITPROTECT {||.NOT.mNCochPr02} HIDE {||.NOT.mNCochPr02} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr03  PROMPT ' 3' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  3 = "+ALLTRIM(STR(C(izN, 3))) EDITPROTECT {||.NOT.mNCochPr03} HIDE {||.NOT.mNCochPr03} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(03) EDITPROTECT {||.NOT.mNCochPr03} HIDE {||.NOT.mNCochPr03} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr04  PROMPT ' 4' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  4 = "+ALLTRIM(STR(C(izN, 4))) EDITPROTECT {||.NOT.mNCochPr04} HIDE {||.NOT.mNCochPr04} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(04) EDITPROTECT {||.NOT.mNCochPr04} HIDE {||.NOT.mNCochPr04} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr05  PROMPT ' 5' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  5 = "+ALLTRIM(STR(C(izN, 5))) EDITPROTECT {||.NOT.mNCochPr05} HIDE {||.NOT.mNCochPr05} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(05) EDITPROTECT {||.NOT.mNCochPr05} HIDE {||.NOT.mNCochPr05} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr06  PROMPT ' 6' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  6 = "+ALLTRIM(STR(C(izN, 6))) EDITPROTECT {||.NOT.mNCochPr06} HIDE {||.NOT.mNCochPr06} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(06) EDITPROTECT {||.NOT.mNCochPr06} HIDE {||.NOT.mNCochPr06} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr07  PROMPT ' 7' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  7 = "+ALLTRIM(STR(C(izN, 7))) EDITPROTECT {||.NOT.mNCochPr07} HIDE {||.NOT.mNCochPr07} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(07) EDITPROTECT {||.NOT.mNCochPr07} HIDE {||.NOT.mNCochPr07} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr08  PROMPT ' 8' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  8 = "+ALLTRIM(STR(C(izN, 8))) EDITPROTECT {||.NOT.mNCochPr08} HIDE {||.NOT.mNCochPr08} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(08) EDITPROTECT {||.NOT.mNCochPr08} HIDE {||.NOT.mNCochPr08} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr09  PROMPT ' 9' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по  9 = "+ALLTRIM(STR(C(izN, 9))) EDITPROTECT {||.NOT.mNCochPr09} HIDE {||.NOT.mNCochPr09} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(09) EDITPROTECT {||.NOT.mNCochPr09} HIDE {||.NOT.mNCochPr09} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr10  PROMPT '10' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 10 = "+ALLTRIM(STR(C(izN,10))) EDITPROTECT {||.NOT.mNCochPr10} HIDE {||.NOT.mNCochPr10} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(10) EDITPROTECT {||.NOT.mNCochPr10} HIDE {||.NOT.mNCochPr10} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr11  PROMPT '11' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 11 = "+ALLTRIM(STR(C(izN,11))) EDITPROTECT {||.NOT.mNCochPr11} HIDE {||.NOT.mNCochPr11} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(11) EDITPROTECT {||.NOT.mNCochPr11} HIDE {||.NOT.mNCochPr11} PARENT oGroup2
   @++s  ,  2 DCCHECKBOX mNCochPr12  PROMPT '12' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 12 = "+ALLTRIM(STR(C(izN,12))) EDITPROTECT {||.NOT.mNCochPr12} HIDE {||.NOT.mNCochPr12} PARENT oGroup2
   @s+0.2, 57 DCSAY "Всего = "+S(12) EDITPROTECT {||.NOT.mNCochPr12} HIDE {||.NOT.mNCochPr12} PARENT oGroup2
[/size]

Function calculate the amount

Code: Select all

FUNCTION S(mNum)
   mSumCnm = 0
   IF mNCochPr02.AND.01<=mNum;Cnm = C(izN, 1);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr02.AND.02<=mNum;Cnm = C(izN, 2);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr03.AND.03<=mNum;Cnm = C(izN, 3);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr04.AND.04<=mNum;Cnm = C(izN, 4);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr05.AND.05<=mNum;Cnm = C(izN, 5);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr06.AND.06<=mNum;Cnm = C(izN, 6);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr07.AND.07<=mNum;Cnm = C(izN, 7);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr08.AND.08<=mNum;Cnm = C(izN, 8);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr09.AND.09<=mNum;Cnm = C(izN, 9);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr10.AND.10<=mNum;Cnm = C(izN,10);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr11.AND.11<=mNum;Cnm = C(izN,11);mSumCnm = mSumCnm + Cnm;ENDIF
   IF mNCochPr12.AND.12<=mNum;Cnm = C(izN,12);mSumCnm = mSumCnm + Cnm;ENDIF
RETURN(ALLTRIM(STR(INT(mSumCnm))))
[/size]

Function to calculate the number of combinations of large numbers without using the factorial

Code: Select all

***************************************************************
********* С(n,m) = n! / (m! (n - m)!) число сочетаний из n по m
***************************************************************
*FUNCTION C(n,m)
*RETURN(INT(F(n)/(F(m)*F(n-m))))

**************************************************************************
******** С(n,m) = n! / (m! (n - m)!) число сочетаний из n по m для больших
******** чисел без вычисления промежуточных факториалов путем разложения 
******** факториалов на простые множители и их сокращений
******** С(n,m) = P(m+1,n) / P(1,n-m), где P(a,b) произведение целых чисел от a до b с шагом 1
**************************************************************************
******** 1. Найти все простые числа меньшие n
******** 2. Сформировать массив чисел числителя
******** 3. Сформировать массив простых сомножителей числителя
******** 4. Сформировать массив чисел знаменателя
******** 5. Сформировать массив простых сомножителей чисел знаменателя
******** 6. Сформировать массив простых сомножителей числителя,
********    не входящих в массив простых сомножителей знаменателя
******** 7. Перемножить массив уникальных простых сомножителей числителя
**************************************************************************
FUNCTION C(n,m)

   ***** 1. Найти все простые числа меньшие n
   aPrCh := {}   // Массив простых чисел
   FOR j = 2 TO n
       **** Проверка, является ли j простым числом
       Flag = .T.
       FOR i=2 TO j-1
           IF j=i*INT(j/i)  // Делится ли j на i
              Flag = .F.
              EXIT
           ENDIF
       NEXT
       IF Flag
          AADD(aPrCh, j)
       ENDIF
   NEXT

   ***** 2. Сформировать массив чисел числителя
   aChis := {}
   IF m < n
      FOR j=m+1 TO n
          AADD(aChis, j)
      NEXT
   ELSE
      AADD(aChis, n)
   ENDIF

   ******* 3. Сформировать массив простых сомножителей числителя
   aPSChis := {}
   FOR i=1 TO LEN(aChis)

       ***** Разложить число на простые множители
       aPrMn := {}   // Массив простых множителей числа: Chislo
       Chislo = aChis[i]
       Flag = .T.
       DO WHILE Flag
          FOR j=1 TO LEN(aPrCh)
              **** Проверка, делится ли Chislo на простое число из массива aPrCh
              Flag = .F.
              IF Chislo = aPrCh[j] * INT(Chislo/aPrCh[j])
                 AADD(aPrMn,aPrCh[j])
                 Chislo = Chislo/aPrCh[j]
                 Flag = .T.
                 EXIT
              ENDIF
          NEXT
       ENDDO
       
       ***** Занести простые множители числа aChis[j] в массив простых сомножителей числителя
       FOR j=1 TO LEN(aPrMn)
           AADD(aPSChis, aPrMn[j])
       NEXT

   NEXT

   ***** 4. Сформировать массив чисел знаменателя
   aZnam := {}
   IF n > m
      FOR j=1 TO n-m
          AADD(aZnam, j)
      NEXT
   ELSE
      AADD(aZnam, 1)
   ENDIF

   ******* 5. Сформировать массив простых сомножителей чисел знаменателя
   aPSZnam := {}
   FOR i=1 TO LEN(aZnam)

       ***** Разложить число на простые множители
       aPrMn := {}   // Массив простых множителей числа: Chislo
       Chislo = aZnam[i]
       Flag = .T.
       DO WHILE Flag
          FOR j=1 TO LEN(aPrCh)
              **** Проверка, делится ли Chislo на простое число из массива Ar_prch
              Flag = .F.
              IF Chislo = aPrCh[j] * INT(Chislo/aPrCh[j])
                 AADD(aPrMn, aPrCh[j])
                 Chislo = Chislo/aPrCh[j]
                 Flag = .T.
                 EXIT
              ENDIF
          NEXT
       ENDDO

       *** Занести простые множители числа aZnam[j] в массив простых сомножителей знаменателя
       FOR j=1 TO LEN(aPrMn)
           AADD(aPSZnam, aPrMn[j])
       NEXT

   NEXT

   ******** 6. Сформировать массив простых сомножителей числителя,
   ********    не входящих в массив простых сомножителей знаменателя
   aPS:= {}
   FOR j=1 TO LEN(aPSChis)
       Pos = ASCAN(aPSZnam, aPSChis[j])
       IF Pos = 0
          AADD(aPS, aPSChis[j])
       ELSE
          aPSZnam[Pos] = 1    // Сокращение простых сомножителей числителя и знаменателя
       ENDIF
   NEXT

   ******** 7. Перемножить массив уникальных простых сомножителей числителя и знаменателя
   mMulChis = 1
   FOR j=1 TO LEN(aPS)
       mMulChis = mMulChis * aPS[j]
   NEXT
   mMulZnam = 1
   FOR j=1 TO LEN(aPSZnam)
       mMulZnam = mMulZnam * aPSZnam[j]
   NEXT

RETURN(ROUND(mMulChis/mMulZnam,0))
[/size]

User avatar
rdonnay
Site Admin
Posts: 4813
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Displaying the amount entered on lines DCCHECKBOX

#2 Post by rdonnay »

Here's a small test program that will give you some ideas.

Code: Select all

#INCLUDE "dcdialog.CH"

FUNCTION Main()

LOCAL GetList[0], aNumbers, i

aNumbers := { ;
   {       31, .f. }, ;
   {      465, .f. }, ;
   {     4495, .f. }, ;
   {    31465, .f. }, ;
   {   169911, .f. }, ;
   {   987455, .f. }, ;
   {  2629575, .f. } }

FOR i := 1 TO Len(aNumbers)
  @ i,0 DCCHECKBOX aNumbers[i,2] PROMPT Alltrim(Str(aNumbers[i,1])) ACTION {||DC_GetRefresh(GetList)}
  @ i,25 DCSAY CalcSumBlock(aNumbers,i) SAYSIZE 30 SAYLEFTBOTTOM
NEXT

DCREAD GUI FIT TITLE 'Check Sums'

RETURN nil

* -----------

PROC appsys ; return

* -----------

STATIC FUNCTION CalcSumBlock( aNumbers, i )

RETURN {||CalcSum( aNumbers, i)}

* -----------

STATIC FUNCTION CalcSum( aNumbers, i )

LOCAL j, n := 0

wtf i

FOR j := 1 TO i
  IF aNumbers[j,2]
    n += aNumbers[j,1]
  ENDIF
NEXT

RETURN 'Sum = ' + Alltrim(Str(n))
The eXpress train is coming - and it has more cars.

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Displaying the amount entered on lines DCCHECKBOX

#3 Post by Eugene Lutsenko »

Your demo does exactly what I need. I will use the method of implementation.
Thank you very much!

Post Reply