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

#31
Cita de: Artikbot en 10 Marzo 2012, 00:03 AM
Ese vídeo es un clásico de los foros de informática, cada X meses alguien lo postea :xD


no es que estén fabricados para no durar, es que la tecnología que empleamos es tan alta que cualquier pedito ya rompe algo.


No es del todo cierto. Por temas económicos, un cierto fabricante puede considerar que le sale más a cuenta producir un artículo con una calidad y una integridad estructural menor. Ello comporta, a priori, dos ventajas: una reducción del coste de producción y la posibilidad potencial de que, tras una compra, el cliente vuelva a comprar el mismo producto en un futuro no muy lejano a causa del deterioro del primero, o requiera los servicios del soporte técnico. Esto es lo que me imagino que describen en el vídeo como obsolescencia programada (aún no lo he visto). Peor que la obsolescencia programada es la obsolescencia percibida. En esta última, si bien un producto sigue funcionando de forma no errática tras un cierto tiempo, el usuario percibe o tiene la sensación de que su producto es obsoleto o inferior frente a nuevas tecnologías. Este es el caso, por ejemplo, de la PS2 (modelo "obsoleto") y la relativamente reciente salida al mercado de la PS3 (modelo novísimo). U otro ejemplo aun más reciente: el iPad, el iPhone, y todas sus versiones posteriores. Como ya sabrán, estos dos esquemas de obsolescencias tienen su base en la sociedad consumista en que vivimos actualmente.

Saludos
#32
Programación C/C++ / Re: Contar caracters
10 Marzo 2012, 16:00 PM
Cita de: nirvguy en  9 Marzo 2012, 19:06 PM
Creas un array en el que cada indice represente un caracter (a,b,c,d,e,f,g,h,i,j,etc) y metes de valor la cantidad de veces que se uso. ¿De que tamaño? fijate que si trabajas con chars los chars van de -127 a 127.
Algo asi, por ejemplo
Código (cpp) [Seleccionar]

arr[65]=12; /*12 veces se uso la A*/

Espero haberte dado una guía.

Sólo una cosa. El tipo char tiene asociado el rango [-128,127], no el [-127,127]. Codificación Ca2.

Por otro lado, quisiera recomendar la buena costumbre de utilizar operaciones aritméticas con caracteres. Por ejemplo, si se desea crear un array con una posición para cada letra minúscula. crearlo como int array['z'-'a'+1]. De esta manera quedará más clara la función del array y nos aseguramos de no haber contado mal las letras del abecedario >.<

Y también me gustaría aconsejar usar la directiva define o declarar variables constantes para asignar identificadores:

Código (cpp) [Seleccionar]
#define NUMOFLETTERS 'z'-'a'+1
...
int array[NUMOFLETTERS];


Código (cpp) [Seleccionar]
int const NUMOFLETTERS = 'z'-'a'+1
...
int array[NUMOFLETTERS];


Cuando haces programas largos, ver un puñado de 27's o 42's por ahí puede ser muy confuso. De cara a la depuración y a la modificación, es más gratificante que cada constante tenga su identificador.

Cita de: Stone20 en  9 Marzo 2012, 20:52 PM
Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
   string abc= "abcdefghijklmnñopqrstuvwxy";
   vector<int> conta(26);
   string miCadena = "ejemplo de un tio que pregunta en un foro";
   
   for(int i=0;i < miCadena.size();i++)
       for(int j=0;j < abc.size();j++)
           if(miCadena[i] == abc[j]) conta[j]++;


   for(int k=0;k < conta.size();k++)
       cout << "Letra " << abc[k] << " aparece " << conta[k] << " veces." << endl;
   return 0;
}


Algo asi creo que funcionaria.Para que funcione mejor asegurate de convertir la cadena que entres a minusculas.

