elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11
21  Programación / Programación C/C++ / Re: [ALGEBRA DE MATRICES] Matriz triangular superior desdendiente en C. en: 1 Mayo 2020, 21:38 pm
Hmmm.... Correcta!   ;-) ;-) ;-)

Una objección:
  •  La tecnica es estructurada, pero emplea 3 variables... trinangular_superior es redundante...

Se puede conseguir una solucion estructurada y con solo 2 variables locales?


...
Por lo tanto la solución más sencilla parece un par de bucles que recorran esta parte de la matriz.
.....
Código
  1. int upperTriangleDesc(const int **A, const int N){
  2. int triangular_superior = 1;
  3. for(size_t i = 1; i < N && triangular_superior; ++i)
  4. for(size_t j = 0; j < i && triangular_superior; ++j)
  5. triangular_superior = (A[i][j] == 0);
  6. return triangular_superior;
  7. }
....
Como echo de menos estas cosas de C/C++ desde que trabajo con Java :rolleyes:
...
Desde luego... Con los Objetos de Java (o de C++) no se puede hacer fácilmete algebra...

22  Programación / Programación C/C++ / Re: [ALGEBRA DE MATRICES] Matriz triangular superior desdendiente en C. en: 1 Mayo 2020, 21:31 pm
Hmmmm... Correcta! ;-) ;-) ;-)

Dos objecciones que lo pueden hacer mejor...
  •  Date cuenta que contador=i-1. Luego esa variable es redundante, innecesaria! Basta a<i
  •  Desde un punto de vista purista (ojo, esto no le quita valor a lo tuyo)... no es progrmacion estructurada... saliendo del bucle interno con return

¿Igual algo así?

Código
  1. int upperTriangleDesc(const int **A, const int N)
  2. {
  3.    int contador = 0;
  4.    int i, a;
  5.  
  6.    for ( i = 1; i < N; i++)
  7.    {
  8.        for (a = 0; a <= contador; a++)
  9.        {
  10.            if (A[i][a] != 0) return 0; // Es incorrecta
  11.        }
  12.        contador++;
  13.    }
  14.  
  15.    return 1 ; // Es correcta
  16. }
23  Programación / Programación C/C++ / [ALGEBRA DE MATRICES] Matriz triangular superior desdendiente en C. en: 1 Mayo 2020, 20:08 pm
Se pide, dada na matriz de tamaño NxN, N arbitrario, determinar si es una matriz triangular superior decendiente. Esto es, los elementos debajo de la diagonal principal descendiente son todos nulos (no necesariaemente el resto).

Por ejemplo, son triangulares superiores descendientes:

Código:
1 2 3    1 2 3    
0 4 5    0 4 5
0 0 2    0 0 0

Y no lo son

Código:
1 2 3    1 2 3    
0 4 5    2 4 5
0 2 2    0 0 0
Se facilita el codigo de entrada/salida y unos casos de uso. La primera linea marca la dimension de la matriz cuadrada, N. Las siguientes N lineas dan las filas de la matriz.

ES UN RETO. YO YA TENGO LA SOLUCION. EN UNOS DIAS LA PONGO...
(Se valora la solucion mas imple)



Código:
5
1 2 3 0 0
0 4 5 0 0
0 0 0 1 1
0 0 0 3 1
0 0 0 0 1
upperTriangleDesc: 1
3
1 2 3
0 4 5
0 2 0
upperTriangleDesc: 0
3
1 2 3
0 4 5
0 0 0
upperTriangleDesc: 1
Código
  1. int upperTriangleDesc(const int **A,
  2.      const int N)
  3. {
  4. // Start coding here
  5.    return 0 ;
  6. }
  7.  
  8. int main(int argc, char *args[])
  9. {
  10.  int **A;
  11.  int N;
  12.  for( ; scanf("%d",&N)==1; )
  13.    {
  14.      if  ((A=(int**)malloc(N*sizeof(int *)))==NULL)
  15. {
  16.  perror("calloc");
  17.  exit(1);
  18. }
  19.      for(int n=0;n<N;n++)
  20. {
  21.  if  ((A[n]=(int*)malloc(N*sizeof(int)))==NULL)
  22.    {
  23.      perror("calloc");
  24.      exit(1);
  25.    }
  26.  for(int m=0;m<N;m++)
  27.    if (scanf("%d",&A[n][m])!=1)
  28.      {
  29. perror("scanf");
  30. exit(1);
  31.      }
  32. }
  33.      printf("upperTriangleDesc: %d\n",upperTriangleDesc((const int **)A,N));
  34.      for(int n=0;n<N;n++)
  35. free(A[n]);
  36.      free(A);
  37.    }
  38.  return 0;
  39. }

