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

#1581
Cita de: neo_from_cs_matrix en  9 Julio 2011, 22:48 PM
señores agradezco sus respuestas pero me parece que la de leo g. es la mas posible
Correcto. Solo debes tener cuidado de implementar la matriz como muestra Leo, utilizando un "int **":

signed int **matriz, i, j;

if((matriz = malloc(filas * sizeof *matriz)) == NULL)
   return EXIT_FAILURE;

/* Reservar memoria para cada elemento de la matriz : */
for(i = 0; i < filas; i++)
   if((matriz[i] = malloc(columnas * sizeof *matriz[i])) == NULL)
      return EXIT_FAILURE;



Lo que no debes hacer es implementar la matriz utilizando un array de arrays como sugiere tu primer mensaje:
int matris[2][4];


Ya que los tipos de las variables (el array y el parámetro de la función "matrizEnCero_int") son distintos ("int [2][4]" el primero e "int **" el segundo).

Un saludo
#1582
Cita de: BlackZeroX?????? en 10 Julio 2011, 00:02 AM
has un:

fflush();  // stdio o a stdin

antes del getchar();
Si te refieres a utilizar "fflush(stdin)" antes de la llamada a "getchar()" no es una buena idea ya que el estándar de C define la funcion "fflush" solo para streams de salida (stdin es uno de entrada).


Cita de: Leo Gutiérrez. en 10 Julio 2011, 00:07 AM
while(getchar() != '\n');
getchar();
El problema con ese bucle es, si por cualquier razón la función retorna EOF, se cae en un bucle infinito. En todo caso:
int ch;

/* ... */

while ((ch = getchar()) != EOF && ch != '\n')
   ;



La mejor solución es utilizar un IDE que soporte la generación automática de una pausa cuando se ejecuta una aplicación de consola, de todos los disponibles el único que recuerdo no la tiene es Dev-C++. Eso o ejecutar la aplicación desde el interprete de comandos disponible (cmd.exe, bash, etc.).

Un saludo
#1583
Cita de: Leo Gutiérrez. en  9 Julio 2011, 23:57 PM
Otra cosa, no es necesario que definas PI, PI ya está definida en math.h como M_PI, así que la pudieras usar así:

a=M_PI*(r*r);
No exactamente. ISO-C90 e ISO-C99 no definen esa macro. Supongo es una de las extensiones de GNU GCC.

Un saludo
#1584
Programación C/C++ / Re: [C]Función SPLIT
9 Julio 2011, 01:48 AM
La función "split" del programa de Binary_Death se puede mejorar.

Se debería eliminar la llamada a "getchar" al final de la función "main" ya que la generación de una pausa de forma automática es problema del IDE, no del programa.

Y ya que la función retorna una única estructura no es necesario reservar memoria para ella, puede declararse una dentro de la funcion y utilizarla como valor de retorno.

También se pueden eliminar todas las conversiones explicitas ya que en C no son necesarias, "sizeof(char)" también hay que eliminarlo ya que este siempre es igual a uno.

----

Otra forma de realizar la operación utilizando la función strstr y aritmética de punteros es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **split(char const *linea, char const *sep);

int main(void)
{
   char **p;
   char **q;
   
   p = split("STRING1#DLM#STRING2#DLM#STRING3", "#DLM#");
   
   for (q = p; *q != NULL; q++){
      puts(*q);
      free(*q);
   }
   free(p);
   
   return EXIT_SUCCESS;
}

char **split(char const *linea, char const *sep)
{
   char **p;
   char const *a;
   char const *b;
   int i;
   
   p = malloc((strlen(linea) / 2 + 2) * sizeof *p);
   
   i = 0;
   a = linea;
   while ((b = strstr(a, sep)) != NULL){
      if (b != a){
         p[i] = malloc(b - a + 1);
         strncpy(p[i], a, b - a);
         i++;
      }
     
      a = b + strlen(sep);
   }
   if (*a != '\0'){
      p[i] = malloc(strlen(a) + 1);
      strcpy(p[i], a);
      i++;
   }
   p[i++] = NULL;
   
   p = realloc(p, i * sizeof *p);
   return p;
}


Un saludo
#1585
Lo primero que debes aclarar de una forma precisa es el objetivo de la funcion, si bien esta se llama "buscar" la operacion que realiza (de forma incorrecta) es "eliminar el primero".

Un saludo
#1586
Programación C/C++ / Re: Lista en C++
7 Julio 2011, 20:16 PM
Cita de: Franz1628 en  7 Julio 2011, 19:49 PM
Este es un ejemplo de insertar un nodo a una lista en forma ordenada pero en la parte de la funcion insertarNodo (en la parte de  "else" no veo como cambia el *cab para que se haya ingresado el NODO)

El codigo si funciona pero esa parte es la que no entiendo ,supongo que esta parte de :
neo->sgte = p->sgte;
p->sgte = neo;
"Pero esto como afectaria *cab ???"
No lo afecta y ese es el punto.

En la función de inserción primero se revisa si el nuevo nodo debe colocarse como primero, si es así se utiliza "*cab" para modificar el puntero al primer nodo de la lista (la variable "A" de la función "main").

Si no debe insertarse como primero basta con actualizar los punteros "sig" del nodo que corresponda (alguno después del primero) y del nuevo nodo.

Un saludo
#1587
Cita de: PiroskY en  7 Julio 2011, 18:16 PM
int c;
unsigned contador = 0;

while((c = getchar()) != EOF && c != '\n')
   if(c != '\n')
      contador++;


ahí quedaría, creo yo
No tendria efecto ya que el cuerpo del bucle (la sentencia de seleccion) se ejecuta mientras el caracter sea distinto de EOF y '\n'. En otras palabras dentro del cuerpo del bucle "c != '\n'" siempre es verdadero (1 en este caso).

Si se debe contabilizar el caracter '\n' esa condicion se puede colocar a continuacion del bucle:
int c;
unsigned contador = 0;

while ((c = getchar()) != EOF && c != '\n')
   contador++;
if (c == '\n')
   contador++;

/* ... */


Un saludo
#1588
Me parece el enunciado es bastante claro. El punto clave para obtener la solucion exacta es como, en ese libro y hasta ese punto, almacenan las palabras leidas mediante el objeto cin, utilizando un:

A) array de caracteres.
B) objeto de la clase string

El algoritmo es sencillo: inicias con un acumulador en cero y, por cada digito del numero binario empezando por el mas significativo y terminando con el menos, multiplicas el acumulador por dos y sumas el digito.

Por ejemplo en el caso de 1101:
1) Acumulador a 0

   A   D  (A es el acumulador y D el digito procesado)
2) 0 * 2 + 1 == 1
3) 1 * 2 + 1 == 3
4) 3 * 2 + 0 == 6
5) 6 * 2 + 1 == 13

Un saludo
#1589
Se debe comparar contra EOF en caso de error o fin de archivo y contra '\n' para cumplir con el enunciado (debe procesar solo una linea de texto).

Por ultimo se debe cambiar el tipo de la variable "c" en el programa de Leo a "int" ya que ese es el tipo de retorno de la función "getchar":
int c;
unsigned contador = 0;

while((c = getchar()) != EOF && c != '\n')
   contador++;


Un saludo
#1590
La recomendación dada por Leo (uso de "%s %c") debe solucionar el problema.


La causa del error es la siguiente, al utilizar estas dos llamadas:
fscanf(pf,"%s",planet_info[i-1].nombre);
fscanf(pf,"%c",planet_info[i-1].cod);


En la primera iteracion del bucle la primera llamada lee una palabra y el problema viene con la segunda: "%c" lee el primer carácter que encuentre sin ignorar el espacio blanco (espacio, tabulador, avance de linea, etc.). Ese es el espacio que separa la palabra del carácter.

En la segunda iteracion del bucle la primera llamada a función con "%s" lee el carácter y la segunda llamada con "%c" lee el avance de linea.

Esa es la razón por la cual debes doblar el numero de registros.


Para evitarlo basta con utilizar "%s %c" ya que esta lee una palabra ("%s"), descarta el espacio (" ")y por ultimo lee el carácter ("%c").

Un saludo