Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#441
Programación C/C++ / Re: Recibir int seguro
11 Marzo 2014, 03:37 AM
Cita de: leosansan en  8 Marzo 2014, 07:00 AMEl 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 (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;
using std::getline;

#include <sstream>
using std::istringstream;

int main()
{
   bool ok = false;
   int num;
   
   do {
      cout << "Introduce un numero: ";
      string linea;
      getline(cin, linea);
   
      istringstream is(linea);
      char ch;
      if (is >> num && !(is >> ch))
         ok = true;
      else
         cout << "Entrada no valida" << endl;
   }while (!ok);
   
   cout << "num == " << num << endl;
   
   return 0;
}


----

Cita de: yoel_alejandro en  9 Marzo 2014, 17:48 PMLa 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 (cpp) [Seleccionar]
/** INT && UINT **/
if(s[0]=='-')
sign=true;
if ( allNumeric(s.substr(sign, s.size()))) {
if(sign) {
    if ( atoi(s.substr(1, s.size())) <= INT_MAX  )
type+=type_int;
}else{
if ( atoi(s.substr(0, s.size())) <= INT_MAX )
type+=type_int;
if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
type+=type_uint;
}
}
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
Tienes que explicar de una forma mas clara y detallada tu problema.

Cita de: nolasco281 en  9 Marzo 2014, 19:57 PMquisiera 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 (cpp) [Seleccionar]
string nombre = "Hola";
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 (cpp) [Seleccionar]
char *nombre = "Cosa";
funcion(string(nombre));


Cita de: nolasco281 en  9 Marzo 2014, 20:41 PMtengo cin.ignore(); despues que me lee la cadena pero no me muestra la cadena
Publica el código fuente completo.

Cita de: nolasco281 en  9 Marzo 2014, 20:41 PMlo hice con cin >> cadena y despues
Código (cpp) [Seleccionar]
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
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 (cpp) [Seleccionar]
#include <iostream>
#include <string>
using namespace std;

int main()
{
   int matriz;
   cin >> matriz;
   
   // creamos la matriz !
   char **M = new char *[matriz];
   for (int i = 0; i != matriz; i++)
      M[i] = new char [matriz];
   
   // Asignacion, solo un ejemplo
   for (int i = 0; i != matriz; i++)
      for (int j = 0; j != matriz; j++)
         M[i][j] = '*';
   
   //mostrar matriz
   for (int i = 0; i != matriz; i++){
      for (int j = 0; j != matriz; j++)
         cout << " " << M[i][j];
   
      cout << endl;
   }
   
   for (int i = 0; i != matriz; i++)
      delete[] M[i];
   delete[] M;
   
   return 0;
}


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

Un saludo
#444
Programación C/C++ / Re: Recibir int seguro
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
Otra solución recursiva pero forzada (ya que parte de la información se codifica en la cadena a imprimir) es:
#include <stdio.h>
#include <stdlib.h>

void f(char *ch);

int main(void)
{
   char ch[] = "    *\0*******";
   
   f(ch);
   
   return EXIT_SUCCESS;
}

void f(char *ch)
{
   int i = printf("%s\n", ch) - 1;
   
   if (*ch == ' '){
      ch[i] = '*';
      ch[i + 2] = '\0';
      f(ch + 1);
     
      printf("%.*s\n", i, ch);
   }
}


Un saludo
#446
Programación C/C++ / Re: Error c++
6 Marzo 2014, 16:36 PM
Cita de: eferion en  6 Marzo 2014, 09:14 AMEspero que no se me haya olvidado nada.
Hay un error lógico en este bloque:
int cargar_arch()
{
   if (fopen("dato.txt","r")){
      arch = fopen("dato.txt","r"); /* modo "r", lectura */
      fscanf(arch, "%i", &a);       /* OK */
     
      for (int c = 0; c < a; c++){
         fprintf(arch, "%s\n", nombres[c]);   /* <== */
         fprintf(arch, "%s\n", apellidos[c]); /* <== */
      }
      fclose(arch);
     
      return 1;
   }

Considerando el estado del programa tal vez haya mas (no lo revise a fondo).

Un saludo
#447
Cita de: yoel_alejandro en  5 Marzo 2014, 21:23 PMBá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):
void rombo(int N)
{
   int i;
   int j;
   
   for (i = -N/2; i <= N/2; i++){
      for (j = 0; j < N - abs(i); j++)
         putchar(j < abs(i) ? ' ' : '*');
     
      putchar('\n');
   }
}


----

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int i;
   
   for (i = -4; i < 5; i++)
      printf("%*c%0*d\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, 0);
   
   return EXIT_SUCCESS;
}


Produciendo la salida:
     0
    000
   00000
  0000000
000000000
  0000000
   00000
    000
     0


Un saludo
#448
Cita de: nanto en  4 Marzo 2014, 07:46 AM
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:
char *arreglo, S3, aux1;
El otro fragmento que pones no es valido, supongo en realidad la declaracion de las variables es:
char **arreglo, *S3, *aux1;

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

Un saludo
#449
Programación C/C++ / Re: fopen() y c++
3 Marzo 2014, 23:58 PM
Cita de: m@o_614 en  3 Marzo 2014, 21:33 PMcon 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 (cpp) [Seleccionar]
// ...
while((car = fgetc(fd)) != EOF)
   cout << "" << car;
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 (cpp) [Seleccionar]
while((car = fgetc(fd)) != EOF)
   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
Para imprimir las secuencias de espacios y asteriscos se puede desarrollar una función, por ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define LADO  5

void repetir(int reps, char ch);

int main(void)
{
  int i;
 
  for (i = 1; i < LADO * 2; i += 2){ /* 1, 3, 5, 7, 9 */
     repetir((LADO - 1) - i/2, ' ');
     repetir(i, '*');
     putchar('\n');
  }
 
  for (i -= 4; i > 0; i -= 2){ /* 7, 5, 3, 1 */
     repetir((LADO - 1) - i/2, ' ');
     repetir(i, '*');
     putchar('\n');
  }
 
  return EXIT_SUCCESS;
}

void repetir(int reps, char ch)
{
  int i;
 
  for (i = 0; i < reps; i++)
     putchar(ch);
}


Otra forma de imprimir ese rombo en particular es:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char ch[] = "*********";
  int i;
 
  for (i = -4; i < 5; i++)
     printf("%*c%.*s\n", 1 + abs(i), ' ', 1 + (4 - abs(i)) * 2, ch);
 
  return EXIT_SUCCESS;
}


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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch[] = "*********";
   int i;
   
   for (i = -4; i < 5; i++)
      printf("%*.*s\n", 9 - abs(i), 1 + (4 - abs(i)) * 2, ch);
   
   return EXIT_SUCCESS;
}


Un saludo