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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  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 ... 26
61  Programación / Programación C/C++ / Re: [Ayuda] variable dentro de char en: 24 Diciembre 2014, 19:51 pm
Así:

Código
  1. fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
  2. fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
  3. fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
  4. fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
  5. fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);    /* si el pass no es igual a cmb, salir */
  6.  

Hay un detalle con scanf(). Esta función requiere un argumento de tipo apuntador al tipo de dato declarado con %d, %s, etc. Si lees un entero, debes pasarle un apuntador a entero, por eso pones el "&". Pero en C las cadenas son técnicamente apuntadores a variables tipo char (el tema de apuntadores en C es delicado, y es algo que debes leer a profundidad cuando tengas tiempo), por eso no requieren "&". Se escribe:
Código
  1. scanf(\"%s\", pass);
con "pass" y no "&pass". Por otra parte, el pass es de tipo cadena, lo correcto es declarar como "char *". Luego, a la hora de comparar el pass con el cmb se usa la función strcmp() que devuelve cero si las cadenas son IGUALES, y distinto de cero si son DIFERENTES.

Aquí te mando el programa completo con las correcciones:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.  
  8.   FILE *fp;
  9.   char filename[31];          //filename for source code
  10.   char creador[51];       /* <-- cadena para contener el nombre del creador */
  11.   char *cPtr;
  12.   size_t i;
  13.  
  14.   // starting header of outputted file
  15.   char header[300];
  16.  
  17.   //all the includes in output file
  18.   char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n\n";
  19.  
  20.   //end part of output file
  21.   char end[50] = "\treturn 0;\n}";
  22.  
  23.   //for command
  24.   char cmd[150];
  25.  
  26.   //para el resto, la clave
  27.   char cmb[350] = "abc566h7Tgfr";
  28.  
  29.   printf("\t+----------------------------+\n");
  30.   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  31.   printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
  32.   printf("\t+----------------------------+\n");
  33.  
  34.   printf("Introduce el nombre del creador: ");
  35.   scanf("%s", creador);
  36.   while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
  37.      ;
  38.   sprintf( header, "\nCodigo creado por %s\n", creador);       /* <-- revisa aqui */
  39.  
  40.   printf("\nEnter the filename(with .c extension): ");
  41.   scanf("%s",filename);
  42.   while ( getchar() != '\n' )    /* limpia el caracter ENTER de la entrada estandar */
  43.      ;
  44.  
  45.   fp = fopen(filename,"w");
  46.   if (fp==NULL)
  47.   {
  48.      printf("Some error occurred while opening file");
  49.      getchar();
  50.      exit(1);
  51.   }
  52.   else
  53.   {
  54.      fprintf(fp,"%s%s",header,incs);
  55.  
  56.      fprintf(fp,"\tchar *pass = \"%s\";\n", cmb);      /* <-- observa el argumento %s */
  57.      fprintf(fp,"\tprintf(\"dame la clave: \");\n");    /* <-- no necesitas el argumento cmb */
  58.      fprintf(fp,"\tscanf(\"%%s\", pass);\n");                /* no es &pass, sino simplemente pass */
  59.      fprintf(fp, "\twhile ( getchar() != '\\n' );\n" );    /* <-- limpias búfer después de scanf() */
  60.      fprintf(fp,"\tif( strcmp( pass, \"%s\") ) exit(1); \n\n", cmb);    /* si el pass no es igual a cmb, salir */
  61.  
  62.      printf("\nNow start entering DOS commands: \n");
  63.      printf("When finished, type 'end' for the end of commands\n");
  64.  
  65.      printf("\nStart:\n\n");
  66.  
  67.      fgets( cmd, 150, stdin );
  68.      if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  69.  
  70.      while ( strcmp( cmd, "end" ) )
  71.      {
  72.         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  73.         fgets( cmd, 150, stdin );
  74.         if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
  75.      }
  76.      fprintf(fp,"\tprintf(\"\\n\");");
  77.  
  78.      fprintf(fp,"\n%s",end);
  79.  
  80.      printf("\n\nFile successfully created");
  81.      printf("\nNow compile it with any C compiler");
  82.      printf("\nThanks for using this little app");
  83.      fclose(fp);
  84.   }
  85.   getchar();
  86. }

Yo probé para generar un script con los comandos "dir" y "cd .." que se active con la contraseña abc566h7Tgfr. He aquí uan vista de mi consola cuando estaba ejecutando el programa (en Linux)
Código:
yoel@yoel-pc:~/Documentos/C/test$ ./test
+----------------------------+
|BATCH TO C SOURCE CONVERTER |
|CODED BY SAMARDHWOJ ACHARYA |
+----------------------------+
Introduce el nombre del creador: yoel

Enter the filename(with .c extension): script.c

Now start entering DOS commands:
When finished, type 'end' for the end of commands

Start:

dir
cd..
end


File successfully created
Now compile it with any C compiler
Thanks for using this little app

y ve el fichero script.c que me generó:

Código:
Codigo creado por yoel
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

char *pass = "abc566h7Tgfr";
printf("dame la clave: ");
scanf("%s", pass);
while ( getchar() != '\n' );
if( strcmp( pass, "abc566h7Tgfr") ) exit(1);

system("dir ");
system("cd..");
printf("\n");
return 0;
}

Si compilaras este source (para Windows), te daría un ejecutable que te pide contraseña y luego de validar ejecutaría en consola los comandos dir y cd ... Era ese el resultado que querías lograr ?  :laugh:
62  Programación / Programación C/C++ / Re: [Ayuda] variable dentro de char en: 24 Diciembre 2014, 19:09 pm
************* CONTINUANDO EL TEMA *****************

Hay otros detalle dignos de mencionar. Si realmente te apasiona aprender programación C, sigue leyendo, de lo contrario no lo hagas porque te voy a aburrir  :rolleyes:

Observa que modifiqué ligeramente la estrcutura de control del while() por una forma más práctica:
Código
  1. while ( strcmp( cmd, "end" ) )
  2.      {
  3.         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  4.         gets(cmd );
  5.         printf( "cmd is: %s\n", cmd );
  6.      }
  7.  
así, en vez de poner while(1), y luego poner una condición de parada con break dentro del bucle, pusimos la condición de parada como condición de ejecución del propio while, que es por cierto donde debe ir. Los puristas de la programación estructurada aconsejan recurrir lo menos posible a sentencias como break o continue, a menos que a cambio vayas a aobtener una sustancial mejora del rendimiento, que no es el caso.

A propósito de gets(). Esta función se considera potencialmente peligrosa porque corre el riesgo de sobrepasar la longitud del array donde estás almacenando los caracteres leídos. Es mejor usar getline() de C++, o la misma fgets() de C. Esta última permite especificar la longitud máxima del arreglo leído. Ejemplo, si la longitud de cmd es 150 (lo cual significa que al descontar el nulo de terminación habrá espacio para 149 caracteres), entonces puedes usar
Código
  1. fgets( cmd, 150, stdin );
  2.  
con lo cual serán leídos no más de 149 caracteres de la entrada estándar (teclado). El problema con fgets() es que esta función sí pasa el ENTER al final de la cadena, lo que puede generar un efecto indeseado. Para eliminarlo puedes usar algo como:
Código
  1. size_t i;
  2.  
  3. fgets( cmd, 150, stdin );
  4. for ( i = 0; cmd[i] != '\0'; i++ )
  5.    if ( cmd[i] == '\n' ) cmd[i] = '\0';
(el "size_t i" va una sola vez en el apartado de declaración de variables del main()). Otra manera sería

Código
  1. char *cPtr;
  2.  
  3. fgets( cmd, 150, stdin );
  4. if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
