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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 102
341  Programación / Programación C/C++ / Re: Punteros en: 29 Mayo 2020, 08:30 am
.-Realice un programa que tenga una función que mediante apuntadores pueda transformar un
número entero en una cadena de caracteres formada por los dígitos del número entero.
Los punteros dan mucha libertad. Es muy difícil saber qué es lo que te están pidiendo exactamente pero yo creo que podría ser algo así:
Código
  1. void numberToString(int *number, char *string);
  2. char* numberToString(int *number);
En ambos casos es una función que recibe un entero por medio de un puntero, lo que sería el paso por referencia en C, y modifica (primer caso) o crea y devuelve (segundo caso) un puntero a una cadena en la que cada carácter es un dígito del número.

.-Empleando apuntadores escribir un programa que lea una línea de texto y escriba en pantalla
las palabras de que consta la línea sin utilizar las funciones de string.h y particularmente sin usar
strtok ().
En este caso quiero entender que tienes que separar cada una de las palabras leídas. Podrías guardar la línea de texto en una cadena unidimensional char[] e ir separando y mostrando alternativamente o, crear un array de cadenas char[][] y en cada fila guardar una de esas palabras.

Todo esto tiene bastante sentido si estás trabajando con memoria dinámica. Si no es así, también podrías hacerlo con memoria estática pero los punteros adquieren menos relevancia en este caso.

De todas formas, tienes que darnos más información sobre el problema. A ser posible con una breve explicación de lo que tú crees que tienes que hacer y cómo estás intentando hacerlo. Ya partimos luego de ahí para poder ayudarte mejor.

Suerte.  :-X
342  Programación / Programación C/C++ / Re: Ayuda con problema escolar, secuencia aritmetica en: 28 Mayo 2020, 23:39 pm
hola YreX-DwX, te agradezco mucho el tiempo que has dedicado a la respuesta, la verdad es que mi profesor no nos ha dado muchas clases y no tengo las bases necesarias para resolver el problema, intente hacer el pseudo codigo para el problema, lo hice de la siguiente forma:

PEDIR numero
SI NUMERO es igual o menor que 9 ENTONCES
 MOSTRAR "El numero "x9+1 = " Numero +1 veces 1"
SINO
 MOSTRAR "Introduzca un numero entre 1 y 9"
FIN SI
Lo primero: ese pseudocódigo no es muy correcto. Estás pidiendo un número <= 9 para mostrar el número en sí. Lo que tienes que hacer es calcular el número en base al que tú pides.
Además es importante el uso correcto de las comillas para mostrar mensajes. Las comillas significan que debe aparecer tal cual. Si pones "numero", se escribirá "numero"; si escribes: numero, se escribirá el valor del numero.

Hasta aquí creo entender el problema, sin embargo se me complica al querer escribir código para "numero+1" veces 1, no se en realidad como crear el bucle para ir colocando los 1 las veces que define numero.

Para crear bucles tienes que usar un sentencia while() o for():

SENTENCIA WHILE
Un bucle while(condicion) es un bucle que se repite mientras la condición que pongas dentro sea cierta. Es importante, dentro del bucle modificar algo que afecte a la condición pues sino el bucle siempre será cierto/falso y entonces nunca saldrás/entrarás.
Por ejemplo, para crear el primer número sabiendo el número de dígitos:
Código:
PEDIR numeroCifras
i := 1
numero := 0
MIENTRAS i <= numeroCifras HACER
  numero := numero + (i * pow(10, numeroCifras-i)) // pow(base, exponente)
  i := i + 1
FIN MIENTRAS
MOSTRAR "El numero de " + numeroCifras + " cifras es: " + numero


SENTENCIA FOR
Un bucle for(inicializacion, condicion, actualizacion) ejecuta lo que pongas en la inicialización cuando empieza, se repite como el while() cada vez que se cumple la condición y tras terminar cada iteración se ejecuta la actualización. El mismo ejemplo de antes con un for() sería:
Código:
PEDIR numeroCifras
numero := 0
PARA i := 1 HASTA numeroCifras INCREMENTO 1 HACER
  numero := numero + (i * pow(10, numeroCifras-i))
  // En este caso no se incrementa la i aqui porque ya lo hemos puesto en el INCREMENTO