No es necesario desplegar esa maquinaria para saber si un carácter es una letra. Para saber si un carácter c es una letra (minúscula, pongamos, para simplificar), basta con comparar si es mayor o igual que 'a' y menor o igual que 'z'. No hace falta, pues, meter otro bucle dentro del primer for, y te ahorras ese string abc. En la librería cctype hay una función que te hace esto ya. Se llama isalpha() y recibe un parámetro de tipo char. Devuelve true si el parámetro es una letra, ya sea minúscula o mayúscula y falso en caso contrario.

Saludos
#33
Cita de: SXF en  6 Marzo 2012, 02:14 AM
He pensado en algo así:

int primo(int n, i){
    for(;((n>i)&&((n%i)!=0));i++)  return ((n%i)!=0);
}


EI: juntando mensajes.

Bueno veo que un poco diferente, alli se habla de numeros circulares  primos. Aunque gracias por la anotación.
Cita de: SXF en  6 Marzo 2012, 00:41 AM
Buenas, pues para pasar un rato divertido propongo un reto: Crear un codigo que nos diga si un número ES primo lo mas corto y eficiente posible, vale cualquier lenguaje;
Empiezo con el mio:

en c:


int esPrimo(int n){
    for (int i=2; i<n; i++) if(n%i==0) return 0;
    return 1;
}


Lo de corto lo cumple. Lo de eficiente...  :rolleyes:

#34
Cita de: rir3760 en  5 Marzo 2012, 00:42 AM
El uso de la función "foo" en el fragmento de Xandrete es solo ilustrativo, el ya lo indica así al final de su mensaje:
Un saludo

Exacto. ¡Gracias ;D!
Por cierto, he editado el código. Había puesto M[ i ][ M-i-1 ] en lugar de mat[ i ][ M-i-1 ].

Saludos
#35
Programación C/C++ / Re: librerias para c++
5 Marzo 2012, 10:36 AM
Cita de: Synth3tik0 en  5 Marzo 2012, 00:14 AM
que no neatbeans es para java? mejor bajate el codeblocks

Cierto, lo acabo de mirar. Está pensado fundamentalmente para Java. Es que llevo casi toda la vida usando Geany para programar, compilando desde consola (menos cuando empecé, que iba con Windows y Dev-cpp) y no voy muy puesto de IDE's  :-[

Como alternativa tienes el Codeblocks, tal y como te sugieren.

Saludos
#36
Programación C/C++ / Re: GUI en C++
5 Marzo 2012, 10:32 AM
Cita de: abi-ds en  5 Marzo 2012, 01:43 AM
Bueno no tengo mucha idea sobre C++, supuse que seria algo tranquilo programar GUI's, que tal vez contarían como el tipo Swing de Java.

Me interesa este lenguaje por que segun e visto en la web que es el mas utilizado para crear aplicaciones, como los navegadores. y es por eso que necesito saber como crear guis para crear aplicaciones no sean solo de consola.

Entiendo.

En ese caso, puedes hacer la lógica de la aplicación (lo que el usuario no ve) portable, e implementar una interfaz gráfica distinta para cada SO donde quieras distribuir tu aplicación (esto lo digo más que nada por si quieres usar cosas como el winAPI). O usar una librería que provea de portabilidad como wxWidgets, la que te mencioné en el post anterior. Otras librerías son qt y gtk. Y hay más, por supuesto.

Saludos
#37
Programación C/C++ / Re: librerias para c++
4 Marzo 2012, 23:35 PM
¿Eh? ¿Cómo que no tienes librerías? ¿Pero tienes compilador? Las librerías estándar vienen incluídas con tu compilador. Ignoro si el Netbeans viene ya con compilador integrado (y me siento demasiado vago para comprobarlo  :silbar:), pero si no es así, tienes que descargarte uno (por ejemplo el minGW si trabajas en Windows).

¡Saludos!
#38
Programación C/C++ / Re: GUI en C++
4 Marzo 2012, 23:31 PM
¡Hola!

¿Sin librerías externas? Bueno, teniendo en cuenta que las librerías externas se pueden hacer sin librerías externas, sí, claro que se puede si te pones a programar tus propias funciones gráficas >.<

Sin embargo, siendo prácticos, hay que recurrir a librerías de terceros. C/C++ no provee de herramientas estándar para interfaces gráficas.

Respecto al tema de portabilidad, depende de lo que escojas. En general, la gracia de usar librerías de terceros reside precisamente en la portabilidad. Conozco wxWidgets. Funciona tanto en Windows como en Linux :-). Pero hay muchísimas más, por supuesto.

Saludos, jefe.
#39
Oh, en general, para una matriz mat cuadrada de orden M.

El primer elemento de la diagonal secundaria es mat[0][M-1], el segundo es mat[1][M-2]... y el último es mat[M-1][0]. A partir de esto se puede extraer el patrón. Sea mat[ i ][ j ] un elemento de la diagonal secundaria. Si i va de 0 a M-1, j va de M-1 a 0. Podemos expresar j como función de i: j = M-1-i.

Comprobamos:
-Cuando i = 0, j = M-1-0 = M-1 -> correcto
-Cuando i = 1, j = M-1-1 = M-2 -> correcto
...
-Cuando i = M-1, j = M-1-(M-1)=0 -> correcto.

Por ende, podemos utilizar el siguiente bucle para recorrer la diagonal secundaria:

Código (cpp) [Seleccionar]
for (i = 0; i < M; ++i) foo(mat[i][M-1-i]);

Donde foo() es una función o código arbitrario.

Saludos.
#40
Deberías dividir tu problema en subproblemas. De momento tienes aislada la parte para saber si un número es primo. Lo ideal ahora sería que pensaras en un módulo o función que te calculara la órbita de un número. Si lo integras todo en el main, el código será más difícil de leer y de corregir.

Aquí una propuesta de función:

int orbit(int n) {
int n_10 = n/10;
int orbit = n%10;
n = n_10;
while (n != 0) {
orbit *= 10;
n /= 10;
}
orbit += n_10;
return orbit;
}


Tu idea para obtener la "órbita" de un número (convirtiéndolo en una cadena y efectuando los desplazamientos correspondientes) es también válida.

Tu código es un poquitín chapuza por los siguientes motivos. Imagínate que evalúas el 23423426. Tu código comprueba la primera vez que no es primo, pero igualmente haces la rotación y vuelves a comprobar si es primo, y así 8 veces. Es evidente que si una sola de las órbitas del número  no es prima, el número no puede ser primo circular y puedes parar y pasar a evaluar el siguiente número. Además, si tienes 7777, harás 4 comprobaciones, cuando está claro que es totalmente innecesario (da igual las rotaciones que le apliques a 7777, seguirá siendo el mismo número y por tanto, basta con una sola comprobación. Y por último, si tienes que un número es primo circular, esta claro que todos los números de su órbita son primos circulares también, y cuando llegues a ellos no haría falta hacer todas las comprobaciones de nuevo. Aquí un código que he hecho para este mismo problema en que tengo en cuenta todo esto:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int k = 0;

int isPrime(int n) {
int sqrt_n = (int) sqrt(n);
int lim = (sqrt_n+1)/6;
int i;
if (n==2 || n==3) return 1;
if (n==1 || !(n%2) || !(n%3)) return 0;
for (i = 1; i <= lim; ++i) {
if (!(n%(6*i-1)) || !n%(6*i+1)) return 0;
++k;
}
return 1;
}

int orbit(int n) {
int n_10 = n/10;
int orbit = n%10;
n = n_10;
while (n != 0) {
orbit *= 10;
n /= 10;
}
orbit += n_10;
return orbit;
}

int main() {
int n,prime,i,j,s,q;
int* taken;
scanf("%d",&n);
taken = malloc(n*sizeof(int));
for (i = 0; i < n; ++i) taken[i] = 0;

q = 1;
for (i = 3; i < n; i += 2) {
if (!taken[i]) {
j = i;
s = 0;
do {
if (j < n) {
taken[j] = 1;
++s;
}
prime = isPrime(j);
j = orbit(j);
} while (prime && j!=i);
if (prime) q += s;
}
}
printf("%d\n",q);
return 0;
}