Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: micky123 en 16 Febrero 2010, 02:46 am



Título: Practiquemos C++ (juntos)
Publicado por: micky123 en 16 Febrero 2010, 02:46 am
Hola a todos bueno estuve leyendo el post en los cuales participaban Leyer y Amerikano, muy bueno por cierto, la idea de practicar en conjunto resolviendo ejercicios que suben el nivel gradualmente me agrada, partiendo de su idea; espero que participenos.

Como hicieron con java, quisiera proponer resolver ejercicios en C++,partiendo de ejercicios simples para todos aquellos principiantes (me incluyo).

si les parece... Comienzo proponiendo un ejercicio basico:

1. Realizar un programa en el cual me permita introducir un numero y el programa debera de desplegar un mensaje si dicho numero es capicua o no...
  Ejemlpo:    x=12321   mensaje==>   Es capicua

 


Título: Re: Practiquemos C++ (juntos)
Publicado por: AlbertoBSD en 16 Febrero 2010, 03:19 am
Aquí esta el código

Código
  1. #include<stdio.h>
  2.  
  3. int main(int argc, char **argv) {
  4. int numero,len,capicua,I;
  5. char *cadena;
  6. printf("Ingrese un numero: ");
  7. scanf("%d",&numero);
  8. cadena = (char*)calloc(18,sizeof(char));
  9. snprintf(cadena,19,"%d",numero);
  10. len = strlen(cadena);
  11. capicua = 1;
  12. I = 0;
  13. if((len % 2) == 0) {
  14. while(I <= (len/2)) {
  15. printf("comparando %c , %c\n",cadena[I],cadena[len - I -1]);
  16. if(cadena[I] != cadena[len - I -1]) {
  17. printf("Saliendo del ciclo\n");
  18. capicua = 0;
  19. break;
  20. }
  21. I++;
  22. }
  23. }
  24. else {
  25. while(I < ((len-1)/2)) {
  26. printf("comparando %c , %c\n",cadena[I],cadena[len - I -1]);
  27. if(cadena[I] != cadena[len - I -1]){
  28. printf("Saliendo del ciclo\n");
  29. capicua = 0;
  30. break;
  31. }
  32. I++;
  33. }
  34. }
  35. if(capicua)
  36. printf("Numero %d es capicua\n",numero);
  37. else
  38. printf("Numero %d NO es capicua\n",numero);
  39.  
  40. }

Lo he compilado con el gcc de devcpp


(http://lh5.ggpht.com/_1zYIthtq7IY/S3oDSdEd9DI/AAAAAAAAAOs/BlaDKKymVrU/s800/capicua1.PNG)

Saludos


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 16 Febrero 2010, 03:32 am
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. string num;
  8. cin>>num;
  9.  
  10. string num2 = string(num.rbegin(), num.rend());
  11.  
  12. if(num==num2)
  13. cout<<""<<"Es capicua"<<endl;
  14. else
  15.   cout<<""<<"No es capicua"<<endl;
  16.  
  17. cin.get();
  18. cin.get();
  19. }


Título: Re: Practiquemos C++ (juntos)
Publicado por: AlbertoBSD en 16 Febrero 2010, 03:35 am
Littlehorse tu código es mucho mas sencillo que el mio y mas facil de entender, sin embargo es posible ingresar también letras, ese seria "Textos capicua" xDD

Edit
Agrego codigo mas reducido, con la idea de Littlehorse

Código
  1. #include<stdio.h>
  2.  
  3. int main(int argc, char **argv) {
  4. int numero,len,capicua,I;
  5. char *cadena1,*cadena2;
  6. printf("Ingrese un numero: ");
  7. scanf("%d",&numero);
  8. cadena1 = (char*)calloc(18,sizeof(char));
  9. snprintf(cadena1,19,"%d",numero);
  10. len = strlen(cadena1);
  11. cadena2 = (char*)calloc(len,sizeof(char));
  12. I = 0;
  13. while(I < len) {
  14. cadena2[I] = cadena1[len -1 -I];
  15. I++;
  16. }
  17. if(strcmp(cadena1,cadena2) == 0)
  18. printf("Numero %d es capicua\n",numero);
  19. else
  20. printf("Numero %d NO es capicua\n",numero);
  21.  
  22. }

Saludos


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 16 Febrero 2010, 03:46 am
Y bueno texto capicua sera entonces  :xD jaja.

Ahora en serio, validar el input son solo 2 lineas mas y prefiero dejarselo a micky123. La lógica seguirá siendo la misma.

No obstante, en tu código también se puede ingresar texto:

Citar
Ingrese un numero: AAAADDDD
Numero 2 es capicua

Para validarlo podes usar ctype o chequear los valores ascii. Igualmente en C la única forma de validar un input correctamente es leyendo el texto y parseando.

Y para calloc tenes que incluir stdlib.h.

Un saludo!




Título: Re: Practiquemos C++ (juntos)
Publicado por: AlbertoBSD en 16 Febrero 2010, 03:53 am
Si se del stdlib.h sin embargo ahorita estoy en winsucks y si me lo permite con el gcc del devcpp

Ahora con tu comentario de texto en mi input, es cierto pasan cosas raras, de hecho:

Código
  1. scanf("%d",&numero);

scanf es el que impide la entrada de texto con el formato "%d"

(http://lh3.ggpht.com/_1zYIthtq7IY/S3oILY0TaRI/AAAAAAAAAO0/ucntbR5HPXI/s800/capicua_no_letras.png)

Aun así no procesa el texto como parte de la entrada

Saludos


edit

¿El que contesta el ejercicio propone otro?

Saludos


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 16 Febrero 2010, 04:00 am
Claro pero a lo que iba es que el programa funciona igual. Es decir, no hay avisos que el input es invalido. Ese 2 puede ser un 2 o cualquier otro valor basura.
No me gusta scanf, pero igualmente devuelve valores para comprobar si el input fue correcto. No es de lo mejor pero tampoco esta mal si validas de esa forma.
Yo también estoy con devcpp ahora.

Un saludo

PD: Tambien falta string.h para strxxx, aunque es verdad, en este entorno ni siquiera se queja  ;D.


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 16 Febrero 2010, 04:12 am
Hola a todos y gracias por continuar con el tema.
bueno mi respuesta al ejercicio q plantee seria:
#include<stdio.h>
#include<conio.h>

void main()
{
    int x,d,aux,i=1,nn=0;
    scanf("%d",&x);
    aux=x;
    while(x>0)
    {
          d=x%10;
          nn=(nn*i)+d;
          i=i*10;
          x=x/10;
     }
     if(nn==aux)
         printf("Es capicua");
     else
         printf("No es capicua");
}


bueno Anon gracias por responder primero, y bueno te tocaria proponer otro ejercicio(con la misma simplicidad  :) je je) gracias por continuar.


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 16 Febrero 2010, 04:15 am
Antes que nada decidir si es C, C++ o ambos  :). Porque el código que pusiste vos (Y Anon tambien) es C, y en el hilo el titulo dice C++. Decidí vos que fuiste el que inicio el hilo.

Y por cierto, muy buena iniciativa. Siempre viene bien ponerse a hacer ejercicios.

Un saludo!



Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 16 Febrero 2010, 04:21 am
bueno gracias por continuar...
espero no ser cambiante pero agradeceria por que continuemos con C...

por que aun soy principiante y quiero practicar un poco...

propongan un nuevo ejercicio je je :)
Salu2


Título: Re: Practiquemos C++ (juntos)
Publicado por: AlbertoBSD en 16 Febrero 2010, 04:39 am
LOL no me habia dado cuenta que el titulo dice "C++" xD, bueno acepto que me haga falta stdlib.h y string.h xD, en FreeBSD los tendría que poner a fuerza, pero "conio.h", micky123 no necesitas conio.h.

Ahora sobre ejercicios fáciles asi, pues no se me ocurren muchos pero ahi va uno:

Escribir un programa que lea un numero ROMANO en forma de cadena de caracteres y lo convierta en un numero Arábigo. Si ya esta repetido por ahi en las chinchetas propongan otro.

Saludos
 
 


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 16 Febrero 2010, 18:29 pm
Holas gracias por continuar y bueno dando solucion al ultimo ejercicio mi forma de resolverlo solo convierte un numero romano comprendido entre 0 y 399, seria asía:

/*Escribir un programa que lea un numero ROMANO en forma de cadena de caracteres y lo convierta en un numero Arábigo realizado por Micky123*/

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main(void)
{
   char v[15];
   int i=1, cont=0,na=0,dim;
   clrscr();
   printf("Ingrse Numero Romano: ");
   fflush(stdin);
   fgets(v,15,stdin);

   //cputs(v);
   dim=strlen(v);
   //mayusculas
   for(i=0;i<dim;i++)
   v=toupper(v);

   for(i=0;i<dim;i++)
     if(v=='I')
       if(v[i+1]=='V')
       { na=na+4;i++;}
       else
    if(v[i+1]=='X')
    {  na=na+9;i++;}
    else
      if(v[i+1]=='L')
        {na=na+49;i++;}
      else
        if(v[i+1]=='C')
          {na=na+99;i++;}
        else
          na++;
     else
       if(v=='V')
    na=na+5;
       else
    if(v=='X')
      if(v[i+1]=='L')
        {na=na+40;i++;}
      else
        if(v[i+1]=='C')
         { na=na+90;i++;}
        else
          na=na+10;
    else
      if(v=='L')
        na=na+50;
      else
        if(v=='C')
          na=na+100;

   printf("\nEn arabigo es %d",na);

   getch();
}

gracias y bueno proponiendo otro ejercicio(mm generacion de digitos) seria:
generar los N numeros perfectos:

salu2


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 16 Febrero 2010, 19:56 pm
micky123, usa las etiquetas Geshi para poner código, así es mas legible.

Citar
generar los N numeros perfectos:

Código
  1. #include <stdio.h>
  2. int isPnumber(int num);
  3.  
  4. int main()
  5. {
  6.    int num=0;
  7.    int i=0;
  8.  
  9.    printf("Ingrese numero:  ");
  10.    scanf("%d", &num);
  11.  
  12. for(i=1;i<=num;i++)
  13.  if(isPnumber(i))
  14.      printf("%d es perfecto\n",i);
  15.  
  16. }
  17.  
  18. int isPnumber(int num)
  19. {
  20.    int sum = 0 ;
  21.    int i=0;
  22.  
  23.    for( i = 1; i<num; i++ )
  24.        if( num%i==0)
  25.            sum+=i;
  26.    if( sum == num )
  27.        return 1;
  28.    else
  29.        return 0;
  30. }

Citar
Ingrese numero:  10000
6 es perfecto
28 es perfecto
496 es perfecto
8128 es perfecto


Nuevo ejercicio:

Leer tres variables enteras A1, M1, D1, que representan una fecha, y otras tres A2, M2 y D2, que representan otra fecha. Luego informar la cantidad de días entre las dos fechas (respetando la cantidad de días que tiene cada mes y teniendo en cuenta los años bisiestos).


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 17 Febrero 2010, 01:34 am
ok Littlehorse gracias por la sugerencia, es que como soy nuevo en el foro me voy acostumbrando :P...
salu2... resolviendo ejercicio.
Código
  1. Probando geshi
  2.  


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 17 Febrero 2010, 02:20 am
hola Litllehorse... bueno me costo mucho resolver este ejercicio je je... fue uno de mis ejercicios mas complejos, pero bueno al fin logre realizarlo... ahí va:

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. void main()
  5. { int d1,m1,a1,d2,m2,a2,d,db,ca;
  6.  int mes[12],i;
  7.  mes[1]=31;  mes[7]=31;
  8.  mes[2]=28;  mes[8]=31;
  9.  mes[3]=31;  mes[9]=30;
  10.  mes[4]=30;  mes[10]=31;
  11.  mes[5]=31;  mes[11]=30;
  12.  mes[6]=30;  mes[12]=31;
  13.  
  14.  printf("Ingrese dia inicial d1= ");
  15.  scanf("%d",&d1);
  16.  printf("Ingrese mes inicial m1= ");
  17.  scanf("%d",&m1);
  18.  printf("Ingrese año inicial a1= ");
  19.  scanf("%d",&a1);
  20.  
  21.  printf("Ingrese dia final d2= ");
  22.  scanf("%d",&d2);
  23.  printf("Ingrese mes final m2= ");
  24.  scanf("%d",&m2);
  25.  printf("Ingrese año final a2= ");
  26.  scanf("%d",&a2);
  27.  d=0;db=0;
  28.  ca=a2-a1-1;
  29.  d=d+ca*365;
  30.  
  31.  for(i=m1;i<=12;i++)
  32.    d=d+mes[i];
  33.  
  34.  if(m2>1)
  35.    for(i=1;i<=m2-1;i++)
  36.      d=d+mes[i];
  37.  d=d-d1+d2;
  38.  if(d1%100==0)
  39.  {  if(a1%400==0)
  40.      if(m1<=2)
  41. db=1;  
  42.  }
  43.  else
  44.  {
  45.    if(a1%4==0)
  46.      if(m1<=2)
  47. db=1;
  48.  }
  49.  for(i=a1+1;i<=a2;i++)
  50.  { if(i%100==0)
  51.    { if(i%400==0)
  52.        db++;
  53.    }
  54.    else
  55.    { if(i%4==0)
  56. db++;
  57.    }
  58.  
  59.  }
  60.  if(a2%100==0)
  61.  { if(a2%400==0)
  62.    { if(m2>2)
  63.      { db++; }
  64.      else
  65.      { if(m2==2 && d2==29)
  66.  db++;
  67.      }
  68.    }
  69.  }
  70.  else
  71.  { if(a2%4==0)
  72.    { if(m2>2)
  73.      { db++;}
  74.      else
  75.      { if(m2==2 && d2==29)
  76.          db++;
  77.      }
  78.    }  
  79.  }
  80.  d=d+db;
  81.  printf("Los dias entre la fecha 1 y la fecha 2 son= %d",d);
  82.  getch();
  83. }
  84.  

gracias por continuar con la linea y gracias por hacerme romper la cabeza :xD je je
lo necesitaba...
salu2


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 17 Febrero 2010, 02:29 am
Bueno me toca proponer otro ejercicio:

Encontrar numeros de 3 digitos, cuya suma del cubo de los digitos sea el numero
de 3 digitos, mostrar los digitos:
    ejemplo: 153= 13+53+33

espero haber sido claro :).

Extra  :)
Sin la intencion de molestar no c si pudieras resolver un ejercicio que hasta el dia de hoy no puedo resolverlo :-( :huh: :-(
si me das opcion a planteartelo lo coloco...

salu2


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 18 Febrero 2010, 12:08 pm
Ya me estaba olvidando de este post  :P

Encontrar numeros de 3 digitos, cuya suma del cubo de los digitos sea el numero

Código
  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. int IsNumber(int num);
  5. int main()
  6. {
  7. int num;
  8. int i;
  9.  
  10. printf("Ingrese numero (100-999): ");
  11. scanf("%d",&num);
  12. printf("----\n");
  13. for(i=100;i<=num;i++)
  14. if(IsNumber(i)==i)
  15.    printf("%d\n",i);
  16. }    
  17.  
  18. int IsNumber( int numero)
  19. {
  20. int i;
  21. int nums[3];
  22. double sum=0;
  23.  
  24. for (i=2;i>=0;i--)
  25. {
  26. nums[i]=numero/pow(10,i);
  27. nums[i]%=10;        
  28. }    
  29. for(i=0;i<3;i++)
  30.   sum+=pow(nums[i],3);
  31.  
  32. return sum;
  33. }
  34.  


Citar
Ingrese numero (100-999): 999
----
153
370
371
407

Nuevo ejercicio:

Desarrollar una función que permita insertar en una secuencia de dígitos los caracteres guión
cada 8 dígitos a partir del cuarto dígito, y un espacio cada 8 dígitos a partir del octavo dígito.
Si la cantidad de dígitos no fuera múltiplo de 8 se deberá adicionar ceros por la izquierda.
Ejemplo:
472348237388539055823012 queda como 4723-4823 7388-5390 5582-3012.

Citar
Sin la intencion de molestar no c si pudieras resolver un ejercicio que hasta el dia de hoy no puedo resolverlo :-( :huh: :-(
si me das opcion a planteartelo lo coloco...

Dale ponelo asi lo vemos, pero primero haz el ejercicio que te pase  :).

Un saludo!


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 19 Febrero 2010, 05:18 am
Hola de nuevo y gracias por continuar...
mi respuesta a:

Desarrollar una función que permita insertar en una secuencia de dígitos los caracteres guión cada 8 dígitos a partir del cuarto dígito, y un espacio cada 8 dígitos a partir del octavo dígito. Si la cantidad de dígitos no fuera múltiplo de 8 se deberá adicionar ceros por la izquierda.
Ejemplo:
472348237388539055823012 queda como 4723-4823 7388-5390 5582-3012.


Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4.  
  5.  
  6. void main(void)
  7. {
  8.   char v[35];
  9.   int i, dim,f;
  10.   clrscr();
  11.   printf("Ingrese Numero ");
  12.   fflush(stdin);
  13.   fgets(v,35,stdin);
  14.   dim=strlen(v);
  15.   v[dim+1]=v[dim];
  16.   for(f=dim;f>=1;f--)
  17.   {
  18.     v[f]=v[f-1];
  19.   }
  20.   for(i=1;i<=dim;i++)
  21.   {  if(i%5==0)
  22.      {
  23. v[dim+1]=v[dim];
  24.  for(f=dim;f>=i;f--)
  25.  {
  26.    v[f]=v[f-1];
  27.  }
  28. if(i%2==0)
  29. {
  30.  v[i]=' ';
  31. }
  32. else
  33. {
  34.  v[i]='-';
  35. }
  36.      }
  37.  
  38.   }
  39.   dim=strlen(v);
  40.   for(i=1;i<=dim;i++)
  41.     printf("%c",v[i]);
  42.   getch();
  43. }

Bueno algo raro que pasa es que introduzco tus datos y me devuelve:
Código
  1. 4723-4823 7388-5390 5582-3@

Porfa pido identificar mi error... gracias de antemano.




Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 19 Febrero 2010, 05:23 am
El ejercicio q nunca pude resolver es:

Dado un numero x (puede ser de cualquier cantidad de digitos) hallar todas las posibles combinaciones entre sus digitos:
ejemplo1:
x=1234
la salida seria:
1234
1243
1342
2341
2421
.....
123
132
213
231
321
312
....
12
21
31
13
23
32 todas las posibles permutaciones; podria ser x=124  ó x=64875

espero haberme dejado entender...
gracias de antemano
salu2


Título: Re: Practiquemos C++ (juntos)
Publicado por: ghastlyX en 19 Febrero 2010, 18:51 pm
Si te he entendido, es un simple backtracking muy sencillo de hacer.
Código
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. using namespace std;
  5.  
  6. void rec(int p, string& s, string r) {
  7.    if (p == s.size()) {
  8.        do {
  9.            cout << r << endl;
  10.        } while (next_permutation(r.begin(), r.end()));
  11.        return;
  12.    }
  13.    rec(p + 1, s, r);
  14.    r.push_back(s[p]);
  15.    rec(p + 1, s, r);
  16. }
  17.  
  18. int main() {
  19.    string s;
  20.    cin >> s;
  21.    sort(s.begin(), s.end());
  22.    rec(0, s, "");
  23. }

Un saludo de ghastlyX ;)


Título: Re: Practiquemos C++ (juntos)
Publicado por: Littlehorse en 19 Febrero 2010, 18:57 pm
Ains, siempre me olvido de este hilo. Tendre que tenerlo en favoritos.

@ghastlyX

Propone un ejercicio así no se pierde el hilo  :D


Título: Re: Practiquemos C++ (juntos)
Publicado por: ghastlyX en 19 Febrero 2010, 19:13 pm
Bueno, pues uno muy típico. Dadas dos strings, decir la longitud de la máxima subsecuencia que tengan en común (subsecuencia != substring). Hacedlo con una complejidad temporal polinómica, nada de probar a saco todas las posibilidades.

Un saludo de ghastlyX ;)


Título: Re: Practiquemos C++ (juntos)
Publicado por: micky123 en 21 Febrero 2010, 02:17 am
Holas Littlehorse y ghastlyX...
Bueno gracias por resolver el ejercicio de mi gran duda jeje...
pero, estoy practicando y aprendiendo con BC, y me dice que no tengo la libreria algorithm, obviamente lo busque y no lo encontre, o talves tengo q descargarmelo, donde me recomendarian entrar??

y siguiendo la linea, sinceramente no comprendo bien el ejercicio planteado (se seguro es por q soy novato).

salu2.


Título: Re: Practiquemos C++ (juntos)
Publicado por: .:BlackCoder:. en 6 Marzo 2010, 01:42 am
y siguiendo la linea, sinceramente no comprendo bien el ejercicio planteado (se seguro es por q soy novato).

Bueno segun yo xD Es que debes buscar el tamaño de la secuencia (secuencia de caracteres), mas grande, que tienen en comun las 2 cadenas... Me parece complicado, pero bueeeh nada es imposible...

PD: Aunque tenian tiempo sin escribir en este post, escribi de nuevo a ver si lo siguen, pues me parece muy bueno...