elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 26
71  Programación / Programación C/C++ / Re: Ayuda con grafos en c en: 21 Diciembre 2014, 03:53 am
Debe ser algún algoritmo matemático conocido, pero implementado mediante colas, ¿no?

Bueno, estoy conjeturando ... :rolleyes:
72  Programación / Programación C/C++ / Re: Consulta ficheros en: 21 Diciembre 2014, 01:13 am
Mmmm, interesante  :rolleyes:

Bueno desde mi punto de vista, interpretar el fichero de texto formateado como dices es como hacer un mini-análisis léxico. Es decir, tienes que distinguir los "tokens" o palabras clave en que se divide tu archivo. Los tokens serían por ejemplo:

  • el carácter '('
  • el carácter ')'
  • el carácter ','
  • la secuencia de caracteres "---"
  • los números, o cadenas conformadas por dígitos consecutivos cada uno comprendido entre el 0 y el 9

Cualquier carácter o cadena de caracteres que no encaje en uno de estos patrones sería una palabra no reconocida. Pues bien, tu programa debe leer el fichero de texto de principio a fin, y desglosarlo en los posibles tokens reconocidos.

Voy a suponer que cada posible token tiene una longitud máxima de 50 caracteres, por ello la representamos por medio de un array de 51 caracteres (incluyendo el nulo de terminación). Si esto no es así hay opciones como arreglos dinámicos (función realloc(), o la clase string de C++), pero no se si esto sería muy avanzado para que lo pruebes en este momento)

Supongamos que tienes un fichero llamado datos.txt con el contenido:

(1,2)(3,4)---(10,6)(7,18)


Entonces el siguiente programa lee el fichero y lo desglosa en tokens:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int extract_token( FILE *, char * );
  6. int isInt( const char * );
  7.  
  8. int main( ) {
  9.  
  10. char *file = "datos.txt";
  11. char token[51];
  12. FILE *fPtr;
  13.  
  14. /* Definiendo la estructura COORD, con capacidad para diez números */
  15. struct COORD {
  16. int x1[10];
  17. int y1[10];
  18. int x2[10];
  19. int y2[10];
  20. };
  21. struct COORD P; /* objeto de tipo struct COORD */
  22. int count = 0; /* lleva el conteo de miembros en COORD */
  23.  
  24. if ( ( fPtr = fopen(file, "r") ) == NULL )
  25. return -1; /* error al abrir el fichero */
  26.  
  27. int status;
  28. while ( !feof(fPtr) && !ferror(fPtr) ) {
  29. *token = '\0'; /* inicializa cadena vacía */
  30. extract_token( fPtr, token );
  31. printf( "token: %s\n", token );
  32. }
  33.  
  34. fclose( fPtr );
  35. return 0;
  36. }
  37.  
  38. /* Extrae un token del fichero.
  39.  * Devuelve 1 si finalizó el archivo o si reconoció un token valido.
  40.  * En cualquier otro caso, devuelve cero.
  41.  */
  42. int extract_token( FILE *fPtr, char *token )  {
  43.  
  44. char c;
  45. size_t len;
  46.  
  47. while ( ( c = fgetc( fPtr ) ) != EOF ) {
  48.  
  49. //printf( "c: %c,\ttoken: %s\n", c, token );
  50. /* ignorar espacios */
  51. if ( isspace( c ) ) continue;
  52.  
  53. /* encontró parentesis, token reconocido y finalizar */
  54. if ( *token == '\0' && c == '(' ) {
  55. strcpy( token, "(" );
  56. return 1;
  57. }
  58. /* encontró parentesis, token reconocido y finalizar */
  59. if ( *token == '\0' && c == ')' ) {
  60. strcpy( token, ")" );
  61. return 1;
  62. }
  63. /* encontró coma, token reconocido y finalizar */
  64. if ( *token == '\0' && c == ',' ) {
  65. strcpy( token, "," );
  66. return 1;
  67. }
  68. /* encontró '-' añadir al token, pero al haber tres '-' seguidos,
  69. * finalizar */
  70. if ( c == '-' ) {
  71. strcat( token, "-" );
  72. if ( !strcmp( token, "---" ) ) return 1;
  73. continue;
  74. }
  75. /* encontró el primer carácter numérico, añadir a la cadena y continuar */
  76. if ( *token == '\0' && isdigit(c) ) {
  77. token[0] = c;
  78. token[1] = '\0';
  79. continue;
  80. }
  81. /* si token es una cadena numérica ... */
  82. if ( isInt( token ) ) {
  83. /* ... y se haya un nuevo carácter, añadir */
  84. if ( isdigit( c ) ) {
  85. len = strlen( token );
  86. token[len] = c;
  87. token[len + 1] = '\0';
  88. }
  89. /* ... sino, terminar */
  90. else {
  91. ungetc( c, fPtr ); /* "devuelve" el caracter al archivo */
  92. return 1;
  93. }
  94. }
  95.  
  96. /* si es carácter no reconocido, terminar */
  97. if ( !isspace(c) && !isdigit(c) && c != ',' && c != '(' && c != ')' && c != '-' )
  98. return 0;
  99. }
  100.  
  101. return 0;
  102. }
  103.  
  104. /* Decide si la cadena corresponde a un numero entero */
  105. int isInt( const char *s ) {
  106.  
  107. char *cPtr = (char *)s;
  108.  
  109. if ( *cPtr == '\0' ) return 0; /* devuelve 0 si la cadena es nula */
  110.  
  111. while ( *cPtr != '\0' ) {
  112. if ( !isdigit( *cPtr ) ) return 0;
  113. cPtr++;
  114. }
  115. return 1;
  116. }

Observa la salida:

token: (
token: 1
token: ,
token: 2
token: )
token: (
token: 3
token: ,
token: 4
token: )
token: ---
token: (
token: 10
token: ,
token: 6
token: )
token: (
token: 7
token: ,
token: 18
token: )
token:

o sea, que ha identificado los tokens: "(", "1", ",", ... etc

Luego de esto ya tienes divivido el fichero, lo que viene es más fácil. Sólo tienes que agarrar los tokens e irlos asignando como valores de x1, y1, x2, y2.

/*************************************************************************************/
(Continuando el tema)

Voy a asumir que vas a leer como máximo 10 cuartetas de valores (por supuesto, puedes indicar una cantidad mayor, o si lo prefieres, programar arrays dinámicos que crezcan conforme la necesidad, pero esto es más avanzado)
En fin, modifica el código de la función main() de la siguiente manera:

Código
  1. int main( ) {
  2.  
  3. char *file = "datos.txt";
  4. char token[51];
  5. FILE *fPtr;
  6.  
  7. /* Definiendo la estructura COORD, con capacidad para diez números */
  8. #define MAX 10 /* <-- asignas el tamano maximo de cuartetos a leer */
  9. struct COORD {
  10. int x1[MAX];
  11. int y1[MAX];
  12. int x2[MAX];
  13. int y2[MAX];
  14. };
  15. struct COORD P; /* objeto de tipo struct COORD */
  16. int count = 0; /* lleva el conteo de miembros en COORD */
  17. int i, k = 0;
  18.  
  19. if ( ( fPtr = fopen(file, "r") ) == NULL )
  20. return -1; /* error al abrir el fichero */
  21.  
  22. while ( !feof(fPtr) && !ferror(fPtr) ) {
  23. *token = '\0'; /* inicializa cadena vacía */
  24. extract_token( fPtr, token );
  25. //printf( "token: %s\n", token );
  26.  
  27. if ( isInt(token) && count < MAX) {
  28. switch ( k % 4 ) {
  29. case 0:
  30. P.x1[count] = atoi(token);
  31. break;
  32. case 1:
  33. P.y1[count] = atoi(token);
  34. break;
  35. case 2:
  36. P.x2[count] = atoi(token);
  37. break;
  38. case 3:
  39. P.y2[count] = atoi(token);
  40. count++;
  41. break;
  42. }
  43. k++;
  44. }
  45. }
  46. printf( "x1\ty1\tx2\ty2\n----------------------------\n" );
  47. for ( i = 0; i < count; i++ )
  48. printf( "%d\t%d\t%d\t%d\n", P.x1[i], P.y1[i], P.x2[i], P.y2[i] );
  49.  
  50. fclose( fPtr );
  51. return 0;
  52. }

La variable "count" lleva el conteo de los cuartetos leidos, que debe ser menor a la constante definida MAX. La variable auxiliar k se utiliza para leer consecutivamente x1, luego y1, luego x2, luego y2. En efecto, aumentamos consecutivamente el valor de k y luego calculamos su resto de la división entera entre 4, el cual puede ser 0, 1, 2 ó 3, es como un contador cíclico que se reinicia continuamente.

La salida del anterior programa, es como se muestra:


x1   y1   x2   y2
----------------------------
1    2   3    4
10   6   7   18


Puedes probar modificando el fichero datos.txt y observando los resultados. Por supuesto, si dicho fichero está escrito de manera incorrecta, los valores obtenidos por el programa no serán correctos, y además no hemos programado rutinas para verificación y validación de datos (aunque sería deseable hacerlo).

Estoy a tu disposición si quieres mejorar, ampliar o corregir esta propuesta, o adaptarla mejor a lo que necesitas ....
Yoel.
73  Programación / Programación C/C++ / Re: buenas me pueden dar un ejemplo en: 1 Junio 2014, 02:34 am
En primer lugar, debes especifica qué se entiende por una contraseña fuerte. Investiga un poco sobre ésto, o establece tus propios criterios. Por ejemplo, digamos que la contraseña debe:
  • tener una longitud de al menos 8 caracteres
  • poseer al menos un carácter entre a-z, uno entre A-Z, y un dígito 0-9
  • poseer al menos un carácter especial como -_?*%&$

Este sencillo programa pide al usuario una cadena y luega prueba todas estas condiciones, indicando por pantalla si la contraseña es débil o fuerte. La verificación es realizada por la función auxiliar es_fuerte() que devuelve 0 si es débil, 1 si es fuerte.

EI: codigo removido, no hagas tareas ajenas por favor.

Veamos la ejecución del programa:

_____________________________________________
yoel@debian:~/Documentos/C/test$ ./test
intro contrasena: Abc31
contrasena debil

yoel@debian:~/Documentos/C/test$ ./test
intro contrasena: Abcs145Ahy*yh_1
contrasena fuerte
_____________________________________________


Ten en cuenta que los criterios de fortaleza de contraseña pueden ser variados, así que podrían existir algoritmos más sofisticados que el que aquí pongo de ejemplo. De todos modos espero haberte ayudado al menos a iniciar.
74  Programación / Programación C/C++ / Re: quiero empezar en esto!!!! en: 1 Junio 2014, 02:03 am
Aquí tienes un excelente tutorial de iniciación de lenguaje C.

Y recuerda que nunca es tarde para empezar, mucha constancia y éxito!!!
75  Programación / Programación C/C++ / Re: me explican que hace cada ciclo en: 1 Junio 2014, 01:55 am
En efecto eferion, disculpen todos mi lapsus, la relación de orden está bien. Pero lo malo sigue siendo que no indexa el array. Para mí que la idea original del programa era hacer
Código
  1. *(array + i)
o también hubiera servido incrementar el valor del puntero array
Código
  1. for(i=0; i<t; i++, array++){
  2.    if(*mayor < *array) *mayor = *array;
  3.    if(*menor > *array) *menor = *array;
  4.    suma+= *array;
  5. }

Yo particularmente entre ambas, prefiero la forma que mencioné primero pues así damos uso a la variable i para algo más que como contador.
76  Programación / Programación C/C++ / Re: me explican que hace cada ciclo en: 30 Mayo 2014, 03:14 am
Bueno, en líneas generales te voy a decir que la función estadisticaArray toma como primer ()argumento un array de números reales, como segundo argumento la cantidad de elementos del vector, y los argumentos tercero, cuarto y quinto (pasados por "referencia") son para obtener el mayor, menor y promedio de los elementos del vector, respectivamente.

Para comprender mejor el funcionamiento debes estudiar el tema de punteros o apuntadores en C, así como paso a funciones de argumentos por referencia.

Y aprovecho para declarar que estoy en desacuerdo con la línea del programa:

suma += array

puesto que no está sumando los elementos del arreglo, como cabría esperar. Debería ser:

suma += array[ i ]

¿no?

También, tiene otras cosas extrañas, por ejemplo

if(*mayor<array) *mayor=array;

para empezar no debería ser '<', sino '>', y tampoco se accede a un elemento específico dentro del array. Pienso que debería ser:

if(*mayor > array) *mayor = array[ i ];

o a menos que incrementes el valor de array en cada ejecución del ciclo, cosa que tampoco veo que se haga.

Cuéntanos de dónde sacaste este programa, porque tiene como varios errores ...  :rolleyes:
77  Programación / Programación C/C++ / Re: Me crashea el programa en: 30 Mayo 2014, 02:42 am
De acuerdo con Eternal, de repente no has inicializando algún elemento del arreglo sucursal, y por ello tiene almacenado el valor cero.
78  Programación / Programación C/C++ / Re: ayuda urgente!!!!!!!!!! en: 30 Mayo 2014, 02:40 am
Aquí tienes más o menos una versión que calcula el total a pagar por los articulos elegidos (faltaría solamente la parte calcular el cambio). Me tomé la libertad de cambiar el tipo de la variable opcion de int a char, así respondes a la pregunta de si quieres elegir otro artículo con un 's' ó un 'n' lo cual a mí me parece mucho maś lógico y cómodo que responder con un número.

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3.  
  4. int main()
  5. {
  6. clrscr();
  7. int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,q,r,s,t,u;
  8. int p;
  9. char opcion; /* <--- te cambie opcion a tipo char */
  10. printf("øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø\n");
  11. printf("                 BIENVENIDOS A LA TIENDITA DE LA ESQUINA\n");
  12. printf("øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø\n\n\n\n\n\n");
  13.  
  14. double TOTAL = 0;
  15.  
  16. opcion = 's';
  17. while( opcion == 's' )
  18. {
  19. printf("              Que desea llevar?\n\n");
  20. printf("1. Coca cola 600ml\n");
  21. printf("2. Huevo 1kg\n");
  22. printf("3. Sopa de fideo\n");
  23. printf("4. Sopa maruchan\n");
  24. printf("5. Azucar 1kg\n");
  25. printf("6. Sal 1kg\n");
  26. printf("7. pan blanco\n");
  27. printf("8. Pan integral\n");
  28. printf("9. Salchicas 1kg\n");
  29. printf("10. Yogurth\n");
  30. printf("11. Bubalo\n");
  31. printf("12. Leche lala\n");
  32. printf("13. Leche alpura\n");
  33. printf("14. Jamon 1/4\n");
  34. printf("15. Papas sabritas\n");
  35. printf("16. Agua 1lt\n");
  36. printf("17. Paleta payaso\n");
  37. printf("18. Cigarros\n");
  38. printf("19. Cerveza 1lt\n");
  39. printf("20. Agua mineral 2lt\n");
  40. scanf("%i",&p);
  41. if(p==1) {
  42. printf(" son: $10");
  43. TOTAL += 10; /* suma 10 al total */
  44. }
  45. else if(p==2) {
  46. printf(" son: $28");
  47. TOTAL += 28;
  48. }
  49. else if(p==3) {
  50. printf(" son: $5");
  51. TOTAL += 5;
  52. }
  53. else if(p==4) {
  54. printf(" son: $8");
  55. TOTAL += 8;
  56. }
  57. else if(p==5) {
  58. printf(" son: $12");
  59. TOTAL += 12;
  60. }
  61. else if(p==6) {
  62. printf(" son: $8");
  63. TOTAL += 8;
  64. }
  65. else if(p==7) {
  66. printf(" son: $14");
  67. TOTAL += 14;
  68. }
  69. else if(p==8) {
  70. printf(" son: $19");
  71. TOTAL += 19;
  72. }
  73. else if(p==9) {
  74. printf(" son: $36");
  75. TOTAL += 36;
  76. }
  77. else if(p==10) {
  78. printf(" son: $8.50");
  79. TOTAL += 8.50;
  80. }
  81. else if(p==11) {
  82. printf(" son: $.50");
  83. TOTAL += 0.50;
  84. }
  85. else if(p==12) {
  86. printf(" son: $17");
  87. TOTAL += 17;
  88. }
  89. else if(p==13) {
  90. printf(" son: $19");
  91. TOTAL += 19;
  92. }
  93. else if(p==14) {
  94. printf(" son: $21");
  95. TOTAL += 21;
  96. }
  97. else if(p==15) {
  98. printf(" son: $9");
  99. TOTAL += 9;
  100. }
  101. else if(p==16) {
  102. printf(" son: $12");
  103. TOTAL += 12;
  104. }
  105. else if(p==17) {
  106. printf(" son: $9.50");
  107. TOTAL += 9.5;
  108. }
  109. else if(p==18) {
  110. printf(" son: $35");
  111. TOTAL += 18;
  112. }
  113. else if(p==19) {
  114. printf(" son: $30");
  115. TOTAL += 19;
  116. }
  117. else if(p==20) {
  118. printf("\n son: $20");
  119. TOTAL += 20;
  120. }
  121. printf("\n\n\nDesea llevar algo mas s/n?: ");
  122. scanf("%c",&opcion);
  123. if ( opcion != 's' ) opcion = 'n';
  124. clrscr();
  125. }
  126. printf("Total:\t%.2lf\n", TOTAL);
  127. return 0;
  128. }

Desde luego que se puede mejorar mucho el programa, y si ese es tu objetivo, estamos aquí para ayudarte.
79  Programación / Programación C/C++ / Re: Ayuda para crear tabla de conversión de decimales en: 22 Mayo 2014, 18:36 pm
¿Por qué me siento algo aludido con el mensaje anterior?, Jaja, broma.

Bueno, traté de dar una solución con métodos elementales, ya ese era más o menos el estilo del programa originalmente presentado. Pero esperemos que al autor aclare qué tipo de programación está dispuesto a usar .....

Y como decimos los programadores, entre más "bajo" o elemental el nivel que usemos, más trabajo para uno  ;D
80  Programación / Programación C/C++ / Re: Problema con float y double!!!! en: 22 Mayo 2014, 04:02 am
Mmmmm, perfecto pero yo opino que si sólo quiere imprimir los valores en Kelvin no es necesario el segundo argumento en la función kelvin(). Bastaría con:
Código
  1. #include <stdio.h>
  2. #define MAX 30
  3.  
  4. void kelvin(float *grados ){
  5.    int i, float kel;
  6.    for( i = 0; i < MAX; i++ ){
  7.        kel = grados[i] + 273.15;
  8.        printf("%f\n", kel);
  9.    }
  10. }
  11. }
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines