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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [45] 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 ... 160
441  Programación / Programación C/C++ / Re: Recibir int seguro en: 11 Marzo 2014, 03:37 am
El método que propones tiene un pero, si introduces 12as toma 12 como int.
En ese caso nada impide verificar el resto del stream con una lectura adicional, las funciones eof/get, etc. Por ejemplo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include <sstream>
  11. using std::istringstream;
  12.  
  13. int main()
  14. {
  15.   bool ok = false;
  16.   int num;
  17.  
  18.   do {
  19.      cout << "Introduce un numero: ";
  20.      string linea;
  21.      getline(cin, linea);
  22.  
  23.      istringstream is(linea);
  24.      char ch;
  25.      if (is >> num && !(is >> ch))
  26.         ok = true;
  27.      else
  28.         cout << "Entrada no valida" << endl;
  29.   }while (!ok);
  30.  
  31.   cout << "num == " << num << endl;
  32.  
  33.   return 0;
  34. }

----

La biblioteca <limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo, CHAR_MAX, SHRT_MAX, UINT_MAX define los máximos de char, short int y unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:
Código
  1. /** INT && UINT **/
  2. if(s[0]=='-')
  3. sign=true;
  4. if ( allNumeric(s.substr(sign, s.size()))) {
  5. if(sign) {
  6.   if ( atoi(s.substr(1, s.size())) <= INT_MAX  )
  7. type+=type_int;
  8. }else{
  9. if ( atoi(s.substr(0, s.size())) <= INT_MAX )
  10. type+=type_int;
  11. if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
  12. type+=type_uint;
  13. }
  14. }
Un problema con ese fragmento es el uso de atoi, por razones obvias su valor de retorno no puede ser mayor a INT_MAX. Para conocer si un numero esta fuera del rango valido para un tipo entero se deben utilizar las funciones strtol, strtoll (C++11), etc. dependiendo del caso (y del modo de compilación).

Un saludo
442  Programación / Programación C/C++ / Re: Convertir un string a char en: 11 Marzo 2014, 03:07 am
Tienes que explicar de una forma mas clara y detallada tu problema.

quisiera saber si alquien sabe como convertir una string a char ya que lo nesesito para la funcion.

void outtextxy (int x, int y, char *textstring);
Si apenas empiezas tu aprendizaje del lenguaje C++ te recomiendo evitar extensiones como (en este caso) la biblioteca conio de Borland, enfocate primero en aprender el lenguaje.

En C++ tienes la clase string para un manejo mas fácil (en relación a C) de cadenas, si utilizas un objeto de la clase string y necesitas en base a el obtener una cadena "a la C" debes utilizar la función miembro "c_str", esa es la idea en el primer ejemplo de amchacon:
Código
  1. string nombre = "Hola";
  2. funcion(Hola.c_str());

El proceso opuesto (en base a una cadena "a la C" crear un objeto de la clase string) en su segundo ejemplo:
Código
  1. char *nombre = "Cosa";
  2. funcion(string(nombre));

tengo cin.ignore(); despues que me lee la cadena pero no me muestra la cadena
Publica el código fuente completo.

lo hice con cin >> cadena y despues
Código
  1. strcpy(cadena2,nombrePer.c_str());
y hace la convercion pero no acepta espacios.
Al utilizar "cin >> cadena" lo que obtienes es un palabra, ese es el comportamiento normal del operador.

Un saludo
443  Programación / Programación C/C++ / Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas? en: 8 Marzo 2014, 05:35 am
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

* Lo primero que debes hacer es cambiar el tipo de los elementos de la matriz de double a char ya que en ella almacenaras caracteres.

* Debes liberar primero todas las filas y solo entonces el bloque principal.

* Para almacenar un carácter solo tienes que verificar que los indices sean validos y a continuación utilizar el operador de asignación "M[ f ][ c ] = algun_valor".

Mas o menos así:
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.   int matriz;
  8.   cin >> matriz;
  9.  
  10.   // creamos la matriz !
  11.   char **M = new char *[matriz];
  12.   for (int i = 0; i != matriz; i++)
  13.      M[i] = new char [matriz];
  14.  
  15.   // Asignacion, solo un ejemplo
  16.   for (int i = 0; i != matriz; i++)
  17.      for (int j = 0; j != matriz; j++)
  18.         M[i][j] = '*';
  19.  
  20.   //mostrar matriz
  21.   for (int i = 0; i != matriz; i++){
  22.      for (int j = 0; j != matriz; j++)
  23.         cout << " " << M[i][j];
  24.  
  25.      cout << endl;
  26.   }
  27.  
  28.   for (int i = 0; i != matriz; i++)
  29.      delete[] M[i];
  30.   delete[] M;
  31.  
  32.   return 0;
  33. }

Y si estas aprendiendo C++ puedes utilizar las clases vector y string para implementar la matriz.

Un saludo
444  Programación / Programación C/C++ / Re: Recibir int seguro en: 8 Marzo 2014, 02:10 am
Esa pregunta ya se ha respondido en varias ocasiones en los foros, solo tienes que utilizar el motor de búsqueda para encontrar los temas relacionados. Por ejemplo Validar algunas cosas en C++.

Un saludo
445  Programación / Programación C/C++ / Re: [C] Rombo con asteriscos en: 7 Marzo 2014, 03:53 am
Otra solución recursiva pero forzada (ya que parte de la información se codifica en la cadena a imprimir) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void f(char *ch);
  5.  
  6. int main(void)
  7. {
  8.   char ch[] = "    *\0*******";
  9.  
  10.   f(ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }
  14.  
  15. void f(char *ch)
  16. {
  17.   int i = printf("%s\n", ch) - 1;
  18.  
  19.   if (*ch == ' '){
  20.      ch[i] = '*';
  21.      ch[i + 2] = '\0';
  22.      f(ch + 1);
  23.  
  24.      printf("%.*s\n", i, ch);
  25.   }
  26. }

Un saludo
446  Programación / Programación C/C++ / Re: Error c++ en: 6 Marzo 2014, 16:36 pm
Espero que no se me haya olvidado nada.
Hay un error lógico en este bloque:
Código
  1. int cargar_arch()
  2. {
  3.   if (fopen("dato.txt","r")){
  4.      arch = fopen("dato.txt","r"); /* modo "r", lectura */
  5.      fscanf(arch, "%i", &a);       /* OK */
  6.  
  7.      for (int c = 0; c < a; c++){
  8.         fprintf(arch, "%s\n", nombres[c]);   /* <== */
  9.         fprintf(arch, "%s\n", apellidos[c]); /* <== */
  10.      }
  11.      fclose(arch);
  12.  
  13.      return 1;
  14.   }
Considerando el estado del programa tal vez haya mas (no lo revise a fondo).

Un saludo
447  Programación / Programación C/C++ / Re: [C] Rombo con asteriscos en: 6 Marzo 2014, 04:43 am
Básicamente lo que hacemos es calcular el "punto medio" p de N (redondeo por exceso de N/2), para el caso N=9 sería p=5. Luego recorremos tanto i como j desde -p+1 hasta p-1, o sea, desde -4 hasta 4. El asterisco se imprime si abs(j) < p - abs(i), y esto dibuja el rombo de manera correcta, tanto en su parte superior como la inferior.
Solo un comentario: no es necesario imprimir los espacios al final de cada linea, por cada una basta con los primeros "N - abs(i)" caracteres.

La función con esa y otras modificaciones (todas ellas menores):
Código
  1. void rombo(int N)
  2. {
  3.   int i;
  4.   int j;
  5.  
  6.   for (i = -N/2; i <= N/2; i++){
  7.      for (j = 0; j < N - abs(i); j++)
  8.         putchar(j < abs(i) ? ' ' : '*');
  9.  
  10.      putchar('\n');
  11.   }
  12. }

----

Ya por ultimo la biblioteca estándar de C no incluye una función que permita imprimir N veces un determinado carácter. Las únicas dos excepciones (forzadas, por supuesto) son el espacio y el cero. Un ejemplo de ello es otra versión (mas) del bendito rombo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int i;
  7.  
  8.   for (i = -4; i < 5; i++)
  9.      printf("%*c%0*d\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, 0);
  10.  
  11.   return EXIT_SUCCESS;
  12. }

Produciendo la salida:
Código:
     0
    000
   00000
  0000000
 000000000
  0000000
   00000
    000
     0

Un saludo
448  Programación / Programación C/C++ / Re: Ayuda con arrays y punteros en: 4 Marzo 2014, 16:16 pm
Espero puedan ayudarme o prestarme alguna idea. Mi duda surge cuando al generar una cierta cantidad de arrays de tipo char de forma iterativa
Con esta sentencia:
Código
  1. char *arreglo, S3, aux1;
El otro fragmento que pones no es valido, supongo en realidad la declaracion de las variables es:
Código
  1. char **arreglo, *S3, *aux1;

Para evitar confusiones mejor publica el código fuente completo.

Un saludo
449  Programación / Programación C/C++ / Re: fopen() y c++ en: 3 Marzo 2014, 23:58 pm
con el código todavía tengo problemas, tengo que hacer que me lea un archivo de texto y que lo imprima en pantalla, pero me imprime basura y no entiendo por qué?
Código
  1. // ...
  2. while((car = fgetc(fd)) != EOF)
  3.   cout << "" << car;
  4.  
El problema ocurre porque la variable "car" es de tipo int y la imprimes tal cual. En su lugar debes utilizarla para generar un carácter:
Código
  1. while((car = fgetc(fd)) != EOF)
  2.   cout << char(car);

Y las comillas dobles "" están demás (no se cual fuera tu intención con ellas). Por ultimo si estas aprendiendo C++ deberías utilizar su biblioteca estándar.

Un saludo
450  Programación / Programación C/C++ / Re: [C] Rombo con asteriscos en: 2 Marzo 2014, 18:59 pm
Para imprimir las secuencias de espacios y asteriscos se puede desarrollar una función, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LADO  5
  5.  
  6. void repetir(int reps, char ch);
  7.  
  8. int main(void)
  9. {
  10.   int i;
  11.  
  12.   for (i = 1; i < LADO * 2; i += 2){ /* 1, 3, 5, 7, 9 */
  13.      repetir((LADO - 1) - i/2, ' ');
  14.      repetir(i, '*');
  15.      putchar('\n');
  16.   }
  17.  
  18.   for (i -= 4; i > 0; i -= 2){ /* 7, 5, 3, 1 */
  19.      repetir((LADO - 1) - i/2, ' ');
  20.      repetir(i, '*');
  21.      putchar('\n');
  22.   }
  23.  
  24.   return EXIT_SUCCESS;
  25. }
  26.  
  27. void repetir(int reps, char ch)
  28. {
  29.   int i;
  30.  
  31.   for (i = 0; i < reps; i++)
  32.      putchar(ch);
  33. }

Otra forma de imprimir ese rombo en particular es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char ch[] = "*********";
  7.   int i;
  8.  
  9.   for (i = -4; i < 5; i++)
  10.      printf("%*c%.*s\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }

La primera es clara y flexible, la segunda es breve y esta bien para practicar con la biblioteca estándar de C pero es muy limitada (eso es evidente si se trata de modificar para el manejo de casos generales).

----

Editado: una forma ligeramente mas corta donde se evita imprimir si o si un espacio:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char ch[] = "*********";
  7.   int i;
  8.  
  9.   for (i = -4; i < 5; i++)
  10.      printf("%*.*s\n", 9 - abs(i), 1 + (4 - abs(i)) * 2, ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }

Un saludo
Páginas: 1 ... 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [45] 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines