none
Ayuda con programa. RRS feed

  • Pregunta

  • Una concesionaria de autos usados dispone de 10 autos diferentes para reparar y luego poner a la venta. De esos autos conoce su dominio (Patente), el precio de compra y el presupuesto de las reparaciones.

    Hacer un programa que permita cargar los datos de los autos e informe:
    - Cantidad de autos con precio de compra mayor a $12000
    - Total que se prevee gastar en reparaciones.
    - Dominio y precio de todos los autos ordenados por precio en forma descendente.
    - Dominio de todos los autos cuyo presupuesto de reparaciones es mayor a la mitad del precio de compra.
    - Dominio y precio del auto más barato.

    Desde el principio empezé mal..
    quize hacer el contador para los autos con precio mayor a $12000 y estó puse..

    Public Sub ContarAutos(ByVal precio() As Integer)
            Dim i, c As Integer
            c = 0
            For i = 1 To precio.Length - 1
                If precio > 12000 Then
                    c = c + 1
                End If
            Next
        End Sub

    en "precio > 12000" me dice que ">" no esta definido para los tipos integer.. porque es??..


    miércoles, 20 de junio de 2012 5:14

Respuestas

  • "precio" no es un integer, sino un "Array de Integer". No puedes comparar un array de integer con un único integer; primero tienes que separar un elemento del array, y comparar dicho elemento con el integer. en otras palabras, la línea que te da error tienes que modificarla así:

    If precio(i) > 12000 Then

    miércoles, 20 de junio de 2012 5:37

Todas las respuestas

  • "precio" no es un integer, sino un "Array de Integer". No puedes comparar un array de integer con un único integer; primero tienes que separar un elemento del array, y comparar dicho elemento con el integer. en otras palabras, la línea que te da error tienes que modificarla así:

    If precio(i) > 12000 Then

    miércoles, 20 de junio de 2012 5:37
  • "robertitoalcides" escribió:

    > quize hacer el contador para los autos con precio mayor a $12000 y estó puse..
    >
    > Public Sub ContarAutos(ByVal precio() As Integer)
    >
    >    If precio > 12000 Then
    >
    > en "precio > 12000" me dice que ">" no esta definido para los tipos integer
    > .. porque es??..

    El motivo del error ya te lo ha indicado correctamente el compañero Alberto Población. Pero te comento que si en lugar de recorrer un bucle For ... Next recorrieras un bucle For Each ... Next, sí podrías hacer la comparación individualmente por cada elemento existente en el array.

    Al tratarse de un array, las buenas prácticas dictan que el nombre del array sea en plurar: precioS mejor que precio:

        Public Sub ContarAutos(ByVal precios() As Integer)
    
            Dim c As Integer
    
            For Each precio As Integer In precios
    
                If (precio > 12000) Then
                    c = c + 1
                End If
    
            Next
    
        End Sub
    

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 20 de junio de 2012 13:46
    Moderador
  • Hola, gracias por la ayuda, pude solucionar el problema, ahora vengo con más avances y más errores..

    Esto es lo que me salió hasta ahora para el punto 3 y 5.

    - Dominio y precio de todos los autos ordenados por precio en forma descendente.
    - Dominio y precio del auto más barato.

    Module Module1
    
        Sub Main()
            Dim patente(3) As String
            Dim precio(3) As Integer
            Dim presupuesto(3) As Integer
    
            CargarDatos(patente, precio, presupuesto)
            ContarAutos(precio)
            Ordenar(patente, precio, presupuesto)
            MostrarDatos(patente, precio)
    
            Console.ReadLine()
        End Sub
    
        Public Sub CargarDatos(ByVal patente As String(), ByVal precio As Integer(), ByVal presupuesto() As Integer)
            Dim i As Integer
    
            For i = 1 To patente.Length - 1
                Console.WriteLine("Ingrese los datos del automóvil " & i)
                Console.WriteLine("Ingrese la patente")
                patente(i) = Console.ReadLine
                Console.WriteLine("Ingrese el precio")
                precio(i) = Console.ReadLine
                Console.WriteLine("Ingrese el presupuesto de reparación")
                presupuesto(i) = Console.ReadLine
            Next
        End Sub
    
        Public Sub ContarAutos(ByVal precio() As Integer)
            Dim i, c As Integer
            c = 0
            For i = 1 To precio.Length - 1
                If precio(i) > 15000 Then
                    c = c + 1
                    Console.WriteLine("Los autos con precio mayor a $15000 son " & c)
                End If
            Next
        End Sub
    
        Public Sub Ordenar(ByVal patente As String(), ByVal precio As Integer(), ByVal presupuesto() As Integer)
            Dim i, menor, mayor As Integer
            Dim auxPatente As String
            Dim auxPrecio As Integer
            Dim auxPresupuesto As Single
            Dim auxmenor As Single
            For i = 1 To patente.Length - 2
    
    
                auxPatente = patente(i)
                patente(i) = patente(mayor)
                patente(mayor) = auxPatente
    
    
                auxPrecio = precio(i)
                precio(i) = precio(mayor)
                precio(mayor) = auxPrecio
    
                menor = Buscarmenor(patente, i)
                auxmenor = auxPresupuesto
                auxPresupuesto = presupuesto(menor)
                presupuesto(menor) = auxPresupuesto
            Next
        End Sub
    
        Private Function Buscarmenor(ByVal patente As String(), ByVal fin As Integer) As Integer
            Dim l As Integer
            Dim menor As Integer = fin
    
            For l = fin + 1 To patente.Length - 1
                If patente(l) > patente(menor) Then
                    menor = l
                End If
            Next
    
            Return menor
        End Function
    
        Public Sub MostrarDatos(ByVal patente As String(), ByVal precio() As Integer)
            Dim i As Integer
            For i = 1 To precio.Length - 1
                Console.WriteLine("Autos Ordenados por precio:" & patente(i) & precio(i))
            Next
            Dim k As Integer
            For k = 0 To 1
                Console.WriteLine("Precio del auto más barato: " & patente(i) & precio(i))
            Next
    
        End Sub
    
    
    
    
    
    
    
    End Module
    

    No entiendo porque al ejecutarlo me dice 2 veces el resultado del primero punto (que había quedado funcionando bien hasta entonces), y me ordena mal los datos y los muestra 3 veces tambien.. Espero alguna respuesta, desde ya, gracias.

    viernes, 22 de junio de 2012 16:29
  • "robertitoalcides" escribió:

    > No entiendo porque al ejecutarlo me dice 2 veces el resultado del
    > primero punto (que había quedado funcionando bien hasta entonces),
    > y me ordena mal los datos y los muestra 3 veces tambien..

    Tu código es mejorable y está expuesto a cualquier tipo de error que se produzca.

    Para comenzar debes saber que en .NET los índices de los arrays están en base cero, lo que significa que el primer elemento es el 0, el segundo el 1, el tercero el 2, y el último su índice será igual a Length-1.

    Si tu declaras el siguiente array

       Dim patente(3) As String

    en realidad no estás teniendo 3 elementos, si no CUATRO ELEMENTOS cuyos índices van desde el 0 al 3 (Length-1). Si tú quieres tener solamente 3 elementos, deberás de definir los arrays de la siguiente manera:

       Dim patente(2) As String
       Dim precio(2) As Integer
       Dim presupuesto(2) As Integer

    Eso en cuento a la declaración de los arryas. Ahora vamos al bucle donde recorres los elementos del array:

       For i = 1 To patente.Length - 1

    Con ese bucle estarás comenzando el recorrido por el segundo elementos (el que tiene el índice 1). Para comenzar desde el primer elemento (el que tiene el índice 0), tiene que hacerlo de la siguiente manera:

       For i = 0 To patente.Length - 1

    Cuestión que tendrás que modificar en todos los distintos bucles que utilizas en los diferentes procedimientos de tu aplicación de consola.

    En el procedimiento MostrarDatos, si tu recorres éste bucle:

       For k = 0 To 1
         Console.WriteLine("Precio del auto más barato: " & patente(i) & precio(i))
       Next

    Aparte que los datos que estás obteniendo no se corresponden con los del bucle k, si no los del bucle i, Obtendrás dos precios, que se corresponderán con los elementos 0 y 1. Si tu intención es obtener el precio del automóvil más barato, tendrás que especificar el índice del primer elemento de los dos arrays, sin necesidad de recorrer ningún tipo de bucle:

      Console.WriteLine("Precio del auto más barato: {0}  {1}", patente(0), precio(0))

    Mejor será que inicies un nuevo proyecto de consola, y copias y pegas las modificaciones que he efectuado en tu código:

    Module Module1
    
        Sub Main()
    
            Dim patente(2) As String
            Dim precio(2) As Integer
            Dim presupuesto(2) As Integer
    
            CargarDatos(patente, precio, presupuesto)
            ContarAutos(precio)
            Ordenar(patente, precio, presupuesto)
            MostrarDatos(patente, precio)
    
            Console.ReadLine()
        End Sub
    
        Public Sub CargarDatos(ByVal patente As String(), _
                               ByVal precio As Integer(), _
                               ByVal presupuesto() As Integer)
    
            For i As Integer = 0 To patente.Length - 1
                Console.WriteLine("Ingrese los datos del automóvil " & i + 1)
    
                Console.WriteLine("Ingrese la patente")
                patente(i) = Console.ReadLine
    
                Console.WriteLine("Ingrese el precio")
                precio(i) = CInt(Console.ReadLine)
    
                Console.WriteLine("Ingrese el presupuesto de reparación")
                presupuesto(i) = CInt(Console.ReadLine)
            Next
    
        End Sub
    
        Public Sub ContarAutos(ByVal precio() As Integer)
    
            Dim c As Integer = 0
    
            For i As Integer = 0 To precio.Length - 1
                If (precio(i) > 15000) Then
                    c = c + 1
                    Console.WriteLine("Los autos con precio mayor a $15000 son " & c)
                End If
            Next
    
        End Sub
    
        Public Sub Ordenar(ByVal patente As String(), _
                           ByVal precio As Integer(), _
                           ByVal presupuesto() As Integer)
    
            Dim menor, mayor As Integer
            Dim auxPatente As String
            Dim auxPrecio As Integer
            Dim auxPresupuesto As Single
    
            For i As Integer = 0 To patente.Length - 1
    
                auxPatente = patente(i)
                patente(i) = patente(mayor)
                patente(mayor) = auxPatente
    
                auxPrecio = precio(i)
                precio(i) = precio(mayor)
                precio(mayor) = auxPrecio
    
                menor = Buscarmenor(patente, i)
                Dim auxmenor As Single = auxPresupuesto
                auxPresupuesto = presupuesto(menor)
                presupuesto(menor) = CInt(auxPresupuesto)
    
            Next
    
        End Sub
    
        Private Function Buscarmenor(ByVal patente As String(), _
                                     ByVal fin As Integer) As Integer
    
            Dim menor As Integer = fin
    
            For l As Integer = fin To patente.Length - 1
                If (patente(l) > patente(menor)) Then
                    menor = l
                End If
            Next
    
            Return menor
    
        End Function
    
        Public Sub MostrarDatos(ByVal patente As String(), _
                                ByVal precio() As Integer)
    
            For i As Integer = 0 To precio.Length - 1
                Console.WriteLine("Autos Ordenados por precio: {0}  {1}", patente(i), precio(i))
            Next
    
            Console.WriteLine("Precio del auto más barato: {0}  {1}", patente(0), precio(0))
    
        End Sub
    
    End Module

    Verás como éste código no te dá ningún tipo de problema. :-)

    NOTA: Una vez que respondas a éste mensaje, las respuestas serán movidas a la siguiente conversación:

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/2a3c7c5d-cbe9-4e93-b637-38ae60b0957c

    Donde otros usuarios ya te han respondido también. Por tanto, no publiques más mensajes para el mismo tema. ¿De acuerdo?


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    sábado, 23 de junio de 2012 7:04
    Moderador