- Код: Выделить всё
Dim numbers() As Double
Dim Stt As Double
Dim Stp As Double
Dim St() As Double
Dim resperc() As Double
Dim counter As Double
Dim fileno As Integer
Dim getvalue As String
counter = 0
fileno = FreeFile
Open InputFile For Input As fileno
Do Until EOF(fileno)
Line Input #fileno, getvalue
If IsNumeric(getvalue) = True Then
counter = counter + 1
ReDim Preserve numbers(counter)
numbers(counter) = getvalue
End If
DoEvents
If aborted = True Then GoTo aborted
Loop
Close fileno
Stt = Val(Text1)
Stp = Val(Text2)
ReDim St(Stt To Stp)
If UBound(St) = o Then GoTo errorh
If UBound(numbers) = 0 Then GoTo errorh
For i = Stt To Stp
For j = 1 To UBound(numbers)
If Len(numbers(j)) < Len(i) Then
DoEvents
Else
If Left(numbers(j), Len(i)) = Val(i) Then
St(i) = St(i) + 1
End If
End If
Next j
DoEvents
Next i
For i = Stt To Stp
ReDim Preserve resperc(i)
DoEvents
resperc(i) = (St(i) * 100) / UBound(numbers)
If aborted = True Then GoTo aborted
Next i
Программа вычисляет сколько % чисел от общего кол-ва начинаются на определённые цифры. Например,
вы вводите в программу 100000 чисел и нужно узнать сколько % начинаются на 11, 12, 13, и т.д. например до 99. Алгоритм я
придумал, вот он здесь, но чёто в проге работает не так. Иногда всё работает нормально, а иногда при вычислении процента
(последний цикл) выдаётся неверный результат. Я припостил файл с числами, с которым я работал. Опция "считывать с" (перем.
Stt) = 100, а "считывать до" (переменная Stp) = 110. Так вот там даётся неверный результат, вместо 0.08 % даётся 9.8 %.
ПОЧЕМУ?
Для того чтобы быстрее понять код, поясняю как всё работает.
массив Numbers - в нём хранятся числа, прочитанные из файла (читается строчка за строчкой)
переменная Stt - определяет, с какой цифры, на которую начинаются загруженные числа, показать процент
переменная Stp - определяет, до какой цифры, на которую начинаются загруженные числа, показать процент
массив St - в нём хранится кол-во чисел, которые начинаются на цифру, которая соответствует индексу элемента массива, от
общего кол-ва чисел (т.е. от UboundNumbers))
массив resperc - там хранится сколько процентов чисел начинаются на цифру, которая соотв. индексу элемента массива
counter, fileno, getvalue - всё неважно: счётчики, номер файла, прочитанные из файла строки...
1) сначала я читаю файл построчно, и если каждая послед. прочитанная строка является числом, записываю её в Numbers()
2) потом с помощью двух циклов перебираю все числа в Numbers() и смотрю какие числа начинаются на x. Полученные числа
записываю в массив St(x). (в элемент x)
3) потом вычисляю процент: смотрю что хранится в массиве St в элементе x. умножаю на 100 делю на общее кол-во
вот тут и начинаются проблемы. например, чисел начинающихся на 109 в файле 23, а общее кол-во чисел в файле 100000. Результат
должен быть 0.023 , а он даёт (к примеру) 9.8 !