Dev - C++ - Compila pero el programa deja de funcionar

 
Vista:

Compila pero el programa deja de funcionar

Publicado por Javier (2 intervenciones) el 28/05/2017 16:33:47
Hola, estoy empezando en C++ y he hecho un programa que compila bien pero deja de funcionar al ejecutarse, me ha pasado ya con varios programas, a ver si podríais ayudarme, aquí os dejo el código (da error al introducir el nº de vehículos):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
 
/* Se desea desarrollar una aplicación para la gestión de
 * los vehículos de un concesionario.
 * 
Para cada vehículo se almacenará la siguiente información:
 
○ Marca: cadena de caracteres (longitud máxima 20 y mínima 3)
○ Modelo: cadena de caracteres (longitud máxima 30 y mínima 1)
○ Matrícula: cadena de caracteres (longitud 6)
○ Año de fabricación: entero
○ Precio: float (>0)
 * 
Definir una estructura Vehiculo para representar esta información.
 */
 
#include <string>
#include <iostream>
struct vehiculo {
    string marca;
    string modelo;
    string matricula;
    int anio;
    float precio;
 
};
void leePorTeclado(int *a)
{
    vehiculo v[*a];
    //Para evitar que salga el mensaje de error
    v[*a].marca=3;
    v[*a].modelo=3;
    v[*a].matricula=6;
    v[*a].precio=1;
 
 
    do {
        if (v[*a].marca.length() < 3 || v[*a].marca.length() > 20)
            cout<<"Error, intrduzca una marca válida por favor: ";
    cin>>v[*a].marca;
    } while (v[*a].marca.length() > 3 && v[*a].marca.length() < 20);
 
 
    cout<<endl<<"Modelo: ";
    do {
        if (v[*a].modelo.length() < 1 || v[*a].modelo.length() > 30)
            cout<<"Error, intrduzca un modelo válido por favor: ";
    cin>>v[*a].modelo;
    } while (v[*a].modelo.length() > 3 && v[*a].modelo.length() < 20);
 
 
    cout<<endl<<"Matrícula: ";
    do {
        if (v[*a].matricula.length() != 6)
            cout<<"Error, intrduzca una matricula válida por favor: ";
    cin>>v[*a].matricula;
    } while (v[*a].matricula.length() == 6);
 
    cout<<endl<<"Año de fabricación: ";
    cin>>v[*a].anio;
 
 
    cout<<endl<<"Precio: ";
     do {
        if (v[*a].precio < 0)
            cout<<"Error, introduzca un precio válido por favor: ";
    cin>>v[*a].precio;
    } while (v[*a].precio > 0);
};
 
 
void leePorTeclado(int a)
{
    vehiculo v[a];
 
    //Para evitar que salga el mensaje de error
    v[a].marca=3;
    v[a].modelo=3;
    v[a].matricula=6;
    v[a].precio=1;
 
   cout<<"Marca: ";
    do {
        if (v[a].marca.length() < 3 || v[a].marca.length() > 20)
            cout<<"Error, intrduzca una marca válida por favor: ";
    cin>>v[a].marca;
    } while (v[a].marca.length() > 3 && v[a].marca.length() < 20);
 
 
    cout<<endl<<"Modelo: ";
    do {
        if (v[a].modelo.length() < 1 || v[a].modelo.length() > 30)
            cout<<"Error, intrduzca un modelo válido por favor: ";
    cin>>v[a].modelo;
    } while (v[a].modelo.length() > 3 && v[a].modelo.length() < 20);
 
 
    cout<<endl<<"Matrícula: ";
    do {
        if (v[a].matricula.length() != 6)
            cout<<"Error, intrduzca una matricula válida por favor: ";
    cin>>v[a].matricula;
    } while (v[a].matricula.length() == 6);
 
    cout<<endl<<"Año de fabricación: ";
    cin>>v[a].anio;
 
 
    cout<<endl<<"Precio: ";
     do {
        if (v[a].precio < 0)
            cout<<"Error, intrduzca un precio válido por favor: ";
    cin>>v[a].precio;
    } while (v[a].precio > 0);
};
 
 
void muestraEnPantalla(int a) {
    vehiculo v[a];
    cout<<"     Características del vehículo Nº"<<a<<":"<<endl;
    cout<<endl;
    cout<<"Marca: "<<v[a].marca<<endl;
    cout<<"Modelo: "<<v[a].modelo<<endl;
    cout<<"Matrícula: "<<v[a].matricula<<endl;
    cout<<"Año de fabricación: "<<v[a].anio<<endl;
    cout<<"Precio: "<<v[a].precio<<endl;
};
 
void muestraEnPantalla(int *a) {
    vehiculo v[*a];
    cout<<endl;
    cout<<"     Características del vehículo Nº"<<*a<<":"<<endl;
    cout<<endl;
    cout<<"Marca: "<<v[*a].marca<<endl;
    cout<<"Modelo: "<<v[*a].modelo<<endl;
    cout<<"Matrícula: "<<v[*a].matricula<<endl;
    cout<<"Año de fabricación: "<<v[*a].anio<<endl;
    cout<<"Precio: "<<v[*a].precio<<endl;
};
int main(int argc, char** argv) {
    vehiculo v[1000];
    int num,mascaro=0,n=0;
    cout<<"Introduzca el número de vehículos: ";
    cin>>num;
 
    for (int i=0;i<num;i++) {
        leePorTeclado(i);
    }
 
    for (int i=0;i<num;i++) {
        muestraEnPantalla(i);
    }
 
    for (int i=0;i<num;i++) {
        if (v[i].precio>mascaro);
        mascaro=v[i].precio;
        n=i;
    }
    cout<<"El vehículo más caro es el Nº"<<n<<endl;
    muestraEnPantalla(n);
 
 
 
    return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.440
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por dario (27 intervenciones) el 29/05/2017 06:15:56
Hola, porque tiene dos veces la funcion leePorTeclado y muestraEnPantalla.
Creo q alli esta el error.
Cual es el enunciado del problema.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por agustin (522 intervenciones) el 29/05/2017 07:17:55
¿Y por qué usas un puntero cómo argumento si no modificas su valor? En tu caso las que usan punteros sobran. Y como te dicen estas declarando dos veces la misma función con diferentes parámetros, o lo que es lo mismo, estas usando polimorfismo de c++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Compila pero el programa deja de funcionar

Publicado por Javier (2 intervenciones) el 29/05/2017 11:43:45
Hola, muchas gracias por tu respuesta, dejo enunciado del ejercicio (el resto esta al principio del código). me pide que las sobrecargue pasando los datos por referencia por eso lo de las dos funciones, no se si sera correcto.

Implementar en C y especificar usando sintaxis de Doxygen las siguientes funciones de
apoyo para la aplicación:
● leePorTeclado( Vehiculo ): Leer la información de un vehículo desde teclado, modificando
con los nuevos datos sus atributos. Utilizar para esta función paso de parámetros por
referencia
● Realizar una versión sobrecargada de la anterior función que realice un paso de
parámetros mediante un puntero
● muestraEnPantalla( Vehiculo ): Mostrar por pantalla la información de un vehiculo.
Realizar dos versiones sobrecargadas: por referencia y mediante un puntero

Apoyándonos en las funciones anteriores, realizar un programa que haga lo siguiente:
● Definir un vector con un tamaño fijo suficientemente grande (MAX_VEHICULOS) y
solicite mediante teclado el número de vehículos a introducir (como máximo el tamaño
del vector)
● Utilizar las funciones anteriores para rellenar el vector y, posteriormente, mostrarlo por
pantalla.
● Visualizar por último el vehículo con mayor precio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Luis
Val: 57
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por Carlos Luis (19 intervenciones) el 29/05/2017 23:42:43
Por favor revisa el archivo:

//vehiculo v[a]; //...Estas creando una nueva variable.

Puedes hacer dos cosas:
1.- Pasas vehiculo como argumento
2.- Creas vehiculo como variable global. En este caso como variable global

vehiculo
vehiculo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
 
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct vehiculo {
    string marca;
    string modelo;
    string matricula;
    int anio;
    float precio;
 
};
 
vehiculo v[1000];
 
void muestraEnPantalla(int a) {
    //vehiculo v[a]; //...Estas creando una nueva variable.
    /*Puedes hacer dos cosas: 
    1.- Pasas vehiculo como argumento
    2.- Creas vehiculo como variable global. En este caso como variable global
    */
    v[a].marca = "marca";
}
 
int main(int argc, char** argv) {
 
	muestraEnPantalla(0);
 
    cout << v[0].marca << "\n";
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Luis
Val: 57
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por Carlos Luis (19 intervenciones) el 29/05/2017 23:48:32
Adicionalmente, si es que C++, ha cambiado y no estoy al tanto. No se puede crear un arreglo dinamico de esa forma. (vehiculo [variable]). O utilizas punteros:

vehiculo *v = new vehiculo(variable) o creas un vector: vector<vehiculo> v(variable).

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por agustin (522 intervenciones) el 30/05/2017 22:43:53
Por lo que a mi me comentaron una vez, si fue aprobada esa forma de reservar memoria en una revisión concreta y en la siguiente la eliminaron con lo que no es muy estándar que digamos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Luis
Val: 57
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por Carlos Luis (19 intervenciones) el 31/05/2017 03:21:16
Gracias por tu información.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gregory
Val: 82
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por gregory (34 intervenciones) el 01/06/2017 22:37:43
Para que hacer vehiculo global si vehiculo es una estructura por lo que por defecto es global, otra cosa no usa el typedef para modificar el nombre de la estructura, tambien pasa toda a struct por parametro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Luis
Val: 57
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Compila pero el programa deja de funcionar

Publicado por Carlos Luis (19 intervenciones) el 03/06/2017 07:01:20
Cierto. vehiculo es una estructura y es global. Pero la variable: v, no lo es y es la que estoy haciendo global, para llamarla sin tener que pasarla como parámetro. La estructura no la puedo usar sin asignarla a una variable, y siempre digo, que yo tenga conocimiento. Quizás no se entendió bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar