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 - leosansan

#721
Cita de: xXxBazzxXx en  2 Junio 2013, 06:49 AM
Gracias!
Ahí lo corregí, y ahora tira otro error.

En la primera linea tira el error:

iostream: No such file or directory

(También al momento de compilarlo)

Tienes que guardar el fichero con la extensión .cpp en lugar de simplemente .c.

También debes escribir la segunda librería en el formato de C++:

Código (cpp) [Seleccionar]
#include <cstdlib>

Saluditos!. .... ..
#722
Programación C/C++ / Re: Vectores vs Listas
2 Junio 2013, 07:06 AM
Cita de: amchacon en  1 Junio 2013, 20:40 PM
Eso es lo que te pregunto (en este caso que escogerías?)

Yo me decanto por vector, de la librería vector que contiene con sus funciones incorporadas casi todo lo que exiges: añadir, añadir en una cierta posición,quitar, ordenar, desordenar , cambiar tamaño y así hasta 31 funciones ya listas ara ser usadas a la carta. También me influye el que veo las listas demasiado enrevesadas para programarlas desde que queremos añadirle las funcionalidades que de forma natural proporciona la clase vector. Es mi humilde opinión.

Saluditos!. .... ..
#723
Cita de: alexalfonso en  1 Junio 2013, 16:17 PM
HEY NECESITO UNA AYUDA CON ESTO ( C++ ):

Es muy simple, imprime las milésimas de segundo hasta que llega a la cantidad de milésimas que escribimos de primero.

El problema es que el Sleep no me esta marcando el tiempo de forma exacta, se tarda como 12 segundos en llegar a 1000,

Es hasta cierto punto normal ya que el compilador mide el tiempo total de la ejecución del programa y tal como lo tienes no sólo cuenta el tiempo de 1 segundo correspondiente a Sleep(1) 1000 veces, según pones en el código, sino que además hay un retardo considerable empleado en la impresión por pantalla de los 1000 números así como el retardo en presionar enter debida a la función system. Es este tiempo empleado el que origina que en lugar de tardar 1 segundo tarde los 12 que tú comentas, aunque aún con la impresión es algo elevado y lo achaco al retardo adicional en introducir el dato de 1000.

Para ver si tardaría 1 segundo, como pareciera en un principio por el bucle de Sleep(1) 1000 veces habría que desactivar la impresión y la función system, aún así tardaría un pelin más por  las llamadas a la memoria e incrementos correspondientes de la variable.

Me ha salido  1.015 segundos, muy cercano al 1 segundo esperado, dando de antemano el valor de 1000 a la variable y desactivando la impresión y el system, para descontar el tiempo que tardo en introducir dicho valor y el enter:


Código (cpp) [Seleccionar]
#include<windows.h>
#include<iostream>

using namespace std;

int main()
{
   int t=0,fin;
   /*cin>>*/fin=1000;
   while(fin>t)
   {
       //cout<<t<<endl;
       Sleep(1);
       t++;
   }
   //ystem("pause");
return 0;
}



Y lo que viene es para el amigo amchacon, ¿o podemos llamarte ya Miguel?:

Cita de: amchacon en  1 Junio 2013, 16:33 PM

¿En serio? A mi me tarda 1s:
http://imageshack.us/a/img7/4753/sinttulofmr.png


A mí me podéis llamar por mi nombre de pila León, :o  sí de nombre, no de apellido. Y lo de "san" es por el primer apellido :-) . Además, para más inri, soy leo de  horóscopo, ni tan siquiera, como buen leo, me interesan los demás signos zodiacales, sencillamente no tienen la suerte de ser leo. Y, como no y según habeís podido observar, mi animal preferido con diferencia es el León.  ;)

Rápido, rápido tu PC, el mio tarda algo más, 1.01. O como me comento, creo que mr.blood dejo de tener abiertas a la vez que el Code:Blocks 27, sí 27 contaditas, páginas web, música a todo volumen, así como los programas Python -sí, no puedo estar sólo con C y C++, en los que soy un aficionado, no como ustedes que son aunténticos profesionales, y  Matlab y Mathematica que son en lo que realmente trabajo duramente ahora y,  casi me olvido, mantengo abiertas las puertas del Facebook, el antiguo Messenger, ahora Skype mientras con utorrent y la mulita me descargo los últimos y no tan últimos estrenos y documentos varios y paro de contar mi vida, ! curiosos, que sois unos curiosos!. El problema de ser, aún a mi ya elevada edad y, a pesar de la enfermedad, una persona hiperactiva

Me entra una duda existencial al ver la imagen que posteas, ¿por que creas un proyecto para probar un código tan simple cuando puedes sencillamente crear un File nuevo?. La ventaja de trabajar con file es que puedes mantener "operativos" multitud de files para "probar"cosas mientras con un proyecto sólo puedes probar uno, cerrar y abrir otro proyecto y así sucesivamente. Yo uso ventanitas múltiples en Code::Blocks y cada una con múltiples pestañas. Así trabajo yo, en general dejando proyectos para programas que necesiten de varios file a la vez. Y eso porque ahora estoy en un portátil de tan solo 18 pulgadas, porque en la torre con uno de los monitores de 32 pulgadas mantengo nueve ventanitas abiertas, en lugar de las seis que aparecen en la imagen anterior. Y sí , estoy en esta situación porque ando reinstalado el Windows 7 -el 8 me resisto todavía a instalarlo, me parece poco práctico para un ordenador de sobremesa, es más bien para tablets y smarpfones- debido  a que una actualización automática me mando a la porra el sistema. Parece mentira pero aún ocurren cosas como esas.


Saluditos desde Gran Canaria! .... ...

#724
Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
#define NUM_ELEM  1000

/* ... */

int num[NUM_ELEM];
int i;
int j;

/* ... */

i = 0;
while (i < NUM_ELEM){
  num[i] = rand() % (NUM_ELEM + 1);
 
  for (j = 0; j < i && num[j] != num[i]; j++)
     ;
 
  if (i == j)
     i++;
}



Tengo que estar a la fuerza de acuerdo contigo, faltaría más. Pero en realidad estas haciendo lo mismo expresado de otra manera, sustituyes un for por un while y aprovechas el segundo for para meter en él la condición. Vamos, más cortito pero más de lo mismo.

Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

Sin duda vuelvo a estar de acuerdo contigo. Pero, cuando menos es curiosa/original la forma de obtener los elementos de la matriz sin repetir y aunque hace una comparación para ver si está o no repetido, sólo hace uso de un for y un else en lugar de mis dos for o tus dos bucles  while-for. Al César lo que es del César, me gustó la "elegancia/originalidad" de mr.blood de obtener los elmentos de la matriz, más inclusive que tu método. Claro que todo es cuestión de gustos.

Cita de: rir3760 en 31 Mayo 2013, 18:14 PM
No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:

Ya, se me escapó el detallit0 y mira que lo he aplicado ya varias veces. Son las miserias de contestar rapidito en el foro, me recuerda las partidas rápidas de ajedrez donde después de terminarlas te das cuenta de las tonterías que has cometido por culpa de ir contra reloj. Hago propósito de enmienda y tomarme más tiempo en contestar. Aunque pensándolo mejor, eso haría perder cierto encanto a la participación en el foro, al menos para mi punto de vista.

Como siempre, gracias por tus aportaciones/puntos de vista, siempre en la misma línea y me refiero al nivelazo que tienes /aportas al foro.

Un fuerte abrazo amigo rir, espero no te tomes a mal mis poquísimas y levísimas discrepancias.


#725
Cita de: rir3760 en  1 Junio 2013, 20:35 PM
Dos comentarios sobre tu programa:

1) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'. Para explicarlo mejor (con un ejemplo) revisa el funcionamiento del programa cambiando la cadena a procesar a:
char frase[] = "Hola\0como\0estas\0Hola\0como\0te\0va\0Hola\0amigo";

2) No es necesario poner a cero todos los caracteres del array "auxiliar" vía strcpy, con asignar '\0' al primero basta.

Un saludo


En cuanto a lo segundo totalmente de acuerdo, no está mal pero es una redundancia el uso de strcpy como has indicado.

Respecto a lo primero, el que en la cadena estuviera el \0, no me lo plantee porque no era el caso en cuestión. La cadena era la que era y se trataba de explicar el por qué no  le funcionaba, cosa que dentro de mis modestísimos conocimientos traté de hacer con resultados, a mi entender, aceptables, más cuando nadie parecía interesado en darle una explicación o por falta de tiempo, interés  o ganas.

Vamos, que si la cuestión hubiera sido analizar una cadena genérica entrada por teclado, en lugar  de la indicada por el código, el planteamiento habría variado.

Como resumen de lo expuesto, teniendo en cuenta también lo aportado por CCros:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
   char frase[] = "Hola como estas Hola como te va Hola amigo";
   char palabra[] =  "Hola" , aux[10]={0},aux0[10]="";
   int i=0, j = 0;

   do
   {
       if(frase[i]=='H' && frase[i+3]=='a')
           j++;
       i++;
   }while(frase[i] != '\0');
   printf("La palabra %s se repite %d veces con do-while.\n" , palabra, j);

   /************ otra forma************/

  char *p;
   i=0;
   for (p = frase; (p = strstr(p, "Hola")) != NULL; p += 2)
       i++;
   printf("La palabra %s se repite %d veces con strstr.\n",palabra, j);

   /************ otra forma************/

   int k=0;
   i=0, j = 0;
   for (i=0;frase[i] != '\0' ;i++)
   {
       if (frase[i] != ' ')
           aux[k] = frase[i];
       k++;
       if (frase[i] == ' ')
       {
           aux[k-1]='\0';
           k=0;
           if (strcmp (palabra,aux)==0)
               j++;
           aux[k]='\0';
       }
   }
    printf("La palabra %s se repite %d veces con strcmp.", palabra,j);

   /************ otra forma************/

    i = 0, j = 0,k = 0;
   do{
       while(frase[i] != ' ' && frase[i] != '\0')
       {
           aux[k] = frase[i];
           i++;k++;
       }
       aux[k]='\0';
       k=0;
       i++;
       if(strcmp(aux, palabra) == 0)
         j++;
       aux[k]='\0';
       }while(frase[i] != '\0');

   printf("\nLa palabra Hola se repite %d veces con do-while y strcmp.", j);

   /************ otra forma************/

   char *ptr;
   i = 0;
   ptr = strtok(frase, " ");
   while(ptr != NULL)
   {
       if(strcmp(ptr, palabra)==0)
           i++;
           ptr = strtok(NULL, " ");
   }
   printf ("\nLa palabra Hola se repite %d veces con strtok.", j);
   return 0;
}



Como siempre, gracias por tus aportaciones de las que no paro de aprender.

Saluditos! ... ..
#726
Cita de: mcKicrO en 31 Mayo 2013, 02:56 AM
Hola he intentado hacerlo de esta forma pero sigue sin funcionar este me compila
pero al ejecutarlo me indica que mi programa quiere leer una area de memoria que
no esta disponible como puedo correjirlo

Veamos por qué no te funciona:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char frase[] = "Hola como estas Hola como te va Hola amigo";
   char palabra[] = { "Hola" }, auxiliar[10]={0};/*==error, las llaves están de más*/

   int lon = strlen(palabra);/*<==esto no sirve de nada*/

   int i, j = 0;/*<==no inicializas la variable i a cero, error fundamental*/

   do{

       while(frase[i] != '32')/*<==debería ser: =32 o ='0' e incluir  
el llegar al final de la cadena, si no entras en un bucle por el
incremento posterior de i */
       {
           auxiliar[i] = frase[i];/*<== error en el índice de la variable
auxiliar, que llamaré k, debe ser independiente de i y cada vez que
inicie una nueva palabra esté a cero*/
           i++;/*<==aquí también habría que incrementar el índice de k*/
       }
       auxiliar[i]='\0';/*<==deberia ser auxiliar[k]='\0' y como
empezariamos con una nueva variable, se vuelve a inicializar el índice k a cero*/
       if(i == lon && strcmp(auxiliar, palabra) == 0)/*<==sobra lo de
lon, sencillamente se compara la variable auxiliar con palabr, la
longitud es lo de  menos, serán iguales o no, simplemente*/
         j++;

         if(frase[i] != '\0')/*<==esto sobra ya que hemos tenido en
cuenta este hecho en el while*/
           i++;
/*<==aquí falta limpiar la variable auxiliar, es decir que no contenga
nada, para volver a rellenarla en el while*/
   }while(frase[i] != '\0');

   printf("La palabra Hola se repite %d veces", j);

   return 0;
}



El código corregido es:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char frase[] = "Hola como estas Hola como te va Hola amigo";
   char palabra[] = "Hola" , auxiliar[10]={0}, auxiliar0[10]={0};
   int i = 0, j = 0,k = 0;
   do{
       while(frase[i] != ' ' && frase[i] != '\0')
       {
           auxiliar[k] = frase[i];
           i++;k++;
       }
       auxiliar[k]='\0';
       k=0;
       i++;
       if(strcmp(auxiliar, palabra) == 0)
         j++;
       strcpy(auxiliar,auxiliar0);
       }while(frase[i] != '\0');
   printf("La palabra Hola se repite %d veces", j);
   return 0;
}


Saluditos!. ... ..

#727
Cita de: mcKicrO en 31 Mayo 2013, 02:56 AM

   int i, j = 0;
Código (cpp) [Seleccionar]

   do{

       while(frase[i]!= '32')
       {
          ......................................................................


Perdona que no haya mirado mucho el código, pero de entrada tienes un despiste mortal de necesidad, no has inicializado la variable i y a partir de ahí paré de mirar, sorry. Cuando pille más tiempo lo miraré más detalladamente.

Saluditos! ... ..
#728

Pues a mí si me compila, pero con unas pequeñas variaciones :)

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char frase[] = "Hola como estas Hola como te va Hola amigo";
    char palabra[] =  "Hola" , aux[10]={0},aux0[10]="";
    int i=0, j = 0;

    do
    {
        if(frase[i]=='H' && frase[i+3]=='a')
            j++;
        i++;
    }while(frase[i] != '\0');
    printf("La palabra %s se repite %d veces con do-while\n" , palabra, j);

    /************ otra forma************/

   char *p;
    i=0;
    for (p = frase; (p = strstr(p, "Hola")) != NULL; p += 2)
        i++;
    printf("La palabra %s se repite %d veces con strstr.\n",palabra, j);

    /************ otra forma************/

    int k=0;
    i=0, j = 0;
    for (i=0;frase[i] != '\0' ;i++)
    {
        if (frase[i] != ' ')
            aux[k] = frase[i];
        k++;
        if (frase[i] == ' ')
        {
            aux[k-1]='\0';
            k=0;
            if (strcmp (palabra,aux)==0)
                j++;
            strcpy(aux,aux0);
        }
    }
     printf("La palabra %s se repite %d veces con strcmp", palabra,j);
    return 0;
}


Saluditos!. .... ..
#729

He tenido que crear un tema nuevo porque el autor del tema original, tan simpático él, le cambio el nombre al tema que se encuentra ahora en

http://foro.elhacker.net/programacion_cc/portafolium_set_my_name_for_the_example_yes_i_from_colombia-t390785.0.html

La verdad es que el reto era curioso, lamentablemente estaba algo indefinido, como ya comenté en otro post anterior.

Así que decidí poner yo las condiciones que faltaban:

* Rellenamos una matriz de 10x10 de manera aleatoria con números entre 1 y 1000.

* Se comienza, lo que acabará siendo un juego en modo consola, por situarnos en la casilla del número el mínimo de la matriz.

* A partir de ahí nos movemos hacia la casilla que le rodee y que contenga al mayor número, poniendo un cero en la casilla que se abandona.

* Si está rodeado de ceros el movimiento será  al máximo de los números que queden en la matriz y siempre dejando un cero en la casilla que se deja.

* Así se continúa hasta que todos los elementos sean cero.

Por ahora el movimiento lo realiza el ordenador, aunque espera un Enter para que el usuario pueda localizar la casilla. En cambio, en la próxima "entrega" el juego será más interactivo, ya que el usuario tendrá que entrar las coordenadas de la casilla a la que tiene que moverse, y en función de los intentos fallidos y el tiempo empleado se le puntuará. Y será aún con más color. Todo es cuestión de encontrar tiempo para su desarrollo. Y aún quedará el reto de controlar el ratón para mediante él seleccionar la casilla, aunque esto lleva más conocimientos de Api y/o ensamblador de los que tengo en estos momentos. Pero todo se andará.  :) y si alguien esta "curtido" en el control del ratón con las API agradecería me pasará información al respecto.

El reto en sí es hacerlo todo mediante un código simple y, lo más importante, sin usar librerías gráficas, todo en C puro y duro.

Por ahora dejo lo explicado anteriormente y para a quienes le queden dudas de cómo funciona el futuro juego, por cierto bautizado como "Matrisan", les dejo un enlace donde se ve en acción:



Código (cpp) [Seleccionar]

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

/***************  FUNCIONES  ***********/

int color (int n);
int mover (int i_mov, int j_mov, int matriz[10][10], int pendiente);
void rellenar_matriz (int i_mov, int j_mov, int matriz[10][10]);
void calculo_maximo (int matriz [10][10], int* i_max,int* j_max);

/***************  MAIN  ***********/

int main()
{
   //system("color 70");
   srand(time(NULL));
int n,matriz[10][10]={0}, i=rand()%10+1, j=0,pendiente=0, x, y,minimo=10001,i_min=0,j_min=0;

/***************  CALCULO  DEL MINIMO  ***********/

do{

x=rand()%10;
y=rand()%10;
if(matriz[x][y]==0 ){
           matriz[x][y]=i;
           if (i<minimo)
           {
               minimo=i;
               i_min=x;
               j_min=y;
           }
       i+=rand()%18+1;
       j++;
       }
}while (j<100);

/***************  IMPRESION CON COLOR  ***********/

   for(i=0;i<10;i++)
{
       putchar('\n');
for(j=0;j<10;j++)
       {
           if (i==i_min && j==j_min)
               n=228;
           else
               n=113;
           color (n);
           printf(" %d", matriz[i][j]);
           color (7);
           printf("\t");
       }
}
   color (96);
   printf("\n\nminimo = %d en la posicion ",minimo);
   color (228);
   printf(" (%d,%d) \n",i_min+1,j_min+1);
   color (7);
   matriz[i_min][j_min] = 0;
   mover (i_min, j_min, matriz,  pendiente);
   return 0;
}
int color (int n)
{
       SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
}

/***************  FUNCION COLOR  ***********/

int mover (int i_mov, int j_mov, int matriz[10][10], int pendiente)
{
   color (7);
   int n=0,i=0,j=0,maximo=0,maximo2=0,i_max=0,j_max=0,x,y;

   if (pendiente==100)
   {
       color (228);
       printf("\n\t\t\t\t\tACABO\t\t\t\t\t\n");
       color (7);
       return 1;
   }

   else
   {
       for ( i=i_mov-1; i<=i_mov+1; i++)
       {
           for ( j=j_mov-1; j<=j_mov+1; j++)
               {
                   if ( i < 0 || j < 0 || i > 9 || j > 9)
                       continue;
                   else
                   {
                       if (matriz[i][j] > maximo )
                       {
                           maximo = matriz[i][j];
                           i_max = i;
                           j_max = j;
                       }
                   }
               }
       }
  if (maximo==0)
       {
           for (x=0;x<10;x++)
               for (y=0;y<10;y++)
               {
                   if (matriz[x][y]>maximo)
                   {
                       maximo = matriz[x][y];
                       i_max = x;
                       j_max = y;
                   }
               }
       }
   }
   color (96);
   printf("\nMaximo = %d en la posicion ",maximo);
   color (228);
   printf(" (%d,%d) \n",i_max+1,j_max+1);
   color (7);
   //puts ("color");

   pendiente++;
   //rellenar_matriz ( i_mov,  j_mov,  matriz[10][10]);

   /***************  IMPRESION CON COLOR  ***********/

    for(i=0;i<10;i++)
{
       putchar('\n');
for(j=0;j<10;j++)
       {
           if (i==i_max && j==j_max)
               n=228;
           if (i==i_mov && j==j_mov)
               n=86;
           else if (matriz[i][j]==0)
               n=125;
           else
               n=113;
           color (n);
           printf(" %d ", matriz[i][j]);
           color (7);
           printf("\t");
       }
}
   //color (113);
   matriz[i_max][j_max] = 0;
   system("pause");
   system("cls");
   mover (i_max, j_max, matriz,  pendiente);
}

/***************  X  ***********/



Saluditos!. .... ..
#730
error.

El que abrió el tema le cambio el nombre así que decidí continuar la tarea abriendo otro tema con el nombre inicial actualizado simulacion con matriz bidimensional de 10x10 II

Saluditos!. ... ..