1

Estoy realizando un menú con varios programas en el switch llamo al case y en el case la función, llego el tema de estructuras pero no me envía el dato ni de sexo, ni de club.

#include<iostream>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
#include<string.h>

using namespace std;

//prototipo de la funcion 
int programa1();

int main (){

int opc;
do{
system("COLOR 1E");

    cout<<"\t Bienvenido al Menu de Programas: "<<endl;
        cout<<"1.-Programa:  "<<endl;
         cout<<"Opcion: ";
    cin>>opc;
    system("cls");
  switch(opc){
        case 1:
        system ("color 08"); 
        programa1();

        break;  
    }    
  }while (opc !=30);
  return 0;

 }

struct Corredor{
char nombre[20];
int edad ;
char sexo[10];
char club[21];
}c1;


int programa1(){
char categoria[20];

cout<<"Nombre: "; 
cin.ignore(20,'\n');
cin.getline(c1.nombre,20,'\n');
cout<<"Edad: "; 
cin>>c1.edad;
fflush(stdin);
cout<<"Sexo: "; 
cin.ignore(10,'\n');
cin.getline(c1.sexo,10,'\n');
cout<<"Club: "; 
cin.ignore(20,'\n');
cin.getline(c1.club,20,'\n');


if(c1.edad <= 18){
    strcpy(categoria,"Juvenil");
}   
else if(c1.edad <= 40){
    strcpy(categoria,"Senior");
}
else{
    strcpy(categoria,"Veterano");
}

cout<<"\n\nMostrando Datos"<<endl;
cout<<"Nombre: "<<c1.nombre<<endl;
cout<<"Edad: "<<c1.edad<<endl;
cout<<"Sexo: "<<c1.sexo<<endl;
cout<<"Club: "<<c1.club<<endl;
cout<<"Categoria: "<<categoria<<endl;

system("pause");
return 0;
}
zerokira
  • 1,889
  • 4
  • 10
  • 37

2 Answers2

1

Tu código es confuso y difícil de seguir, además de contar con múltiples fallos de concepto. En primer lugar, señalaré que estás programando en C++ por lo tanto deberías seguir las premisas, costumbres y constructos de C++:

  • Las cabeceras <stdlib.h>, <math.h>, <stdio.h>, <time.h> y <string.h> son de C, no de C++, si realmente necesitas usarlas (que no las necesitas) debes usar los equivalentes de C++: <cstdlib>, <cmath>, <cstdio>, <ctime>, <cstring>. Consulta esta pregunta para saber por qué.
  • La cabecera <conio.h> ni siquiera es estándar C y no existe en C++, consulta esta pregunta para saber por qué.
  • La manera de trabajar con cadenas de caracteres en C++ es usando objetos de tipo std::string (accesibles tras incluir la cabecera <string>) no con formaciones1 de caracteres.
  • No se aconseja el uso de using namespace std; en el ámbito global, si fuese necesario usarlo (no suele serlo) debe usarse en el ámbito más pequeño posible. Consulta este hilo para saber por qué.
  • No suele ser necesario usar std::endl, es más eficiente usar un salto de línea explícito \n, consulta este hilo para saber por qué.
  • Evita las variables globales, consulta este hilo para saber por qué.
  • Deja a tus variables respirar, apretujar el código para que ocupe menos tenía sentido en los 80 cuando los monitores mostraban 80 caracteres por línea y 20 líneas por pantalla; hoy día no tiene sentido.

Teniendo en cuenta todas estas correcciones tu código podría quedar así:

Propuesta.

// Usando std::string, no char[]
struct Corredor {
    std::string nombre;
    int edad = 0;
    std::string sexo;
    std::string club;
};

// No utilizas el retorno de la función, así que no necesita retorno
void programa1() {
    std::string categoria;

    Corredor c1; // Sin variables globales.

    // El código separado es más legible
    std::cout << "Nombre: "; 
    std::cin >> c1.nombre;

    std::cout << "Edad: "; 
    std::cin >> c1.edad;

    std::cout << "Sexo: "; 
    std::cin >> c1.sexo;

    std::cout << "Club: "; 
    std::cin >> c1.club;

    // No hay necesidad de strcpy
    if (c1.edad <= 18) {
        categoria = "Juvenil";
    }
    else if(c1.edad <= 40) {
        categoria = "Senior";
    }
    else {
        categoria = "Veterano";
    }

    // Por qué llamar varias veces a std::cout pudiendo llamarlo sólo una?
    std::cout << "\n\nMostrando Datos"
                 "\nNombre: " << c1.nombre <<
                 "\nEdad: " << c1.edad <<
                 "\nSexo: " << c1.sexo <<
                 "\nClub: " << c1.club <<
                 "\nCategoria: " << categoria << '\n';
}

Si cambias tus formaciones1 de caracteres a std::string como en la propuesta, el programa funcionará como esperas.


  1. También conocidas como arreglos o en inglés arrays.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
-2

Qué tal, el problema es que declaraste las variables sexo y club de la estructura como arreglo de char, de esta manera no las puedes leer de manera "directa" con cin.

Para resolverlo, declara las variables de esta manera:

char* sexo;

char* club;

De esta manera las podrás leer sin problema con cin.