Entrada/Salida (Standard) Clase 6 Introducción a la Computación Patricia Borensztejn Euler 3 The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ? Euler 3: Algoritmo • Encontrar los factores primos de un número, se llama factorizar. Por lo tanto necesitamos saber como se factoriza, es decir, encontrar el algoritmo de la factorización. • Usaremos el que se enseña en los colegios. Consiste en partir del número y dividirlo por 2 tantas veces como sea posible, cuando ya no es mas posible, entonces lo dividimos por 3 tantas veces como sea posible, y asi sucesivamente. Podemos saltarnos los pares, porque ya dividimos por 2 tantas veces como sea posible….El algoritmo finaliza cuando llegamos al 1 Factorización 524 262 2 Factorización 524 2 262 2 131 Factorización 524 2 262 2 131 131 1 Pruebo con 2, con 3, con 5, 7, 9…. hasta 131 Cuando da 1, termino 524=22*131 Euler 3 (printf) • Veamos el programa int main() { unsigned long long numero = 600851475143LLU; int factor; printf("Factor Primo de %llu\n",numero); while(numero % 2 == 0) numero = numero / 2; for (factor = 3; numero > 1; factor+=2){ while(numero % factor == 0) numero = numero / factor; } printf("El resultado es %d\n",factor-=2); return 0; Euler 3 (scanf) • Veamos el programa int main() { unsigned long long int numero; int factor; printf("Ingresa el número a factorizar "); scanf( "%llu",&numero); printf("Factor Primo de %llu\n",numero); while(numero % 2 == 0) numero = numero / 2; for (factor = 3; numero > 1; factor+=2){ while(numero % factor == 0) numero = numero / factor; } printf("El resultado es %d\n",factor-=2); return 0; Entrada/Salida • Las operaciones de entrada/salida no son parte del lenguaje C. • La biblioteca standard contiene un conjunto de funciones que proporcionan entrada y salida, manipulación de caracteres, manejo de memoria, rutinas matemáticas y una variedad de otros servicios para programas en C. • Las propiedades de las funciones de la biblioteca están especificadas en mas de una docena de archivos .h (headers) . Por ejemplo: stdio.h ctype.h string.h math.h stdlib.h time.h Archivos Header • Los archivos header contienen información sobre la función, pero no el código de la función. Es decir: contienen su interface con el programa: su entrada y su salida. Esto se denomina el prototipo de la función. Los archivos de header se guardan en el directorio /include de la distribución del compilador. • La implementación de la función se guarda en el directorio /lib Printf • La función de salida printf traduce valores internos a caracteres. • Convierte, da formato e imprime sus argumentos en la salida standard bajo el control de format. Devuelve el número de caracteres impresos int printf (char *format, arg1,arg2,…..) • La cadena de formato contiene dos tipos de objetos: caracteres ordinarios, que son copiados al flujo de salida, y especificaciones de conversión, cada uno de los cuales causa la conversión e impresión de los siguientes argumentos. Printf int printf (char *format, arg1,arg2,…..) printf("El factor mas grande de %llu es %d\n", numero, factor-=2); Printf • Cada especificación de conversión comienza con un % y termina con un carácter de conversión. Entre el % y el carácter de conversión pueden estar, en orden Printf Scanf • Lee caracteres de la entrada estándar y los interpreta de acuerdo con las especificaciones que están en format y almacena los resultados a través de los argumentos restantes. El resto de los argumentos indican donde deberá almacenarse la entrada correspondiente, por lo tanto…. deberán ser apuntadores. scanf( "%llu",&numero); Valor y Dirección de una Variable • Para asignarle un valor a la variable lo hacemos de la siguiente manera: var1=3456 ; Esto se lee así: en la dirección de memoria var1 guardar el valor 3456 var1=var2; Esto se lee así: en la dirección de memoria var1 guardar el valor almacenado en la dirección de memoria var2 • Es decir: – Cuando la variable está a la izquierda de la asignación, se interpreta como una dirección – Cuando la variable está a la derecha de la asignación, sola o formando parte de expresiones mas complejas, se interpreta como un valor. • Y, cual es esa dirección? Puedo saberlo? – Si, puedo saberlo y usar esa dirección: en C es &var1 var2=&var1; O bien printf ("la dirección de la variable var es %i y su valor es %i\n", &var1, var1); Punteros en C • Bueno, solo para confundir : – Si hacemos esta asignación: • a= &var1; Lo que hemos creado (o sea, a) es un puntero. 0 b=a+var1; // b=04+D204=D208 1 b=(*a)+var1; // b=D204+D204=1A408 2 3 Fijense que &a= 0006 hexa var1 a=a+2 ; // ahora a vale 08 y ya no es mas igual a var1 a TODO ESTO y MUCHO MAS EN: ARITMÉTICA DE PUNTEROS 4 04 5 6 D2 04 7 00 Scanf • La dirección de numero es &numero 600851475143 8BE589EAC7 numero 0 C7 1 EA 2 3 89 E5 4 8B 5 00 6 00 7 00 Entrada /Salida en Python • Función raw_input: devuelve una cadena >>> s=raw_input() hola como estas >>> print s hola como estas >>> >>> i=raw_input("Escribe algo ") Escribe algo hola >>> i 'hola' >>> Operador % • Es el operador de formato en Python. • %d, el valor se muestra como int • %s, el valor se muestra como string (ya veremos los strings) • El operador % va a ser removido del lenguaje!!!! Lo que se viene es: format Print con format >>> for x in range(1,11): ... print "{0:2d} {1:3d} {2:4}".format(x,x*x,x*x*x) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 >>> Esta es una función propia de las cadenas Esto es una cadena