Inicio > Foros
- Foros
- Varios
- Off-Topics Informáticos
- Alguien q sepa C++ ¿?
Resultados 1 al 35 de 35
Tema: Alguien q sepa C++ ¿?
-
05/11/2007, 23:08MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Alguien q sepa C++ ¿?
Ya se que este foro no toca esta parte de la informática, pero bueno, seguro que hay alguien q me pueda sacar d dudas.
bien, tengo un txt en el cual hay lo siguiente:
Juan
Perez
55581953
Soy nuevo en este lenguaje, y tengo que hacer un programa en C++ que me lea los datos. A priori pense que era muy facil, pero no se pq no me funciona bien el programa:
#include <stdio.h>
int main () {
FILE *fp;
char nom[15];
char cog[15];
double dni;
//int letra;
//char tabla[24]="TRWAGMYFPDXBNJZSQVHLKE";
//char letradni;
//int i;
fp = fopen ( "miDNI.txt", "r" );
if(fp==NULL) printf("Error, no es troba miDNI.txt");
fscanf(fp,"%s",&nom);
fscanf(fp,"%s",&cog);
fscanf(fp,"%d",&dni);
printf("%s \n", nom);
printf("%s \n", cog);
printf("%d", dni);
// letra=dni%23;
// letradni=tabla[letra];
// printf("%c \n",letradni);
fclose ( fp );
return 0;
}
Lo que está comentado no le hagáis caso. Leyendo ya sabeis de que va el programa ^^. Pues bueno, compilando y ejecutanto esto obtengo lo siguiente:
C:\TC\BIN>dni.exe
Juan
Perez
7425
Pq me sale un 7425 en vez del 55581953¿? Incluso he probado con un float (el resultado es 0.0000000) o con un long y me da lo mismo. Alguien sabe pq?
Gracias!
-
06/11/2007, 00:05Reiya
- Fecha de ingreso
- 29 jun, 05
- Ubicación
- Geofront (Tokio 3)
- Mensajes
- 432
A mi me funciona como deberia, de todos modos, debes tener en cuenta que el fscanf lee hasta que se encuentra una nueva linea, si en el archivo miDNI.txt al final del dni no pones un salto de linea (un intro vamos) el fscanf leera lo que le de la gana. Otra cosa en el fscanf y en el printf el %d se usa con int (con un int debe sobrarte), para los float usa %f y para el double %Lf (creo).
Esta pagina te vendra bien: http://www.cplusplus.com/reference/
Hasta otra.
-
06/11/2007, 00:06
Inicializa a 0 todo y limpia buffer de teclado.
-
06/11/2007, 00:35MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Lo de limpiar el buffer del teclado no se lo que es, y el resto q me habeis dicho lo he intentado y nada. Añadí incluso algo de texto en la siguiente linea para ver si me hacia algo, pero tp.
Acabo de probar declarando float como dni y poniendo "%f" en vez de "%d" en sus respectivos sitios y si que me lo lee, pero como float, y por tanto me añade: 55581953.000000000
Sinceramente, no lo entiendo -.-
Com0 no sonsiga hacerlo le meto ahora un cast! xDD
-
06/11/2007, 01:46Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
¿Y cogiendo DNI como String? Así puedes además añadir la letra
xDD
El C ya lo tengo muy olvidado, pero bueno, como te han dicho un entero te sobra (hasta 2*10^9 aprox.). De todas formas creo que hay un fallo, y los Double se muestran de la misma forma que los Float, con %f, no con %d (enteros).
También deberías probar el fwrite/fread (en este caso no, ya que el archivo lo creas tu) y el fput/fget.
Por cierto, yo veía más cómodo el D.e.v.C.p.p [sin puntos, error 403] que el TurboC, ¿lo has probado?
Un saludo
-
06/11/2007, 02:34MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
No, no lo he probado. Y uso TutboC más que nada pq és el mismo que usamos en las prácticas de la carrera.
Y lo cogerlo como string ya lo pense, pero tendre que pasarlo con el atoi o con alguna funcion a int, pq no se si se ve muy bien (no esta todo el codigo) pero lo que hare despues es hacer un mod 23, y si pones el resultado en la tabla, la letra resultante es la letra del DNI. Lo que quiero dcir es que necesitare como valor numerico esa variable, para poder interactuar con ella.
-
06/11/2007, 03:17Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
Ajam, pués luego casi mejor intentar cogerlo como integer, ya que a mí personalmente el atoi nunca me entusiasmó... Sí fuese al revés, de int a char no habría complicación.
Yo creo que así:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
FILE *fp;
char nombre[15];
char apellidos[15];
double dni;
int letra;
char tabla[24]="TRWAGMYFPDXBNJZSQVHLKE";
char letradni;
fp = fopen ( "miDNI.txt", "r" );
if(fp==NULL)
{
printf("Error, no se ha encontrado miDNI.txt");
}
else
{
fscanf(fp,"%s",&nombre);
fscanf(fp,"%s",&apellidos);
fscanf(fp,"%f",&dni);
fclose (fp);
}
printf("Nombre: %s \n", nombre);
printf("Apellidos: %s \n", apellidos);
printf("DNI: %d", dni);
letra=dni%23;
letradni=tabla[letra];
printf("- %c \n",letradni);
return 0;
}
A ver...
Un saludo
-
06/11/2007, 08:50
Primer fallo:
- Has abierto el ficheo como lectura, pero al no estar, sacas el error, pero no lo creas!!
quedaría:
if(fp==NULL)
{
printf("Error, no se ha encontrado miDNI.txt");
fopen("miDNI.txt","w");
}
Luego te lo puedo mirar, que no me puedo parar ahora.
Chaoo!
-
06/11/2007, 10:38Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
Quete, de hecho he visto un fallo, pero no ese; el no quiere escribir en el fichero, simplemente leer (por lo menos, de escribir no ha dicho nada). El fallo que he visto es que debería cerrar el else justo antes del return, es decir, no mostrar por pantalla nada más que el error.
De todas formas échale un ojo, por que yo esto lo tengo muy olvidado xD (ahora uso PHP y JS, ni del .Net me acuerdo apenas).
Un saludo
-
06/11/2007, 15:51
Con el DNI basta un "int", que son 32 bits, es decir 2^32 valores de sobre; eso cubre cerca de los 2.000 millones tanto en + como en -
Si no va a escribir fichero se usa scanf y no fscanf, sólo válido para ficheros. Entonces creo que el problema va en eso, en que al no haber creado el fichero, da fallos con fscanf.
Sin ficheros sería:
Código:#include <stdio.h> #include <conio.h> void main (void) { char tabla[]={'T','R','W','A','G','M','Y','F','P','D','X','B','N','J','Z','S','Q','V','H','L','C','K','E'}; int dni,resto; textcolor(LIGHTGREEN); cprintf("Introduce tu DNI, sin la letra: "); scanf("%d",&dni); resto=dni%23; textcolor(YELLOW); cprintf("\n\nEl DNI %d lleva la letra %c",dni,tabla[resto]); printf("\nPulsa cualquier tecla para salir"); getch(); }
Usa primero esto sin ficheros y a ver si te rula. Y el main de toda la vida de Dios, no tiene por qué devolver nada, es el main y punto, se pone el menor código posible, haciendo uso de funciones.
Cuando controles esto, pasamos a los ficheros.
-
06/11/2007, 16:26Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
No me has entendido; no tiene que escribir en el fichero (lo que sería con el fprintf, fwrite, fputs o fputc), sino leer.
La mejor opción, sí antes de leer tiene que escribir en el fichero (es decir, utilizando la aplicación) es utilizar fwrite/fread mediante una estructura de datos.
En el caso de que el fichero lo cree manualmente, fscanf es lo recomendable, siendo más cómodo que fgetc/fgets.
Viendo el código, diría que al menos por ahora es la segunda opción, se trata de leer datos de un fichero de texto debidamente estructurado (por lo que el fread no nos vale), así que queda como mejor opción fscanf.
El fallo de la primera versión que nos ha puesto era que intentaba capturar una variable Double como Integer/Decimal (%d), cuando el método correcto es capturarla como Float (%f). Las opciones son corregir eso, o como dices utilizar un Int, más que suficiente para el número del DNI.
Un saludo
-
06/11/2007, 20:10MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Iniciado por Ly0n
Viendo el código, diría que al menos por ahora es la segunda opción, se trata de leer datos de un fichero de texto debidamente estructurado (por lo que el fread no nos vale), así que queda como mejor opción fscanf.
Iniciado por Ly0n
El fallo de la primera versión que nos ha puesto era que intentaba capturar una variable Double como Integer/Decimal (%d), cuando el método correcto es capturarla como Float (%f). Las opciones son corregir eso, o como dices utilizar un Int, más que suficiente para el número del DNI.
Un saludo
#include <stdio.h>
int main () {
FILE *fp;
char nom[15];
char cog[15];
int dni;
fp = fopen ( "miDNI.txt", "r" );
if(fp==NULL) printf("Error, no es troba miDNI.txt");
fscanf(fp,"%s",&nom);
fscanf(fp,"%s",&cog);
fscanf(fp,"%d",&dni);
printf("%s \n", nom);
printf("%s \n", cog);
printf("%d", dni);
fclose ( fp );
return 0;
}
El resultado q me muestra por pantalla es el siguiente:
C:\TC\BIN>dni
Juan
Perez
7425
Como ya dije antes, la única forma que obtengo un valor "normal", es declarando como "float dni" y leyendo y escribiendo
"/f" respectivamente. En este caso el resultado es:
C:\TC\BIN>dni
Juan
Perez
55581952.000000
Podria aplicarle un CAST y listos, pero no me parece adecuado cuando por logica con un INT bastaria. Y me pica mucho la curiosidad de saber qué está fallando.
-
06/11/2007, 21:17Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
¿Puedes probar a declarar dni como double, sin tocar el resto del código? Sólo para probar una cosa.
Un saludo
Edito: lo olvidaba, tanto en el fscanf como en el printf ponle %f a dni, cuando esté como double.
Otro saludo
-
06/11/2007, 21:25
A mí me funciona a la perfección con este código:
Código:#include <stdio.h> #include <conio.h> void main (void) { FILE *fp; char nom[15]; char cog[15]; int dni; fp = fopen ( "miDNI.txt", "r" ); if(fp==NULL) printf("Error, no es troba miDNI.txt"); else { fscanf(fp,"%s",&nom); fscanf(fp,"%s",&cog); fscanf(fp,"%d",&dni); } printf("%s \n", nom); printf("%s \n", cog); printf("%d", dni); fclose ( fp ); getch(); }
Código:Juan Perez 77854865
-
06/11/2007, 21:33
Iniciado por Ly0n
¿Puedes probar a declarar dni como double, sin tocar el resto del código? Sólo para probar una cosa.
Un saludo
Edito: lo olvidaba, tanto en el fscanf como en el printf ponle %f a dni, cuando esté como double.
Otro saludo
-
06/11/2007, 21:41Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
He probado el ultimo código que tiene, y funciona perfectamente :?
¿Quizás el buffer del teclado? Métele un fflush.
Un saludo
PD: Olvida lo del double xD
-
06/11/2007, 21:45MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
como es eso del buffer del teclado?
-
06/11/2007, 23:03
fflush(stdin)
Limpia el buffer del teclado, pero para leer no creo que sea necesario, aunque C es muy puñetero para estas cosas.
Has probado mi código?
-
07/11/2007, 00:05
El problema creo que puede venir por aquí:
fscanf(fp,"%d",&dni);
Si en el archivo de origen tienen un simple espacio te puede dar un error.
Por eso otros podemos probar el código y como hemos creado un archivo para el caso, que nos salga bien y tú que utilices el txt que tienes y éste tenga algún caracter después del número y te de el error.
Para evitar esos problemas creo que lo mejor sería limitar el número de caracteres que lees a los necesarios para el DNI.
No recuerdo ya como se hacía ni si el fscanf lo aceptaba, pero sería algo así: “%8ld” ... o utilizar scanf.
Un saludo.
-
07/11/2007, 00:09MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
He probado poniendo eso un par de veces y sigue funcionando =.
Respecto a tu codigo, lo he probado y el resultado es el mismo que el mio:
Juan
Perez
7425
Ya empezaré a sospechar que es mi compilador, pero el caso es que en un ordenador de la uni funcionó "solo la primera vez" utilizando un int.
-
07/11/2007, 00:14MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Iniciado por pritt
El problema creo que puede venir por aquí:
fscanf(fp,"%d",&dni);
Si en el archivo de origen tienen un simple espacio te puede dar un error.
Un saludo.
Tb me he dado cuenta que si pongo sólo los 4 primeros dígitos del DNI, es decir: 5558 me los lee a la perfeccion como int. Si pongo una cifra más, ya me los lee mal y el resultado es un numero negativo.
-
07/11/2007, 00:36MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Yo de nuevo! xDD Pues resulta que me he puesto a jugar a la "patata caliente" con el programa y creo que en C++ el integuer no es tan grande como decis! xD (bueno, al menos eso he deducido de los siguiente). He ido probando valores en el dni, asi que el valor maximo que me lee a la perfeccion como integer es el 32767. A partir de aki, es dcir, si pusiera 32768, sería el -32768 al leerse. El 32769 es el -32767, por lo q supongo q el int va del 32767...0...-32768, no? Y si no recuerdo mal en java es lo mismo, qué cabeza la mía! Tendriamos tb el long int, pero no creo q sirviera (seria el doble de 32767 pq no acepta negativos). El siguiente valor ya es el float (q es el unico q me funcionaba)...
Lo q no entiendo es pq todos estamos diciendo que con el int ya tendria suficiente, o nos ekibocamos todos (me incluyo) o aun entiendo menos el problema de mi programa xDDDD
He estado buscando información y en C++ un integer son 2bytes, es dcir, 16bits; 2^16=65536, entonces lo que puse arriba era correcto.
Iniciado por Pagina Web vía Google
1-Un byte es la menor unidad de informacion que pueden direccionar la mayoria de las computadoras. En la mayoria de las arquitecturas el tipo char ocupa un solo byte, por lo tanto es la unidad minima. Un bool admite solo dos valores diferentes, pero es almacenado como un byte. El tipo integer ocupa generalmente 2 bytes, un long 4, double 8, y asi con el resto de los tipos.
-
07/11/2007, 02:05
:lol: :lol: :lol:
... con la iglesia hemos topado.
Realmente C no garantiza un tamaño definido de variable, depende de la arquitectura y del compilador.
Lo único que garantiza es la relación entre un tamaño y otro.
Si lo que dices es así, teóricamente debes de estar trabajando en arquitectura de 16 bits (o el compilador trabaja así), con lo que:
int = 16 bits = 2 ^ 16 = 65536
Si utilizases arquitectura de 32 bits int = 32 Bits, 2 ^32 = 4294967296
Compruébalo en tu caso: sizeof(int).
Son cosas de las que ya no nos acordamos, pero ahí están.
Un saludo.
-
07/11/2007, 02:43MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Pues si, ni yo había caído hasta que fui probando. En prácticas ensamblamos sobre un emulador del viejo Intel 8086, así que debe ser por eso que la versión del compilador tb es en arquitectura de 16b. Por cierto, que deberia darme el sizeof(int)? el valor en Bytes? Me da 2.
Perdonad por el lio, tp yo sabía que estaba trabajando en 16b hasta que probé... No tengo más remedio que declararlo como float.
Me podríais recomendar algun compilador para C++ q no sea demasiado engorroso? Quiero dcir, el eclipse por ejemplo esta muy bien y tal para trabajos grandes, pero prefiero algo similar al TurboC, simple y sencillo. Un solo click y tienes el exe.
-
07/11/2007, 02:58Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
DevC-pp (sin el guión).
Para mí de los más sencillos, interfaz gráfica y cuando quieras compilar y ejecutar, F9. Sin más rodeos. Además, incluye gran cantidad de ejemplo.
Un saludo
-
07/11/2007, 03:09
Iniciado por MacSpawn
que deberia darme el sizeof(int)? el valor en Bytes? Me da 2.
2 bytes = 16 bits
... por lo tanto, arquitectura de 16 bits, el resultado es correcto.
int = 65536
Así que ya sabes donde está el problema
Has de buscar un valor entero más largo. No sé si tu compilador admitirá el long o long long, o le asignas f y luego le quitas los decimales.
Un saludo
-
07/11/2007, 03:24MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Acabo de crear el programa completo, calculando la letra y tal con el compilador que me has dicho, LyOn, y funciona a la perfección. Gracias
Para ir practicando por mi cuenta usaré este, y para prácticastendre que usar el otor, que remedio! :o
-
07/11/2007, 19:03
Me alegro de que lo hayas solucionado.
Te olvidaste de algo fundamental en la programación, la Ley de Murphi. Mi profe de programación siempre nos la recordaba para que no dejásemos nunca de contemplar un posible error.
Un saludo.
-
08/11/2007, 01:47MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Es q es algo tan raro q ni yo me esperaba que a estas alturas me fueran a hacer trabajar con un compilador que trabaja en 16b
-
08/11/2007, 02:49
Es lo que tiene eso de "estudiar", que siempre lo hacen con "algo" que te pueda dar problemas y no puedas averiguar el por qué con la facilidad de los medios actuales.
... yo empecé estudiando Módula-2 porque decían que era un lenguaje muy bien estructurado. Lo gracioso era que en el libro (teoría) te decía una cosa y luego cuando eso lo aplicabas a la práctica, el compilador te decía que naranjas de la China.
El mayor problema venía a la hora de los exámenes: Normalmente te vas a acordar más de lo que has llevado a la práctica que de la teoría, pero en los exámentes exigían que pusieses lo que decía el librito (teoría).
... y no hablemos ya del código máquina, direccionamientos y cosillas de esas, que es para ponerse a llorar directamente, con el agravante de que ¿quién narices lo va utilizar hoy en día?
Un saludo.
-
08/11/2007, 03:06MacSpawn
- Fecha de ingreso
- 15 oct, 07
- Ubicación
- Barcelona
- Mensajes
- 232
Tiene gracia... pq es precisamente esa asignatura. Hasta ahora todo ha sido en ensamblador, pero no se pq hemos cambiado a C++. Sólo se que algo tiene que ver con el 8086 xD. Yo empecé con java, y ahora los q empiezan carrera estudian algo llamado Paiton o algo asi, no lo conozco sinceramente.
-
08/11/2007, 03:06Ly0n
- Fecha de ingreso
- 25 oct, 06
- Ubicación
- 01001100 01010101 01000111 01001111
- Mensajes
- 2,204
Bueno, es como hoy día C, se estudia por su estructura y por que lo aprendido en el se puede exportar de una u otra forma a la mayoría de lenguajes (o por lo menos por eso lo estudié yo, aunque por lo que tengo entendido es un lenguaje muy potente). Pero a nivel práctico, dudo que en cualquier empresa te pidan un programa en C, ya que no es orientado a objetos.
Sobre la facilidad de los medios actuales, realmente programar en .Net con el Visual Studio es una gozada, pero bueno, hay que empezar por abajo.
De hecho yo ahora me dedico de forma exclusiva a lenguajes utilizados en la creación de webs, y por desgracia no conozco ningún editor para PHP lo suficientemente decente, así que la opción que me queda es Dreamweaver (porque es más cómodo para visualizar el código fuente, coloreado y eso) y activar los warnings, y aún así te dejas media hora revisando una maldita línea para que al final el fallo sea una simple comilla, una coma, un punto y coma, una variable mal escrita...
Un saludo a todos y suerte con el proyecto, MacSpawn.
------------
Ups, me acaba de llegar el aviso de respuesta, no había visto tu último mensaje
-
08/11/2007, 08:34
C se estudia porque es el padre de todos los lenguajes. Es raro estudiar Java y luego C.
Una vez sabido lo básico de C, Java está chupao, porque las clases al fin y al cabo son funciones, se usan instrucciones comunes, etc.
Con php pasa lo mismo, for, while, if y palante xddd
El problema de los lenguajes para web como html o php es la falta de un buen "editor" que te indique los fallos-errores, tipo Eclipse o Jdeveloper para java.
-
08/11/2007, 23:49
Iniciado por Quetedigo
C se estudia porque es el padre de todos los lenguajes.
Como padres creo que habría que citar más bien a lenguajes más antiguos como Pascal, Cobol, Fortran y ALGOL.
De hecho el CPL surgió teóricamente para juntar los beneficios de estos cuatro lenguajes en uno y eliminar las cosas innecesarias, pero tuvo múltiples problemas, entre ellos que era demasiado pesado.
Para intentar paliar este problema surgió el BCPL, y aún así, con posterioridad surgió el B, más simplificado, que es del que realmente surgió el C.
Incluso la programación orientada a objetos nació del Pascal (modula) y no de C.
Un saludo.
-
10/11/2007, 15:41Prowl
- Fecha de ingreso
- 16 jun, 07
- Ubicación
- Tarragona
- Mensajes
- 1,939
No había visto este post XD
El problema era ese efectivamente... con TurboC int = 2bytes (±32768) por lo que para el DNI se te quedaba corto (con un unsigned int tendrías hasta +65536).
La manera más sencilla de solucionarlo es poniendo un unsigned long por ejemplo (cuando se lo quieras asignar a una variable basta con poner %ld en lugar de %d) y así te cubrirá toda la cifra sin decimales
#include <stdio.h>
int main () {
FILE *fp;
char nom[15];
char cog[15];
unsigned long dni;
clrscr();
fp = fopen ( "miDNI.txt", "r" );
if(fp==NULL) printf("Error, no es troba miDNI.txt");
fscanf(fp,"%s",&nom);
fscanf(fp,"%s",&cog);
fscanf(fp,"%ld",&dni);
printf("%s \n", nom);
printf("%s \n", cog);
printf("%ld", dni);
fclose ( fp );
getch();
return 0;
}
Powered by vBulletin® Version 4.2.5
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.
Traducción por vBulletin Castellano Copyright © 2025.
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.
Traducción por vBulletin Castellano Copyright © 2025.
AutoLinker v1.3 by Poker Forum