|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - betopin
26
« en: Domingo 13 de Septiembre de 2009, 21:03 »
27
« en: Domingo 13 de Septiembre de 2009, 20:33 »
Para el color lo podrias hacer con system(color)...no es muy bonito que digamos, pero puedes modificar el color de los caracteres y el fondo...para lo otro, podrias hacer algo asi como
if (scanf("%i",&dato)!=0) printf("Error");
No es el metodo ideal pero puede servir
Saludos
28
« en: Domingo 13 de Septiembre de 2009, 20:19 »
mmm...ya probaste en google?
29
« en: Domingo 13 de Septiembre de 2009, 20:14 »
//Leer la cadena de caracteres que se va a evaluar. //Tomar el tama¤o de la cadena. {printf("nnError digite una opci¢n valida.");} }while(Sigue!=0);
}
El problema reside en la manera como capturas la cadena. Con scanf no puedes capturar espacios. Lee un poco al respecto. Tendras que utilizar otros metodos como por ejemplo el comando gets(). Saludos
30
« en: Miércoles 29 de Abril de 2009, 03:32 »
se usa *buscar en vez de buscar y porque se usa *p en vez de p[] la defino *buscar porque debes retornar un puntero que para el caso es un puntero a una estructura y *p...bueno eso, segun lo que plantean en el enunciado que pusiste podrias tambien manejarlo como p[], la cuestion es recibir los datos de la estructura... En mi caso concreto no estoy acostrumbrado a declarar parametros de esa forma sino que prefiero siempre definir el puntero en propiedad...aunque cuidado, recuerrda que si vas a usar punteros a estructuras, ya sea fuera o dentro de la funcion tendras que utilizar el operador -> Saludos
31
« en: Martes 28 de Abril de 2009, 06:27 »
excelente!! eso queria saber!!... osea ke limpio el buffer tantas veces como "gets" use? Si o captures caracteres con scanf(); Saludos
32
« en: Martes 28 de Abril de 2009, 06:20 »
Evidentemente ese ejemplo esta mal porque, en caso de funcionar, solo estas retornando uno solo de los campos de la estructura y no todos los que necesitas de un solo articulo. La funcion deberas de definirla de otra forma y tendras que utilizar probablemente el operador flecha Te dejo un ejemplo para que te guies #include <stdio.h> #include <stdlib.h> struct agenda { char apellido[30]; char nombre[30]; char telefono[30]; int edad; }datos[3],*dat; struct agenda *suma(struct agenda *total) { int pos; for (pos=0;pos<3;pos++) if (((total+pos)->edad)>10) return (total+pos); } int main() { int a,val=0; for (a=0;a<3;a++) { printf("Ingrese el apellido del sujeto #%i: ",a +1); scanf("%s",datos [a ]. apellido); printf("Ingrese el nombre del sujeto #%i: ",a +1); scanf("%s",datos [a ]. nombre); printf("Ingrese el telefono del sujeto #%i: ",a +1); scanf("%s",datos [a ]. telefono); printf("Ingrese la edad del sujeto #%i: ",a +1); scanf("%i",&datos [a ]. edad); } for (a=0;a<3;a++) { printf("Nombre: %s %s, Telefono: %s, Edad: %in",datos [a ]. apellido,datos [a ]. nombre,datos [a ]. telefono,datos [a ]. edad); if (datos[a].edad>10) val=1; } if (val==1) { dat=suma(datos); printf("Nombre: %s %s, Telefono: %s, Edad: %inn",dat ->apellido ,dat ->nombre ,dat ->telefono ,dat ->edad ); } return 0; }
En el, capturo los datos de 3 personas e imprimo la primer persona que encuentra con edad mayor a 10 años. Mira que devuelvo todo a traves de un puntero a la estructura Saludos
33
« en: Martes 28 de Abril de 2009, 02:12 »
Quizá utilizar el valor de retorno no es la mejor opcion ya que el manejo de errores no se asegura en un 100%. Es preferible manejar el dato ingresado como una cadena de caracteres, validar ascii a ascii lo ingresado y en caso de exito utilizar atoi para convertir el dato en un numero...incluso existen comandos que validan si lo ingresado es numero o letra
Saludos!
34
« en: Martes 28 de Abril de 2009, 02:06 »
Hay dos opciones para que no hayan saltos 1) Limpiar el buffer y luego capturar Ej: 2) Usar getchar (Que para el caso funciona como un filtro) y capturar Ej: El problema en ambos casos es el mismo, se queda el caracter 'n' en el buffer en una captura de datos previa y al realizar el intento de una nueva captura tal caracter se libera Saludos
35
« en: Viernes 24 de Abril de 2009, 15:45 »
Cuidado con esto if (l[i].existencia !=0) { return "SIn"; ban=1; }
Si se llega a cumplir la condicion, se regresará a main pero ban jamas tendra el valor de 1. Intercambia el orden Saludos
36
« en: Viernes 24 de Abril de 2009, 06:39 »
Upsss....no habia visto el segundo codigo que posteaste. Tiene bastantes diferencias que el primero, sorry en verdad!!!...no habia notado la diferencia!!!! Bueno varias cosas que ya este tema esta bastante largo, jeje 1) En cuanto a los getchar(). Si vas a detener la ejecucion del codigo es mejor que manipules system("pause") con la libreria stdlib.h y si vas a capturar caracteres con scanf. Esto le dara mas claridad a tu codigo. 2) En cuanto a los while, el que defines en carga datos Este te aconsejo lo modifiques...si el usuario por ejemplo ingresara 'k', lo cual es un error, el ciclo dejaria de ejecutarse 3) La dichosa funcion void.... Ha sido error mio porque no he sido absolutamente claro con la explicacion de la misma y creo que en algo te he confundido porque supuse que conocias sus usos. Me explico void la puedes definir de dos formas Caso 1) void suma (int a, int b) { }
Cuando defines a void de esta forma, estas declarando que no se regresarán valores de tal función. Esto explica el error que te genera con el return i Caso 2) int suma (void) { int a=1,b=2; return a+b; }
En este caso, con void estas declarando en tu funcion, que esta no recibe parametro alguno pero date cuenta que devuelve datos. Por eso comentaba en mensajes anteriores que dependiendo como se declarara, void devolveria o no valores. Espero que con esto que acabo de señalar quede mas claro el tema del void. Ahora bien, si ves el esquema que te propuse hay dos cosas importantes: La funcion que yo señale es de tipo int (teniendo presente el primer codigo posteado) y en main inicializo la variable cant_lib en cero Esto ultimo lo he enfatizado en varios mensajes pero creo que aun no has caido en cuenta de la importancia de que esta se inicialice. Como estaba en el primer codigo que escribiste se inicializaba en la funcion, lo cual sobreescribiria los datos previamente ingresados cada ves que se invocara la funcion... en el segundo codigo ya no lo inicializaste en ninguna parte, asi que a la funcion llegara un valor indeterminado en donde empezara a guardar los valores el array de estructuras y asi seguira por siempre Confio que con esto ya quede mas claro que el agua y disculpa por mi ligereza en el mensaje anterior pero realmente no habia observado los cambios del segundo codigo Saludos!!!
37
« en: Viernes 24 de Abril de 2009, 03:39 »
Tu codigo sigue teniendo fallos, debes decantarlos. Mira por ejemplo la variable c en la funcion carga datos y en main. La defines como un entero pero capturas caracteres, los while como los mencione en mensajes anteriores no son correctos ya que no funcionaran como esperas, los return donde devuelves texto deberas corregirlos, asi como inicializar en ceros la variable que pasaras a la funcion para controlar la estructura
Te aconsejo decantes a profundidad tu codigo y prestes atencion al esquema que te propse en el mensaje anterior
Saludos
38
« en: Viernes 24 de Abril de 2009, 01:43 »
Bien, lo que hiciste en el primer ejemplo puedes hacerlo exactamente igual en la funcion void que definiste en el primer codigo que escribiste. El punto es que la variable con la que manipulas los indices del array de estructuras debe ser inicializado en cero en main e irse modificando en la funcion acorde a la cantidad de datos que desee ingresar el usuario. Tal dato (indice de la estructura - variable i en tu codigo) deberas retornarlo al final de la funcion a main para no perder el indice en el que vas. Tal como tienes el programa, los datos ingresados previamente se perderan ya que a pesar de que estas manipulando la estructura a traves de un puntero, el indice de esta siempre comienza en cero acorde a la definicion de i que tiene tu primer codigo en la funcion. Asi que si el usuario desea volver a escribir datos en la estructura tras haber previamente invocado a la funcion y haber ingresado datos, lo que hara es sobreescribir lo ya ingresado. Lo ves???....Es decir...lo que debes hacer es algo asi # include <stdio.h> # include <string.h> # define sub 1000 struct libreria { char codigo[7]; char titulo[15]; char autor[25]; char editorial[15]; int existencia; float precio; }; int carga_datos (struct libreria *l,int cant) { int i=cant; int j; char c; do { // Lineas y mas lineas de codigo..... // Mas lineas ++i; // Lineas y mas lineas de codigo..... // Mas lineas return i; } main() { int cant_lib=0; char c; struct libreria libros[sub]; do { switch (c) { case 'a': cant_lib=carga_datos(libros,cant_lib); break; // Lineas de Codigo // Mas lineas de codigo // ..... }
Saludos!!!!
39
« en: Viernes 24 de Abril de 2009, 00:39 »
bien, lo que haga en una funcion muere al cuncluir esta. el tipo void es un caso especial de funcion en el cual no muere nada de lo que haga? osea ke utilizando el tipo void puedo cambiar valores de variables que estan en main usando o no punteros?... ahi entendi bien?
ahora tengo el nuevo codigo de mi programa y presento un nuevo problemilla... - al ingresar un titulo de un libro digamos "COMO HACER UN PROGRAMA", utilizando scanf, me toma los espacion como fin de cadena o algo asi... por lo tanto tengo que utilizar el gets (que gracias a betopin ahora sé que esta funcion corresponde a c ), pero... como se usa??. aca va el codigo, diganme como reemplazarian los scanf por los gets.
les comento que el programa en la funcion consultas (opcion b) debe recibir un titulo y un autor y de tener stock disponible, devolver a main la cadena "si" y de lo contrario "no hay stock", les comento por si ven algun error para corregir, o algun metodo mas adecuado que yo no haya utilizado.
muchisismas gracias y espero sus respuestas!!!
pd: van a ver muchos getchar() que no tienen sentido, es que los uso para pausar el programa y ver los resultados  Hola No se si no me he hecho entender bien con lo de void, jejeje. Esta es un tipo de funcion cualquiera...es decir, lo que haces en ella...muere en ella (obviamente me refiero en cuanto a las variables que declaras alli y las operaciones que realices con estas), sin embargo, en esta tu puedes retornar lo que desees...un entero, un caracter, un float....o por el contrario nada. Logicamente esto que retornas es lo que manipularas en main. Esto quiere decir quer mientras en una funcion tipo int, char, etc estas obligado a devolver un dato acorde al tipo de funcion que defines, en las void lo puedes o no hacer. No existe obligatoriedad de retornoEn cuanto a gets su uso es simple. Si tienes un array, por ejemplo, cadena[50], para caprurar la cadena simplemente tendras que hacer gets(cadena); y listo....sin embargo ten cuidado ya que si la cadena que se intenta ingresar sobrepasa el tamaño del array, poseerás problemas Saludos
40
« en: Jueves 23 de Abril de 2009, 21:13 »
Excelente!, a ver si entendi bien... osea que si uso una funcion del tipo void, esta me va a modificar de manera permanente una variable que este en main. y si utilizo una funcion que devuelva un solo valor (del tipo int ), solo va a modificar la variable en la funcion y no en main?
aqui va el nuevo codigo, estoy haciendo la parte b del programa, asique les voy a hacer algunas preguntas: - para ingresar un titulo de un libro que contiene espacios, debo usar gets? - o gets se usa para c++?! Varias cosas 1) Lo que hagas en una funcion muere al concluir las operaciones a realizar en esta a menos de que uses punteros o que retornes los datos. El caso void es un caso especial de las funciones ya que con esta puedes o no retornar valores 2) El usos de gets es C, en C++ (que tambien se puede usar), se utiliza normalmente la clase string Saludos
41
« en: Jueves 23 de Abril de 2009, 06:43 »
Respondiendo a tu interrogante, podria ser pero no es estrictamente necesario..Aparte de que tu variable determina la cantidad de libros, esta determina igualmente el indice en que el array de la estructura va, que en la funcion lo defines como i. Esto quiere decir, que la variable que defines desde main como cant_lib en la funcion debe transformarse a i. Sin embargo, como"salvas" el valor ...sea manipulandolo atraves de un puntero o retornando el dato desde la funcion hacia main lo defines tu. Desde una funcion tipo void igualmente puedes retornar datos. Hay que aclarar, que este dato tendras que inicializarlo una sola ves y tendras que hacerlo en main. Hay otras cosas en tu codigo 1) Al manipular estructuras con punteros, el operador para acceder a los campos no es punto (.) sino flecha (->). Esto quiere decir que todas las operaciones que estas realizando en la funcion, tanto de captura como de impresion de datos debes corregirlas 2) Las condiciones de los bucles estan mal. La de main deberia ser y la de la funcion 3) Eso quiere decir que dentro del switch o en su defecto con if - else deberas adecuar las condiciones que definan datos que no esperan que se ingresen para el correcto funcionamiento del codigo: Por ejemplo que se ingrese z en el menu principal 4) No te aconsejo que captures datos con un getchar. Para eso se encuentran comandos como scanf que estan diseñados para el caso y con el que puedes manejar un cierto control de errores 5) Al capturar cadenas de caracteres, sobra & Saludos
42
« en: Lunes 20 de Abril de 2009, 16:52 »
Podrias validar el valor de retorno de scanf al capturar un dato. Como sabes, al capturar valida que lo que se ingrese corresponda al tipo de dato y al modificador enunciados en el comando Ej if (scanf("%d", &numero ) == 1) printf("El numero introducido fue %dn", numero );
Quiza pueda servirte Saludos
43
« en: Lunes 20 de Abril de 2009, 06:24 »
Elabora una funcion que valide los ASCIIS ingresados...si estan dentro del rango de numeros lo transformas con el atoi, sino vuelves y solicitas ingreso de info
Saludos!
44
« en: Domingo 12 de Abril de 2009, 19:00 »
Puedes usar punteros para praticamente todo...de hecho a medida que vayas avanzando en tus estudios veras que son imprescindibles en el uso de ficheros, manejo de listas, entre otros. Su gran fortaleza es el hecho de poder acceder a cualquier dato practicamente en cualquier momento....aunque esto suele muchas veces ser motivo de confusion para quienes aun no estan acostumbrados a su uso, ya que los punteros...como supongo ya sabrás, almacenan direcciones de memoria, no valores
Saludos
45
« en: Domingo 12 de Abril de 2009, 18:51 »
Par cosas Si vas a capturar las cadenas, solo debes de asignar el indice de la fila del array bidimensional, no la columna....ya que lo que estarias intentando hacer es meter toda una cadena de caracteres en una unica pocision de memoria...como si fuera un unico caracter La correcion seria la siguiente # include <stdio.h> # include <stdlib.h> int main () { char nombres[15][20],apellidos[15][20]; int i,j; for (i=0;i<2;++i) for (i=0;i<2;++i) return 0; }
Es importante que tengas presente que es equivalente nombres[i] a &nombres[i][0]
Saludos!!!
46
« en: Domingo 12 de Abril de 2009, 02:01 »
Yo en cada ciclo borraria la pantalla e imprimiria los asteriscos que representen la cantidad de caracteres ingresados...luego si solicitaria caracter
Saludos!
47
« en: Jueves 9 de Abril de 2009, 06:33 »
Lo que copiaste es el codigo del archivo .cpp de tu proyecto que para el caso es normalmente igual en todas las aplicaciones que se generan desde builder (o al menos tiene siempre la misma estructura) El try y el catch debes ponerlo tu pero en cada uno de los .cpp de los forms en donde vayas a manejar las excepciones, que en tu caso es cuando capturas valores de los edits Quiza esto te sirva de guia int n=0; try { n=StrToInt(Edit1->Text); } catch (...) // Si ingreso un caracter diferente a numero entero { Application->MessageBox ("Sólo deben ingresarse números enteros","Error en la entrada de datos", MB_OK); Edit1->Text=" "; }
Saludos!
48
« en: Jueves 9 de Abril de 2009, 06:17 »
Porque está mal. De hecho deberia marcarte error. El comando toupper asi como tolower modifican caracter a caracter, no una cadena completa El ejercicio corregido es asi #include <stdio.h> #include <ctype.h> #include <stdlib.h> int main() { char palabra[20]; int a=0; while(palabra[a]!=' ') { a++; } return 0; }
Saludos
49
« en: Jueves 9 de Abril de 2009, 02:48 »
Revisa los comandos de la libreria ansi c string.h
Saludos
50
« en: Miércoles 8 de Abril de 2009, 20:25 »
Tu problema esta aca taula[50][30]=*cad[50]; ordenar(n,cad); printa(n,cad);
En cad, previo a esas lineas no hay nada asi que la asignacion que estas haciendo almacena basura y los punteros que estas manejando en las funciones estan apuntando a arrays inexistentes Saludos
|
|
|