FIN PARA

El for() puede parecer un poco más raro, te dejo la forma que tiene en C:
Código
  1. for(int i = 1; i <= numeroCifras; ++i){
  2.  // lo que sea
  3. }
  4. // Intentar usar i aqui da error porque solo existe dentro del for()
También puedes declarar la variable fuera. La diferencia es que si la declaras en el for() solo podrás usarla dentro del for() y si la declaras fuera podrás usarla una vez termine el bloque for().
Código
  1. int i;
  2. for(i = 1; i <= numeroCifras; ++i){
  3.  // lo que sea
  4. }
  5. // Aqui puedes usar la i porque esta declarada fuera del for()

Te dejo que intentes pasar esto a C, no tiene mucha complicación y es más gratificante si lo consigues tú. Lo único un poco raro es la función pow() pero ya existe en C, para poder usarla tienes que incluir la biblioteca <math.h>.

PD: Un bloque while() se puede convertir en un bucle for() y viceversa. La norma general es que si el bucle depende de un contador o índice se use for() y si la condición es de otro tipo, se utilice un while(). Pero ambas soluciones van a ser correctas. En el caso anterior, el uso correcto sería el for() pues depende de un contador i.

No se como hacer un arreglo, lo cheque en algunas paginas pero la verdad me perdí por completo, la forma en que puse el primer código, uso las funciones que me enseño el profesor pero no nos ha enseñado otras, solo conozco if y else ¿Podrías orientarme sobre que funciones estudiar para poder llegar a hacer el ejercicio?

Muchisimas gracias
No sé qué pretende que hagáis en este ejercicio pero me parece indispensable el uso de bucles para poder completarlo.
Creo que es mejor que primero lo intentes sin usar arrays/arreglos y luego le vayas introduciendo cosas. Mejor ir poco a poco comprobando que lo que tienes funciona que meter muchas cosas y luego hacerte un lío para arreglar los fallos.
Los arrays están muy relacionados con el bucle for(), te pongo un ejemplo básico de uso de un array con un for():
Código
  1. #include <stdio.h> // Biblioteca para la funcion printf()
  2.  
  3. #define LONGITUD 10 // Constante que se llama LONGITUD y vale 10. Es recomendable que las uses en vez de inventarte un numero dentro del codigo.
  4. // Si en algun momento quieres cambiar la longitud, solo tendras que cambiar ese 10. Si has ido poniendo 10 por todo el codigo, tendras que cambiarlo muchas veces
  5.  
  6. int main(){
  7.  int digitos[LONGITUD]; // Declaras un array estatico <digitos> con una longitud de lo que valga LONGITUD (10)
  8.  // La primera posicion del array es 0 y la ultima es LONGITUD-1 (9). Se accede a cada posicion con []
  9.  for(int i = 0; i < LONGITUD; ++i){
  10.    digitos[i] = i; // Guardamos en cada posicion el valor del indice: 0, 1, 2, 3, 4, 5,...
  11.  }
  12.  printf("El contenido del array es:\n");
  13.  for(int i = 0; i < LONGITUD; ++i){
  14.    printf("%d  ", digitos[i]);
  15.  }
  16.  getchar();
  17.  return 0;
  18. }
Los arrays son un tema muy amplio, te recomiendo que busques algún recurso (libros, pdfs, vídeos,...) sobre programación en C. Y las dudas que te surjan las preguntes por aquí porque si tengo que explicarte todo, se va a hacer un tema enorme. Así puedes profundizar más y con más ejemplos.

Ya tienes bastantes cosas para probar.
Suerte. :-X
343  Programación / Programación C/C++ / Re: Ayuda con problema escolar, secuencia aritmetica en: 28 Mayo 2020, 08:22 am
Si es la primera vez que tocas la programación y este es el primer ejercicio que os ha mandado hacer, tiene toda la pinta de que tienes un profesor un poco duro  :rolleyes: pero bueno, no hay que desanimarse por eso. Con los profesores duros en con los que más se aprende, a base de sacarse las castañas del fuego.

El primer código que pones es, digamos... una locura  :xD.
No es algo malo pues es la forma de pensar de cualquier persona pero los programas crecen muy rápidamente y no se pueden tratar los casos uno por uno porque entonces los códigos serían interminables. Es por esto que te pide sacar la correspondencia entre una cosa y otra, es decir el patrón con el que puedes hacer un programa mucho más corto.

El patrón en este caso si te das cuenta es:
1. Número (que llamaremos A) con n cifras empezando en el que la cifra en la posición 0 (izquierda) es 1 y para cada posición i, la cifra es i+1.
2. (* 9 +), no tiene mayor misterio puesto que siempre es así.
3. Número (que llamaremos B) que se corresponde con n+1. Si n vale 5 en el último caso (12345), B valdrá n+1 = 6.
4. Cantidad de 1s (que llamaremos X). Este valor es igual a B. En el último caso hay 6 1s.

Eso es obtener la correspondencia del ejercicio para poder programarlo. Y este patrón te permite conocer X sin tener que hacer la operación matemática, ya que X siempre tendrá una cantidad de 1s igual al número de dígitos del número de la izquierda + 1.


PARÉNTESIS SOBRE EL PSEUDOCÓDIGO Y UN EJEMPLO MUY SENCILLO

El pseudocódigo es un "lenguaje" para escribir algoritmos de forma más o menos flexible y sencilla para que un programador lo pueda entender. Muchas veces se parecen al código en sí o se puede pasar de uno a otro de forma muy fácil. Por ejemplo:
El pseudocódigo de un algoritmo que solicite un número y muestre si es positivo o negativo:
Código:
PEDIR numero
SI numero >= 0 ENTONCES
  MOSTRAR "El numero " + numero + " es positivo"
SINO
  MOSTRAR "El numero " + numero + " es negativo"
FIN SI

El código en C, que parece que es el lenguaje de programación que utilizas, sería:
Código
  1. #include <stdio.h> // Cabecera / Biblioteca que contiene las funciones printf() y scanf() para poder usarlas
  2.  
  3. int main(){
  4.  int numero;
  5.  printf("Introduce un numero: ");
  6.  scanf("%d", &numero);
  7.  if(numero >= 0){
  8.    printf("El numero %d es positivo", numero);
  9.  }
  10.  else {
  11.    printf("El numero %d es negativo", numero);
  12.  }
  13.  // En caso de que ejecutes directamente el .exe en Windows hay que poner una pausa para que no se cierre hasta que pulses una tecla
  14.  getchar(); // Si lo ejecutas en Linux o desde el IDE, no hace falta
  15.  // La funcion principal main() devuelve un entero al final, normalmente 0 si todo va bien:
  16.  return 0; // Si no lo pones, el compilador lo pondra solo pero solo en esta funcion
  17. }

El pseudocódigo es más importante de lo que suele parecer de primeras. Con él puedes diseñar un algoritmo que hace cosas sin tener que poner cómo las hace. Esto te permite simplificar problemas grandes y compartir algoritmos para luego traducirlos a su correspondiente lenguaje.


Para no hacer el mensaje excesivamente largo, que ya lo es un poco, te recomiendo que intentes lo siguiente:
Un programa que le indiques un número de dígitos (n) y te muestre la fila correspondiente. Por ejemplo, para n = 5:
Código:
 12345 * 9 + 6 = 111111 
El número n puede ser cualquiera así que tendrás que usar algún tipo de bucle (while() o for()).

Cuando tengas lo anterior perfecto, agrega el arreglo. En vez de mostrar el resultado directamente por la pantalla, tienes que ir guardando cada carácter en el arreglo para que quede de tal forma:
Código:
 arreglo = ['1' | '2' | '3' | '4' | '5' | ' ' | '*' | ' ' | '9' | '6' | ' ' | '=' | ' ' | '1' | '1' | '1' | '1' | '1' | '1'| 
Cuando lo tengas ahí guardado, tendrás que recorrer el array para ir mostrando cada posición y que te aparezca el mismo resultado por pantalla.

Ahora es cuando te toca esforzarte a ti e intentar hacer eso  :rolleyes: :rolleyes:
Los problemas que tengas los puedes comentar aquí para orientarte.
Suerte.

PD: Tú estás programando en C (o eso te piden) y el código ese que has conseguido buscando en Internet es C++ con un poco de C. Ten cuidado con eso.
PD 2: Procura que cada función tenga solo un <return>.
344  Programación / Programación C/C++ / Re: Ayuda en: 28 Mayo 2020, 03:38 am
Si lo que quieres es buscar en tu array de Agenda, el que tenga el número telefónico igual al que introduces:
Código:
Pedir telefono
i := 0
encontrado := -1
MIENTRAS i < longitud(contactos) and encontrado = -1 HACER
  SI contactos[i].telefono = telefono ENTONCES
    encontrado = i
  FIN SI
FIN MIENTRAS
Con este pseudocódigo puedes localizar el índice del contacto que tiene el número de teléfono que buscas. Luego solo es modificar sus campos accediendo a él.
El problema que tienes es que estás mezclando los índices de los contactos con sus números de teléfono.



PD: Unas cuantas mejoras para el programa:
  • Ya que usas una constante para el tamaño de los contactos, por qué no usas también constantes para los arrays de agenda??
  • Algunos nombres de variables no ayudan. opc, opc2, opc12432454... no dice nada. Llámalas opcion_menu, telefono_buscado, indice_buscado... y verás como no tienes el problema que has tenido de confundir un índice con un teléfono.
  • La programación utiliza el principio de una única vez, es decir, no repetir fragmentos de código innecesarios. Tienes un bloque de al menos 30 líneas y otro de unas 10 líneas por lo pronto repetidos... Deberías hacer uso de funciones, no solo para esa parte sino para otras también. Saber modularizar un programa también es programar.
  • Para leer cadenas de caracteres es recomendable usar la función fgets(), no scanf().
  • La biblioteca <conio.h> no pertenece al estándar y no se recomienda su uso. La única función que le das es llamar a getch() y puedes utilizar la función getchar() perteneciente a <stdio.h> en su defecto. Así te ahorras la biblioteca <conio.h>.
  • El único uso recomendado de break es para finalizar cada case de un switch. En tu programa veo algún break con otro fin.
  • Es más seguro utilizar strncpy() para copiar cadenas que strcpy().
Y el que más me ha dolido de todos: dicen que por cada fflush(stdin) que se utiliza, muere un gatito. No hagas eso a los pobres animalitos inocentes.

Con aplicar uno o dos de los consejos de esta lista, ese código pasaría de tener 311 líneas a unas 100 o menos y sería más fácil de leer para ti y para los demás. Aunque lo suyo sería que las aplicases todas o prácticamente todas.

Suerte. :-X
345  Programación / Programación C/C++ / Re: [Ayuda] guías de c++ en: 24 Mayo 2020, 11:28 am
Haber hay muchas y ya hay algunos temas abiertos en el foro destinados a libros para aprender a programar. Te dejo por aquí algunos enlaces:
https://foro.elhacker.net/dudas_generales/listado_de_libros_para_principiantes-t497312.0.html;msg2197810#msg2197810
https://foro.elhacker.net/programacion_general/que_lenguaje_es_mas_facil_para_aprender-t504547.0.html;msg2221135#msg2221135
https://foro.elhacker.net/programacion_cc/librospapers_cc-t296234.0.html;msg1467269#msg1467269

Aunque el último enlace es muy antiguo y puede que los enlaces de descarga ya no funcionen (no lo sé, no lo he probado), es una recopilación muy grande y siempre puedes buscar los títulos en Google.
346  Programación / Programación C/C++ / Re: Consulta con archivos en C y un arreglo en: 21 Mayo 2020, 08:49 am
Modifique esta funcion y le agregue en la linea 8 el i<2.
Lo que no entiendo es porque funciona mal si en el while en la linea 10, como los nombres no son tan largos, lo primero que va a encontrar es el \n y la linea 21 por mas que la saque queda igual.
Aunque añadas la segunda condición en la línea 8 sigues teniendo el problema que tienes en la función lectura().
Te lo muestro por pasos (función auxiliares()):
Código:
1. i = 0 -> i < 2?? Sí -> Entra a los dos bucles -> Guarda "Juan Perez" -> Sale -> i++
2. i = 1 -> i < 2?? Sí -> Entra a los dos bucles -> Guarda "Graciela Arpe" -> Sale -> i++
3. i = 2 -> i < 2?? No -> Va a la línea 21 -> aux[2][0] = '\0'
Al final accedes a aux[2][0] y tu array es de 2 dimensiones por lo que solo tiene las filas {0,1}. Esto es un acceso fuera de la memoria permitida. Coincide que justo donde acaba tu array aux, empieza el espacio de memoria de arreglo. Entonces el programa accede sin querer a arreglo[0][0] (que repito, el programa calcula la posición de memoria en la que tendría que estar aux[2][0] pero se encuentra con que esa posición es la de arreglo[0][0]) y cambia su valor.

La forma de hacerlo con fgetc para que no pase esto es... haciéndolo bien  :xD. Es decir, tratando correctamente cada posible situación:
Código
  1. i = 0
  2. letra = fgetc(fichero)
  3. while(i < F && letra != NULL){
  4.  j = 0
  5.  // La ultima columna siempre va a tener \0 entonces no hace falta guardar nada del fichero ahi
  6.  while (j < C-1 AND letra != NULL AND letra != '\n'){
  7.    arreglo[i][j] = letra
  8.    ++j
  9.    letra = fgetc(fichero)
  10.  }
  11.  // Una vez salimos, siempre podemos poner el \0 sin miedo a salirnos porque solo hemos ido hasta C-1
  12.  arreglo[i][j] = '\0'
  13.  if(letra != NULL) letra = fgetc(fichero);
  14.  ++i
  15. }
  16. return i

Igual que antes, en vez de poner un 0 en la primera línea vacía, es mejor que devuelvas el número de filas útiles que tiene tu array. Luego guarda dicho valor en una variable y úsalo cuando quieras mostrar el array. Así no malgastas una fila entera para nada.

Si sigo sin convencerte y quieres poner un 0 al final, recorre el bucle de fuera para i < F-1. Así siempre dejarás la última fila libre para poder guardar ese 0.

EDIT: En el código anterior me he dejado el leer otro carácter al salir del bucle interno. Ahora lo corrijo... :rolleyes:
347  Programación / Programación C/C++ / Re: Consulta con archivos en C y un arreglo en: 21 Mayo 2020, 07:45 am
Lo que veo son varios problemas de acceso y eso es lo que está generando tu problema.

Función lectura():
  • Si el bucle de la línea 31 sale porque j == C, en la línea 37 tienes un acceso a memoria fuera de los límites del array.
  • Si el bucle de la línea 29 sale porque i == F, en la línea 42 tienes otro acceso fuera del array.

Además no sé si es obligatorio que hagas así la lectura pero sino es mucho mejor que uses la función fgets():
Código
  1. // Guarda el contenido de un archivo en un array bidimensional por lineas y devuelve el numero de lineas leidas
  2. int lectura(char array[][C]){
  3.  FILE *archivo = fopen("loquesea.txt", "r");
  4.  int fila = 0;
  5.  // fgets guarda C-1 caracteres de una linea del archivo y pone '\0' al final
  6.  while(fila < F && fgets(array[fila], C, archivo)) ++fila;
  7.  return fila;
  8. }

Y en la función auxiliares() tienes los mismos problemas que en lectura() además de que no controlas el límite de líneas leídas. Si el array tiene 2 filas y el fichero tiene n filas estás realizando n-2+1 accesos a memoria fuera del array.
Al ejecutarse la línea 74, el programa se detendría si intenta acceder a memoria fuera del ámbito de tu ejecutable. Si no se detiene está modificando algo y en tu caso ese algo es el elemento arreglo[0][0].
348  Seguridad Informática / WarZone / Re: ¿Donde podria encontrar otro sitio parecido al warzone? en: 18 Mayo 2020, 23:12 pm
Buscando CTF (Capture The Flag) en Internet no deberías de tener problemas para encontrar lugares similares.
Si te aparecen enlaces al tradicional juego de capturar la bandera, añade "hacking" o algo por el estilo a la búsqueda.

Espero que te sirva.
Suerte.
349  Programación / Programación C/C++ / Re: Dividir polinomio en monomios C++ en: 18 Mayo 2020, 22:01 pm
Muchas gracias, no entiendo muy bien a que te refieres con la primera linea la de validar monomio.
La estructura del monomio seria así?
Código:
struct monomio {
int coeficiente;
int exponente;
};
Y como puedo guardar los monomios en la estructura?

La primera línea era solo para definir una función llamada validarMonomio() que recibe como parámetro un string y devuelve un Monomio. El prototipo de la función sería:
Código
  1. Monomio validarMonomio(string monomio);



Para usar la struct Monomio:
Código
  1. struct Monomio {
  2.  int coeficiente;
  3.  int exponente;
  4. };
  5.  
  6. int main(){
  7.  Monomio mon;
  8.  int coeficiente = 2, exponente = 5;
  9.  mon.coeficiente = coeficiente;
  10.  mon.exponente = exponente;
  11. }

También puedes crear constructores, gets()/sets(),... Incluso crear una class para hacer los atributos privados y manejar los objetos a partir de los métodos.
350  Programación / Programación C/C++ / Re: Dividir polinomio en monomios C++ en: 18 Mayo 2020, 17:05 pm
La estructura que debe tener el monomio es:
```
1. Signo + o -
2. COEFICIENTE: uno o mas dígitos enteros (0,...,9)
3. x
4. signo ^
5. EXPONENTE: uno o mas dígitos enteros (0,...,9)
```

Esta estructura que dices que debe cumplirse no se cumple. Casos:
  • Término independiente -> solo tiene signo y coeficiente.
  • Monomio grado 1 -> solo tiene signo, coeficiente y x.


De todas maneras, una vez que ya lo tienes separado en monomios, te digo cómo puedes validar cada uno de estos. Mi recomendación es que crees una clase Monomio con coeficiente y exponente. Así podrás manejar los datos fácilmente y no desperdigarlos. Una idea del algoritmo sería:
Código:
validarMonomio(string) : Monomio // Funcion que recibe un string (monomio) y devuelve un objeto de tipo Monomio
INICIO
  exponente = 0 // Exponente por defecto
  i := 1 // El 0 ya sabes que es '+' o '-'
  // Calcular la longitud del coeficiente:
  MIENTRAS i < monomio.size() AND es_digito(monomio[i]) HACER // Recuerda la primera condicion para no salirte del string
    i := i + 1
  FIN MIENTRAS
  SI i = 1 ENTONCES // No hay digitos despues del signo
    Mostrar Error
    Salir
  FIN SI
  coeficiente = monomio.substring(0, i)  // Ya tienes el COEFICIENTE y con signo

  // Comprobar si es el termino independiente:
  SI i < monomio.size() ENTONCES // Si no acaba ahi y entonces no es el termino independiente...
    SI monomio[i] != 'x' ENTONCES // ...debe continuar con una 'x'
      Mostrar Error
      Salir
    FIN SI
    coeficiente = 1 // y ahora el coeficiente por defecto sera 1, no 0
    i := i + 1

    // Si no acaba con la x, tiene que seguir '^' y el exponente
    SI i < monomio.size() ENTONCES
      SI monomio[i] != '^' ENTONCES
        Mostrar Error
        Salir
      FIN SI

      // Procedemos a calcular el exponente
      i := i + 1
      inicio := i
      MIENTRAS i < monomio.size() AND es_digito(monomio[i]) HACER
        i := i + 1
      FIN MIENTRAS
   
      // Si no hay digitos despues de '^' o hay algo mas despues de los digitos, esta mal
      SI i = inicio OR i < monomio.size() ENTONCES
        Mostrar Error
        Salir
      FIN SI
      exponente = monomio.substring(inicio, i) // Ya tienes el EXPONENTE
    FIN SI
  FIN SI

  RETURN new Monomio(coeficiente, exponente)
FIN

Es un poco largo pero no lo podía probar así que he ido separando y explicando cada posible situación para procurar no dejarme nada.
Ahora pásalo a C++ y si te da algún problema, coméntalo.
Suerte.

PD: Además puede darse que tengas varios monomios del mismo grado (como en tu ejemplo: -4 y +1). Una vez separados todos, deberías comprobarlo y juntarlos.
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines