作业帮 > 综合 > 作业

麻烦帮我编程一下以下数据

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 10:48:31
麻烦帮我编程一下以下数据
第一组数据:在A2-A151产生从1-150编号
第二组数据:在B2-B150将上述1-150个数分成2组(第一组共100人,用A表示,第二组50人用B表示),
第三组数据:在C2-C151产生第三组数据:将A组100个病人分成甲乙丙丁小组,其中甲占30%,乙占40%,丙占20%,丁占10%,将B组也分成甲乙丙丁小组,其中甲占10%,乙占20%,丙占40%,丁占30%,甲乙丙丁是随机分配给每个病人的.
第四组数据:要D2-D151产生150个年龄数字.要求:所有150个人年龄范围18-75,其中18-40占30%,40-60占50%,60-75占20%.
第五组数据:给每个病人产生一个生存数字,要求:A组范围6-70,其中6-12占30%,12-24占30%,24-36占20%,36-48占10%,48-70占10%.B组范围6-72,且B组均值要比A组大6-12,6-12占20%,12-24占30%,24-36占30%,36-48占10%,48-70占10%.数据显示在E列.
第六组数据:根据第五组数字在F列产生第六组数据,要求:如果A组中,数值位于6-24内时,50%赋值X,50%赋值Y,如果位于24-48时,30%赋值X,70%赋值Y,如果超过48,则10%赋值X,90%赋值Y.在B组中,数值位于6-24内时,40%赋值X,60%赋值Y,如果位于24-48时,20%赋值X,80%赋值Y,如果超过48,则5%赋值X,95%赋值Y.
一定要用VBA编程.
Sub create(n, min1, max1, min2, max2, col)
For i = 1 To n
Do
    m = Int(Rnd * (max1 - min1 + 1) + min1)
    If Cells(m, col) = "" Then Exit Do
Loop
If min2 = max2 Then
    s = min2
Else
    s = Str(Int(Rnd * (max2 - min2 + 1) + min2))
End If
Cells(m, col) = s
Next
End Sub

Sub createf(n, min1, max1, min2, max2)
For i = 1 To n
Do
    m = Int(Rnd * (max1 - min1 + 1) + min1)
    If Cells(m, "F") <> "X" And Cells(m, "E") >= min2 And Cells(m, "E") <= max2 Then Exit Do
Loop
Cells(m, "F") = "X"
Next
End Sub

Sub main()
Randomize
Dim avg1, avg2
    For i = 2 To 151
        Cells(i, "A") = i - 1  '第一组数据
        If i < 102 Then
            Cells(i, "B") = "A" '第二组数据,前100为"A"
            
        Else
            Cells(i, "B") = "B" '剩余为"B"
        End If
        Cells(i, "C") = ""
        Cells(i, "D") = ""
        Cells(i, "E") = ""
        Cells(i, "F") = "Y"
    Next
    create 0.3 * 100, 2, 101, "甲", "甲", "C"       '第三组数据A组
    create 0.4 * 100, 2, 101, "乙", "乙", "C"
    create 0.2 * 100, 2, 101, "丙", "丙", "C"
    create 0.1 * 100, 2, 101, "丁", "丁", "C"
    create 0.1 * 50, 102, 151, "甲", "甲", "C"      '第三组数据B组
    create 0.2 * 50, 102, 151, "乙", "乙", "C"
    create 0.4 * 50, 102, 151, "丙", "丙", "C"
    create 0.3 * 50, 102, 151, "丁", "丁", "C"
    
    create 0.3 * 150, 2, 151, 18, 40, "D"     '第四组数据
    create 0.5 * 150, 2, 151, 41, 60, "D"
    create 0.2 * 150, 2, 151, 61, 75, "D"
    
    create 0.3 * 100, 2, 101, 6, 12, "E"     '第五组数据A组
    create 0.3 * 100, 2, 101, 13, 24, "E"
    create 0.2 * 100, 2, 101, 25, 36, "E"
    create 0.1 * 100, 2, 101, 37, 48, "E"
    create 0.1 * 100, 2, 101, 49, 70, "E"
    avg1 = Application.WorksheetFunction.Average(Range("E2:E101"))      '计算E列A组平均值
    Do
    create 0.2 * 50, 102, 151, 6, 12, "E"     '第五组数据B组
    create 0.3 * 50, 102, 151, 13, 24, "E"
    create 0.3 * 50, 102, 151, 25, 36, "E"
    create 0.1 * 50, 102, 151, 37, 48, "E"
    create 0.1 * 50, 102, 151, 49, 70, "E"
    avg2 = Application.WorksheetFunction.Average(Range("E102:E151"))    '计算E列B组平均值
    Loop Until avg2 - avg1 >= 2 And avg2 - avg1 <= 12      '使B组均值大于A组2-12
    
    Dim sum11, sum12, sum21, sum22, sum31, sum32

    With Application.WorksheetFunction
    sum11 = .CountIf(Range("E2:E101"), "<24")
    sum12 = .CountIf(Range("E102:E151"), "<24")
    sum31 = .CountIf(Range("E2:E101"), ">48")
    sum32 = .CountIf(Range("E102:E151"), ">48")
    sum21 = 100 - sum11 - sum31
    sum22 = 50 - sum12 - sum32
    End With
    createf sum11 * 0.5, 2, 101, 6, 23                 '第六组数据
    createf sum21 * 0.3, 2, 101, 24, 48
    createf sum31 * 0.1, 2, 101, 49, 100
    createf sum12 * 0.4, 102, 151, 6, 23
    createf sum22 * 0.2, 102, 151, 24, 48
    createf sum32 * 0.05, 102, 151, 49, 100
End Sub
再问: create(n, min1, max1, min2, max2, col)这个是什么意思? 还有前2个sub有什么作用?看得不是很明白。能不能解释一下。我把代码运行了一下,非常好!就是不知道代码的意思。我是新手。希望能帮忙解释一下,编程的过程和思维??
再答: 第一个sub思路:随机生成一个数作为行数,再判断该行col列是否为空,如果不为空,表示已经填过数据,如果为空,生成一个数据填入。数据有两种,一种是甲乙丙丁,一种是某个范围的一个数,为了统一,我使用了min2,max2参数。当数据为甲乙丙丁时,min2=max2=甲乙丙丁其中一个;当数据为某范围中的一个数时,在该范围随机生成一个数。由于分成了A和B两组,为了区别,使用了min1,max1参数,如果是A组,min1=2,max1=101;如果是B组,min1=102,max1=151。另一参数n,表示要生成数据的个数,它是根据比例计算出来的。col表示数据填入的列。生成第三、四、五组数据用到该sub。值得注意的是,第五组数据B组均值要大于A组2-16,所以计算了A和B组的均值,用了一个循环,使得生成出的B组数据满足条件。 第二个sub思路:跟第一个sub总的思路是一样的。由于只需要生成X和Y两个数据,所以我先在F2:F151全部填入Y,在creatf 过程中只需要再填入X即可。生成一个随机数作为行数,然后判断该行F列是否为X,并且判断E列是否在指定的范围内(min2至max2范围),如果不是X(即数据未填写),并且E列在指定范围内,则在F填入X。min1和max1作用同第一个sub。注意这里的n,由于题目要求根据E位于某个范围内按比例填入X和Y,所以必须先计算E列数据在该范围内有多少个数,然后用这个数乘以比例,才能得到要生成的数据个数n,因此我使用了countif函数分别计算A,B组中3个指定范围的数的个数(即sum11,sum12,sum21,sum22,sum31,sum32,1结尾的是A组的)。此sub用于生成第六组数据。
再问: 1、“create(n, min1, max1, min2, max2, col)”这个是指第一个sub的名字吗?为什么要用括号? 2、“一种是某个范围的一个数”是什么意思? 3、“另一参数n,表示要生成数据的个数,它是根据比例计算出来的。”这个比例是指什么比例? 4、为什么有三个sub,我拷贝第一subexcel时无法执行?
再问: 5、create 0.3 * 100, 2, 101, "甲", "甲", "C"。这句话是什么意思?尤其是后面那几个数字,所在的位置代表什么意思?create是个函数吗,我怎么百度不到? 6、createf 是什么 最后,能不能按步骤形成上述数据,比如第一步产生第一组数据,第二步产生第二组数据?.
再答: 1、括号里是参数。 2、比如第四组数据 ,其中18-40占30% ,这个10-40就是个范围,取其中一个数 3、比例是你给的。比如第四组数据 ,其中18-40占30% ,30%就是比例。150*30% 就是个数。也就是说150个人中有45个人年龄在18-40之间。 4、第三、四、五组数据用到的是第一个sub(称为子过程),第六组数据由于与前面有些区别,所以单独写了个createf 子过程来生成。 5、create 是自定义过程,参数含义我上面说过了。 6、createf 是生成第六组数据的自定义过程。 至于按步骤,基本上是按步骤生成。就第一组和第二组是交叉生成的。 另外看你对编程不是很了解,最基础的自定义子过程,子函数都不是很清楚,建议你先学习一下vb。否则这段程序很难懂。