вычисление процента, проблема: Basic неправильно умножает

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

вычисление процента, проблема: Basic неправильно умножает

Сообщение v-adix » 10.10.2003 (Пт) 14:19

Код: Выделить всё
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 !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.10.2003 (Сб) 8:19

Какие жуткие неявные преобразования :shock: Это первое.
Второе: К примеру, хотим знать, сколько чисел начинается на числа от 2 до 50. Дают нам число 285677. Оно начинается на 2 (ставим флаг), но оно же начинается на 28 (опять ставим флаг), то есть одно число приращивает две ячейки массива. В итоге количество чисел в массиве результатов превышает количество собственно обработанных чисел. Эту ситуёвину как хэндлить?

Код: Выделить всё
Option Explicit

Function CountNumbers(ByVal InputFile As String, ByVal ffrom As Long, ByVal tto As Long, outArr() As Long) As Long
  Dim i As Long, j As Long, tmpLng As Long, tmpLng2 As Long, tmpLng3 As Long
 
  If ffrom > tto Then Err.Raise 5
  ReDim outArr(ffrom To tto)
 
  i = FreeFile
  Open InputFile For Input Access Read As #i
  tmpLng = Len(CStr(ffrom))
  tmpLng2 = Len(CStr(tto))
 
  Do Until EOF(i)
    Input #i, InputFile
    If IsNumeric(InputFile) Then
      CountNumbers = CountNumbers + 1
      For j = tmpLng To tmpLng2
        tmpLng3 = CLng(Left$(InputFile, j))
        If tmpLng3 >= ffrom And tmpLng3 <= tto Then outArr(tmpLng3) = outArr(tmpLng3) + 1
      Next
    End If
  Loop
  Close #i
End Function

Private Sub Form_Load()
  Dim i As Long, ResArr() As Long
 
  i = CountNumbers("c:\1.txt", 2, 30, ResArr())
  Me.Print "Чисел, начинающихся на 2:" & ResArr(2) / i * 100 & "%"
  Me.Print "Чисел, начинающихся на 23:" & ResArr(23) / i * 100 & "%"
  Me.Print "А всего чисел " & i
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 11.10.2003 (Сб) 11:09

всё, спасибо я сам разобрался. хотя этот вариант не хуже


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 2

    TopList