11 Tipos de objetos III: Estructuras

Las estructuras son el segundo tipo de datos estructurados que veremos (valga la redundancia).

Al contrario que los arrays, las estructuras nos permiten agrupar varios datos, que mantengan algún tipo de relación, aunque sean de distinto tipo, permitiendo manipularlos todos juntos, usando un mismo identificador, o cada uno por separado.

Las estructuras son llamadas también muy a menudo registros, o en inglés records. Tienen muchos aspectos en común con los registros usados en bases de datos. Y siguiendo la misma analogía, cada objeto de una estructura se denomina a menudo campo, o field.

Sintaxis:

struct [<identificador>] {
   [<tipo> <nombre_objeto>[,<nombre_objeto>,...]];
} [<objeto_estructura>[,<objeto_estructura>,...];

El identificador de la estructura es un nombre opcional para referirse a la estructura.

Los objetos de estructura son objetos declarados del tipo de la estructura, y su inclusión también es opcional. Sin bien, aún siendo ambos opcionales, al menos uno de estos elementos debe existir.

En el interior de una estructura, entre las llaves, se pueden definir todos los elementos que consideremos necesarios, del mismo modo que se declaran los objetos.

Las estructuras pueden referenciarse completas, usando su nombre, como hacemos con los objetos que ya conocemos, y también se puede acceder a los elementos definidos en el interior de la estructura, usando el operador de selección (.), un punto.

Una vez definida una estructura, es decir, si hemos especificado un nombre para ella, se puede usar igual que cualquier otro tipo de C++. Esto significa que se pueden declarar más objetos del tipo de estructura en cualquier parte del programa. Para ello usaremos la forma normal de declaración de objetos, es decir:

[struct] <identificador> <objeto_estructura>
   [,<objeto_estructura>...];

En C++ la palabra struct es opcional en la declaración de objetos, al contrario de lo que sucede en C, en el que es obligatorio usarla.

Ejemplo:

struct Persona {
   char Nombre[65]; 
   char Direccion[65]; 
   int AnyoNacimiento; 
} Fulanito;

Este ejemplo define la estructura Persona y declara a Fulanito como un objeto de ese tipo. Para acceder al nombre de Fulanito, por ejemplo para visualizarlo, usaremos la forma:

cout << Fulanito.Nombre;

Funciones en el interior de estructuras

C++, permite incluir funciones en el interior de las estructuras. Normalmente estas funciones tienen la misión de manipular los datos incluidos en la estructura, y su uso está muy relacionado con la programación orientada a objetos.

Aunque esta característica se usa casi exclusivamente con las clases, como veremos más adelante, también puede usarse en las estructuras. De hecho, en C++, las diferencias entre estructuras y clases son muy tenues.

Dos funciones muy particulares son las de inicialización, o constructor, y el destructor. Veremos con más detalle estas funciones cuando asociemos las estructuras y los punteros.

El constructor es una función sin tipo de retorno y con el mismo nombre que la estructura. El destructor tiene la misma forma, salvo que el nombre va precedido el símbolo "~".

Nota: para aquellos que usen un teclado español, el símbolo "~" se obtiene pulsando las teclas del teclado numérico 1, 2, 6, mientras se mantiene pulsada la tecla ALT, ([ALT]+126). También mediante la combinación [Atl Gr]+[4] y un espacio (la tecla [4] de la zona de las letras, no del teclado numérico).

Veamos un ejemplo sencillo para ilustrar el uso de constructores:

Forma 1:

struct Punto { 
   int x, y; 
   Punto() {x = 0; y = 0;} // Constructor
} Punto1, Punto2;

Forma 2:

struct Punto { 
   int x, y; 
   Punto(); // Declaración del constructor
} Punto1, Punto2;
 
// Definición del constructor, fuera de la estructura
Punto::Punto() {  
   x = 0; 
   y = 0; 
}

Si no usáramos un constructor, los valores de x e y para Punto1 y Punto2 estarían indeterminados, contendrían la "basura" que hubiese en la memoria asignada a estas estructuras durante la ejecución. Con las estructuras éste será el caso más habitual, ya que si necesitamos usar constructores para asignar valores iniciales, será mucho más lógico usar clases que estructuras.

Mencionar aquí, sólo a título de información, que el constructor no tiene por qué ser único. Se pueden definir varios constructores, pero veremos esto mucho mejor y con más detalle cuando veamos las clases.

Usando constructores nos aseguramos los valores iniciales para los elementos de la estructura. Veremos que esto puede ser una gran ventaja, sobre todo cuando combinemos estructuras con punteros, en capítulos posteriores.

También podemos incluir otras funciones, que se declaran y definen como las funciones que ya conocemos.

Otro ejemplo:

#include <iostream>
using namespace std;

struct stPareja { 
   int A, B; 
   int LeeA() { return A;} // Devuelve el valor de A
   int LeeB() { return B;} // Devuelve el valor de B
   void GuardaA(int n) { A = n;} // Asigna un nuevo valor a A
   void GuardaB(int n) { B = n;} // Asigna un nuevo valor a B
} Par;
 
int main() { 
   Par.GuardaA(15); 
   Par.GuardaB(63); 
   cout << Par.LeeA() << endl; 
   cout << Par.LeeB() << endl;
 
   return 0; 
}

En este ejemplo podemos ver cómo se define una estructura con dos campos enteros, y dos funciones para modificar y leer sus valores. El ejemplo es muy simple, pero las funciones de guardar valores se pueden elaborar para que no permitan determinados valores, o para que hagan algún tratamiento de los datos.

Por supuesto se pueden definir otras funciones y también constructores más elaborados e incluso, redefinir operadores. Y en general, las estructuras admiten cualquiera de las características de las clases, siendo en muchos aspectos equivalentes.

Veremos estas características cuando estudiemos las clases, y recordaremos cómo aplicarlas a las estructuras.

Inicialización de estructuras

De un modo parecido al que se inicializan los arrays, se pueden inicializar estructuras, tan sólo hay que tener cuidado con las estructuras anidadas. Por ejemplo:

struct A {
   int i;
   int j;
   int k;
};

struct B {
   int x;
   struct C {
      char c;
      char d;
   } y;
   int z;
};

A ejemploA = {10, 20, 30};
B ejemploB = {10, {'a', 'b'}, 20};

Cada nueva estructura anidada deberá inicializarse usando la pareja correspondiente de llaves "{}", tantas veces como sea necesario.

Asignación de estructuras

La asignación de estructuras está permitida, pero sólo entre objetos del mismo tipo de estructura, (salvo que se usen constructores), y funciona como la intuición nos dice que debe hacerlo.

Veamos un ejemplo:

struct Punto { 
   int x, y; 
   Punto() {x = 0; y = 0;} 
} Punto1, Punto2;
 
int main() { 
   Punto1.x = 10; 
   Punto1.y = 12; 
   Punto2 = Punto1; 
}

La línea Punto2 = Punto1; equivale a Punto2.x = Punto1.x; Punto2.y = Punto1.y;.

Quizás te hayas quedado intrigado por el comentario anterior, que adelantaba que se pueden asignar estructuras diferentes, siempre que se usen los constructores adecuados.

Esto, en realidad, se puede extender a cualquier tipo, no sólo a estructuras. Por ejemplo, definiendo el constructor adecuado, podemos asignar un entero a una estructura. Veamos cómo hacer esto.

Hasta ahora, los constructores que hemos visto no usaban argumentos, pero eso no significa que no puedan tenerlos.

Crearemos como ejemplo, una estructura para manejar números complejos. Un número complejo está compuesto por dos valores reales, el primero contiene lo que se llama la parte real y el segundo la parte imaginaria.

struct complejo {
   double real;
   double imaginario;
};

Esta estructura es suficiente para muchas de las cosas que podemos hacer con números imaginarios, pero aprovechando que podemos crear funciones, podemos añadir algunas que hagan de una forma más directa cosas que de otro modo requieren añadir código externo.

Por ahora nos limitaremos a añadir unos cuantos constructores. El primero es el más lógico: un constructor por defecto:

struct complejo {
   complejo() { real=0; imaginario = 0; }
   double real;
   double imaginario;
};

Este construtor se usará, por ejemplo, si declaramos un array:

complejo array[10];

El constructor por defecto será llamado para cada elemento del array, aunque no aparezca tal llamada en ningún punto del programa.

Otro constructor nos puede servir para asignar un valor a partir de dos números:

struct complejo {
   complejo() { real=0; imaginario = 0; }
   complejo(double r, double i) { real=r; imaginario = i; }
   double real;
   double imaginario;
};

Mediante este constructor podemos asignar valores inciales en la declaración:

complejo c1(10.23, 213.22);

Los números reales se consideran un subconjunto de los imaginarios, en los que la parte imaginaria vale cero. Esto nos permite crear otro constructor que sólo admita un valor real:

struct complejo {
   complejo() { real=0; imaginario = 0; }
   complejo(double r, double i) { real=r; imaginario = i; }
   complejo(double r) { real=r; imaginario = 0; }
   double real;
   double imaginario;
};

Este constructor nos permite, como en el caso anterior, inicializar un valor de un complejo en la declaración, pero también nos permite asignar un valor double a un complejo, y por el sistema de promoción automático, también podemos asignar valores enteros o en coma flotante:

complejo c1(19.232);
complejo c2 = 1299.212;
int x = 10;
complejo c3 = x;

Este tipo de constructores se comportan como conversores de tipo, nada nos impide crear constructores con cualquier tipo de parámetro, y tales constructores se podrán usar para convertir cualquier tipo al de nuestra estructura.

Arrays de estructuras

La combinación de las estructuras con los arrays proporciona una potente herramienta para el almacenamiento y manipulación de datos.

Ejemplo:

struct Persona { 
   char Nombre[65]; 
   char Direccion[65]; 
   int AnyoNacimiento; 
} Plantilla[200];

Vemos en este ejemplo lo fácil que podemos declarar el array Plantilla que contiene los datos relativos a doscientas personas.

Podemos acceder a los datos de cada uno de ellos:

cout << Plantilla[43].Direccion;

O asignar los datos de un elemento de la plantilla a otro:

Plantilla[0] = Plantilla[99];

Estructuras anidadas

También está permitido anidar estructuras, con lo cual se pueden conseguir superestructuras muy elaboradas.

Ejemplo:

struct stDireccion { 
   char Calle[64]; 
   int Portal; 
   int Piso; 
   char Puerta[3]; 
   char CodigoPostal[6]; 
   char Poblacion[32]; 
};
 
struct stPersona { 
   struct stNombre { 
      char Nombre[32]; 
      char Apellidos[64]; 
   } NombreCompleto; 
   stDireccion Direccion; 
   char Telefono[10]; 
};
...

En general, no es una práctica corriente definir estructuras dentro de estructuras, ya que tienen un ámbito local, y para acceder a ellas se necesita hacer referencia a la estructura más externa.

Por ejemplo para declarar un objeto del tipo stNombre hay que utilizar el operador de acceso (::):

stPersona::stNombre NombreAuxiliar;

Sin embargo para declarar un objeto de tipo stDireccion basta con declararla:

stDireccion DireccionAuxiliar;

Comentarios de los usuarios (62)

Oscar
2011-09-18 09:10:29

Hola, disculpen pero como puedo declarar dimensión de un array de una estructura, por ejemplo:

struct Persona \{

char Nombre[65];

char Direccion[65];

int AnyoNacimiento;

} Plantilla[variable];

Si mi programa empieza con la función principal

int main()

{

int variable;

cout<<”Cuantas personas declararas en tu lista?”;

cin>>variable;

....

como es que devuelvo este valor a la estructura? para poder declarar el valor de su objeto

Plantilla[variable] y no tener espacio reservado de memoria sin utilizar o quedarme corto de espacio

Por su ayuda de antemano muchas gracias.

Steven R. Davidson
2011-09-18 12:41:11

Hola Óscar,

En primer lugar, no deberías definir una variable ni un array de estructuras globalmente. En tu caso, sería así,

struct Persona
{ 
  char Nombre[65]; 
  char Direccion[65]; 
  int AnyoNacimiento; 
};

int main()
{
  Persona Plantilla[10];
  ...
}

La regla general es que las variables son locales y lo demás es global: tipos de datos, constantes, y funciones (prototipos y definiciones).

En segundo lugar, no puedes crear un array con un tamaño variable, porque el compilador es quien gestiona su creación y por tanto gestiona la memoria requerida para albergar sus elementos (el array en sí). Por consiguiente, no puedes imponer una cantidad variable de elementos; el compilador necesita tener toda la información para crear un array y la cantidad variable sería información obtenida durante la ejecución del programa.

Tenemos dos soluciones ante este problema:

1. Creamos el array con una cantidad máxima de elementos, pero no usamos todos los elementos del array. Esto significa que podemos variar la cantidad actual de elementos, pero siempre tomando en cuenta que hay un tope. El esquema del programa sería así,

int main()
{
  Persona Plantilla[10];
  int nCantActual;
  cout << "Cuantas personas declararas en tu lista? (Max: 10)";
  cin >> nCantActual;
  ...
}

Aquí podemos usar 'nCantActual' para tratar el array según la cantidad actual de elementos. Obviamente, deberíamos agregar más código fuente para asegurarnos de que esta cantidad no rebase el tope de 10, ni tampoco que sea menor a 1.

2. Usamos memoria dinámicamente adjudicada. Aún no hemos visto esta opción, así que no quisiera confundirte ahora mismo con esta otra solución. Por otro lado, veremos este tema, que involucra el tema de punteros, en el siguiente capítulo 12 y posteriormente en los capítulos 13 y 17, principalmente.

Espero que esto te aclare las dudas.

Steven

pablo
2011-10-11 23:32:05

como puedo completar mi tarea

Supón que se está diseñando el módulo de procesamiento de un sistema para manipulación de gráficos. En este caso te han asignado manipular los siguientes poliedros tridimensionales:

· Tetraedro

· Cubo

· Octaedro

Las actividades a realizar son las siguientes:

o Define las estructuras necesarias para representar los objetos dados.

o Diseña un programa en lenguaje C que solicite las coordenadas de los vértices de los tres objetos.

o Diseña un menú, una vez que cuentas con las coordenadas de los objetos, en el cual se puedan elegir las siguientes operaciones a realizar sobre los poliedros:

§ Traslación: Se deberán proporcionar la traslación en dirección del eje X, la traslación en dirección del eje Y, y la traslación en dirección del eje Z.

§ Rotación: Se deberá proporcionar el ángulo en radianes a rotar. Además, deberá indicarse alrededor de qué eje del espacio tridimensional se lleva a cabo la rotación: X, Y o Z.

§ Escalamiento: Se deberán proporcionar el escalamiento en dirección del eje X, el escalamiento en dirección del eje Y, y el escalamiento en dirección del eje Z.

o Presenta los nuevos valores de sus coordenadas, al momento en que los objetos han sido transformados de acuerdo a la operación elegida.

#include <stdio.h>

struct punto

{

int x;

int y;

int z;

};

int main()

{

struct tetraedro

{

struct punto p1;

struct punto p2;

struct punto p3;

struct punto p4;

};

struct cubo

{

struct punto p1;

struct punto p2;

struct punto p3;

struct punto p4;

struct punto p5;

struct punto p6;

};

struct octaedro

{

struct punto p1;

struct punto p2;

struct punto p3;

struct punto p4;

struct punto p5;

struct punto p6;

struct punto p7;

struct punto p8;

};

Steven R. Davidson
2011-10-12 01:44:22

Hola Pablo,

Podrías definir un punto 3D con coordenadas enteras, pero sugiero que sean de coma flotante, como por ejemplo 'float' o 'double'.

Las representaciones de los 3 poliedros no están mal, pero recomiendo que uses un array de puntos, para representar una lista de sus vértices. Por ejemplo,

struct tetraedro
{
  struct punto vertices[4];
};

Me temo que deberías cambiar la definición del cubo por la del octaedro, y viceversa. El cubo tiene 8 vértices y el octaedro (regular) tiene 6 vértices.

Para el resto de las tareas que debes implementar, sugiero que busques información acerca de las transformaciones afines que son la traslación, rotación, y cambio de escala.

Si quieres, puedes consultar el capítulo 6 de nuestro curso de gráficos ( http://graficos.conclase.net/curso/index.php?cap=006#inicio ) acerca del modelado y de las transformaciones afines. El problema es que el capítulo 6 trata el caso de 2D, pero puedes extender los conceptos a 3D, sin mucho problema. Las rotaciones son algo más complicadas, pero seguro que puedes encontrar las fórmulas y matrices sin problemas en internet.

Espero que esto te oriente.

Steven

anonimo
2011-10-30 00:16:39

Por favor, pueden arreglar lo de las barras en los códigos? la verdad molesta mucho...

belky sagrario velasquez
2012-02-28 04:31:38

mire tengo un programa en el cual me piden que usando uif y for muestre cual es la nota mayor y cual es la menor no entiendo me pueden ayudar se los agradesere mucho

gyakuza
2012-02-29 01:50:35

podrian ayudarme tengo el siguiente codigo y me piden que lo compile y encientre los errores, corrija y describa como es que funciona pero no le encuentro como sobre todo cuando guarda los datos en el registro c del arreglo y en donde pide buscar al perro por la clave, podrian checarlo gracias, mi correo es gyakuza@gmail.com po si no sale con el comentario:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

main(){

/* Declaración del arreglo de tipo estructura perro */

struct perro{

char fecha[10];

char raza[30];

char color[50];

char nombre[30];

int edad;

float peso;

} perros[100];

int c=0, op, clave;

do{ /* Inicio del ciclo que imprime el menú*/

printf( "\n----------------------------------------\n");

printf( "\nRefugio para perros -Ladrido Feliz- \n");

printf( "\n----------------------------------------\n");

printf( "1) Registrar un perro \n");

printf( "2) Buscar un perro \n");

printf( "3) Salir \n");

printf( "Elige una opci%cn:",162 );

scanf("%d",&op);

switch (op){

case 1: /*Opción Registrar perro */

printf( "\n------------------------------\n");

if(c>=100) /* Verifica si hay espacio */

printf("El refugio esta lleno\n");

else{

/*Si hay espacio pide los datos del perro y los guarda en el registro c del arreglo */

printf( "Ingresa los datos del perro:");

printf( "Clave:%.3d\n", &c);

printf( "fecha de ingreso[dd/mm/aa]: ");

scanf( "%s", perros[c].fecha);

printf( "nombre: ");

fflush(stdin);

gets( perros[c].nombre);

printf( "color: ");

gets( perros[c].color);

printf( "raza: ");

gets( perros[c].raza);

printf( "edad: ");

scanf("%d" ,&perros[c].edad);

printf( "peso: ");

scanf("%f" ,&perros[c].peso);

c++;

}

break;

case 2: /* Opción buscar perro */

printf( "\n-------------------------------\n");

printf( "Clave: ");

scanf("%d",&clave);

/* verifica que la clave sea válida */

while(clave>=100 || clave <0){

/* Imprime los datos del perro correspondiente a la clave */

printf( "nombre:%s\n",perros[clave].nombre);

printf( "fecha de ingreso: %s\n", perros[clave].fecha);

printf( "color: %s\n", perros[clave].color);

printf( "raza: %s\n", perros[clave].raza);

printf( "edad: %d a%cos\n", perros[clave].edad,164);

printf( "peso: %.2f kilos\n", perros[clave].peso);

}

break;

case 3: /* Caso salir, no hace nada */

break;

default: /* Caso opción inválida */

printf( "Opcion no valida\n");

}

}while (op!=3); /* El ciclo do-while se repite mientras la opción no sea salir (3) */

}

Evy
2012-03-17 20:13:42

¿Es posible inicializar una cadena de caracteres en main(),si se encuentra en una estructura y su objeto es un array?

Lo he visto posible con int

struct Persona {

char Nombre[65];

char Direccion[65];

int AnyoNacimiento;

} Plantilla[200];

main()

{

cout<<"Cual es tu nombre?";

cin>>Plantilla[0].Nombre;

Plantilla[0].AnyoNacimiento=1988;

cout<<Plantilla[0].AnyoNacimiento<<endl;

cout<<Plantilla[0].Nombre<<endl;

Plantilla[1].Nombre="Evy";//No se por que no puedo inicializar, creo que espor que intento guardar varios

caracteres en una sola posición

cout<<Plantilla[0].Nombre<<endl;

}

GRACIAS

Steven R. Davidson
2012-03-17 23:21:10

Hola Evy,

En primer lugar, la función 'main()' DEBE definirse como 'int' para el tipo de retorno.

En cuanto a tu comentario:

Plantilla[1].Nombre="Evy";//No se por que no puedo inicializar, creo que es por que intento guardar varios caracteres en una sola posición

Hay dos matices a comentar:

- No se trata de una inicialización, sino de una mera asignación.

- La razón de que no se puede realizar esta asignación es que no se puede hacer directamente entre dos arrays. Veremos el porqué en el siguiente capítulo 13. Básicamente, estás intentando modificar el array con una dirección de memoria, y no lo que pretendes hacer, que es asignar los elementos de un array al otro. Para esto, tendrás que copiar carácter a carácter explícitamente. La otra opción es invocar la función estándar, 'strcpy()', declarada en <cstring> (o <string.h> si usas C). Esto es,

strcpy( Plantilla[1].Nombre, "Evy" );

Espero que esto aclare la duda.

Steven

marcillo
2012-05-04 03:40:02

Tengo un problema para que la funcion "verificacion" coja los valores ingresados en "ingresar"

#include <iostream.h>

#include <stdio.h>

//Estructura clase 03/05/2012

struct competencia

{ char nombre_atleta[50];

float tiempo_alcanzado;

};

void verificacion(struct competencia estr);

void ingresar(struct competencia A);

void ingresar(struct competencia A)

{

printf("Ingrese el nombre: "); scanf("%s",&A.nombre_atleta);

printf("Ingrese el tiempo alcanzado: "); scanf("%f",&A.tiempo_alcanzado);

}

void verificacion(struct competencia estr, ingresar)

{

if(estr.tiempo_alcanzado<=3)

printf("el altleta %s logro un tiempo menos a 3.01 min",estr.nombre_atleta,estr.tiempo_alcanzado);

else printf("\n\tEl atleta %s logro un tiempo superior a 3.00 minutos",estr.nombre_atleta);

getch();

}

void main()

{

clrscr();

struct competencia A;

ingresar(A);

verificacion(A);

printf("\n%s Tiempo alcanzadado %.2f minutos",A.nombre_atleta,A.tiempo_alcanzado);

getch();

}

Humberto
2012-05-16 04:50:52

Alguien me puede Ayudar con este Proyecto se los voy agradecer mucho..!!!

El proyecto final consiste en el desarrollo de una aplicación que aplique los conceptos de arreglos, procedimientos, funciones, librerías y escritura/lectura de datos en archivos.

Su programa deberá tomar en cuenta el uso de cuatro archivos de texto:

Clientes, Productos, Inventario, Facturas

Clientes: Código de cliente, Nombre

Productos: Código de Producto, Nombre, Precio

Inventario: Código de Producto, Cantidad

Facturas: Código de Cliente, Código de Producto, Cantidad, precio

Transacciones de Clientes:

Creación/Edición/Eliminar Clientes

Transacciones de Productos:

Creación/Edición/Eliminar Productos

Transacciones de Inventario:

Actualizar inventario

Transacciones de Facturas:

Realizar compras de productos que estén disponibles en inventario por parte de clientes que están registrados. Después de realizar la compra se debe actualizar los valores en inventario y almacenar la transacción en el archivo de Facturas.

Búsquedas requeridas:

Producto que genero más ventas

Producto que genero más ingresos

Cliente que realizo la mayor cantidad de compras

Cliente que realizo la mayor inversión en compras

Todas las facturas que tengan el Producto X

Todas las facturas del cliente Y.

El producto que se encuentra en su nivel más bajo.

Observaciones:

Las búsquedas tienen que involucrar una transferencia del contenido de los archivos a un arreglo para que la búsqueda sea realizada en el arreglo. En este proyecto se permiten grupos de un máximo de 2 integrantes.

Liz|
2012-06-26 02:44:27

Hola, me podrían ayudar de menos con ideas para realizar este programa xfavor? es que esta muy revuelto y no estoy logrando mucho, gracias de antemano.

Programar en lenguajes C un inventario de nombre dado por el usuario, que contenga registros con los siguientes campos: Identificador del Producto, Nombre del Producto, Descripción, cantidad en existencia, precio de compra, precio de venta. El programa deberá permitir

a. La lectura de 5 en 5 registros utilizando un vector de tamaño 5.

b. Almacenar el vector de registros en el inventario.

c. Mostrar el contenido total del inventario.

d. Borrar un registro del inventario.

e. Modificar un registro del inventario.

f. Buscar un registro en el inventario (por identificador y por nombre del producto).

g. Eliminar todo el inventario.

h. Mostrar la cantidad total de la inversión que se tiene en el inventario.

Cada acción deberá ser programada en funciones y la aplicación deberá proporcionar un menú en donde se muestren todas las opciones.

Claudia
2012-06-26 07:35:51

Hola necesito ayuda, no se si aplique bien la función STRUCT pero siento que pruebo y pruebo y no me da, me gustaría saber cual es el problema que tengo en este ejercicio?

El objetivo de este ejercicio es tener un registro de los huérfanos de los orfanatos de diferentes distritos de un país y ver cual de estos orfanatos tiene mas huérfanos.

#include<stdio.h>

#include <stdlib.h>

#include<conio.h>

#include <string.h>

struct huer {

char nom[20];

char norf[50];

char est[40];

int n, sex, edad;

};

struct huer;

int main()

printf("\n\n\t\t Ingrese el Nombre del Huerfano: ");

scanf("%s",&nom);

printf("\n\n\t\t Nombre del Orfanatorio: ");

scanf("%s",&norf);

printf("\n\n\t\t Estado de la Republica al que pertenece el Orfanatorio: ");

scanf("%s",&est);

printf("\n\n\t\t Sexo: ");

scanf("%d",&sex);

printf("\n\n\t\t Ingrese el numero total de Huerfanos del Estado de Mexico: ");

scanf("%d",&n);

float porcen, nest;

porcen=(nest*100)/n;

printf("\n\n\t\t\t El Porcentaje de Huerfanos de DF es de: %.2f ",porcen);

getch();

return(0);

}

Angel
2012-08-17 17:39:15

hola, buen dia

me podrian ayudar en encontrar el error es que no me copila he corregido problemas y sigue sin copilar gracias!!

#include <iostream>

#include <stdio.h>

void Leer(Estudiante&Est);

void Imprimir(Estudiante&Est);

using namespace std;

struct Estudiante

{

long int Boleta;

char Nombre[100];

float Edad;

char Carrera[5];

float Calif[4];

};

int main()

{

Estudiante Est;

Leer(Est);

Imprimir(Est);

system("PAUSE");

}

void Leer(Estudiante&Est)

{

cout<<"Captura Boleta: "<<endl;

cin>>Est.Boleta;

cout<<"Captura Nombre: "<<endl;

gets(Est.Nombre);

cout<<"Captura Edad: "<<endl;

cin>>Est.Edad;

cout<<"Captura Carrera: "<<endl;

gets(Est.Carrera);

cout<<"Captura Calificacion: "<<endl;

cin>>Est.Calif;

}

void Imprimir(Estudiante&Est)

{

cout<<"Boleta: "<<Est.Boleta<<endl;

cout<<"Nombre: "<<Est.Nombre<<endl;

cout<<"Edad: "<<Est.Edad<<endl;

cout<<"Captura Carrera: "<<Est.Carrera<<endl;

cout<<"Captura Calificacion: "<<Est.Calif<<endl;

}

Steven R. Davidson
2012-08-17 18:39:41

Hola Ángel,

Cuando tengas errores de compilación, debes decirnos cuáles son los mensajes que te dan, ya que podemos centrarnos en la parte que falla del programa, en lugar de mirar todo el código fuente. El error, que te da el compilador, seguramente tiene que ver con 'Estudiante' en estas dos líneas:

void Leer( Estudiante &Est );
void Imprimir( Estudiante &Est );

Esto es porque no has definido 'Estudiante' previamente. Ten presente que el compilador comienza su tarea "leyendo" el código fuente de arriba a abajo y de izquierda a derecha. Si se encuentra algo que no existe en el lenguaje y no tiene su definición, obtenida previamente, entonces marca un error y no continúa con la compilación.

La solución en tu caso es sencillamente mudar los prototipos de estas dos funciones después de la definición del tipo 'Estudiante'; esto es,

struct Estudiante
{
  long int Boleta;
  char Nombre[100];
  float Edad;
  char Carrera[5];
  float Calif[4];
};

void Leer( Estudiante &Est );
void Imprimir( Estudiante &Est );

Existen otros matices a destacar en tu código fuente:

- El nombre correcto es <cstdio>, al menos que uses un compilador antiguo y de una versión obsoleta.

- No necesitas las funciones en <cstdio>, porque tienes la funcionalidad de <iostream>.

- Invocas 'system()', pero no has #incluido el fichero estándar de cabecera que la declara. Escribe:

#include <cstdlib>

- La función 'main()' DEBE retornar un entero, que por convenio es 0, para indicar que el programa ha terminado con éxito.

- En 'Leer()', lees primero un entero, para el campo 'Boleta', y luego lees una cadena de caracteres. Obtendrás un comportamiento inesperado e indeseado. El programa aparentará "saltarse" la lectura de esta cadena y pasará a leer el entero, 'Edad'. Esto es porque en el canal de entrada (el teclado) queda un carácter '\n'. Al leer una cadena de caracteres, se lee este carácter sin pedir caracteres al usuario. Esto aparenta "saltarse" la lectura.

La solución es extraer ese carácter, '\n', antes de comenzar la lectura del siguiente campo. Puedes usar 'cin.get()' para esta tarea. El resultado sería,

cin >> Est.Boleta;
cin.get();  // Extraemos '\n' que queda pendiente

- Usas la función 'gets()' que es de <cstdio>. Esta función es demasiado problemática para ser usada, aunque sea estándar. En su lugar, aconsejamos usar 'getline()' conjuntamente con 'cin'. Esto es,

cin.getline( Est.Nombre, 100 );

Espero que todo esto te aclare las dudas.

Steven

Sony Turcios
2012-08-29 23:59:56

Hola viendo tu pag me ayudo con el tema de las estructuras, pero tengo una duda en un programa ya q ue no me quedo como me lo pidieron.

Lo que pide el maestro del programa es esto :

Elaborar un programa usando struct que permita controlar la informacion de 3 personas (nombre y Edad) ademas escriba una funcion que permita comparar la edad de dos personas (Funcion dentro de Struct).

Lo que tengo del programa es esto

#include <iostream>

using namespace std;

struct NombreEdad

{

char nombre[20];

int edad;

void CompararEdad(int n,int m)

{

cout<<"Las edades de las personas 2 y 3 son: "<<n<<" Y "<<m<<endl;

}

}persona[3];

int main()

{

NombreEdad EDAD;

for(int i=1;i<4;i++)

{

cout<<"Ingrese Nombre de persona:"<<" "<<i<<endl;

cin>>persona[i].nombre;

cout<<"Ingrese Edad:";

cin>>persona[i].edad;

cout<<"\n\n";

}

EDAD.CompararEdad(2,3);

system("PAUSE");

return 0;

}

Como ven las edades de las personas no se comparan ya que al momento de correr el programa no se muestran las edades ingresadas por el usuario, solo dice que las edades comparadas son las del 2 y 3 que en realidad no compara nada, solo copia y escribe en pantalla el 2 y el 3

Alguien me podria dar una solucion para poder realmente comparar las edades

Gavilan
2012-11-24 05:11:58

URGENTE!

Como declaro los arrays dentro de las estructuras?

ricardo
2012-12-01 22:47:18

hola me podrias ayudar lo que tengo muy poco que empece a programar y me encargaron una tarea y no encuentro la solucion y lo que hice es contactarme con ustedes ayudenmepor favor este es el programa

que tengo que hacer

Hacer un programa en c++ usando una estructura definida por arreglos:

Abstraccion del programa: Programa que hace el promedio final de una materia, pide el nombre y apellido del alumno, su matricula y el nombre de la materia, pide el resultado del primer, segundo y tercer parcial, los promedia e imprime un resultado final, todo esto almacenandolo dentro de una estructura.

ejemplo de resultado de salida:

Nombre Alumno: Jon

Apellido: Luna

Materia: Programacion

Resultado 1er Parcial: 10

Resultado 2do Parcial: 10

Resultado 3er Parcial: 10

Promedio Final de <aqui nombre del Alumno y Apellido> es: <aqui el resultado final promediado de los 3 terminos parciales>

confio en usted !!!!!!

migue
2012-12-23 19:13:33

Mi problema es el siguiente; quiero hacer una tabla que pida las asignaturas en las que esta matriculado un alumno (maximo 8 asignaturas), y luego me pida el nombre de cada asignatura.

He hecho lo siguiente, pero no se solucionarlo.

#include <iostream>

using namespace std;

typedef char cad[50];

int main(){

int nasign=0;

char asig[40]; //nombre de la asignatura

do{

cout<<"introduce el numero de asignaturas en la que esta matriculado: "; cin>>nasign;

if(nasign<=0 || nasign>8) cout<< "\nError. el numro de asignaturas no puede ser negativo ni mayor que 8\n";

system("Pause");

system("cls");

}while(nasign<=0 || nasign>8);

cout<<"introduce el nombre de las asignaturas: "<<endl;

for(int a=1;a<=nasign ;a++) {

cout<<"Asignatura "<< a <<" : "; cin>> asig[a];cin>>asig[a];}

system("pause");

return 0;

}

fulanito
2013-01-14 11:50:43

me podrian ayudar con un programa de c++

debes crear dos numeros aleatorios ponerlos en

struct fnum { int num; int serie;}; (como loteria numero y reintegro) despues tienes crear una matriz ccon primer premio, segundo premio y lugar (para el lugar te dan un archivo con todas las convinaciones)

deberia quedar asi

numero reintegro lugar

1º premio 0000 1 calle trilla

2º premio 9999 10 administracion n56

Diego
2013-01-24 00:04:19

Buenos dias..

tengo un problema bien interesante, quiza ustedes me puedan colaborar con una solución.

Tengo una aplicacion hecha con objetos es una aplicación bien grande.

resulta que ahora tengo que implementarla sobre un procesador, que por su estructura no soporta binarios generados desde codigo en C++, por lo que debo esribir el codigo directamente sobre C. Realmente deseo

De una clase basica de triangulo(a modo de ejemplo)

class Triangulo

{

public:

float cat_opuesto;

float cat_adyacente;

float hipotenusa;

Triangulo();

};

La idea es que no tenga que hacer mucho para poder migrar el codigo.

He tratado definiendo dentro de la estrictura con punteros a funciones. de esta manera.

---------triangulo.h------------------

typedef void (*PTRN_Triangulo)(void);

typedef struct Triangulo_1

{

float cat_opuesto;

float cat_adyacente;

float hipotenusa;

PTRN_Triangulo FnTriangulo;

// Constructor de la clase

}TRIANGULO;

void Triangulo(void);

------------------------------

--------Triangulo.c-----------

static TRIANGULO _triangulo = {1,2,1,Triangulo};

void Triangulo(void)

{

_triangulo.cat_opuesto = 0;

_triangulo.cat_adyacente = 0;

_triangulo.hipotenusa = 0;

}

------------------------------

Asi tengo lo mas parecido a una clase.

el problema radica que dentro del "Metodo" no puedo usar los "Atributos".

La idea es que no tenga que mantener una "Instancia" activa todo el tiempo que la aplicacion este en funcionamiento ya que tengo limitaciones de hardware.

En el .c tengo obligatoriamente que hacer la definición de "mini la clase" y tendria que mantenerla "Viva", en toda la aplicación.

Sé que es algo poco convencional pero si alguien sabe como lo puedo usar algo muy parecido a usar objetos les inmenzamente agradecido.

Gracias.

Edwin Bohorquez
2013-01-28 00:59:59

Hola, tengo una pregunta: Como puedo acceder a los campos de una estructura anidada, para realizar una asignacion?.

En el siguiente codigo asigne una cadena a cada uno de estos campos, para despues imprimirlos, pero el compilador me dice que tengo errores.

#include<iostream.h>

using namespace std;

struct stPersona {

struct stNombre {

char Nombre[32];

char Apellidos[64];

} NombreCompleto;

char Telefono[10];

};

int main()

{

stPersona ::stNombre NombreAuxiliar;//declaro un objeto de tipo stNombre

NombreAuxiliar.Nombre="Edwin";

NombreAuxiliar.Apellidos="Bohorquez";

cout<<NombreAuxiliar.Nombre<<endl<<endl;

cout<<NombreAuxiliar.Apellidos<<endl;

system("pause");

}

Estos son los errores que me genera el compilador:

16 D:\Curso C++\pract.cpp incompatible types in assignment of `const char[6]' to `char[32]'

17 D:\Curso C++\pract.cpp incompatible types in assignment of `const char[10]' to `char[64]'

Este codigo lo tome del capitulo 11 del curso de C++, solo lo modifique un poco.

De antemano muchas gracias por su explicacion!!

SaraTeleco
2013-01-28 17:43:48

HOLA! MAÑANA (29-1-2013) TENGO QUE ENTREGAR UNA PRÁCTICA Y LA VERDAD QUE ME ESTOY VOLVIENDO LOCA PUES NO CONSIGO SOLUCIONAR LOS ERRORES DE COMPILACIÓN. TRABAJO CON CENTOS DE VMWARE, Y LA PRÁCTICA ES LA SIGUIENTE:

Se desea diseñar una aplicación informática que almacene la información de la cartelera de los

cines Alameda, PLazaMayor, Larios y Albéniz. En cada una de sus distintas salas (Salas 1 a la

Sala 6 para todos ellos) hay 5 sesiones diarias, en las que pueden exhibirse películas distintas,

y en horarios no fijos (varían para cada cine, día y sala). Por ejemplo, en el cine Alameda, en la

Sala 3, el miércoles proyectan las siguientes películas en sus cinco sesiones:

“Harry Potter y la Piedra Filosofal”, hora de inicio: 12:30h., Daniel Radcliffe y Richard Harris, TP

“Sentido y Sensibilidad”, hora de inicio: 16:30h., Emma Thomson y Kate Winslet, TP

"El Secreto de Thomas Crown", hora de inicio: 20 h., René Ruso y Pierce Brosnan, TP

“Torrente 2”, hora de inicio: 22:30h., Santiago Segura y Gabino Diego, M18

“Ocean’s Eleven”, hora de inicio: 24:00h., George Clooney y Brad Pitt, M18

Se pide realizar un menú para la gestión de esta aplicación informática. En concreto hay que

escribir un programa donde se definan las estructuras de datos necesarias para almacenar la

información de dicha cartelera. Para cada película se deberá almacenar la hora de comienzo

(ya que es variable según el día, cine y sala), su título, sus dos principales protagonistas, y su

calificación por edades –enumerado que podrá ser TP (todos los públicos), M13 (Mayores de

13 años) o M18 (Mayores de 18). Ver más abajo una posible plantilla para el programa. El

programa debe presentar un menú con las opciones que se muestran a continuación:

Elaborado por: <Nombre> <Apellidos>

Fecha: <Fecha>

A.

B.

C.

D.

X.

MENU PRACTICA 9

================

Leer película.

Visualizar información en una sala concreta.

Buscar película.

Listar películas por edades.

Salir del Programa.

Introduzca Opción:

Habrá que realizar además un procedimiento para inicializar la estructura con datos

(actualizada cada semana con la nueva cartelera).

Descripción de las Opciones:

A.- Leer película. Se deberá pedir al usuario (gestor de la aplicación) la información concreta

de una película y el cine, el día, la sala y la sesión en el cual quiere que se proyecte. La

película será entonces incluida en la cartelera según los datos indicados. Si ya había alguna

película, está será sustituida por la proporcionada en esta opción.

B.- Visualizar información en una sala concreta. Se pedirá al usuario que proporcione el

cine, la sala, la sesión y el día correspondiente, y el programa listará la información de la

película que está proyectada en la cartelera. En caso de no haber película proyectada, se

visualizará el mensaje correspondiente.

Ejemplo:

Cine: Alameda

Día: Miércoles

Programación I

1o Grado de Ingeniería de Sistemas de Telecomunicación

Práctica Evaluable

E.T.S.I. TELECOMUNICACIÓN

Sala: 3

Sesión: 2

Película proyectada: “Sentido y Sensibilidad”

Hora de inicio: 16:30h.,

Actores/actrices: Emma Thomson y Kate Winslet,

Calificación: TP

C.- Buscar película. Dado el título de una película se visualizarán en pantalla todas aquellas

salas donde se proyecta en la cartelera.

Ejemplo:

Título: “Sentido y Sensibilidad”

Se proyecta en:

El Cine Alameda, el Miércoles, en la sala 3 y Sesión 2.

Hora de comienzo: 16.30

El Cine Albeniz, ...

D.- Listar películas por edades. Lea desde teclado una cadena de caracteres con una

calificación por edades, y muestre la lista de las películas que con dicha calificación se

proyectan esta semana. Para cada una de éstas deberá mostrarse el título junto con la

información del cine donde se proyecta, día de la semana, sala y horario.

Deberán definirse completamente todos los procedimientos o funciones auxiliares que se

precisen. Se recomienda que los cines sean también definidos como enumerados.

Nota: Esta práctica es un ejercicio que apareció en el examen Ordinario de Febrero de 2004 de

la asignatura de Elementos de Programación en la ETSI en Informática..

X. Salir del Programa. Se solicita confirmación y sólo en caso de sea afirmativa se sale del

programa.

Ejemplo:

Introduzca su opcion: x

¿Esta seguro de salir (S/N)?

Y EL PROGRAMA QUE HE DISEÑADO ES:

#include <iostream>

#include <string>

#include <array>

using namespace std;

//-------------------------------//

//---DECLARACIÓN DE CONSTANTES---//

//-------------------------------//

const unsigned int MAX_CINES = 4;

const unsigned int MAX_DIAS = 7;

const unsigned int MAX_SALAS = 5;

//-------------------------------//

//------DECLARACIÓN DE TIPOS-----//

//-------------------------------//

enum calificaciones {TP, M13, M18};

enum cines {Alameda, PlazaMayor, Larios, Albeniz};

struct TpInfopeli{

calificaciones calificacion_edades;

string protagonistas, pelicula;

cines nombre_cine;

}informacion;

typedef array <TpInfopeli,MAX_CINES> TpCines;

enum dias {Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo};

struct TpFecha{

dias dia_semana;

}dia;

typedef array <TpFecha,MAX_DIAS> TpSemana;

enum salas {sala1, sala2, sala3, sala4, sala5, sala6};

enum hora {sesion1, sesion2, sesion3, sesion4, sesion5};

enum peliculas {ElHobbit, ¡RompeRalph!, ElCuerpo, ElAlucinanteMundoDeNorman, LoImposible};

struct TpHorario{

salas numero_sala;

hora hora_sesion;

peliculas peli

}horario;

typedef array <TpHorario,MAX_SALAS> TpSalas;

//--------------------------------//

//---DECLARACIÓN DE PROTOTIPOS----//

//--------------------------------//

//LEERPELICULA: se pide al usuario que introduzca la informacion de la pelicula.

void LeerPelicula (const TpInfopeli &informacion);

//VISUALIZARINFORMACION: si existen los datos anteriores, se muestra la informacion de la pelicula. En caso contrario, se muestra otra opcion (cine:Alameda, Día:Miercoles).

void VisualizarInformacion(const TpInfopeli &informacion);

//INSERTARPELICULA:

void InsertarPelicula(TpCines &cartelera, const TpInfopeli &informacion);

//BUSCARPELICULA: se pide al usuario que introduzca el nombre de una pelicula; si está en la cartelera, se le muestra la informacion de su proyeccion.

void BuscarPelicula (const TpCines &cartelera, const string &nombre, bool &encontrado, TpInfopeli &informacion);

//LISTARPELICULAS: se pide al ususario que introduzca una edad y se muestran todas las peliculas con dicha calificacion.

void ListarPeliculas (const TpInfopeli &informacion);

//SALIR: se le pregunta al usuario si desea salir del programa (se necesita confirmacion para salir del mismo).

bool SalirDelPrograma(salir);

//-----------------------------//

//-----FUNCION PRINCIPAL-------//

//-----------------------------//

int main (){

unsigned int opcion;

TpInfopeli informacion;

TpCines cartelera;

string protagonistas;

bool encontrado;

string nombre;

do{

cout << "MENÚ:" << endl;

cout << "0:\tInsertar películas en la cartelera" << endl;

cout << "1:\tVisualizar información de la cartelera" << endl;

cout << "2:\tBuscar película por su nombre" << endl;

cout << "3:\tListar películas de la cartelera" << endl;

cout << "4:\tSalir del programa." << endl;

cout << "¿Opcion?: ";

cin >> opcion;

switch (opcion){

case 0: cartelera = LeerPelicula();

InsertarPelicula(cartelera, informacion);

break;

case 1: VisualizarInformacion(cartelera);

break;

//

case 1: //VisualizarInformacion

//

case 2: cout << "Nombre de película: ";

cin >> pelicula;

BuscarPelicula(cartelera, pelicula, encontrado, informacion);

if (encontrado){

cout << "Película encontrada " << endl;

LeerPelicula(informacion);

}

else{

cout << "La película no se encuentra en la cartelera " << endl;

}

break;

case 3: ListarPeliculas(informacion.pelicula);

break;

case 4: cout << "¿Desea abandonar el programa?" << endl;

SalirDelPrograma(salir);

break;

}

}while(opcion != 5 );

return 0;

}

//-------------------------------------//

//-----IMPLEMENTACIÓN DE FUNCIONES-----//

//-------------------------------------//

//LeerPelicula

void LeerPelicula(const TpInfopeli &informacion){

cout << "Cine\t";

cin >> informacion.nombre_cine;

cout << "Película:\t";

cin >> informacion.pelicula;

cout << "Protagonistas:\t";

cin >> informacion.protagonistas;

cout << "Calificación por edades (TP,M13,M18):\t";

cin >> informacion.calificacion_edades;

return informacion;

}

//InsertarPelicula

void InsertarPelicula(TpCines &cartelera, const TpInfopeli &informacion);{

unsigned int i = 0;

if (Buscar(cartelera,informacion.nombre_cine.pelicula.protagonistas.calificacion_edades) == -1){

while(i < MAX_CINES && cartelera[i].ocupada) // Buscar hueco

i++;

if (i < MAX_CINES){

cartelera[i].informacion = info;

cartelera[i].ocupada = true;

}

}

}

//VisualizarInformacion

void VisualizarInformacion(const TpInfopeli &informacion){

cout << "LISTA DE PRODUCTOS DE LA FARMACIA: " << endl;

for (unsigned int i = 0; i < MAX_CINES; i++)

if (informacion[i].ocupada)

LeerPelicula(informacion[i].nombre_cine.pelicula.protagonistas.calificacion_edades);

}

//BuscarPelicula

void BuscarPelicula(const TpCines &cartelera, const string &pelicula, bool &encontrado, TpInfopeli &informacion){

unsigned int i = 0;

encontrado = false;

while(i < MAX_CINES && !encontrado){

if (cartelera[i].ocupada && cartelera[i].informacion.pelicula == pelicula)

encontrado = true;

else

i++;

}

if (encontrado){

informacion = cartelera[i].informacion;

}

}

//ListarPeliculas

void ListarPeliculas(const TpCines &cartelera, TpInfopeli &informacion){

cout << "PELÍCULAS EN CARTELERA " << endl;

for (unsigned int i = 0; i < MAX_CINES; i++)

if (cartelera[i].ocupada)

EscribirPelicula(cartelera[i].informacion);

}

//Salir

bool SalirDelPrograma(salir){

cin >> salir >> endl;

if (salir = S){

salir = true;

}else salir = false;

}

LES ESTARÍA ETERNAMENTE AGRADECIDA SI CONSIGUIERAN AYUDARME CON MI PROBLEMA, YA QUE CON LA SUBIDA DEL PRECIO DE LOS CRÉDITOS PARA LA UNIVERSIDAD ME AMARGARÍA EL AÑO QUE VIENE SI ME QUEDARA ESTA ASIGNATURA. MUCHAS GRACIAS.

angel
2013-06-23 01:02:06

como puedo hacer esto en c++ estoy usando estructura

Destino (1= Sn Jose- Miami, 2= Miami-Sn Jose, 3=Sn Jose-España, 4=España-Sn Jose),

estado de la reservación (1= Reserva 2= Anulado 3=Pagado),

precio tiquete (*),

impuesto venta 13% (*),

impuesto salida 3% (hacia Miami) 4.5% (hacia España) (*),

total precio tiquete, saldo.

Cuando está en reserva el saldo es el mismo monto del total,

cuando esta anulado o cancelado el saldo es cero.

** Los precios se muestran al final en una tabla.

**Precios

Niño Adulto Adulto Mayor

SJ CR-Miami 225 450 375

Miami-SJ CR 305 510 399

SJ CR-España 890 1350 1050

España-SJ CR 950 1600 1400

//este es el proceso de incluir datos lo que me falta eshacer lo arriba

void ingresar_datos()

{

char sigue;

do{

system("cls");

if (a<z)

{

system("cls");

printf("Ingresando Registro %i: \n",a);

printf("Ingresar numero de tiquete:");

scanf("%i",&aerolinea[a].tiquete);

printf("Numero de cedula es :");

scanf("%i",&aerolinea[a].cedula);

printf("Nombre de pasajero:");

fflush(stdin);gets(aerolinea[a].nom…

printf("Dijite Año de nacimiento del pasajero:");

scanf("%i",&aerolinea[a].año_nac);

printf("Dijite Año actual:");

scanf("%i",&aerolinea[a].año);

aerolinea[a].edad=aerolinea[a].año-…

if

(aerolinea[a].edad>=0 && aerolinea[a].edad <12)

strcpy(aerolinea[a].mensaje,"Eres un nino");

else if(aerolinea[a].edad>12 && aerolinea[a].edad <55)

strcpy(aerolinea[a].mensaje,"adulto…

else

strcpy(aerolinea[a].mensaje,"Eres un adulto mayor");

do

{

printf("destino");

printf("[1]=san jose-Miami [2]=Miami-san jose [3]=San_jose-Espana [4]=Espana-San_jose");

aerolinea[a].destino=getch();

}while(aerolinea[a].destino!='1' && aerolinea[a].destino!='2' && aerolinea[a].destino!='3' && aerolinea[a].destino!='4' );

system("cls");

printf("**Resultados**");

printf("\nNumero de tiquete es:%i",aerolinea[a].tiquete);

printf("\nNumero de cedula es :%i",aerolinea[a].cedula);

printf("\nNombre de pasjero es :%s",aerolinea[a].nom);

printf("\nFecha de nacimiento es :%i",aerolinea[a].año_nac);

printf("\nAño actual es :%i",aerolinea[a].año);

printf("\nEdad es :%i",aerolinea[a].edad);

printf("\nTipo de pasajero :%s",aerolinea[a].mensaje);

a++;

do

{

printf("\nDesea continuar S/N?");

sigue=getch();

}while(toupper(sigue)!= 'S' && toupper(sigue)!= 'N'); }

else

{

printf("Vectores llenos....!");

sigue= 'N';

getch();

}

}while(toupper(sigue)=='S');

}

Juan M.
2013-07-09 02:21:28

Hola! Tengo un pequeño problemita este es mi programa:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

struct Salon

{

char M[6];

char A[6];

char C[6];

float B[4];

};

typedef struct Salon vec;

int main()

{

int i,n;

vec V[i];

float Pa,s;

s=0;

for(i=0; i<n; i++)

{

printf("Introducir Nombre de V:");

scanf("%s",&V[i].M);

printf("Introducir Apellido de V:");

scanf("%s",&V[i].A);

printf("Introducir Cedula de V:");

scanf("%s",&V[i].C);

printf("Introducir Notas de V:");

scanf("%f",&V[i].B);

s=s+V[i].B;

Pa=s/4;

}

printf("Promedio de alumno:", Pa);

system ("PAUSE");

return 0;

}

Y en el sumador me marca "invalid operands of types `float' and `float[4]' to binary `operator+'" A que se debe eso?

Steven R. Davidson
2013-07-09 02:46:00

Hola Juan M.,

Tienes varios errores:

int i,n;
vec V[i];
...
scanf("%s",&V[i].M);
scanf("%s",&V[i].A);
scanf("%s",&V[i].C);
scanf("%f",&V[i].B);
s=s+V[i].B;

El primero se basa en que no puedes crear un array (estático) de una cantidad variable de elementos. Si necesitas tal comportamiento, entonces necesitas usar memoria dinámicamente adjudicada, invocando 'malloc()'. Si no puedes, entonces elige una cantidad máxima de elementos para 'V', pero mantén la cantidad actual de elementos en tal array.

Los tres siguientes errores tienen que ver con el uso del operador & para una cadena de caracteres. No debes usar tal operador; simplemente pasa el array de 'char' a 'scanf()'. Esto es,

scanf( "%s", V[i].M );
scanf( "%s", V[i].A );
scanf( "%s", V[i].C );

El siguiente error se debe a que lees un solo 'float', pero intentas pasar un array de 'float' como parámetro a 'scanf()'. Esta función no lee arrays de 'float'. Por lo tanto, la solución es leer cada uno explícitamente. Esto es,

scanf( "%f", V[i].B[0] );
scanf( "%f", V[i].B[1] );
scanf( "%f", V[i].B[2] );
scanf( "%f", V[i].B[3] );

También puedes optar por usar un bucle 'for' para recorrer cada elemento del array 'B'.

El último error se basa en el uso del array, 'B', ya que C no ofrece una suma de elementos en un array. Si quieres hacer esto, entonces necesitas ser explícito; por ejemplo,

s += V[i].B[0] + V[i].B[1] + V[i].B[2] + V[i].B[3];

O como dije antes, puedes usar un bucle para recorrer el array.

Espero que todo esto te oriente.

Steven

Juan Luis
2013-07-13 15:44:13

Buenos días, sera que alguien puede ayudarme?

Tengo este programa, estructura (que es un registro de alumnos), me piden que almacene la información y calcule el promedio de cada alumno, el promedio por cada evaluación y el promedio global es decir el promedio de la sección, mi programa almacena los datos y calcula el promedio de los alumnos y el problema esta en que no calcula los promedios de las evaluaciones ni el promedio global, me arroja datos que no tengo.

Este es:

#include <stdlib.h>

#include <stdio.h>

#define N 3

struct salon

{

char Nombre[10];

char Apellido[10];

char Cedula[10];

float Nota[4];

};

typedef struct salon vec;

int main()

{

vec V[N];

float Sa,Sg,Se1,Se2,Se3,Se4,Pa,Pg,Pe1,Pe2,Pe3,Pe4;

int i,j,n;

Se1=0;

Se2=0;

Se3=0;

Se4=0;

Sg=0;

for(i=0; i<N; i++)

{

printf("\n");

printf("Introducir Nombre de Alumno: \n");

fflush(stdin);

gets(V[i].Nombre);

fflush(stdin);

printf("\n");

printf("Introducir Apellido de Alumno: \n");

fflush(stdin);

gets(V[i].Apellido);

fflush(stdin);

printf("\n");

printf("Introducir Cedula de Alumno: \n");

fflush(stdin);

gets(V[i].Cedula);

fflush(stdin);

printf("\n");

Sa=0;

for(j=0; j<4; j++)

{

printf("\n");

printf("Introducir Notas: \n\n");

scanf("%f",&V[i].Nota[j]);

printf("\n");

Sa=Sa+V[i].Nota[j];

Pa=Sa/4.0;

}

printf("\n");

printf("Promedio de Alumno: %.2f\n", Pa);

printf("\n");

}

Se1=Se1+V[i].Nota[1];

Pe1=Se1/3;

printf("Promedio de Evaluacion 1: %.2f\n", Pe1);

Se2=Se2+V[i].Nota[2];

Pe2=Se2/3;

printf("Promedio de Evaluacion 2: %.2f\n", Pe2);

Se3=Se3+V[i].Nota[3];

Pe3=Se3/3;

printf("Promedio de Evaluacion 3: %.2f\n", Pe3);

Se4=Se4+V[i].Nota[4];

Pe4=Se4/3;

printf("Promedio de Evaluacion 4: %.2f\n", Pe4);

system ("PAUSE");

return 0;

}

josue reyes
2013-09-18 07:05:13

sera que me ayudan es que me da un error q al momento de compilar me da el error ne la llav de void main xfa ayda

#include <stdio.h>

#include <conio2.h>

#define TAM 3

using namespace std;

struct persona

{

char nombre[50];

char equipo[100];

int partidos;

int goles;

float promedio;

};

void main()

{

struct persona jugadores[TAM];

int i;

float auxf;

for(i=0;i<TAM;i++)

{

clrscr();

printf("FICHA DE JUGADOR\n\n");

printf("NOMBRE:");fflush(stdin);gets(jugadores[i].nombre);

printf("EQUIPO:");fflush(stdin);gets(jugadores[i].equipo);

printf("PARTIDOS:");scanf("%d",&jugadores[i].partidos);

printf("GOLES:");scanf("%d",&jugadores[i].goles);

jugadores[i].promedio =(float) jugadores[i].goles / jugadores[i].partidos;

// VALIDAR LA INFORMACION INGRESADA

}

for(i=0;i<TAM;i++)

printf("\nNOMBRE %s EQUIPO %s PARTIDOS %d GOLES %d PROMEDIO DE GOLES %.2f POR PARTIDO",jugadores[i].nombre,jugadores[i].equipo,jugadores[i].partidos,jugadores[i].goles,jugadores[i].promedio);

getch();

}

Steven R. Davidson
2013-09-18 07:52:58

Hola Josué,

Seguramente el error que te da el compilador es por la definición de 'main()', la cual debe retornar un entero. La definición en C++ de 'main()' es:

int main()

Por convenio, retornamos 0 (cero) para indicar una terminación exitosa del programa.

Espero que esto te ayude.

Steven

Ludwin
2013-10-02 04:12:35

Hola sera que me pueden ayudar con el siguiente problema ya que no entiendo como resolverlo.

Utilizando estructuras, vectores/matrices, funciones desarrolle el

siguiente problema.

Se quiere construir un registro para guardar carne, nombre, código del curso,

nombre del curso, punteo de 2 exámenes parciales, zona (tareas-exámenes cortosproyectos), examen final, examen de retrasada (solo si el estudiante perdió el curso)

para 100 alumnos.

Se debe presentar un menú con las siguientes opciones:

1. Ingreso de Datos

a. Cursos.

b. Catedráticos.

c. Estudiantes

. Reportes

a. Por Curso (con toda la información de los estudiantes, el usuario

indicara el código del curso que desea consultar).

b. Por Estudiante (con toda la información de los estudiantes, el usuario

indicara el carne del estudiante que desea consultar).

c. Por Catedrático (con toda la información de los estudiantes, el usuario

indicara el código del curso que desea consultar).

d. General de Estudiantes con el mayor promedio por semestre.

e. General de Estudiantes que Salieron en Limpio.

f. General de Estudiantes que tienen Retrasadas.

3. Salir

Evelin perez
2013-10-09 21:12:46

necesito ayuda como empezar a escribir en mi programa lo que me esta pidiendo es: Utilizando funciones y/o procedimientos, escribir un programa que calcule el sueldo liquido de “n”

empleados, ingresando el sueldo nominal, días del mes, días trabajados, imprima el total de

empleados ingresados, el total del IGSS, el total de descuentos y el total liquido a recibir.

a. Sueldo= Sueldo / diasmes / diastrabajados

b. Liquido = Sueldo – IGSS (4.83%) – ISR – descuentos. en c++ y hacer diagrama de flujo.

lo agradezco muchisimo ayuda y me puede enviar al eveamayapeba20@hotmail.com Gracias!!!! :)

Tatiana Vargas
2013-10-16 22:28:39

hola me gustaría que me ayudaran con el concepto de estructuras autoreferenciantes y un posible ejemplo aplicado del tema gracias

Steven R. Davidson
2013-10-17 18:17:36

Hola Tatiana,

Se trata de crear una estructura que contenga cualesquier miembros de los cuales uno sirva para referirse a un objeto de este mismo tipo de estructura. En C/C++, esto se suele implementar con punteros. Por ejemplo,

struct nodo
{
  int dato;

  nodo *pNodo;
};

Al crear un objeto de tipo 'nodo', podemos apuntar a otro 'nodo', y éste posiblemente apunte a otro; y así sucesivamente.

El uso típico es encadenar varios objetos (del mismo tipo) y así poder crear una lista cuyas operaciones de inserción, agregado, y eliminación son fáciles de realizar: una complejidad temporal de O(1). Típicamente, estas listas usan memoria dinámicamente adjudicada por lo que ofrecen una gran flexibilidad. Por ejemplo,

nodo *pCabeza;
nodo *pAux;

// Creamos un nuevo nodo
pAux = new nodo;

// Damos valores iniciales
pAux->dato = 0;
pAux->pNodo = nullptr;

// Relacionamos el nodo principal al nuevo nodo
pCabeza = pAux;
...

Sugiero que consultes nuestro curso de EDD yendo a: http://c.conclase.net/edd/index.php

Otro uso típico es para crear relaciones de parentesco entre objetos; o sea, una relación de "hijo-pariente". Por ejemplo,

struct ventana
{
  ventana *apHijas[256];
  unsigned char nCantHijas;
  ...
};

Así podríamos crear ventanas que posiblemente contengan una lista de ventanas hija. Lo normal es que esta ventana padre controle algún aspecto de sus hijas, como por ejemplo, si movemos la ventana padre, sus hijas son mudadas también. Esto también implicaría que cada ventana hija a su vez puede ser pariente de otras hijas.

Espero que esto te oriente.

Steven

lenin tandalla
2013-11-21 19:17:51

Elabore un programa en G++ con las siguientes indicaciones

a.- Un menu de 3 opciones:

1.- Ingresar Datos

2.- Mostrar Datos

3.- Salir

Utilice una función solo para el menu

b.- Utilice la estructura STRUC para definir y almacenar

Cedula, Nombre, Dirección y Edad de personas

c.- Utilice la función para ingresar los datos de estas personas

Al seleccionar la opción 1, lo primero que le pedirá es el número de personas a registrar los datos

d.- Utilice la función para desplegar o Mostrar los datos ingresados.

victor
2014-01-24 16:23:27

nesecito resolver este problema

escriba las estructuras nesesarias para almacenar informacion d los estudiantes y los profesores de alguna universidad

Carol
2014-02-28 15:16:27

Hola!! Como hago para realizar el calculo de pares trigonométricos en precisión simple?

Estoy llevando una clase que utilizo programación y no se nada con esta pagina estoy aprendiendo lo basico.

David
2014-05-28 19:08:03

Esta pagina me resuelve muchas dudas y realmente es muy útil, pero hay una cosa que no entiendo. Cuando definimos el struct con varios constructores en este capitulo:

struct complejo {
   complejo() { real=0; imaginario = 0; }
   complejo(double r, double i) { real=r; imaginario = i; }
   complejo(double r) { real=r; imaginario = 0; }
   double real;
   double imaginario;
}; 

y luego expones varios ejemplos:

complejo c1(19.232);
complejo c2 = 1299.212;
int x = 10;
complejo c3 = x;

Cuando creas por ejemplo c1, se llama automáticamente a todos los constructores? Si es así, hay funciones de c1 que requieren de mas de un parámetro pero solo pasamos uno.

En c2 que sucede cuando igualas este objeto a un numero? (es decir complejo c2 = 1299.212;)

Gracias de antemano.

Salvador Pozo
2014-05-28 20:32:42

Hola, David:

> Cuando creas por ejemplo c1, se llama automáticamente a todos los constructores?

No, sólo se llama a uno de ellos.

Se elige aquel cuyos parámetros, por número y tipo, más se aproximen a los argumentos usados.

En el caso de c1, como se invoca con un valor en punto flotante, se usa el tercer constructor, y se convierte el parámetro de float a double.

> En c2 que sucede cuando igualas este objeto a un numero?

Suceden dos cosas. Primero, como los dos objetos a ambos lados del igual deben ser del mismo tipo, se crea un objeto de la clase complejo a partir del valor 1299.212, es decir, de nuevo usamos el tercer constructor.

Después se usa el operador de asignación que el compilador define por defecto para la clase complejo. El operador de asignación por defecto asigna a cada dato del objeto de la izquierda el valor correspondiente del objeto de la derecha. Es decir, a c3.real le asigna el valor del objeto creado, que será 1299.212, y a c3.imaginario le asigna 0.

El objeto creado antes de la asignación se destruye una vez ejecutada la sentencia. Se trata de un objeto temporal sin nombre.

De todos modos, el compilador suele optimizar este código para no tener que hacer uso de esos objetos temporales.

Hasta pronto.

Steven R. Davidson
2014-05-28 21:11:38

Hola David,

En general, el compilador busca de entre los candidatos a la función invocada para elegir el mejor a usar.

En el caso de 'c1', vemos que pasamos un solo parámetro de tipo 'double'. Por lo tanto, el mejor candidato de entre todos los constructores es:

complejo::complejo( double r );

Para el caso de 'c2', no igualamos el objeto, sino que inicializamos el objeto. La forma de inicializar un objeto es instanciando tal objeto con el valor de la inicialización. Este resulta en invocar el constructor debido, que en este caso es,

complejo::complejo( double r );

Esto es igual a,

complejo c2( 1299.212 );

Para terminar, para el caso de 'c3', el compilador ve que necesitamos un constructor del prototipo,

complejo::complejo( int );

Pero al no encontrar una versión exacta, entonces aplica las reglas de "cásting". Se da cuenta que podemos promocionar un 'int' a un 'double' y así podemos usar este constructor:

complejo::complejo( double r );

Al final, hace esto:

complejo c3( (double) x );

Espero que esto aclare las dudas.

Steven

Adri
2015-01-05 00:19:13

¿Cual es la diferencia entre inicializar una variable de una estructura con constructor y sin constructor?

//Con constructor
struct A
{
	int a;
	A(){a = 7;};
};
//Sin constructor
struct A{int a = 7;};

Veo mas ventajoso hacerlo directamente, porque requiere de menos codigo.

Steven R. Davidson
2015-01-05 02:15:20

Hola Adri,

En ambos ejemplo, existe un constructor. En el primer ejemplo, defines uno, mientras que en el segundo, uno se define implícitamente; este constructor por defecto no hace nada aparente, que al final se definen los campos en el orden de aparición.

La ventaja es que la lógica de la inicialización del objeto queda en el interior de la definición de la estructura. Es una manera de "esconder" estos detalles que el exterior no necesita conocer. Esto implica que si el exterior se limita a usar el constructor, no tiene que depender de la representación interna de la estructura ni de la organización de sus campos.

Usando tu ejemplo, tenemos dos versiones:

A obj;   // Invocamos:  A()
A st = { 7 };  // Directamente

Ahora imagina que queremos cambiar la definición de 'A' a lo siguiente:

struct A
{
  int a;
  char b, c;
  float f;

  A()
  {
    a = 7;
    b = c = '#';
    f = -1.0f;
  }
};

El código fuente es ahora,

A obj;  // No cambia
A st = { 7, '#', '#', -1.0f };

Como puedes ver, tenemos que cambiar la inicialización de 'st', porque se hace explícitamente. Imagínate que tenemos 100 definiciones e inicializaciones de estructuras por todo el código fuente. Esto implicaría modificar todas correctamente. El problema es que depende de la representación interna de 'A'. Si cambia, por la razón que sea, o incluso la lógica de una inicialización adecuada, tales inicializaciones deben modificarse también, por lo que suele aumentar la posibilidad de introducir errores en el código fuente.

Existen otras razones, pero aún no hemos visto suficientes conceptos. Veremos este tema al llegar a la Programación Orientada a Objetos (POO) a partir del capítulo 27.

Espero haber aclarado el tema.

Steven

Mikma94
2015-05-01 11:08:01

Hola!,

he programado una cola con plantillas, y querría saber si cuando declare una cola puedo declarar la plantilla de la misma como struct, tal que asi:

 queue_t<struct> Q;
Steven R. Davidson
2015-05-01 14:12:45

Hola Mikma94,

No, tal y como presentas la definición del objeto, ya que 'struct' no es un tipo de dato, sino un vocablo. Si has definido un tipo de dato usando 'struct', entonces sí podrás; por ejemplo,

struct Algo {...};
struct OtraCosa {...};
...
queue_t< Algo > Q;
queue_t< OtraCosa * > obj;

Obviamente, esto funcionará si la definición de la plantilla 'queue_t' acepta un tipo de dato como su primer parámetro; o sea, definiste algo así,

template< typename T >
class queue_t {...};

Espero haber aclarado la duda.

Steven

Milton
2015-05-26 23:07:27

Hola queria ver si me pueden ayudar tengo que hacer este programa en c++

Se desea llevar el control de los estudiantes de la clase.

Los datos a almacenar son: # carné, nombre, edad, carrera.

El programa debe:

A) Solicitar los datos de los estudiantes que el usuario desee registrar

B) Grabar los datos en un arreglo de objetos

C) Tener una opción para imprimir el nombre de un estudiante en función del número de carné (este se solicita al usuario)

D) Tener una opción para imprimir el listado de estudiantes en orden ascendente del número de carné

el problema son los incisos C Y D en el C como hacer para comparar el numero de carnet ingresado con los de la base de datos digamoslo asi y en el D como comparar todos los carnet ingresados para ordenarlos.

De ante mano gracias por la ayuda

Nadia
2015-05-27 08:21:20

Hola !!

Necesio ayuda con este programa

soy nueva en esto de la programacion &' no entiendo nada

Realizar un programa utilizando estructuras.

Se deberan agregar:

-20 alumnos

. mas de 20 alumnos marcar ERROR

-nombre

-matricula (4 digitos)

. + 4 digitos marcar ERROR

-calificacion

. + de 9 alcanzo beca

. - de 9 no alcanzo beca

. si agregas 12 de calificacion ERROR

. SI AGREGAS -1 de calificacion ERROR

Espero me puedas ayudar con el codigo, graciias !!!

javier
2015-07-31 19:50:51

me aparece el siguiente error al pasar por parametro una cadena:

char cadena[15];

void referencia(char *ptr[15]);

main(){

cadena="admon.bin";

referencia(char *ptr[15]);

getch();

return 0;

}

javier
2015-07-31 19:53:18

perdon este es el codigo, me equivoque:

char cadena[15];

void referencia(char *ptr[15]);

main(){

cadena="admon.bin";

referencia(*ptr[15]);

getch();

return 0;

}

void referencia(){

printf("\n%s",cadena);

}

javier
2015-07-31 19:56:13

el error que me aparece dice:incompatible types in assignment of `const char[10]' to `char[15]'

char cadena[15];

void referencia(char *ptr[15]);

main(){

cadena="admon.bin";

referencia(*ptr[15]);

getch();

return 0;

}

void referencia(char palabra[15]){

printf("\n%s",palabra);

}

Steven R. Davidson
2015-08-11 17:48:49

Hola Javier,

El mensaje del compilador hace referencia a esta sentencia:

cadena="admon.bin";

No puedes asignar una cadena a otra de esta manera, porque un array es tratado realmente como una dirección constante de memoria.

Hay dos posibles soluciones:

1. Copia carácter por carácter de una cadena a otra, incluyendo el primer carácter nulo, el cual indica el final de la cadena. Por ejemplo,

cadena[0] = 'a';
cadena[1] = 'd';

y así sucesivamente. También podrías usar la función estándar, 'strcpy()', declarada en <cstring>; por ejemplo,

strcpy( cadena, "admon.bin" );

2. Declara 'cadena' como un puntero para apuntar a tal cadena literal; esto es,

const char *cadena;

cadena = "admon.bin";

De todas maneras, tienes algunos errores más en este código fuente:

- No es un error, pero es MUY recomendado no definir variables globales; siempre procura usar variables locales. Existen demasiados peligros asociados a variables globales.

- En C++, 'main()' debe definir explícitamente el tipo de 'int' de retorno. En C, era implícito, pero creo que en el estándar actual ya no es así; se debe hacer explícitamente.

- Escribes,

referencia(*ptr[15]);

Sin embargo, no has definido 'ptr' y por tanto es un error.

- Defines 'referencia' pero su firma no es igual a su prototipo que escribiste previamente:

void referencia(char *ptr[15]);

no es igual a,

void referencia(char palabra[15])

Sospecho que quieres pasar una cadena de caracteres, por lo que acepta un array de 'char'; esto es,

void referencia( char ptr[15] );

int main()
{
  ...
}

void referencia( char palabra[15] )
{
  ...
}

Espero que esto aclare las dudas.

Steven

Sonia
2015-08-23 04:05:06

Quiero agradecer por que esta pagina exista, me ha ayudado mucho en mis clases de programacion ya que estudio a distancia, pero aqui la explicacion es muy detallada.

Muchas gracias

daniel
2015-12-20 17:56:03

Hola tengo un problema y es que al querer compilar me dice undefined reference y es que tengo un fichero.h y su fichero.cpp que estos si me funcionan pero al querer crear un fichero main para hacer que desde el main que lo he llamado Principal.cpp me da este error. He puesto en principal:

#include <stdio.h>

#include <stdlib.h> y ahora he puesto:

#include "Calendario.h"

pues bien quiero que desde la clase Principal pueda acceder a la clase Calendario que tiene su correspondiente cpp implementada y que funciona. He leido que hay que configurar en donde pone setting y tal pero no se como hacerlo. Muchas gracias

Steven R. Davidson
2015-12-21 17:32:06

Hola Daniel,

Esto depende del compilador y hasta cierto punto el entorno de desarrollo (IDE). Por esta razón uno SIEMPRE debe crear un proyecto, por muy sencillo que sea el código fuente.

Si usas Code :: Blocks, en el menú "Project" (Proyecto), elige la opción "Build options" (Opciones de construcción). En el cuadro de diálogo, elige la pestaña "Linker settings" (ajustes del enlazador). Debajo del cuadro titulado "Link libraries" (bibliotecas de enlazado) pulsa el botón denominado "Add" (agregar). Busca el fichero objeto - posiblemente "calendario.o" - que quieres agregar al proyecto. Pulsa "OK". Ahora vuelve a reconstruir el proyecto: Build -> Rebuild.

Espero que esto te sirva.

Steven

Mik
2016-01-10 00:18:17

Solo me resta agradecer tu curso me a sido de mucha ayuda en las dudas que he tenido como manejar C++

Alexander Cuenca
2016-07-19 22:20:13

***Sistema de ventas de entradas al cine***

Usando estructuras de datos, crear un sistema que permita ingresar y visualizar las siguientes opciones para la venta de entradas a un cine

(1) Ingresar venta

(2) Mostrar total de ventas

(3) Mostrar venta más alta

(4) Salir

Elija su opción:

La opción 1 permitirá registrar 1 venta, para lo cual se pedirá la cantidad de boletos que desea, indicando si son normales ($8), menor de edad o adulto mayor ($4) o d-box ($15) -tomando en cuenta que para esta localidad no hay descuentos-; calculando y mostrando el total de esa transacción. Cada vez que se ingrese a esta opción, se deberá visualizar el total de entradas disponibles al momento.

La opción 2 permitirá mostrar el total de todas las transacciones hechas al momento.

La opción 3 permitirá mostrar el detalle de la transacción que más haya costado.

La opción 4 permitirá salir del sistema, mostrando el nombre y paralelo del creador del sistema.

Adicionalmente, tomar en consideración que la cantidad de asientos normales es de 175 y de asientos d-box de 25.

Las opciones 2 y 3 no se podrán habilitar si no se ha ingresado ventas.

El menú de opciones volverá a cargar luego de haber realizado la acción de cada opción.

La opción 1 tendrá una limitante: la cantidad de boletos, ya que si se llega al tope de boletos disponibles el proceso deberá detenerse y deshabilitarse.

¿Me podrían ayudar con esto? por favor

steven
2016-09-06 01:19:10

BUENAS NOCHES

soy estudiante de ingenieria y el profesor del area de programacion nos dejo el siguiente programa para hacer en c++:

programa que digite el nombre de una persona y lo imprima en numeros del 1 al 5. es decir que cambie las vocales del nombre por numeros del 1 al 5:

EJM: ANDRES =1NDR2S

y tambien si ingresa numeros por teclado que los imprima en las 5 vocales

EJM: 2345= EIOU.

aqui esta el codigo en c, pero se que esta mal el uso del while y no se si se usa for:

ayuda por favor,apenas estoy empezando a programar.

#include<stdio.h>

#include<string.h>

main ()

{

int i,n=0;

char b[15];

printf ("digite su nombre\n");

scanf ("%s",&b);

i=0;

while (i<=n)

{

if (b[i]=='a')

{

b[i]='1';

}

if (b[i]=='e')

{

b[i]='2';

}

if (b[i]=='i')

{

b[i]='3';

}

if (b[i]=='o')

{

b[i]='4';

}

if (b[i]=='u')

{

b[i]='5';

}

i++;

}

i=0;

while (i<=n)

{

scanf ("%s",&b[i]);

if (b[i]=='1')

{

b[i]='a';

}

if (b[i]=='2')

{

b[i]='e';

}

if (b[i]=='3')

{

b[i]='i';

}

if (b[i]=='4')

{

b[i]='o';

}

if (b[i]=='5')

{

b[i]='u';

}

i++;

}

printf ("su nombre es %s",b);

}

gracias a los que me ayuden.

Steven R. Davidson
2016-09-06 16:30:08

Hola Steven,

Voy comentando a medida que vaya viendo el código fuente.

- Aconsejo usar nombres descriptivos para variables importantes. Por ejemplo, cambia 'b' por 'nombre' o algo parecido:

char szNombre[15] = "";

- No debes usar & con un array de 'char' en la función 'scanf()'. Simplemente, escribe:

scanf( "%s", b );

- Tienes un error lógico en el bucle 'while', que se basa en el valor en 'n'. El problema es que 'n' inicialmente contiene el valor de 0 (cero) y nunca cambia. Lo que te interesa es guardar previamente la cantidad de caracteres en la cadena, para que puedas recorrerla y procesar cada carácter.

Sugiero que asignes a 'n' el valor retornado por 'scanf()'. En general, para una cadena de caracteres, se usa la función 'strlen()', la cual se declara en <string.h> (o <cstring>, en C++), que te hace el cálculo. Sin embargo, al recibir los caracteres por lectura, 'scanf()' ya nos hace esta labor. Esto es,

n = scanf( "%s", szNombre );

- No hay ningún problema en usar un bucle 'while', pero en estos casos de recorridos e intervalos, sí aconsejo usar un bucle 'for'. Esto es,

for( i=0; i<n; i++ )
{
  ...
}

Aquí vemos claramente la información y la lógica necesaria que controla este bucle 'for', dejando el cuerpo del bucle "limpio" de las tareas de su gestión.

- Usas varias sentencias 'if', pero lógicamente, no nos interesa comprobar todas las condiciones, sino solamente la que nos interesa. Una vez encontrada la condición, nos interesa "saltar" todas las demás. Esto se puede hacer con 'if/else'. Por ejemplo,

if( 'a' == b[i] )
  b[i] = '1';
else if( 'e' == b[i] )
  b[i] = '2';
else if (...)
...

Como las condiciones tienen que ver con el valor en 'b[i]' y además los valores a comprobar son constantes, podemos usar un 'switch/case'; a veces es más elegante. Esto es,

switch( b[i] )
{
  case 'a':
    b[i] = '1';
  break;

  case 'b':
    b[i] = '2';
  break;

  case 'c':
    b[i] = '3';
  break;
  ...
}

Recuerda que la sentencia 'switch' hace un salto al caso correcto, pero necesitamos un 'break' al final para hacer el salto hacia fuera de la sentencia 'switch'.

- Luego creas otro bucle 'while', pero hay un error a la hora de usar 'scanf()'. Escribes:

scanf( "%s",&b[i] );

Deberías pasar el array porque eso es lo que indicas a 'scanf()' con el especificador, %s.

De todas maneras, te interesa leer la cadena antes del bucle 'while', no dentro de ello. Esto es,

n = scanf( "%s", szNombre );

for( i=0; i<n; i++ )
{
  ...
}

Espero que esto te oriente.

Steven

juan
2016-09-22 03:53:13

Buenas noches me gustaria su ayuda necesito hacer lo siguiente

Asi es el ejercicio:

Haga un programa utilizando arreglos bidimensionales o con registros donde almacene 5 personas nombre,edad,sexo que muestre un reporte (salida) ordenados por sexo, presente una salida de cuantos menores de edad, cuantos de la tercera edad y cuantos de edad productiva

Reporte por sexo y escojerlo

Reporte solo menores de edady otras edades

Alex Guillermo
2016-10-03 14:25:42

¿Cómo puedo programar una struct con un número indeterminado de campos? Por ejemplo, una "struct" (entiendo que al ocupar un espacio fijo en memoria debe hacerse mediante otro procedimiento, una clase o template, quizá) que, después de leer un archivo con n campos, se dimensione como una struct de n campos

Confío en haberme explicado, muchas gracias

Enhorabuena por el curso

maycol rodriguez
2016-10-26 03:19:54

Hola, muy buenos días me gustaría que me ayudaran con este problema, soy nuevo en esto y por mas que e intentado no he podido les agradecería.

Se necesita un programa que elabore las facturas de los productos que se venden en una feria de libros, el cual registre cantidad, libro y precio de venta. A continuación se listan los textos que se encuentran disponibles, por lo tanto solo se pueden registrar esos productos:

Libro 1 $10000

Libro 2 $20000

Libro 3 $30000

Libro 4 $40000

Libro 5 $50000

La factura debe incluir lista de productos vendidos y cantidad a pagar. Además el programa debe permitir la consulta del valor de un producto.

rivera
2016-10-26 03:26:54

tengo un programa que no me sale ya lo intente de distintas formas pero no me da si alguien pudiera ayudarme se lo agradecería es el siguiente:

Obtener el promedio de general de un alumno que lleva 6 materias y en cada materia se

compone de lo siguiente:

3 exámenes parciales (50 % de la calificación final)

1 proyecto final (20% de la calificación final)

1 examen departamental (30% de la calificación final)

Imprimir el promedio de cada materia y el promedio general del alumno.

Utilizar una estructura while

angel
2016-11-17 00:27:05

hola ayuda con este Realizar un programa que mediante estructuras llene la información de n cantidad de estudiantes con nombre, apellido, edad y carrera. El programa debe mostrar la cantidad de estudiantes por carrera, si hay dos o más personas con la misma edad y en que posiciones se encuentran

#include<stdio.h>

#include<stdlib.h>

typedef struct estudiantes

{

char nombre [20];

char apellido [20];

int carrera;

int edad;

};

int main (){

struct estudiantes estu[50];

int n, nestudiantes,edad2;

int contsistema=0, contagronomia=0,contaturismo=0;

float sistemas,agronomia,turismo;

printf("\n**Ingrese la Cantidad de Estudiantes Porfavor**:");

scanf("%d",&nestudiantes);

for(n=0;n<nestudiantes;n++){

printf("\n**Ingrese el Nombre del Estudiante [%d]:",n+1);

scanf("%s",estu[n].nombre);

printf("\nIngrese el apellido del estudiante [%d]:",n+1);

scanf("%s",estu[n].apellido);

printf("\n Ingrese la Edad del Estudiante [%d]:",n+1);

scanf("%d",&estu[n].edad);

if(estu[n].edad=edad2){

edad2=estu[n].edad;

edad2=n;

}

printf("\nIngrese el Carrera:\n 1 sistema\n 2 agronomia\n 3 turismo\n:");

scanf("%d",estu[n].carrera);

}

if(estu[n].carrera=1){

contsistema=contsistema+1;

}

if(estu[n].carrera=2){

contagronomia=contagronomia+1;

}

if(estu[n].carrera=3){

contaturismo=contaturismo+1;

}

printf("\n la cantidad de estudiantes en sistema es %f",estu[n].contsistema);

printf("\n la cantidad de estudiantes en agronomia es %f",estu[n].contagronomia);

printf("\n la cantidad de estudiantes en turismo es %f",estu[n].contaturismo);

system("PAUSE");

return 0;

}

The_RiPPeR
2017-05-08 16:39:33

men el ejemplo no se ve el signo ~ y la definición de el contructor fuera su declaración de realiza como si fura un variable global, así es como se debe tomar los elementos a la hora de definirlo fuera de su declaración.

-recuerda lo del código de seguridad esta molesto enviar un comentario.

-visita el sitio de https://www.programarya.com/Cursos/C++ y mira como el lo explica aunque el curso se queda demasiado superficial tiene un método un poco más didáctico.