Dev - C++ - Error al crear un Menú

 
Vista:
Imágen de perfil de Angello

Error al crear un Menú

Publicado por Angello (5 intervenciones) el 05/04/2017 15:50:58
Hola, alguien me ayuda a resolver los siguientes errores, intento crear un Menú Dinámico en el que se puedan hacer operaciones matemáticas, es bastante simple y puede mejorar solo que tengo la pregunta de q error es si solo estoy "repitiendo" acciones con el switch y pues usando el case


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
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main(){
 
	int x;
	cout<<"\t\t\tElije una opcion:\n\n";
	cout<<"1. Suma\n";
	cout<<"2. Resta\n";
	cout<<"3. Multiplicacion\n";
	cin>>x;
 
	switch(x)
	{
 
		case 1: int valor1 = 5;
		        int valor2 = 6;
 
				int resultado = 0;
				resultado = valor1+valor2;
 
				printf("el total de la suma es: %d",resultado);
				break;
 
		case 2: int valor3 = 3;
		        int valor4 = 8;
 
		        int resultado = 0;
		        resultado = valor3-valor4;
 
		        printf("el total de la resta es: %d",resultado);
		        break;
	}
 
	cin.ignore();
	return 0;
 
}

errores:
Li Col
- 27 8 [Error] jump to case label [-fpermissive]
- 21 9 [Error] crosses initialization of 'int resultado'
- 19 15 [Error] crosses initialization of 'int valor2'
- 18 15 [Error] crosses initialization of 'int valor1'
- 30 15 [Error] redeclaration of 'int resultado'
- 21 9 [Note] 'int resultado' previously declared here
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
Imágen de perfil de Dionicio
Val: 168
Ha aumentado 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error al crear un Menú

Publicado por Dionicio (57 intervenciones) el 05/04/2017 16:04:18
Primero que nada la librería stdio es una librería estándar de C aunque eso no quita que la puedas usar en C++ ya que este último puede compilar código de C, pero a mí se me hace innecesaria su inclusión en túu proyecto, lo mejor sería usar "cout" en vez de "printf". Pero dejando eso de lado luego de cada case sería bueno que el código a continuación esté entre llaves y más cuando este lleva más de una sentencia.

1
2
3
4
5
6
7
8
9
10
11
...
switch(variable)
 
case X:{
//código...
//más código
 
break;
}//Fin del case X
 
...
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++

Error al crear un Menú

Publicado por agustin (522 intervenciones) el 05/04/2017 19:43:09
Bueno, las llaves no son necesarias pero en un switch para no volverse loco es imprescindible identar bien el código. Por otro lado, dentro de un switch esta prohibido crear variables y ese es el error principal que te da, crealas antes del switch.
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 Angello

Error al crear un Menú

Publicado por Angello (5 intervenciones) el 06/04/2017 05:22:42
Bueno, decirles que soy algo novato en esto, es el primer Programa que intento crear por mi solo... Los errores contextuales como el de printf los tengo porque estoy empleando bases de programas simples como el de Sumar; no sabía que se recomendaba las llaves cuando lleva más de una sentencia

2017-04-05-1
2017-04-05-2
2017-04-05

La librería stdio.h la uso porq era necesaria para el tipo de suma que estoy siguiendo... o al menos eso creo

Pero tengo una Pregunta... Sí cierro con las llaves después del case 1 tendría que darle un tipo de nombre o identidad al case 2, no ? porque se supone que el case 1 ya quedaría identificado como la Variable X o el Valor X

Quizá diga alguna incoherencia pero bueno.
Gracias de antemano !
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++

Error al crear un Menú

Publicado por agustin (522 intervenciones) el 06/04/2017 09:06:30
stdio.h no lo necesitas para nada ya que puedes usar la librería estándar de c++ para eso mismo.
Las llaves en ese caso no hacen nada, solo te ayudan a acotar el código de cada case.
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 Angello

Error al crear un Menú

Publicado por Angello (5 intervenciones) el 06/04/2017 15:33:50
Bueno... al aplicar las llaves en el Código me dio resultado, compilo perfectamente y no presento más errores, sin embargo gracias por sus comentario investigare más sobre la librería stdio.h y de paso veré como cambiar el printf por el cout ya que seguramente también cambiara el Código.

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
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main(){
 
	int x;
	cout<<"\t\t\tElije una opcion:\n\n";
	cout<<"1. Suma\n";
	cout<<"2. Resta\n";
	cout<<"3. Multiplicacion\n";
	cin>>x;
 
	switch(x)
	{
 
		{
 
	    case 1: int valor1 = 5;
		        int valor2 = 6;
 
				int resultado = 0;
				resultado = valor1+valor2;
 
				printf("el total de la suma es: %d",resultado);
				break;
 
		}
		{
 
		case 2: int valor3 = 3;
		        int valor4 = 8;
 
		        int resultado = 0;
		        resultado = valor3-valor4;
 
		        printf("el total de la resta es: %d",resultado);
		        break;
 
		}
		{
 
		case 3:
 
		}
 
 
	}
 
	cin.ignore();
	return 0;
 
}

Gracias Nuevamente ^^
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++

Error al crear un Menú

Publicado por agustin (522 intervenciones) el 06/04/2017 15:58:22
Las llaves sobran y hacen que vicies el código. Prueba asi:
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
#include <iostream>
 
using namespace std;
 
int main(){
    int x;
    cout<<"\t\t\tElije una opcion:\n\n";
    cout<<"1. Suma\n";
    cout<<"2. Resta\n";
    cout<<"3. Multiplicacion\n";
    cin>>x;
 
    int valor1,valor2,resultado;
 
    switch(x)
    {
        case 1:
            valor1 = 5;
            valor2 = 6;
            resultado = valor1+valor2;
            cout <<"el total de la suma es: "<<resultado<<endl;
            break;
 
        case 2:
            valor1 = 3;
            valor2 = 8;
            resultado = valor1-valor2;
            cout <<"el total de la resta es: "<<resultado<<endl;
            break;
 
        case 3:
            valor1 = 3;
            valor2 = 8;
            resultado = valor1*valor2;
            cout <<"el total de la multiplicacion es: "<<resultado<<endl;
            break;
        default:
            cout <<"la opcion elegida no existe"<<endl;
    }
    cin.ignore();
    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 Angello

Error al crear un Menú

Publicado por Angello (5 intervenciones) el 07/04/2017 03:02:45
Perdón, pero que quieres decir con "vicies el código" ?
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++

Error al crear un Menú

Publicado por agustin (522 intervenciones) el 07/04/2017 13:03:11
Pues las llaves sin ningún tipo de sentencia cómo un if, for, while, o función o cosas como uniones, estructuras o clases no tienen ningún tipo de propósito ya que por ejemplo:
1
2
3
4
{
    cout << "hola ";
}
cout << "mundo";
Es lo mismo que:
1
2
3
4
{
    cout << "hola ";
    cout << "mundo";
}
o:
1
2
cout << "hola ";
cout << "mundo";

¿que sentido tiene entonces colocar llaves ahí? Cada opción de un switch empieza con case y termina con break y no necesitas llaves para nada. En un switch esta prohibido declarar variables por lo que tienes que hacerlo antes. ¿por qué digo viciar el código? Porque haces cosas innecesarias y lo único que puedes conseguir es poner una llave de más o de menos que te dará error al compilar y puede que no sea tan sencillo dar con el fallo.
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 Angello

Error al crear un Menú

Publicado por Angello (5 intervenciones) el 07/04/2017 15:33:50
Hey men, lo que no entiendo es entonces porque Logre solucionar Todos los errores antes dichos con solo hacer eso, ahora me compila y se ejecuta perfectamente como esperaba.

Solo agregando aquellas Llaves.

2017-04-07-1
2017-04-07
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++

Error al crear un Menú

Publicado por agustin (522 intervenciones) el 07/04/2017 22:11:32
Porque "engañas" al compilador. Es igual que si haces un cast para hacer una conversión entre tipos, el compilador se lo traga pero puedes estar haciendo una salvajada.
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: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error al crear un Menú

Publicado por Thanatos (199 intervenciones) el 08/04/2017 20:30:41
Ámbito de una variable, es la sección o región del código desde la que se puede acceder a una variable. Estas secciones de código son las que creamos utilizando las llaves. Las variables que se encuentran dentro de una sección de código, son variables locales de esa sección.

Las sentencias case no crean un ámbito por si mismas. Esto quiere decir, que la sección de código creada con las llaves del switch es compartida por todas las sentencias case que estén en su interior.

Los errores del código de tu primer mensaje, se deben a que a las sentencias case no les está permitido "saltarse" la declaración con inicialización, de una variable.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main() {
    int x = 2;
 
    switch(x) {
        case 1:
            int valor1 = 5;
            cout << valor1;
            break;
        case 2:
            cout << "Hola";
            break;
        default:
            break;
    }
    return 0;
}

En el anterior código, cuando x = 2, el flujo del programa se "salta" la declaración con inicialización de la variable valor1, esto es lo que ocasiona el error.

En C++, se puede evitar el error si se declara e inicializa las variables en líneas diferentes, como se ve en el case 2, del siguiente código:

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 <iostream>
 
using namespace std;
 
int main() {
    int x;
 
    cout << "x = ";
    cin >> x;
 
    switch(x) {
        case 1:
        {
            int valor1 = 5;
            int valor2 = 6;
 
            cout << "La suma es: " << valor1 + valor2;
            break;
        }
        case 2:
            int valor1;
            int valor2;
 
            valor1 = 3;
            valor2 = 8;
 
            cout << "La resta es: " << valor1 - valor2;
            break;
        default:
            cout << "* Opcion desconocida *";
            break;
    }
 
    return 0;
}

En el case 1 utilicé las llaves para crear un nuevo ámbito para las variables valor1 y valor2. Es lo mismo que tu hiciste al corregir tu programa.

Además, al crearse ese nuevo ámbito, también se evita el error que provocarían las declaraciones de las variables con nombres repetidos, dentro del case 2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error al crear un Menú

Publicado por alix (1 intervención) el 30/10/2017 05:18:25
yo tengo el mismo error y no se como hacer necesito ayuda :c



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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const char DIR_ARCHIVO[] = "contactos.dat";
//lo usamos como prevencion de cambios o errores
struct Contacto{
    char nombre[30];
    char apellido[45];
    int edad;
    char correo[45];
};
/*********** FUNCIONES DEL PROGRAMA ****************/
void ingresarContacto(Contacto c);
Contacto leerContacto();
bool existeContacto(char nombre[],char apellido[]);//3
Contacto buscarContacto(char nombre[],char apellido[]);//4
void mostrarContacto(Contacto c);
 void listarContacto();
 void eliminarContacto(char nombre[],char apellido[]);
 void actualizarContacto(char nombre[],char apellido[]);
 
/***************************************************/
 
 
 
int main(){
    listarContacto();
    Contacto c= leerContacto();
    ingresarContacto(c);
    int num;  /*con esta variable vamos a controlar el menú y para esto se van a utilizar dos variables mas que van a ser "a" y "b", con tal que el usuario pueda elegir
	 que opción desea hacer(registrar, buscar, eliminar y actualizar).*/
    char a[25],b[25];
    switch (num)
    {
      case 1: cin.ignore();
      Contacto c= leerContacto();
      ingresarContacto(c);break;
      case 2: listarContacto();break;
      case 3:cin.ignore();
      cout<<"Digite nombre del contacto que desea buscar: ";//Solicitamos los datos al usuario en cada una de las opciones.   
      cin.getline(a,25);
      cout<<"Digite apellido del contacto que desea buscar: ";
      cin.getline(b,25);
      if (existeContacto(a,b)){
        Contacto c= buscarContacto(a,b);//aqui se busca el contacto ya antes solicitado al usuario, y se muestra mas adelante.
        mostrarContacto(c);
 
      }
      else{
        cout<<"No se encuentra en la agenda";
 
      }break;
      case 4:cin.ignore();
      cout<<"Digite nombre del contacto que desea eliminar: ";
      cin.getline(a,25);
      cout<<"Digite apellido del contacto que desea eliminar: "<<endl;
      cin.getline(b,25);
      eliminarContacto(a,b);
      cout<<"el contacto ha sido eliminado";
      break;
      case 5:cin.ignore();
      cout<<"Digite nombre del contacto que desea actualizar: ";
      cin.getline(a,25);
      cout<<"Digite apellido del contacto que desea actualizar: ";
      cin.getline(b,25);
      actualizarContacto(a,b);
      cout<<"El contacto ha sido actualizado";
      break;
      default:
      break;
 
    }
    return 0;
}
 
void ingresarContacto(Contacto c){
    ofstream salida;
    salida.open(DIR_ARCHIVO,ios::binary | ios::app);
    salida.write((char*)&c,sizeof(Contacto));
    salida.close();
}
bool existeContacto(char nombre[],char apellido[]){
    Contacto c;
    ifstream entrada;
    entrada.open(DIR_ARCHIVO,ios::binary);
    if(entrada.good()){
        while(entrada.read((char*)&c,sizeof(Contacto))){
            /**strcmp -> comparacion de cadenas**/
            if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){ //0 son iguales, 1 si el primero es mayor q el segundo y -1 si es menor
                entrada.close(); //Ojo con el orden de las instrucciones
                return true;
            }
        }
        entrada.close();
        return false;
    }
    else{
        entrada.close();
        return false;
    }
}
 
Contacto buscarContacto(char nombre[],char apellido[]){
    Contacto c;
    ifstream entrada;
    entrada.open(DIR_ARCHIVO,ios::binary);
    if(entrada.good()){
        while(entrada.read((char*)&c,sizeof(Contacto))){
            /**strcmp -> string comparison -> comparacion de cadenas**/
            if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){
                entrada.close();
                return c; //debe retornar el contacto
            }
        }
    }
}
Contacto leerContacto(){
    Contacto c;
    cout<<"\t\t\tNOMBRE   : ";
    cin.getline(c.nombre,30);
    cout<<"\t\t\tAPELLIDO : ";
    cin.getline(c.apellido,45);
    cout<<"\t\t\tEDAD     : ";
    cin>>c.edad;
    cin.ignore();
    cout<<"\t\t\tCORREO   : ";
    cin.getline(c.correo,45);
    return c;
}
void mostrarContacto(Contacto c){
    cout<<endl;
    cout<<"\t\t\t NOMBRE   : "<<c.nombre<<endl;
    cout<<"\t\t\t APELLIDO : "<<c.apellido<<endl;
    cout<<"\t\t\t EDAD     : "<<c.edad<<endl;
    cout<<"\t\t\t CORREO   : "<<c.correo<<endl;
    cout<<endl;
}
void listarContacto(){
    ifstream entrada;
    entrada.open(DIR_ARCHIVO,ios::binary);
    Contacto c;
    if(entrada.good()){
        while(entrada.read((char*)&c,sizeof(Contacto))){
            mostrarContacto(c);
        }
 
    }
    else{
        cout<<"No se puede leer el archivo"<<endl;
    }
    entrada.close();
}
void eliminarContacto(char nombre[],char apellido[]){
    ifstream entrada; //a
    ofstream temporal;
    entrada.open(DIR_ARCHIVO,ios::binary);//b.
    temporal.open("temp.dat",ios::binary);//i
    Contacto c; //c
    if(entrada.good()){ //d
        while(entrada.read((char*)&c,sizeof(Contacto))){//e
            if(strcmp(nombre,c.nombre)!=0 || strcmp(apellido,c.apellido)!=0){//f -J deben ser diferente
                temporal.write((char*)&c,sizeof(Contacto));//k
 
                /*H como se guardan los registros:
                 * !
                   REGISTRO1REGISTRO2REGISTRO3
                 lee primer registro y no puede devolver
                 * creo otro archivo q sea temporal q copie la info q no quiero eliminar
                 */
            }
        }
    }
    entrada.close();//g
    temporal.close();//l
    remove(DIR_ARCHIVO);//m deseo eliminar el archivo orginal
    rename("temp.dat",DIR_ARCHIVO);//n renombaralo
}
void actualizarContacto(char nombre[],char apellido[]){
    /**
        contactos.dat                                   |
         REGISTRO1REGISTRO2REGISTRO3
        temp.dat                                   |
         REGISTRO1REGISTRONREGISTRO3
    **/
    ifstream entrada;
    ofstream temporal;
    entrada.open(DIR_ARCHIVO,ios::binary);
    temporal.open("temp.dat",ios::binary);
    Contacto c;
    if(entrada.good()){
        while(entrada.read((char*)&c,sizeof(Contacto))){
            if(strcmp(nombre,c.nombre)==0 && strcmp(apellido,c.apellido)==0){
                Contacto actualizado = leerContacto();
                temporal.write((char*)&actualizado,sizeof(Contacto));
            }
            else{
                temporal.write((char*)&c,sizeof(Contacto));
            }
        }
    }
    entrada.close();
    temporal.close();
    remove(DIR_ARCHIVO);
    rename("temp.dat",DIR_ARCHIVO);
}
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

Error al crear un Menú

Publicado por camilo villarraga (1 intervención) el 14/03/2018 16:42:17
En lo que veo de tu codigo estas poniendo la variable resultado, pero te falta declarla por eso el error 219, luego estas delcarando la variable 1 y 2, y pones valores fijos, la idea es que no tenga valores fijos ya que al compilar este codigo el usuario no podra ingresar los numeros que desee.
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