24  Programación / Programación C/C++ / Re: Eliminar ultimo elemento de la lista enlazada C++ en: 21 Marzo 2020, 01:48 am
Brevemente, amigo.
Las estructuras de datos, en tu caso una lista simplemente enlazda, solo exiten para emular algun tipo asbtracto de datos (pilas, colas, dobles colas ... e incluso listas como tipo abstracto, no como estructura de datos en si).


EDIT: No se hacer en C++. Te proporcion en C


Para tu caso he elegio la emulación parcial de una doble cola. Faltan unas operaciones, como push_front, pop_front , que por espacio omito. practica tu.

TE podra serviar para lo que quieres.


La operacion por la que estas interesado es

Código
  1. typedef struct _node
  2. {
  3.  int info;
  4.  struct _node *next;
  5. } *node;
  6.  
  7. typedef struct _deque
  8. {
  9.  node first;
  10.  node last;
  11. }deque;
  12.  
  13.  
  14. void pop_back(deque *dq)
  15. {
  16.  assert(dq->last != NULL);
  17.  node prev,act;
  18.  for(prev=NULL,act=dq->first;act!=dq->last;act=act->next)
  19.    prev=act;
  20.  dq->last = prev;
  21.  if (prev) prev->next=NULL;
  22.  else dq->first=dq->last=NULL;
  23.  free(act);
  24. }
  25.  
  26.  

Y aqui una exhibicion del programa ejecutable


 
Código
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <assert.h>
  5.  
  6. typedef struct _node
  7. {
  8.  int info;
  9.  struct _node *next;
  10. } *node;
  11.  
  12. typedef struct _deque
  13. {
  14.  node first;
  15.  node last;
  16. }deque;
  17.  
  18.  
  19. int print(const deque *dq){
  20.  printf("[ ");
  21.  node p;
  22.  for(p=dq->first;p!=NULL ; p=p->next)
  23.    printf("%d ",p->info);
  24.  printf(" ]");
  25.  printf("\n");
  26.  return 0;
  27. }
  28.  
  29. void create(deque *dq)
  30. {
  31.  dq->first = dq->last = NULL ;
  32.  return;
  33. }
  34.  
  35. void push_back(deque *dq,int info)
  36. {
  37.  node n;
  38.  if ((n = (node)malloc(sizeof(struct _node)))==NULL)
  39.    {
  40.      perror("malloc");
  41.      exit(-1);
  42.    }
  43.  n->info = info;
  44.  n->next = NULL;
  45.  node prev;
  46.  
  47.  if (dq->last) dq->last->next = n ;
  48.  dq->last= n;
  49.  if (!dq->first) dq->first=dq->last;
  50.  return;
  51. }
  52.  
  53.  
  54.  
  55. int top(const deque *dq)
  56. {
  57.  assert(dq->last != NULL);
  58.  return dq->last->info;
  59. }
  60.  
  61. void pop_back(deque *dq)
  62. {
  63.  assert(dq->last != NULL);
  64.  node prev,act;
  65.  for(prev=NULL,act=dq->first;act!=dq->last;act=act->next)
  66.    prev=act;
  67.  dq->last = prev;
  68.  if (prev) prev->next=NULL;
  69.  else dq->first=dq->last=NULL;
  70.  free(act);
  71. }
  72.  
  73.  
  74. int empty(const deque *dq)
  75. {
  76.  return dq->first == NULL;
  77. }
  78.  
  79. void destroy(deque *dq)
  80. {
  81.  node p,aux;
  82.  for(p=dq->first ;p;p=aux)
  83.    {
  84.      aux=p->next;
  85.      free(p);
  86.    }
  87.  return ;
  88. }
  89.  
  90. int main(int argc, char *args[] )
  91. {
  92.  int N=10;
  93.  deque dq;
  94.  create(&dq);
  95.  for(int n=0;n<N;n++)
  96.    push_back(&dq,n);
  97.  for( ; !empty(&dq); pop_back(&dq)) print(&dq);
  98.  print(&dq);
  99.  destroy(&dq);
  100.  return 0;
  101.  
  102. }
  103.  
  104.  

Y una preuba de ejecucion

Código:
[ 0 1 2 3 4 5 6 7 8 9  ]
[ 0 1 2 3 4 5 6 7 8  ]
[ 0 1 2 3 4 5 6 7  ]
[ 0 1 2 3 4 5 6  ]
[ 0 1 2 3 4 5  ]
[ 0 1 2 3 4  ]
[ 0 1 2 3  ]
[ 0 1 2  ]
[ 0 1  ]
[ 0  ]
[  ]
25  Programación / Scripting / Re: leer un array por entrada estandar (cmd) en: 29 Noviembre 2019, 21:01 pm
Gracias, esa página ya la vi antes de consultar, y no encontré la respuesta. Necesito tomar los datos de la entrada estándar.
26  Programación / Scripting / leer un array por entrada estandar (cmd) en: 29 Noviembre 2019, 15:52 pm
Hola.
Tengo experiencia en C pero me gustaría aprender el criptico command.com

Hay algunos tutoriales en la sección de mensajes fijos, pero no encuentro la respuesta.

Se que

Código:
set /P VAR=

Lee un escalar. Pero no consigo leer un array por entrada estandar.

algo como

Código:
for %%i in (0,1,10) do (
   set /P A[%%i]=
)
Que desde luego, no funciona. si alguien puede decirme...
27  Programación / Programación C/C++ / Re: Alguna manera de saber si un numero es narcisista sin utilizar el pow? en: 19 Noviembre 2019, 14:14 pm
Es un problema muy bonito.  :D

En pseudocódigo tu solución quedaría así:
Código:
INICIO
    PEDIR numero
    digitos[LONGITUD_MAXIMA] // array de longitud igual al maximo numero de digitos que puede tener el numero
    numeroDigitos := calcularDigitos(numero, digitos)
...
FIN

La solución por YreX-DwX parece correcta, pero un poco ineficaz, ya qu está en complejidad O(log^2(N)). A grandes rasgos, esto quiere decir que para un número de 10 cifras, hace 10*10 veces la operación más intern, para uno de 1000, hace 1000*1000 veces...


Yo propongo una solucion en O(log(N)), es decir , para un numero de 10 cifras, hace 10*10 veces la operación  . Para uno de 1000, hace 1000*10 veces la operación interna...., Para uno de 4000 cifras, hace 4000*10 veces la operación interna...  Y en espacio es O(10)=O(1), y que solo hay 10 digtos posibles...

Código
  1. /*
  2.  
  3.   Title: Narcisist number (in  base 10)
  4.  
  5.   P : N == \sum i : 0 <= i <= log(N): a_i*10^i
  6.   Q : N==\sum i : 0 <= i <= log(N): a_i^{log(N)+1}
  7.  
  8.  
  9. 3     2     1     0
  10. +-----+-----+-----+
  11. |  1  |  5  |   3 |  YES, since 153=1^3+5^3+3^3
  12. +-----+-----+-----+
  13.  
  14.  
  15.  
  16. I ::= 0<=n<=log(N)+1 and Q[log(N)/n-1] and
  17.       M=N/10^n and
  18.       (n<=log(N) ->
  19.       (\forall i : 0 <= i < 10 : pow[i]=i^n and frec[i]=FREC(i,N%10^n)))
  20.  
  21. !B ::= n==log (N)+1
  22.  
  23. B ::= n<log (N)+1  ; // i.e. M>0
  24.  
  25. Init:
  26. -----
  27.   n,pow[0..9],frec[0..9]=0,
  28.  
  29.   |- P -> I [n/0,M/N,pow[0..9]=[1]^10, frec[0..9]=[0]^10]
  30.  
  31.  
  32. QUOTE(N,n) = log (N)+1 - n >= 0   (Cuota decreases)
  33.  
  34. Step:
  35. -----
  36.  
  37.  n = n + 1 ; // i.e. M = M/10 ;
  38.  
  39. */
  40.  
  41. #include <iostream>
  42. #include <cassert>
  43.  
  44. using namespace std;
  45.  
  46. int narcisist(const unsigned long long N)
  47. {
  48.  unsigned long long pow[10]={1,1,1,1,1,1,1,1,1,1} ; // [0-9]^0
  49.  unsigned long long frec[10]={0,0,0,0,0,0,0,0,0,0} ;
  50.  unsigned long long sum,M;
  51.  assert(N);
  52.  for (M=N ; M ;M/=10 )  // O(log(N)
  53.    {
  54.      frec[M%10]+=1;
  55.      int d;
  56.      for (sum=d=0 ; d<10 ;d++ )  // O(1)
  57. {
  58.  pow[d]*=d;
  59.  sum+=pow[d]*frec[d];
  60. }
  61.    }
  62.  //  cout <<"trace " << N << " " << sum << endl;
  63.  
  64.  return sum==N;
  65.  
  66. }
  67.  
  68. int main (int argc, char *args[])
  69. {
  70.  unsigned long long N;
  71.  for( ; cin >> N ; )
  72.    cout << narcisist(N) << endl;
  73.  return 0;
  74. }
  75.  

Solo me se 153 y 1634 como numero narcisistas en base 10... SI alguien sabe otros, puede comprobar...

Código:
 g++ narcisista.cc -o main && ./main
1634
1
153
1
154
0
28  Programación / Programación C/C++ / Re: Ayuda en: 13 Octubre 2019, 18:03 pm
Hola!

Basado en el trabajo de  YreX-DwX, ahora creo que si he dado con una respuesta a tu problema. Un interprete de expresiones en notación polaca inversa.

En algún lado de la Wikipedia he leído que una de sus propiedades es que el empleo de paréntesis se hace innecesario con independencia de la precedencia de los operadores. Cada secuencia (correcta) determina una y solo una expresión valida...

Para no repeterlo aquí, lo podéis ver en el correo modificado anterior:

https://foro.elhacker.net/programacion_cc/ayuda-t499837.0.html;msg2206082#msg2206082
29  Programación / Programación C/C++ / Re: Ayuda en: 11 Octubre 2019, 15:37 pm
Tengo otra duda, porque yo tengo que ingresar la ecuacion en notacion polaca al programa. Como puedo hacer para ir guardando el primer numero, el segundo y su signo? He visto que lo hacian con pilas pero mi profesor me dijo que lo trate de hacer de otra forma pero no me sale una idea


Las pilas por debajo están simuladas con vectores... O sea, que expones los vectores que se ocultarían en la implementación de una pila normalemente...

EDITO
En esta versión implemento un analizador de notación polaca inversa.
Esto es, primero los operandos y después el operador. Como en (3 4 -)


Código
  1. /*
  2.  
  3. An stack can be simulated by a vector
  4.  
  5. +-----+
  6. |     |
  7. +-----+ N
  8. |  2  |
  9. +-----+
  10. |  1  |
  11. +-----+
  12. |  +  |
  13. +-----+ 0
  14.  
  15.  
  16. */
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <assert.h>
  20. #include <string.h>
  21.  
  22. #define MAX 100000
  23. #define DEBUG
  24.  
  25. int polish (const char V[][25], const int N)
  26. {
  27.  int n,top;
  28.  int S[MAX];
  29.  for( n=top=0;n<N;n++)
  30.  {
  31. #ifdef DEBUG
  32.    int i;
  33.    for(  i=n ; i < N ; i++) printf("%s ",V[i]);
  34.    printf("\n\n");
  35. #endif
  36.  
  37.    if (strtol(V[n],NULL,10))
  38.      S[top++]=atoi(V[n]);
  39.    else
  40.      {
  41. assert(top>1);
  42. const int a = S[--top];
  43. const int b = S[--top];
  44. if (!strcmp(V[n],"+"))
  45.  S[top++] = a + b;
  46. else if (!strcmp(V[n],"-"))
  47.  S[top++] = a - b;
  48. else if (!strcmp(V[n],"*"))
  49.  S[top++] = a * b;
  50. else if (!strcmp(V[n],"/"))
  51.       {
  52. assert(!b);
  53. S[top++] = a / b;
  54.       }
  55.      }
  56. #ifdef DEBUG
  57.    for(  i=0 ; i < top-1 ; i++) printf("%d ",S[i]);
  58.    printf("%d\n\n",S[top-1]);
  59. #endif
  60.  };
  61.  assert(top==1);
  62.  return S[--top];
  63. }
  64.  
  65.  
  66. int main(int argc, char* args[])
  67. {
  68.  char V[MAX][25];
  69.  
  70.  int N;
  71.  for(N=0;scanf("%s",V[N])==1 && strcmp(V[N],"\n");N++);
  72.  printf("%d\n",polish(V,N));
  73.  return 0;
  74.  
  75. }

Y un ejemplo de ejecuci'on. Para la expresi'on en notaci'on polaca
Código:
3 4 + 7 * 9 10 5 6 + * - - 

En la ejecución se da la evoluición de la cadena de entrada y del estado de la pila...
Código:
3 4 + 7 * 9 10 5 6 + * - - 

3

4 + 7 * 9 10 5 6 + * - -

3 4

+ 7 * 9 10 5 6 + * - -

7

7 * 9 10 5 6 + * - -

7 7

* 9 10 5 6 + * - -

49

9 10 5 6 + * - -

49 9

10 5 6 + * - -

49 9 10

5 6 + * - -

49 9 10 5

6 + * - -

49 9 10 5 6

+ * - -

49 9 10 11

* - -

49 9 110

- -

49 101

-

52




30  Programación / Programación C/C++ / Re: Orden de letras de manera alfabetica en C en: 10 Octubre 2019, 08:44 am
Más sencillo aún:


Pero qué.... :-X :-X :-X

  • CalgaryCorpus ya ha comentado que no es necesario operar con enteros.
  • El programa solo acaba si la palabra tiene las 25 letras al menos una vez cada una! (Asumiendo que k=1 al principio, cosa que no se expresa)
  • Si acaba, el programa da siempre la misma solución ABCDEFG..Z

Páginas: 1 2 [3] 4 5 6 7 8 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines