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

#1281
Eso se debe al uso intercalado de "scanf" y "gets" ya que la primera ignora el espacio blanco (con la mayoría de los especificadores) mientras que la segunda no.

Supongamos que tecleas:
2{ENTER}
Ese '2' se procesa y el resultado se almacena en la variable "n" pero el avance de linea se queda en el bufer de la entrada estándar. A continuación la función "gets" (es siempre mejor utilizar "fgets" en su lugar) se topa con el mencionado y lo considera una linea en blanco.

Para evitar eso se debe eliminar el resto de la linea justo después de la llamada a "scanf", por ejemplo:
int ch;

/* ... */

scanf("%d",&n);
/* Descartamos el resto de la linea */
while ((ch = getchar()) != EOF && ch != '\n')
   ;
for (i = 0; i < n; i++){
   printf("ingresa la cadena");
   gets(a[i]);
}


Un saludo
#1282
No es necesario. Basta con incluir el encabezado <stdlib.h>.

Un saludo
#1283
Si te refieres a que los caracteres que se tecleen en la consola no se presenten o bien se sustituyan por un carácter en particular (usualmente  el '*') eso no es posible utilizando solo C estándar.

Dependiendo del compilador y SO habrá que utilizar una biblioteca de terceros o el API del SO.

Un saludo
#1284
Cita de: Xandrete en 21 Febrero 2012, 22:24 PMSólo quería decir que te falta un par de paréntesis y que se te coló un - en la asignación de duracion. Has puesto:  duracion = (double)tf - (double)- ti / CLOCKS_PER_SEC; y sería: duracion = ((double)tf - (double)ti)/ CLOCKS_PER_SEC
Se puede reducir un poco mas. Al convertir explícitamente uno de los operandos de la resta al tipo "double" el otro debe ser del (o se convertirá al) mismo tipo. Eso también sucederá con la división.

Al final queda:
duracion = ((double) tf - ti) / CLOCKS_PER_SEC;

Un saludo
#1285
Un bucle "for" tiene la estructura:
for (expr; expr; expr)
   sentencia

A la ultima expresión se le conoce comúnmente como "incremento" porque es en ella donde se realiza el incremento del contador (la variable que controla la ejecución del bucle).

En otras palabras puedes colocar ahí cualquier expresión, por supuesto debes verificar que en algún momento la condición del bucle (segunda expresión) sea falsa para que este termine.

En C99 y C++ se puede sustituir la primera expresión por una declaración, por ejemplo:
Código (cpp) [Seleccionar]
for (int i = 0; i != 10; ++i)
   cout << "i == " << i << endl;


Un saludo
#1286
Cita de: soyloqbuskas en 21 Febrero 2012, 02:36 AMEl numero de impares entre 0 y n es n/2 redondeado hacia arriba.
ejemplo: n=8 numero de impares= 4 (1, 3, 5, 7)
              n=9 numero de impares=redondeo(4,5)=5 (1,3,5,7,9)
Para que la expresión solo utilice enteros se puede cambiar a "(N + 1) / 2".

Un saludo
#1287
Por partes.

Primero debo indicar que me equivoque con la explicación de la declaración, como dicen en mi rancho: "metí las patas" (las cuatro ;-) ).

----

Bueno, vamos a corregir eso. Cuando en la declaración de un array se utiliza una secuencia de caracteres delimitada por comillas dobles, por ejemplo:
char palabra[] = "hola";
Esa secuencia solo es una forma mas corta de indicar una lista de valores y la declaración anterior es equivalente a:
char palabra[] = {'h', 'o', 'l', 'a', '\0'};

En base a ello la declaración en tu programa:
char i = "a";

/* ==> */

char i = {'a', '\0'};

Es un error ya que una lista de valores solo puede utilizarse en la declaración de un agregado (una estructura o array) y la variable "i" no lo es.

----

Por otra parte en expresiones las secuencias de caracteres delimitadas por comillas dobles se conocen como "cadenas literales", estas secuencias se almacenan en algún lugar en memoria, su tipo es array de caracteres y si se trata de modificar una resulta en "comportamiento no definido" (cualquier cosa puede pasar).

Peor todavía, esas cadenas literales cuando se usan en una expresión tienen usualmente el mismo efecto que los arrays: resultan en la dirección en memoria del primer elemento de este.

Si todo eso te resulta complicado lo siento, el tema de los arrays y punteros es uno de los mas complicados en el lenguaje C.

Un programa demostrando lo anterior es:
#include <stdio.h>
#include <stdlib.h>

#define CAD_EJEMPLO  "123456789"

int main(void)
{
   int i;
   
   printf("La cadena de ejemplo es \"%s\"\n", CAD_EJEMPLO);
   
   /* 1) Direccion donde se almacena la cadena literal */
   printf("Direccion base: %p\n", (void *) CAD_EJEMPLO);
   
   /* 2) Espacio utilizado en memoria por la literal */
   printf("Espacio utilizado: %lu\n", (unsigned long) sizeof CAD_EJEMPLO);
   
   /* 3) Literales iguales se almacenan en el mismo lugar? */
   if (CAD_EJEMPLO == CAD_EJEMPLO)
      puts("Misma ubicacion");
   else
      puts("Distinta ubicacion");
   
   /* 4) Impresion de cada uno de los caracteres de la literal */
   for (i = 0; CAD_EJEMPLO[i] != '\0'; i++)
      putchar(CAD_EJEMPLO[i]);
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Un saludo
#1288
En el caso de aspectos subjetivos sobre el lenguaje C uno puede referenciar practicas seguidas por ciertos grupos, por ejemplo los influenciados (en el buen sentido de la palabra) con el estilo de los libros "K&R" y "K&R2". Uno puede en el tema indicar "me gusta mas", "me gusta menos", etc. pero no puede (por razones obvias) decir, por ejemplo, "es mejor".

En el caso de la sintaxis del lenguaje el escenario es distinto. Tomemos por ejemplo la definición de la función principal. Definiciones como "void main(void) ..." no se recomiendan debido a que su soporte depende del compilador utilizado.

En la misma linea indicar que la "mejor" forma de definir la función principal es:
int main(int argc, char *argv[]) ...
No es correcto, basta con pensar porque se debe definir en esa forma si los argumentos no serán procesados. Aquí uno puede discutir sobre las formas que son validas y las que no lo son.

En cuanto a colocar varias sentencias en una sola linea la mayoría de los libros y cursos lo evitan, en su lugar la convención es colocar solo una sentencia por linea utilizando lineas en blanco (al gusto) para enfatizar la estructura del programa.

Un saludo
#1289
Cita de: Anastacio en 19 Febrero 2012, 19:41 PMAhi esta el Code.

Llamarlas no me cuesta. Entenderlas para que me servirian, me cuesta.
El problemas es, al tratar de avanzar demasiado rápido en tu aprendizaje, estas ignorando (por trolling o de forma genuina, no lo se) las recomendaciones que se te dan. Casi al punto de parecer esto un monologo.

Veamos:

En mi primer mensaje indico:
Cita de: rir3760 en 17 Febrero 2012, 01:22 AMY casi puedo asegurar que tu error es colocar la llamada a srand justo antes de la llamada a rand: esa es la única explicación para obtener dos veces el mismo numero con llamadas consecutivas a función.

Y si revisamos el código fuente que acabas de publicar:
srand( (unsigned)time( NULL ) ); /* <== */
num1 = rand() % nivel;           /* <== */
getchar();
srand( (unsigned)time( NULL ) ); /* <== */
num2 = rand() % nivel;           /* <== */
getchar();


Lo que debes hacer es llamar una única vez a "srand", esto al principio del programa. Después solo llamas a "rand" cuando necesites el siguiente numero de la serie. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM_ELEM 16

int main(void)
{
   int i;
   
   /* Definimos la semilla utilizando la hora actual */
   srand((unsigned) time(NULL));
   
   /* Impresion de valores en el rango 0 .. NUM_ELEM - 1 */
   for (i = 0; i < NUM_ELEM; i++)
      printf(" %d", rand() % NUM_ELEM);
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Un saludo
#1290
Programación C/C++ / Re: Double a Char [C++]
19 Febrero 2012, 18:26 PM
Puedes utilizar la clase "stringstream", por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <sstream>
using std::stringstream;

int main()
{
double num = 1.2345;
string texto;

stringstream ss;
ss << num;
ss >> texto;

string::size_type num_chars = texto.size();
for (string::size_type i = 0; i != num_chars; ++i)
cout << texto[i] << endl;

return 0;
}


Solo debes tener cuidado al trabajar con números de punto flotante, hay algunas discusiones recientes sobre el tema.

Un saludo