El siguiente post muestra fragmentos de código en C que seguido son utilizados en los programas pedidos de Tareas en las escuelas.
Plantilla de un Menu de opciones usando do-while + switchDescargar Menu_do_while_switch.c (http://bit.ly/2OWAqtf)
/*
Twitter: @albertobsd
email: alberto.bsd@gmail.com
Buscame tambien en:
web: https://programaciontrabajosescolares.blogspot.com/
e-mail: ProgramacionTrabajosEscolares@gmail.com
facebook: https://www.facebook.com/ProgramacionTrabajosEscolares
*/
#include<stdio.h>
#include<stdlib.h>
int main() {
int opcion;
int entrar =1;
char temp[10];
do {
do{
opcion
= strtol(temp
,NULL
,10); }while(opcion < 0);
switch(opcion) {
case 1:
printf("Usted selecciono %i\n",opcion
); break;
case 2:
printf("Usted selecciono %i\n",opcion
); break;
case 3:
printf("Usted selecciono %i\n",opcion
); break;
case 4:
printf("Usted selecciono %i\n",opcion
); entrar = 0;
break;
default:
printf("Opcion incorrecta - Mensaje de Error\n"); break;
}
}while(entrar == 1); //Se puede dejar como "}while(entrar);"
return 0;
}
Fuente: Plantilla de para Capturar Datos y Mostrarlos (https://albertobsd.blogspot.com/2018/11/plantilla-de-para-capturar-datos-y.html)
Plantilla de para Capturar Datos y MostrarlosUsando estructura de datos y memoria dinámica para los datos almacenados.
Descarga plantilla_capturar_mostrar_datos.c (http://bit.ly/2FykbmA)
/*
Twitter: @albertobsd
email: alberto.bsd@gmail.com
Buscame tambien en:
web: https://programaciontrabajosescolares.blogspot.com/
e-mail: ProgramacionTrabajosEscolares@gmail.com
facebook: https://www.facebook.com/ProgramacionTrabajosEscolares
*/
#include<stdio.h> //Funciones printf, fgets
#include<stdlib.h> //realloc
#include<string.h> //strcspn
#include<ctype.h> //tolower
#define MAX_LEN_ALFANUMERICA_1 100
#define MAX_LEN_ALFANUMERICA_2 50
#define MAX_LEN_ALFANUMERICA_3 20
typedef struct plantilla_struct {
char variable_alfanumerica_1[MAX_LEN_ALFANUMERICA_1];
char variable_alfanumerica_2[MAX_LEN_ALFANUMERICA_2];
char variable_alfanumerica_3[MAX_LEN_ALFANUMERICA_3];
int variable_entera_1;
int variable_entera_2;
int variable_entera_3;
float variable_flotante_1;
}TIPO;
int funcion_ingreso_de_datos();
int funcion_imprimir_datos();
TIPO *tipos = NULL;
int contador_tipos = 0;
int main() {
int opcion;
int entrar =1;
char temp[10];
do {
printf("1) funcion_ingreso_de_datos\n"); printf("2) funcion_imprimir_datos\n"); do{
printf("Ingrese una opcion: "); opcion
= strtol(temp
,NULL
,10); }while(opcion <= 0); //Mientras sea menor o igual que 0
switch(opcion) {
case 1:
printf("Usted selecciono %i\n",opcion
); funcion_ingreso_de_datos();
break;
case 2:
printf("Usted selecciono %i\n",opcion
); funcion_imprimir_datos();
break;
case 3:
printf("Usted selecciono %i\n",opcion
); entrar = 0;
break;
default:
printf("Opcion incorrecta - Mensaje de Error\n"); break;
}
}while(entrar == 1); //Se puede dejar como "}while(entrar);"
return 0;
}
int funcion_ingreso_de_datos() {
int opcion;
int entrar =1,entrar_opcion_si_no;
char temp[10];
do {
tipos
= realloc(tipos
,(contador_tipos
+1)*sizeof(struct plantilla_struct
)); //Incrementamos el espacio para 1 Variable TIPO mas en el arreglo
//Capturamos variable_alfanumerica_1
printf("Capture variable_alfanumerica_1: "); fgets(tipos
[contador_tipos
].
variable_alfanumerica_1,MAX_LEN_ALFANUMERICA_1
,stdin
); tipos
[contador_tipos
].
variable_alfanumerica_1[strcspn(tipos
[contador_tipos
].
variable_alfanumerica_1,"\n\r")] = '\0'; //Reemplazamos los retornos de linea con caracrer nulo, terminador de cadena
//Capturamos variable_alfanumerica_2
printf("Capture variable_alfanumerica_2: "); fgets(tipos
[contador_tipos
].
variable_alfanumerica_2,MAX_LEN_ALFANUMERICA_2
,stdin
); tipos
[contador_tipos
].
variable_alfanumerica_2[strcspn(tipos
[contador_tipos
].
variable_alfanumerica_2,"\n\r")] = '\0'; //Reemplazamos los retornos de linea con caracrer nulo, terminador de cadena
//Capturamos variable_alfanumerica_3
printf("Capture variable_alfanumerica_3: "); fgets(tipos
[contador_tipos
].
variable_alfanumerica_3,MAX_LEN_ALFANUMERICA_3
,stdin
); tipos
[contador_tipos
].
variable_alfanumerica_3[strcspn(tipos
[contador_tipos
].
variable_alfanumerica_3,"\n\r")] = '\0'; //Reemplazamos los retornos de linea con caracrer nulo, terminador de cadena
//Capturamos variable_entera_1
do {
printf("Capture variable_entera_1: (Solo mayores que 0) "); tipos
[contador_tipos
].
variable_entera_1 = strtol(temp
,NULL
,10); //Solo procesamos numeros BASE 10
}while(tipos[contador_tipos].variable_entera_1 <= 0); // Salimos del DO solo si el valore leido es mayor o igual a 1
//Capturamos variable_entera_2
do {
printf("Capture variable_entera_2: (Solo mayores o iguales que 0) "); tipos
[contador_tipos
].
variable_entera_2 = strtol(temp
,NULL
,10); //Solo procesamos numeros BASE 10 }while(tipos[contador_tipos].variable_entera_2 < 0); // Salimos del DO solo si el valore leido es mayor o igual a 0
//Capturamos variable_entera_3
do {
printf("Capture variable_entera_3: (Solo Negativos) "); tipos
[contador_tipos
].
variable_entera_3 = strtol(temp
,NULL
,10); //Solo procesamos numeros BASE 10 }while(tipos[contador_tipos].variable_entera_3 >= 0); // Salimos del DO solo si el valor leido es negativo
//Capturamos variable_flotante_1
do {
printf("Capture variable_flotante_1: (Solo distintos que 0) "); tipos[contador_tipos].variable_flotante_1 = strtof(temp,NULL);
}while(tipos[contador_tipos].variable_flotante_1 == 0.0); // Salimos del DO solo si el valor leido distinto de 0
entrar_opcion_si_no = 1;
do{
printf("Desea segir ingresando mas datos? (s/n)\n"); case 's':
entrar_opcion_si_no = 0;
break;
case 'n':
entrar_opcion_si_no = 0;
entrar = 0; // Se cambia la variable para salir del menu principal
break;
default:
printf("opcion incorrecta, solo 's' o 'n'\n"); break;
}
opcion
= strtol(temp
,NULL
,10); }while(entrar_opcion_si_no == 1);
contador_tipos++; //Aqui incrementamos el contador_tipos que indica cuantos valores completos tenemos de la estructura plantilla_struct
}while(entrar == 1); //Se puede dejar como "}while(entrar);"
}
int funcion_imprimir_datos() { //Imprimir los datos no tiene mucho sentido, solo hay que recorrer correctamente la cantidad de registros previamente capturados
int i = 0;
while(i < contador_tipos) {
printf("Datos del registro %i\n",(i
+1)); printf("variable_alfanumerica_1: %s\n",tipos
[i
].
variable_alfanumerica_1); printf("variable_alfanumerica_2: %s\n",tipos
[i
].
variable_alfanumerica_2); printf("variable_alfanumerica_3: %s\n",tipos
[i
].
variable_alfanumerica_3); printf("variable_entera_1: %i\n",tipos
[i
].
variable_entera_1); printf("variable_entera_2: %i\n",tipos
[i
].
variable_entera_2); printf("variable_entera_3: %i\n",tipos
[i
].
variable_entera_3); printf("variable_flotante_1: %f\n",tipos
[i
].
variable_flotante_1); printf("\n");//Enter adicional i++;
}
}
- El primer do while tiene la condición mal.
- Los siguientes codigos repiten varias veces el mismo código con distintas variables. Sugiero refactorizar en vez de repetir el código como lo haces.