que reemplaza la primera ocurrencia del carácter '\n' en cmd por el nulo de terminación '\0'.
63  Programación / Programación C/C++ / Re: [Ayuda] variable dentro de char en: 24 Diciembre 2014, 18:46 pm
Amigo sabeeee,

Luce interesante este ejemplo que has escogido para practicar, usa la función system() para "convertir" un script de comandos de DOS en un código fuente compilable de c. ¿Sabes que system() lo que hace es recurrir al procesador de comandos del sistema operadivo para evaluar una orden de comandos determinada? Por ejemplo, system("dir") ejecuta la orden de MSDOS "dir", la cual muestra el directorio actual, en Windows. Tambièn me doy cuenta por el "header" que genera en el archivo .c producido que es específico para Windows.

Mis observaciones. En primer lugar, "creador" es un string o cadena de caracteres. Debe ser declarado como tal:
Código:
char creador[51];
¿por qué 51? Pues, 50 caracteres más el carácter nulo de terminación de la cadena que se debe incluir. Luego, una forma de concatenar la cadena header + la cadena literal "Codigo creado por " + la cadena creador, puede ser:
Código:
sprintf( header, "\nCodigo creado por %s\n", creador);

Finalment un pequeño detalle que quizá no conocías del comportamiento de la función scanf( str ). Esta función lee una cadena de la entrada estándar (teclado) y la copia en la cadena argumento str. Por ejemplo:

scanf("%s", creador);

lee de la entrada estándar y copia el valor leído en la cadena creador. El detalle es que el carácter ENTER con que finalizar la cadena NO es copiado a creador, pero SÍ permanece en el "búfer" de entrada del teclado. Debes limpiar este carácter con la sentencia:
Código:
while ( getchar() != '\n' )		/* limpia el caracter ENTER de la entrada estandar */
      ;
(no olvides el punto y coma al final). Si no lo haces, entonces dicho carácter será leído con la siguiente llamada de scanf(), dando como resultado que se lea una cadena nula la próxima vex, lo que no queremos que ocurra.

Finalmente el código con las modificaciones, y por cierto que no es necesariamente para g++, también puede ser compilado con gcc puesto que está escrito en C, no en C++.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.  
  8.   FILE *fp;
  9.   char filename[31];          //filename for source code
  10.   char creador[51];       /* <-- cadena para contener el nombre del creador */
  11.  
  12.   // starting header of outputted file
  13.   char header[300];
  14.  
  15.   //all the includes in output file
  16.   char incs[200] = "#include <stdio.h>\n#include <conio.h>\n#include <stdlib.h>\n#include <windows.h>\nint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\nPSTR szCmdLine, int iCmdShow)\n{\n\n";
  17.  
  18.   //end part of output file
  19.   char end[50] = "\treturn 0;\n}";
  20.  
  21.   //for command
  22.   char cmd[150];
  23.  
  24.   printf("\t+----------------------------+\n");
  25.   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
  26.   printf("\t|CODED BY SAMARDHWOJ ACHARYA |\n");
  27.   printf("\t+----------------------------+\n");
  28.  
  29.   printf("Introduce el nombre del creador: ");
  30.   scanf("%s", creador);
  31.   while ( getchar() != '\n' ) /* limpia el caracter ENTER de la entrada estandar */
  32.      ;
  33.  
  34.   /* revisa aqui */
  35.   sprintf( header, "\nCodigo creado por %s\n", creador);
  36.  
  37.   printf("\nEnter the filename(with .c extension): ");
  38.   scanf("%s",filename);
  39.   while ( getchar() != '\n' )    /* limpia el caracter ENTER de la entrada estandar */
  40.      ;
  41.  
  42.   fp = fopen(filename,"w");
  43.   if (fp==NULL)
  44.   {
  45.      printf("Some error occurred while opening file");
  46.      getchar();
  47.      exit(1);
  48.   }
  49.   else
  50.   {
  51.      fprintf(fp,"%s%s",header,incs);
  52.  
  53.      printf("\nNow start entering DOS commands: \n");
  54.      printf("When finished, type 'end' for the end of commands\n");
  55.  
  56.      printf("\nStart:\n\n");
  57.  
  58.      gets( cmd );
  59.  
  60.      while ( strcmp( cmd, "end" ) )
  61.      {
  62.         fprintf(fp,"\tsystem(\"%s\");\n",cmd);
  63.         gets(cmd );
  64.      }
  65.      fprintf(fp,"\tprintf(\"\\n\");");
  66.  
  67.      fprintf(fp,"\n%s",end);
  68.  
  69.      printf("\n\nFile successfully created");
  70.      printf("\nNow compile it with any C compiler");
  71.      printf("\nThanks for using this little app");
  72.      fclose(fp);
  73.   }
  74.   getchar();
  75. }
64  Programación / Programación C/C++ / Re: De fichero a Vector en: 22 Diciembre 2014, 15:57 pm
Hula chiue. Hay varios aspectos que tratar. En primer lugar, recuerda que la instrucción getline(f,n); lee una línea del fichero y la copia en el string "n", luego es el contenido de este string (y no del fichero "f") el que pasas a los campos de la estructura. Tambiés debes tener en cuenta (o al menos yo no pude dar con una manera más sencilla de hacerlo) que hay campos tipo "int", "char" y "string", por lo que debes hacer la conversión explícita de tipo según el caso:

Código:
v[i].identificador = atoi(n.c_str());
...
v[i].nombre = n;
...
v[i].direccion = n;

etc. Por último y muy importante lo que te recalcó Orubatosu, no puedes leer todo el fichero y luego copiar los valores a la estructura, pues en ese caso estarías pasando sólo los valores de la última línea del fichero. Debes leer línea por línea, y distinguir lo que se debe leer si es la primera línea, la segunda, la tercera, etc.

Para ello usamos el operador "%" de resto de la división entera. Analiza la estructura de este fichero con sus números de línea

1. ---| 1012 |---
2. 24532333 X
3. La taberna vasca
4. Avda. Pio XII
5. taberna.vasca@hotmail.com
6. Valencia
7. ---| 1230 |---
8. 22345123 P
9. Cafes Valiente
10. Avda. Campanar
11. cafes.valiente@hotmail.com
12. Valencia
13. ---| 1455 |---
14. 20234561 T
15. Bier Winkeln
16. Avda. Campanar
17. Bier.Winklen@hotmail.com
18. Valencia


Aquellas lìneas con los Nros. 1., 7., 13., ..., o sea aquella cuyo resto de dividir por 6 sea 1, corresponden al identificador. Las líneas 2., 8., 14., etc, cuyo resto de dividir por 6 sea 2 corresponden al par "num-letra", y así sucesivamente. Ten en cuenta que esta línea Nro. 2 en particular debe ser dividida en dos sub-strings para extraer el número (tipo num*) y la letra (tipo (char)).

Finalmente, no veo definido el tipo de dato "VecClientes", pero supongo que es un arreglo de struct cliente. Aquí el código de mi propuesta:

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. struct CIF {
  9.   int num;
  10.   char letra;
  11. };
  12.  
  13. struct cliente {
  14.   int identificador;
  15.   CIF c;
  16.   string nombre;
  17.   string direccion;
  18.   string correo;
  19.   string ciudad;
  20. };
  21. typedef struct cliente * VecClientes;   /* <--- Yo puse esto */
  22.  
  23. void FncLeerClientesFich(ifstream &f,VecClientes v, int &tam);
  24.  
  25.  
  26. int main ()
  27. {
  28.   string cadena;
  29.   ifstream f("datos1.txt");
  30.   struct cliente v[100];
  31.   int tam;
  32.  
  33.   FncLeerClientesFich(f, v, tam);
  34.  
  35.   /* En este codigo de prueba vamos a imprimir los datos
  36.     * que ha cargado del archivo
  37.     */
  38.   for ( int i = 0; i < tam; i++ ) {
  39.      cout << v[i].identificador << endl;
  40.      cout << v[i].c.num << " | " << v[i].c.letra << endl;
  41.      cout << v[i].nombre << endl;
  42.      cout << v[i].direccion << endl;
  43.      cout << v[i].correo << endl;
  44.      cout << v[i].ciudad << endl;
  45.      cout << "------------------------" << endl;
  46.   }
  47.  
  48.   f.close();
  49.  
  50.   return 0;
  51. }
  52.  
  53. void FncLeerClientesFich(ifstream &f,VecClientes v, int &tam) {
  54.  
  55.   int i = 0;
  56.   string n;
  57.   string n1, n2; /* <-- esto es nuevo */
  58.   int l = 0;
  59.   while (!f.eof()) {
  60.      getline(f,n);
  61.      l++;
  62.  
  63.      /* 1ra linea */
  64.      if ( l%6 == 1 )
  65.         v[i].identificador = atoi(n.c_str());
  66.      /* 2da linea */
  67.      if ( l%6 == 2 ) {
  68.         /* aqui dividimos el string en dos partes, por la cadena
  69.           * separadora " "
  70.           */
  71.         size_t ind = n.find(" ");
  72.         n1 = n.substr(0, ind);
  73.         n2 = n.substr(ind + 1, n.length());
  74.         v[i].c.num = atoi( n1.c_str() );
  75.         v[i].c.letra = n2[0];
  76.      }
  77.      /* 3ra linea */
  78.      if ( l%6 == 3 )
  79.         v[i].nombre = n;
  80.      /* 4ta linea */
  81.      if ( l%6 == 4 )
  82.         v[i].direccion = n;
  83.      /* 5ta linea */
  84.      if ( l%6 == 5 )
  85.         v[i].correo = n;
  86.      /* 6ta linea */
  87.      if ( l%6 == 0 ) {
  88.         v[i].ciudad = n;
  89.  
  90.         /* incrementa campo cada 6 lineas leidas del fichero */
  91.         i++;
  92.      }
  93.   }
  94.   tam = i;
  95.  
  96.   return;
  97. }
  98.  

y aquì puedes ver la salida del programa, donde le hice imprimir lo que ha leido del archivo:

Código:
1012
24532333 | X
La taberna vasca
Avda. Pio XII
taberna.vasca@hotmail.com
Valencia
------------------------
1230
22345123 | P
Cafes Valiente
Avda. Campanar
cafes.valiente@hotmail.com
Valencia
------------------------
1455
20234561 | T
Bier Winkeln
Avda. Campanar
Bier.Winklen@hotmail.com
Valencia
------------------------
1875
12356355 | R
Tapioca. Comidad para llevar.
Avda. Tres Forques
Tapioca@hotmail.com
Valencia

Por cierto, el fichero "datos1.txt" contiene la información que dices, de donde tomar los datos.

Enjoy it !!!
65  Programación / Programación C/C++ / Re: Ayuda con grafos en c en: 22 Diciembre 2014, 14:16 pm
La idea debe ser buscar recursivamente, por ensayo y error, hasta encontrar el punto final de la ruta.

Te paras en el primer nodo, y luego entre todos los (n-1) nodos restantes hay algunos que se conectan con el primero (y otros que quizá no). Digamos que hay M1 nodos que se conectan con el primero, entonces debes explorar todas estas M1 posibilidades. Cada un de ellos a su vez genera nuevas posibilidades de conectarse con un tercer nodo y así sucesivamente.

Pero a mí esta idea se me va pareciendo más a un árbol de búsqueda de múltiples ramas, que a una cola ....

Es cuestión de hacer un algoritmo en papel, ejecutarlo "a mano", y luego pasarlo a código de programación. Al final, tendrás un cierto número de soluciones al problema (suponiendo que hay una al menos), y elegirás la trayectoria con menos nodos como la más corta.

Voy a ver si al final de este día te preparo algo mejor y te lo envío. Ten en cuenta también que quizá tenemos zonas horarias diferentes tú y yo.
66  Programación / Programación C/C++ / Re: Problema con codigo en C en: 22 Diciembre 2014, 01:20 am
Encantado pues  ;-)
67  Programación / Programación C/C++ / Re: problema en reto de programacion en: 22 Diciembre 2014, 01:19 am
Pues en ese caso no hay problema, pues getchar() requiere <stdio.h>, que ya la tienes.
68  Programación / Programación C/C++ / Re: problema en reto de programacion en: 21 Diciembre 2014, 18:02 pm
Ok, entiendo. Bueno yo humildemente hubiera trabajado la parte de convertir a chuck_norris de una manera diferente y creo que más breve. Tomo el array binario y agarro el primer digito. Luego reviso el segundo, tercero, etc, y así hasta encontrar uno diferente al primero. De esa manera delimito un primer bloque y además llevo la cuenta de la cantidad de dígitos que posee.

Luego, tomo como dígito de prueba el que encontré que era diferente al primero (justo donde se terminó el primer bloque), y repito el proceso para ver cuántos son iguales a este de prueba. Repitiendo el proceso logro convertir toda la secuencia.

Por ejemplo, cuando paso el carácter 'A' (ASCII 65), su binario es '1000001', que el programa me convierte a:

   0 0 00 00000 0 0

que según creo es lo que se quiere, ¿no?

Un detalle, reutilizar apropiadamente el espacio de variables y no desperdiciar memoria, empleé la variable 'letra' para representar los dígitos del binario.

El programa, con mi modificación propuesta, es:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. /**
  6.  * Auto-generated code below aims at helping you parse
  7.  * the standard input according to the problem statement.
  8.  **/
  9.  
  10.  
  11. int main()
  12. {
  13.    char MESSAGE[100];
  14.    fgets(MESSAGE,100,stdin);
  15.    int size=strlen(MESSAGE);
  16.    int letra;
  17.    int Ascii;
  18.    int binario[50];
  19.    int temp;
  20.    int contador=0;
  21.    int reverso[700];
  22.    int indice=0;
  23.    char chuck_norris[700];
  24.    int unocero=0;
  25.    int unomas=0;
  26.    short bloque1=0;
  27.  
  28.    // Write an action using printf(). DON'T FORGET THE TRAILING \n
  29.    // To debug: fprintf(stderr, "Debug messages...\n");
  30.    //---------------------------
  31.  
  32.    *chuck_norris = '\0'; /* inicializa cadena vacia */
  33.    for (int a=0; a<size; a++) {
  34.        if (MESSAGE[a]!='\0' && MESSAGE[a]!='\n')
  35.        {
  36.            letra=MESSAGE[a];//tomo el valor ascii
  37.            if (letra<=64)
  38.            {
  39.                reverso[0]=0;
  40.                unomas=1; //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas
  41.            }
  42.            //----------------------------
  43.            contador=0;
  44.            temp=letra;
  45.  
  46.            //convierto el numero a binario
  47.            while (temp>0) {
  48.                binario[contador]=(temp%2);
  49.                temp=temp/2;
  50.                contador++;
  51.            }
  52.            int conta3=contador-1; //contador es el largo de binario
  53.            contador=contador+unomas;//si es menor a 64 se le pone un cero al comienzo eso es uno mas
  54.  
  55.            for (int inv=0; inv<contador; inv++)
  56.            {
  57.                reverso[inv+unomas]=binario[conta3];//  binario estan los numeros al reves asi que le doy la vuelta
  58.                conta3--;
  59.            }
  60.  
  61.            /* imprimimos en binario para ver el resultado */
  62.            printf( "binario: " );
  63.            for ( int i = 0; i < contador; i++ )
  64.                putchar( '0' + reverso[i] );
  65.            printf("\n");
  66.  
  67.            //ahora lo pasare a el codigo chuck norris
  68.  
  69.            /* ============= MI PROPUESTA DE CHUCK NORRIS =======================
  70.              * --- Humildemente, Yoel.-
  71.             */
  72.            int i = 0;
  73.            /* convertiremos el binario reverso a chuck norris */
  74.            while ( i < contador ) {
  75.                /* NOTA: al final de este while, la variable n contendra la cantidad de veces que se repite
  76.                  * letra en el bloque actual
  77.                  */
  78.                int n = 0;
  79.                letra = reverso[i];
  80.                while ( i < contador && reverso[i] == letra ) {
  81.                    n++;
  82.                    i++;
  83.                }
  84.  
  85.                /* ahora transcribe a la cadena chuck_norris apropiadamente segun el caso */
  86.                if ( letra == 1 )
  87.                    strcat( chuck_norris, "0 ");
  88.                else if ( letra == 0 )
  89.                    strcat( chuck_norris, "00 ");
  90.  
  91.                while ( --n >= 0 ) {
  92.                    strcat( chuck_norris, "0" );
  93.                }
  94.                /* espacio para delimitar el fin de bloque */
  95.                strcat( chuck_norris, " ");
  96.            }
  97.            strcat( chuck_norris, "| ");
  98.            /*=============== FIN =================*/
  99.        }
  100.    }
  101.  
  102. #if 0
  103.    for (int final=0; final<contador; final++) {
  104.        //si bloque1=1 entonces estamos en el segundo bloque y se le agrega un cero si continua siendo el mismo del primer bloque unocero
  105.        if (bloque1==1) {
  106.            if (reverso[final]==unocero)
  107.            {
  108.                chuck_norris[indice]='0';
  109.                indice++;
  110.            }
  111.            else
  112.            {
  113.                chuck_norris[indice]=' ';
  114.                indice++;
  115.                bloque1=0;
  116.            }
  117.        }
  118.        //------------------------------------
  119.        if (reverso[final]==1 && bloque1==0) //si estamos en el primer bloque y es un uno escribe en la respuesta 0 0
  120.        {
  121.            chuck_norris[indice]='0';
  122.            indice++;
  123.            chuck_norris[indice]=' ';
  124.            indice++;
  125.            chuck_norris[indice]='0';
  126.            indice++;
  127.            bloque1=1; // cambiamos de bloque
  128.            unocero=1; //si cambia este numero es que se acabaron los unos repetidos
  129.        }
  130.        else if (reverso[final]==0 && bloque1==0) //si estamos en el primer bloque y es un cero escribe en la respuesta 00 0
  131.        {
  132.            chuck_norris[indice]='0';
  133.            indice++;
  134.            chuck_norris[indice]='0';
  135.            indice++;
  136.            chuck_norris[indice]=' ';
  137.            indice++;
  138.            chuck_norris[indice]='0';
  139.            indice++;
  140.            bloque1=1;// cambiamos de bloque
  141.            unocero=0;//si cambia este numero es que se acabaron los unos repetidos
  142.        }
  143.        //----------------------
  144.    }
  145.    chuck_norris[indice]='\0';// se le agrega el final de la cadena
  146. #endif
  147.  
  148.    printf("%s\n",chuck_norris);//escribe la respuesta
  149.  
  150.    return 0;
  151. }

Te muestro la salida generada con la cadena de entrada "ABC":


ABC
binario: 1000001
binario: 1000010
binario: 1000011
0 0 00 00000 0 0 | 0 0 00 0000 0 0 00 0 | 0 0 00 0000 0 00 |


donde he usado el separador '|' para distinguir a la vista un código del otro (aunque no se si realmente necesitas eso).

Revisa y me comentas!!!  :)
69  Programación / Programación C/C++ / Re: problema en reto de programacion en: 21 Diciembre 2014, 17:14 pm
Hola daryo. Estoy trabajando en tu proyecto pero por favor explícame que significa la parte de:

Citar
unomas=1;  //si es menor a el codigo ascii 64 se le pone un cero al comienzo eso es uno mas

???
70  Programación / Programación C/C++ / Re: Problema con codigo en C en: 21 Diciembre 2014, 16:40 pm
Buenos días TheSocker, bienvenido al apasionante mundo de C.

Como T.Collins, los arrays en C comienzan en la posición 0. Y yo añadiría otros pequeños detalles. Primero, debes saber que la función system() invoca una llamda al sistema operativo, por lo tanto es dependiente del sistema de comandos de tu SO. Esto es, corre el riesgo de que tu programa no "corra" igual en un SO que en otro. Por eso yo recomiendo usar getchar() que es una función estándar (se ejecuta igual en cualquier plataforma) y realiza casi la misma función: esperar una pulsación de tecla de parte del usuario.

Otro detalle, en la función leer_vector() debes pasar a scanf la posición (esto es, la dirección de memoria) del elemento específico del array donde copiar el valor leído. Por eso:

Código
  1. scanf("%d", &v[i] );

Como sabrás, el operador "&" devuelve la dirección del elemento apuntado, en este caso la dirección de v[ i].

Y finalmente en el main(), donde mandas imprimir la media del vector, no puedes pasar como argumento simplemente el nombre de la función, sino que debes poner "media_vector(vector,dim)" con los argumentos donde media_vector() debe ser evaluada. Te quedaría:

Código
  1. printf("\n\nMedia: %f", media_vector(vector,dim) );

Esto es anidamiento de funciones; el valor de retorno de una función pasado como argumento de otra. Finalmente el código te quedaría:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define DIM 100
  4.  
  5. void leer_vector(int *, int);
  6. float media_vector (int *, int);
  7. void escribir_vector(int *, int);
  8.  
  9. int main(int argc, char *argv[]) {
  10.  
  11.   int dim;
  12.   int vector[DIM];
  13.  
  14.   printf("Introduce la dimension del vector: ");
  15.   scanf("%d",&dim);
  16.  
  17.   leer_vector(vector,dim);
  18.  
  19.   printf("\n\n");
  20.  
  21.   escribir_vector(vector,dim);
  22.  
  23.   media_vector(vector,dim);
  24.  
  25.   printf("\n\nMedia: %f", media_vector(vector,dim) ); /* <-- revisa aqui */
  26.  
  27.   printf("\n\n");
  28.  
  29.   //system("PAUSE"); /* <-- solo para Windows */
  30.   getchar(); /* <-- es mas compatible */
  31.   return 0;
  32. }
  33.  
  34.  
  35. float media_vector (int *v, int dim) {
  36.  
  37.   int i;
  38.   float media;
  39.   media = 0;
  40.   for (i=0; i<dim; i++) {
  41.      media = media + v[i];
  42.   }
  43.  
  44.   return media/dim;
  45. }
  46.  
  47.  
  48. void leer_vector(int *v, int dim) {
  49.   int i;
  50.   for (i=0; i<dim; i++) {
  51.      printf("\nElemento (%d): ", i);
  52.      scanf("%d", &v[i] );
  53.   }
  54. }
  55.  
  56. void escribir_vector(int *v, int dim) {
  57.   int i;
  58.   for (i=0; i<dim; i++) {
  59.      printf("%4d\t", v[i] );
  60.   }
  61. }

Un ejemplo de corrida del programa:


Introduce la dimension del vector: 4

Elemento (0): 5

Elemento (1): 8

Elemento (2): 4

Elemento (3): 2


   5      8      4      2   

Media: 4.750000
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines