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

#291
Cita de: full159 en 15 Agosto 2014, 20:36 PMrecién estoy empezando en c pues estoy viendo cursos en youtube y ahí hacen un ejemplo del primer programa usan estos códigos ellos les dan en compilar y se les compila en mi caso no no me pasa eso le doy en el botón de  build y no pasa nada
Ya que se trata de C incluir otro encabezado como <iostream> de C++ o indicarlo con "stdio.h" no solucionara el problema.

Como ya te indicaron lo que debes hacer es verificar que el código fuente este completo y correcto (ahí tienes el ejemplo de vangodp ). A continuación trata de compilarlo y si "no pasa nada" entonces indica el compilador o IDE que estas utilizando y el mensaje de error que este genera.

Un saludo
#292
Lo primero que se debe cambiar en el programa es la definición de la función main y evitar el uso de la biblioteca conio de Borland. Mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Y si apenas empiezas tu aprendizaje del lenguaje C debes conseguir un buen curso o libro, para recomendaciones solo tienes que utilizar el motor de búsqueda de los foros.

En cuanto al programa hay demasiados errores, los mas importantes son 1) primero imprimes la serie y solo después la calculas cuando debería ser al revés y 2) la función que genera la serie de números pares positivos se debe rescribir desde cero. Para generar esa serie debes utiliza un bucle de esta forma:
int i;
   
for (i = 0; i < n; i++)
   a[i] = (i + 1) * 2;


Un saludo
#293
Cita de: leosansan en  5 Agosto 2014, 15:56 PMpara concatenar las palabras usaría la función sprintf con lo que en con sólo una función concateno las palabras:

[...]

sprintf(cad, "%s%c%s", cad, ' ', pal);
Un problema con esa llamada a sprintf es indicar que la cadena debe imprimirse sobre si misma y en caso de utilizar el par strcpy/strcat se tiene el fastidio (con la segunda) de buscar el final de la primera cadena.

En su lugar se puede aprovechar el valor de retorno de sprintf, este es el numero de caracteres generados en base a la cadena de formato sin incluir el '\0'. Un ejemplo basado en el tuyo sin validaciones ni uso de memoria dinámica:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_PAL  50

char *funcion(char *frase);

int main(void)
{
   char frase[MAX_PAL * 20];
   
   printf("La frase es: \"%s\"\n", funcion(frase));
   
   return EXIT_SUCCESS;
}

char *funcion(char *frase)
{
   char pal[MAX_PAL];
   int nc;
   
   puts("Escribe una palabra ( n para salir ):");
   scanf("%s", pal);
   nc = sprintf(frase, "%s", pal);
   
   while (1){
      puts("Escribe una palabra (n para salir):");
      scanf("%s", pal);
     
      if (tolower(*pal) == 'n' && pal[1] == '\0')
         break;
     
      nc += sprintf(frase + nc, " %s", pal);
   }
   
   return frase;
}


Un saludo
#294
Cita de: leosansan en  7 Agosto 2014, 17:21 PMEs que ese caracter nulo  ;D:

Edité el mensaje anterior, pero lo que modifiqué fue la línea:

Código (cpp) [Seleccionar]
if ( iNoEspacio == 4  && ( frase [ i+1 ] ==  ' ' || frase [ i+1 ]==  '\0') )

para tener en cuenta al nulo.  ;-)
Es mejor mantenerse con la versión con centinela ya que a cambio de dos asignaciones fuera del bucle te ahorras la comparación dentro de este.

Otra alternativa consiste en utilizar la función strcspn para encontrar el siguiente carácter igual a ' ' o '\0' y la función memset para imprimir los cuatro espacios (los prototipos de ambas en <string.h>).

Un saludo
#295
Programación C/C++ / Re: Estructura switch¿?
1 Agosto 2014, 03:49 AM
Basta con colocar la sentencia de selección "switch" dentro de un bucle que se repita hasta que la opcion sea valida.

En C y sin validaciones es mas o menos asi:
int opcion;

/* ... */

do {
   puts("Introduce la opcion:");
   scanf("%d", &opcion);
   
   switch (opcion){
   case 1:
      puts("1");
      break;
   case 2:
      puts("2");
      break;
   case 3:
      puts("3");
      break;
   default:
      puts("Opcion fuera de rango");
      break;
   }
}while (opcion < 1 || opcion > 3);


Y por favor la próxima vez indica el lenguaje de programación que  utilizas.

Un saludo
#296
Cita de: kutcher en 28 Julio 2014, 17:51 PMDe ser así, porque al asignar la cadena s a una variable estática los caracteres posteriores al carácter nulo
En tu primer mensaje la función no tiene una variable con clase de almacenamiento estático, si actualizaste la función y te surge una duda por favor publica el código fuente completo.

Y si te interesa el tema de implementaciones propias de strtok puedes revisar varias de ellas en la discusión CRT personalizada.

Un saludo
#297
Cita de: kutcher en 28 Julio 2014, 16:23 PMluego de esta asignación la cadena s queda modificada no?
Si. El propósito de la función es buscar un único carácter y sustituirlo con un cero, si ello sucede se retorna el primer parámetro, caso contrario se retorna NULL.

A esa función se deberían realizar algunos cambios ya que si se busca un solo carácter no tiene caso que el segundo parámetro sea un puntero y ya que las variables "c" y "sc" (deberían ser de tipo char, no hay necesidad de declararlas con el tipo int) solo "pasan la cubeta" se pueden eliminar. Por ultimo no tiene en cuenta el caso donde el primer parámetro es una cadena nula.

Quedaría así:
char *mystrtok(char *s, char delim)
{
   char *p = s;
   
   do {
      if (*s == delim){
         *s = '\0';
         return p;
      }
   }while (*s++);
   
   return NULL;
}


Un saludo
#298
Las bibliotecas estándares de C y C++ no dependen del compilador utilizado sino al revés.

Una referencia en linea de la biblioteca estándar de C++ (C++98 y C++11) se encuentra en la pagina Standard C++ Library reference.

En la caso de C hay tres estándares, de los primeros dos referencias en linea cortesía de P. J. Plauger son C90, C99. En el caso de C11 no recuerdo una pagina con la descripción completa pero en su lugar y si se maneja con soltura el lenguaje se puede utilizar el ultimo borrador N1570.

Un saludo
#299
Como ya te comentaron CalgaryCorpus y Blaster debes verificar (de ser necesario) el campo "left" para conocer el minimo y el campo "right" para el maximo.

Ademas se puede sacar la comprobacion de arbol vacio fuera de la funcion dejando esa verificacion para quien llame a la funcion (de forma similar al uso de pilas con las funciones pop e is_empty). De hacerlo las funciones se reducen a:
Código (cpp) [Seleccionar]
node *min(node *n)
{
   return n->left ? min(n->left) : n;
}

node *max(node *n)
{
   return n->right ? max(n->right) : n;
}


Por ultimo se deben realizar varios cambios al programa, por ejemplo hay que cambiar el tipo de retorno de las funciones "printPostOrden", "printInOrden" y "printRoot" a "void" ya que en ningun momento retornas o utilizas el valor.

Un saludo
#300
Se deben evitar bucles como este:
Código (cpp) [Seleccionar]
for ( int i = 0, linea = 8; i < linea ; i++ ){
   for ( int j = 0, linea = 8; j < linea ; j++ )
      ( i % 2 != 0 && j == 0 ) ? ++linea, cout << ' ' : cout << '*' ;
   
   cout << endl ;
}

Ya que abren la puerta a errores lógicos al tener tres variables con el mismo nombre "linea" pero con ámbito distinto.

Para explicarlo mejor el bucle es (en concepto) equivalente a:
Código (cpp) [Seleccionar]
{
   int i = 0;
   int linea = 8;
   while (i < linea){
      int j = 0;
      int linea = 8;
      while (j < linea){
         ( i % 2 != 0 && j == 0 ) ? ++linea, cout << ' ' : cout << '*';
         
         j++;
      }
      cout << endl;
     
      i++;
   }
}


Ya que la intención es imprimir un espacio antes de las lineas pares se puede sacar la comprobación del bucle externo colocandola en el interno:
Código (cpp) [Seleccionar]
void imprime()
{
   linea = 8;
   
   for (int i = 0; i < linea; i++){
      if (i % 2)
         cout << ' ';
     
      for (int j = 0; j < linea; j++)
         cout << '*';
      cout << endl;
   }
}


Ya por ultimo el valor del campo "linea" debería definirse en otra función y utilizando la clase string se puede eliminar el bucle interno (en su lugar se crea previamente una cadena compuesta por asteriscos).

Todos esto espero se tome como una critica constructiva.

Un saludo