Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Tipos de datos para usar espacio, letras y numeros

Estas en el tema de Tipos de datos para usar espacio, letras y numeros en el foro de C/C++ en Foros del Web. Hola, pues miren tengo que hacer el siguiente programa: Lea estos datos Nombre Edad Domiclio Genero si es Mujer:ingresa 3 numeros y multiplicalos si es ...
  #1 (permalink)  
Antiguo 23/09/2014, 21:44
 
Fecha de Ingreso: diciembre-2012
Ubicación: Jardim Alegre
Mensajes: 25
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta Tipos de datos para usar espacio, letras y numeros

Hola, pues miren tengo que hacer el siguiente programa:
Lea estos datos
  • Nombre
  • Edad
  • Domiclio
  • Genero
si es Mujer:ingresa 3 numeros y multiplicalos
si es Hombre: Ingresa 3 numeros y sumalos
Al final debo de imprimir el resultado mas todos los datos que metieron.

Ya lo tengo terminado, pero hay cosas que no se como van, por ejemplo en el nombre uso el tipo de dato char, pero cuando pongo un espacio se salta hasta donde pide el genero, osea si pongo todo el nombre sin espacios si continua normal, luego en el domicilio, deben ingresar letras y numeros, pero que tipo de datos se usa para poner ambos? se que char es solo para texto e int solo para numeros pero cual usan para combinar letras y numeros?
Y por ultimo a la hora de imprimir los datos no me imprime mas que los numeros, pero no los otros, supongo que arreglando el tipo de dato o variable ya podre con eso, espero me entiendan, les dejo mi codigo.
Gracias de antemano

Código:
#include <stdio.h>
int main (void)
{
	int e,g,x,y,z,re;
	char n ,d; 
printf("Introduce tu nombre: ");
scanf("%s", &n);
printf("Introduce tu Edad: ");
scanf("%d", &e);
printf("Introduce tu Domicilio: ");
scanf("%s", &d);

printf("Presiona 1 si eres mujer, presiona 2 si eres hombre");
scanf("%d", &g);
if(g==1){
printf("Ingresa un numero: ");
scanf("%d", &x);
printf("Ingresa otro numero :");
scanf("%d", &y);
printf("Y otro mas: ");
scanf("%d", &z);
re=x*y*z;
printf("El resultado es: %d\n", re);
printf("Tus datos son: \n");
printf("\tNombre: %s\n", n);
printf("\tEdad: %d\n", e);
printf("\tDomicilio: %s\n", d);
}

if(g==2){
printf("Ingresa un numero: ");
scanf("%d", &x);
printf("Ingresa otro numero: ");
scanf("%d", &y);
printf("Y otro mas: ");
scanf("%d", &z);
re=x+y+z;
printf("El resultado es: %d\n", re);
printf("Tus datos son: \n");
printf("\tNombre: %s\n", n);
printf("\tEdad: %d\n", e);
printf("\tDomicilio: %s\n", d);

}
return 0;
 
}
  #2 (permalink)  
Antiguo 24/09/2014, 22:57
 
Fecha de Ingreso: diciembre-2012
Ubicación: Jardim Alegre
Mensajes: 25
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tipos de datos para usar espacio, letras y numeros

Enserio es tan dificil lo que puse? ayuda :(
  #3 (permalink)  
Antiguo 25/09/2014, 05:12
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Tipos de datos para usar espacio, letras y numeros

En realidad no es tan dificil; el problema está en que no tienes claras algunas cosas.

P.ej. cada letra se simboliza por un char, y cada grupo de letras se simboliza como grupo de chars; traducido signifnica que si quieres guardar una palabra (en este caso el nombre de una persona) tienes que proveer un conjunto de chars:

Código C:
Ver original
  1. char palabra[256];

En este caso la variable 'palabra' es capaz de albergar 255 letras (incluidos espacios) mas el \0 final. En tu codigo estas intentando guardar el nombre en un array de 1 caracter, y ya puedes imaginar que no funcionará de la forma esperada.

Otra cosa, las funciones hacen determinadas operaciones que puedes encontrar definidas en cualquier manual de C, algunas operan de una forma concreta, otras de otra. En el caso de escanear datos de teclado usando scanf siempre queda como residuo de la stdin el return que picaste para aceptar la entrada. Te lo comento muy por encima: el stdin funciona como una pila fifo (el primero que entra es el primero que sale). Esta funcion scanf lee (y quita) caracteres del stdin hasta encontrar un espacio o un salto de linea (el enter es un salto de linea). Por eso cuando haces scanf de un texto siempre queda un \n como primer caracter del stdin para la siguiente operacion o lo que hubiere a continuacion del primer espacio del text (en tu caso entras un nombre con espacios, lee hasta el primer espacio dejando el apellido y el salto de linea, despues escaneas un entero que no enuentra el formato indicado y lo descarta). Puedes usar otra funcion de escaneado de texto para leer espacios y purgar los saltos de linea, por ejemplo gets.

Junto con lo anterior tienes los argumentos y los modificadores (o formateadores o como se llamen) que envias a las funciones scanf y printf. El modificador %s implica que vas a proporcionar un array de caracteres, pero en ambos casos tu les estas proporcionando un solo caracter, y como el compilador te daba fallos pusiste un puntero al caracter para que dejara de quejarse:

Código C:
Ver original
  1. char n;//un caracter
  2. scanf("%s", n);//aqui te da error y lo solucionas con un &
  3. scanf("%s", &n);//aqui te compila bien pero no funciona como esperas
  4. printf("%s", n);//aquí tienes un violacion de segmento

Y por ultimo pero no menos importante es el indentado del codigo; es una buena practica agrupar e indentar tus lineas de codigo por dos motivos: facilidad de lectura para ti, y facilidad de lectura para los demas. En este caso has visto como tu codigo mal indentado ha espantado a qualquier forero que pudiera haberte ayudado con esto. Tambien influyen los nombres de las variables, si quieres una variable para el nombre es mejor llamarla 'nombre' o 'str_nombre' que 'n', de esta forma un simple vistazo a la variable y ya sabes que contiene (o que se espera que contenga); por lo mismo los nombres de las funciones tienes que ser lo maximo de significativos posible (en tu codigo no tienes ninguna de propia, pero acuerdate de esto que te comento para cuando llegue el caso).

Personalmente creo que deberias repasar tus apuntes de C, concretamente estas partes de arrays de caracteres (y topos de datos en general, siempre viene bien), y tambien deberias echar otro vistazo a las referencias de las funciones que estas usando, para ver como funcionan y que esperan que les envies. En internet encontraras todo esto y mas que te será de utilidad.

Vamos, no te tomes a mal mis criticas y echale ganas de aprender a programar, que este ejercicio no tiene que ser ningun obstaculo para continuar con tus ejercicios. Ni tampoco te pongo la solucion, que se supone que debes encontrarla sin problemas.

Saludos
vosk

Última edición por vosk; 25/09/2014 a las 05:30
  #4 (permalink)  
Antiguo 27/09/2014, 15:26
 
Fecha de Ingreso: diciembre-2012
Ubicación: Jardim Alegre
Mensajes: 25
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tipos de datos para usar espacio, letras y numeros

Muchas gracias, mi profesora de fundamentos de programacion no me enseño muy bien por lo que he recurrido a ustedes, ya pude los espacios usando gets, pero lo que para ahora es que al imprimir los datos que puese anterioremente solo imprime o el texto o solo numeros, cual seria el dato para combinar ambos, alguna pagina donde lo explique para principiantes.
Saludos y gracias
  #5 (permalink)  
Antiguo 27/09/2014, 16:20
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Tipos de datos para usar espacio, letras y numeros

"...solo imprime o el texto o solo numeros..."

Tienes que combinar los formateadores de texto y de entero. Te pongo una pequeña ayuda, pero no la copies/pegues sino que leela y entiende que hace cada cosa:

Código C:
Ver original
  1. char frase[256];//declaras un buffer para texto (256 caracteres = 255 caracteres + \0)
  2. int numero;//declaras un buffer para un entero
  3.  
  4. //solicitas un texto y lo lees en el buffer de texto
  5. printf("Escribe una frase: ");
  6. gets(frase);
  7.  
  8. //solicitas un entero y lo lees en el buffer de entero
  9. printf("Ahora escribe un numero: ");
  10. scanf("%d", &numero);
  11.  
  12. //muestras lo leido
  13. printf("Frase=%s\nNumero=%d\n", frase, numero);

Hasta aquí todo ok? Si hay algo que no te queda claro ahora es el momento de preguntarlo.

Suerte con eso.

Saludos
vosk
  #6 (permalink)  
Antiguo 27/09/2014, 21:09
 
Fecha de Ingreso: diciembre-2012
Ubicación: Jardim Alegre
Mensajes: 25
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Tipos de datos para usar espacio, letras y numeros

Ya entendi, todo estaba a la hora de imprimir mostrar texto y numero separado por diagonal, gracias vosk y es todo por ahora, algun dia quisiera ser como vos.
  #7 (permalink)  
Antiguo 28/09/2014, 03:41
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Tipos de datos para usar espacio, letras y numeros

Buenas,

Solo apuntar que la función gets no debería usarse jamás. Es insegura ya que no controla el tamaño del buffer y se puede desbordar. Esto puede causar errores inesperados y difíciles de depurar y además permite ataques de tipo buffer overflow.

De hecho, esta función ha sido definitivamente eliminada del standar C en la la revisión C11.
http://en.wikipedia.org/wiki/C11_(C_standard_revision)


Deberías usar fgets o s_gets en su lugar.


Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: char, float, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:41.