1

Thanks, ahead of time, for any help you can offer.

The following is a simple programming assignment I'm trying to turn in for homework... I've written two functions into the program at lines 65 and 69 *MARKED with comment 1 line ahead, and the functions are defined in lines 93-101 and 103-111*ALSO MARKED with comment 1 line ahead. When the program runs, it returns a value of 0 for "largest rainfall" and "smallest rainfall" and does not offer any value for months(index). It is my goal to display the largest rainfall amount with the month that it fell in and the smallest rainfall amount in the month that it occurred in... Am I approaching this correctly?

Thanks for any time.

    Module Module1

Sub Main()
    'declare constant for array size- to be used in parrallel arrays 
    Const SIZE As Integer = 12

    'declare parrallel arrays rainfall and month
    Dim rainfall(SIZE) As Double
    Dim month(SIZE) As String
    month(0) = "January"
    month(1) = "February"
    month(2) = "March"
    month(3) = "April"
    month(4) = "May"
    month(5) = "June"
    month(6) = "July"
    month(7) = "August"
    month(8) = "September"
    month(9) = "October"
    month(10) = "November"
    month(11) = "December"

    'declare other variables
    Dim total As Double
    Dim average As Double
    Dim index As Integer
    Dim largest As Double = rainfall(0)
    Dim smallest As Double = rainfall(0)
    Dim keepGoing As String = "yes"


    'main program is encapsulated in a while loop 
    'so that user can choose to use program again or exit
    While keepGoing = "yes" Or keepGoing = "Yes"
        'program intro text
        Call programIntro()

        '***********main program module********************************
        Call rainfallProgram(index, SIZE, month, rainfall, total, average, largest, smallest)

        Console.WriteLine("  ")
        Console.WriteLine("  ")
        Console.WriteLine("Would you like to use RainfallAverage again?")
        Console.Write("Enter 'yes' to keep going or any other key to exit:  ")
        keepGoing = Console.ReadLine()
        Console.WriteLine("  ")
        Console.WriteLine("  ")
    End While
End Sub

Sub rainfallProgram(ByRef index, ByVal SIZE, ByVal month, ByRef rainfall,
                    ByRef total, ByRef average, ByRef largest, ByRef smallest)
    'input months and rainfall data in parallel arrays
    For index = 0 To SIZE - 1
        Console.Write("Enter rainfall for " & (month(index)) & ":  ")
        rainfall(index) = (Console.ReadLine())
        Console.WriteLine(" ")
    Next

    Call getTotalRainfall(index, SIZE, rainfall, total)

    Call getAverageRainfall(average, total)

    Console.WriteLine(" ")
    ' ******First problem occurs here
    Console.WriteLine("The largest amount of rainfall was " & (CDbl(getLargestRainfall(index, SIZE, rainfall, largest))) & " inches")
    Console.WriteLine("     and occurred durring" & month(index))

    Console.WriteLine(" ")
    '**********Second Problem occurs here 
    Console.WriteLine("The smallest amount of rainfall was " & (CDbl(getSmallestRainfall(index, SIZE, rainfall, smallest))) & " inches")
    Console.WriteLine("     and occurred durring" & month(index))


    ' Call functionSmallestRainfall()
End Sub

'module for total rainfall
Sub getTotalRainfall(ByVal index, ByVal SIZE, ByVal rainfall, ByRef total)
    For index = 0 To SIZE - 1
        total = total + rainfall(index)
    Next
    Console.WriteLine(" ")
    Console.WriteLine("Total Rainfall:  " & total & " inches")
    index = index + 1
End Sub

'module for average rainfall
Sub getAverageRainfall(ByRef average, ByRef total)
    average = (total / 12)
    Console.WriteLine(" ")
    Console.WriteLine("Average Rainfall:  " & average & " inches")
End Sub

'function for largest rainfall
'********** Another Problem occurs here 
Function getLargestRainfall(ByVal index As Integer, ByVal SIZE As Integer, ByVal rainfall() As Double, ByRef largest As Double) As Double
    For index = 0 To rainfall.Length - 1
        If rainfall(index) > largest Then
            rainfall(index) = largest
        End If
    Next
    Return largest
End Function

'function for smallest rainfall
 '********** Another Problem occurs here 
Function getSmallestRainfall(ByVal index As Integer, ByVal SIZE As Integer, ByVal rainfall() As Double, ByRef smallest As Double) As Double
    For index = 0 To rainfall.Length - 1
        If rainfall(index) > smallest Then
            rainfall(index) = smallest
        End If
    Next
    Return smallest
End Function

'program intro text display
Sub programIntro()
    Console.WriteLine(" ")
    Console.WriteLine("---------------------------------------------------------")
    Console.WriteLine("************   Welcome to RainfallAverage   ************")
    Console.WriteLine("---------------------------------------------------------")
    Console.WriteLine("                                                      ")
    Console.WriteLine("     This program will help to total, average, ")
    Console.WriteLine("       and compare the rainfall of 12 months    ")
    Console.WriteLine(" ")
    Console.WriteLine("      Unit is inches. Input numeric values only")
    Console.WriteLine(" ")
    Console.WriteLine(" ")
End Sub

End Module

1 Answer 1

3

Given that this is an assignment (thanks for being honest) I will not give you the full solution, but I will point out two problems I saw, in the spirit of helping you figure the rest yourself :-)

Function getSmallestRainfall(ByVal index As Integer, ByVal SIZE As Integer, ByVal rainfall() As Double) As Double
    Dim smallest = rainfall(0) 
    For index = 0 To rainfall.Length - 1
        If rainfall(index) < smallest Then
            smallest = rainfall(index) 
        End If
    Next
    Return smallest
End Function

I have changed your if statement so that the assignment is executed whenever necessary i.e. when you reach a smaller value than the ones you have already visited (rainfall(index) < smallest). I have also changed the assignment statement. The one you had changed the rainfall array so that its currently inspected element was deleted and replaced by the currently smallest rainfall value. = is a destructive update operator, not something that makes the left and right hand side equal. So you have to know which value you are changing and which you are keeping. You put the thing you want to update on the left-hand side and its new value on the right hand side (e.g. x = 5 assigns the value 5 to x).

Hope that helps!

Sign up to request clarification or add additional context in comments.

3 Comments

Thank you so much!!! This helped me to step back and look- and now I've got monthnames working (additional variable and statements in the functions) and the largest function returns a value. The smallest function, however, returns a value of 0- even on the first pass. I still cannot figure out why this is happening.
@CaitlinEverett Because getSmallestRainfall returns smallest, I have deleted the additional final ByRef argument (and recommend you do the same in getLargestRainfall). This means that you will have to call it differently. [apologies for the lack of formatting] I think this should solve your problem. Sorry, I should have made this clearer. smallest = getSmallestRainfall(index, SIZE, rainfall) Console.WriteLine("The smallest amount of rainfall was " & CDbl(smallest) & " inches")
Thank you so much for your time! Hopefully I will be good enough to return the favor soon!!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.