Professional Documents
Culture Documents
Julio de 2011
ndice Presentacin .. 1. Arquitectura de la Computadora.. o Modelo actual de la computadora o Software de base 2. Algoritmos .. o Componentes principales de un algoritmo o Programacin o Programacin estructurada o Diagramas de Flujo 3. Lenguaje C y FreeBasic ............. o C: Tipos de datos y operadores o FreeBasic: Tipos de datos y operadores o Primer programa: Hola Mundo! o Entrada y salida de datos 4. Estructuras de seleccin .. o Seleccin simple (if) o Seleccin binaria (if-else) o Seleccin encadenada (if - else if - else) o Seleccin mltiple (case) 5. Funciones .... o Conceptos bsicos o Paso de parmetro por valor o Paso de parmetro por referencia 6. Estructuras repetitivas . o Durante (for) o Mientras (while) o Haz - mientras (do-while) 7. Tipos de datos estructurados .. o Arreglos unidimensionales o Arreglos bidimensionales o Cadenas 8. Archivos . o Conceptos bsicos o Funciones usuales para el manejo de archivos Referencias .......... 2 3
14
25
35
43
54
68
77
UAM Azcapotzalco
Pgina 1
UAM Azcapotzalco
Pgina 2
Registros
b) MEMORIA
ALU
Unidad de control
Contador de programa
La arquitectura de hardware de una computadora que prevalece hasta nuestros das se atribuye a John von Neumann y otros investigadores. Los principales componentes de la computadora son: a) Unidad central de procesamiento (CPU) Se encarga de realizar las operaciones aritmtico-lgicas con los datos, la forman: la Unidad Aritmtico Lgica, la Unidad de Control y la Unidad de Memoria. Unidad aritmtico-lgica (ALU)
UAM Azcapotzalco
Pgina 3
Unidad de Control Es la responsable de seleccionar las operaciones aritmtico-lgicas. Esto se logra a partir de varias lneas de control que pueden estar activas o inactivas. Por ejemplo para una ALU simple con 10 operaciones diferentes se necesitan cuatro lneas de control, las cuales pueden definir 16 (24) situaciones diferentes, diez de las cuales pueden usarse para las operaciones aritmtico-lgicas y el resto para otros propsitos. Ejemplo: 0000 0001 0010 0011 Neutro (no hay operacin por hacer) Operacin suma Operacin resta Operacin de multiplicacin. etc.
Registros 1. Registros de entrada. En el pasado las computadoras solo tenan un registro de entrada para alojar, por turnos, uno de los datos de entrada (el otro dato de entrada vena directamente de la memoria). Actualmente las computadoras utilizan docenas de registros para acelerar las operaciones, las cuales son cada vez ms complejas y requieren de varios registros para mantener los resultados intermedios. 2. Registros de instruccin (I). El CPU es el responsable de buscar las instrucciones en la memoria, una a una; luego debe almacenarlas en el registro de instruccin, interpretarlas y ejecutarlas. 3. Contador de programa (PC): Hace un seguimiento de la instruccin que se ejecuta actualmente; concluida la ejecucin, el contador se incrementa para apuntar a la direccin (de memoria) de la siguiente instruccin. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 4
0 00000000 . . . Direccin 255 111111111 Direccin Con 8 bits tenemos 256 direcciones posibles. 8 bits forman un byte. Existen varios tipos de memoria, de los cuales distinguiremos: 1) la memoria RAM y 2) la memoria ROM. Memoria RAM (Random Access Memory). Es la memoria principal de una computadora. Un usuario puede leer y escribir en la RAM mientras la mquina est encendida. La informacin es automticamente borrada si deja de alimentarse de energa elctrica a la computadora. Por esta caracterstica, a la RAM tambin se le llama memoria voltil. Memoria ROM (Read Only Memory). El contenido de esta memoria es grabada por el fabricante. De la informacin contenida en esta memoria podemos citar: datos del fabricante, modelo de la computadora, tipo de procesador, capacidad de almacenamiento, la fecha, etc. Tambin contiene un programa llamado BIOS el cual arranca o inicia a la computadora. Almacenamiento de datos en la Memoria Principal (RAM) Un bit es la unidad mnima de almacenamiento en una computadora; ste fsicamente es un condensador: si est cargado, entonces representa 1 (verdadero); si no est cargado, entonces representa 0 (falso). +++ ---1 0
A una celda de memoria tambin se le conoce con el nombre de palabra. Una palabra puede contener desde un patrn de 8 bits (ej. 10100100) hasta 64 bits (computadoras recientes).
UAM Azcapotzalco
Pgina 5
Otra representacin para una celda puede ser una caja, cuyo contenido es un valor expresado en binario (10111010), el cual tendr un significado particular para la computadora.
10111010
La cantidad de celdas que contienen las memorias de las mquinas es variable: de cientos (un horno de microondas) a miles de millones (computadoras actuales). El tamao de la memoria principal suele medirse en trminos de unidades de 1048,576 celdas (este valor corresponde a una potencia de 2, as es ms natural como unidad de medida dentro de la computadora, que un milln exacto). 210 1,024 bytes 1 Kilobyte (kb) 220 1'048,576 bytes 1 Megabyte (Mb) 230 1,024 Mb 1 Gigabyte (Gb) Para identificar cada celda de la memoria principal se le asigna un identificador nico, llamado direccin, el cual es un valor numrico consecutivo (ver figuras).
Contenido
Por ejemplo una computadora de tamao de palabra igual a 8 bits y con 4 Mb tiene 4*1'048,576= 4'192,304 celdas, cada una con un tamao de un byte. Todas con su direccin correspondiente: 0,1,2,... 4'192,303 ( pero expresado en binario).
c) Dispositivos de entrada / salida Dispositivos de Entrada. Permiten ingresar datos a la computadora (usuario computadora)
UAM Azcapotzalco
Pgina 6
Dispositivos de almacenamiento secundario. Se clasifican como dispositivos de Entrada y Salida, a la vez. Salida: Pueden almacenar grandes volmenes de informacin. Entrada: Esta informacin puede recuperarse en un momento posterior. Ejemplo: disco duro, discos 3 , USB, CD, DVD, Floppy, SD, etc.
Software de base
Al encender la computadora se ejecuta un programa llamado BIOS (Basic Input-Output System), el cual est guardado en la ROM. El BIOS se encarga de checar a todos los dispositivos conectados a la computadora y se encarga de buscar al Sistema Operativo en el disco duro, para luego cargarlo a la RAM. El software de base esta formado por un conjunto de programas que nos permite comunicarnos con el hardware de la computadora. En la figura el software de base est entre el Hardware y los Programas de aplicacin.
Programa de aplicacin Compiladores Ensambladores Macro-procesadores enlazadores Cargadores Editores de texto Depuradores Sistema Operativo
Programas E/S Sistema de Despachador Archivos de alto nivel (scheduler) Bibliotecas Manejo de memoria Manejo de Dispositivos
Hardware de la computadora
En nuestro curso, nosotros construiremos programas de aplicacin. Un programa de aplicacin que ser escrito en un lenguaje de alto nivel (C); luego ser traducido por un compilador a lenguaje mquina (lenguaje binario 0-apagado y 1-encendido); y finalmente, la CPU los ejecutar. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 7
UAM Azcapotzalco
Pgina 8
CAPITULO II ALGORITMOS
Un algoritmo es un conjunto de pasos precisos y ordenados, que nos permiten alcanzar un resultado, o bien resolver un problema. Caractersticas de un algoritmo: Precisin. Los pasos a seguir e el algoritmo deben evitar, en la medida de lo posible, la ambigedad. Finitud. Independientemente de la complejidad (dificultad) del algoritmo, el conjunto de pasos debe ser finito. Determinismo. Para un mismo conjunto de datos entrada, el algoritmo siempre debe arrojar el o los mismos resultados.
Datos de entrada
Procesamiento de datos
Impresin de resultados
Ejemplo de un algoritmo: darse de alta en el aula virtual 1.- Acceder a la direccin de aula virtual. 2.- Acceder a CBI. 3.- Seleccionar la UEA Introduccin a la Programacin. 4.- Leer instrucciones para el registro. 5.- Realizar el registro. 5.1. Escribir matrcula. 5.2. Escribir fecha de nacimiento. 5.3. Escribir datos generales. 6.- Acceder a aula virtual. 7.- Escribir contrasea. 8.- Matricularse.
UAM Azcapotzalco
Pgina 9
Programacin
Programar es concebir un algoritmo que permita a una computadora resolver un problema. Programar implica un proceso mental complejo dividido en varias etapas:
PROCESO MENTAL
Expresar los pasos a seguir para obtener la solucin (algoritmo), empleando un lenguaje claro, estricto y universal: pseudocdigo
PROGRAMAR
CODIFICACIN:
Traducir el algoritmo a un lenguaje de programacin adecuado (lenguaje de alto nivel)
La codificacin consiste en traducir el algoritmo a un lenguaje de programacin, para as obtener un programa fuente. Un programa, concepto desarrollado por von Neumann en 1946, es un conjunto de instrucciones que sigue una computadora para alcanzar un resultado especfico. El programa se escribe en un lenguaje de programacin, a partir de un diagrama de flujo o de un algoritmo expresado en pseudocdigo. Un lenguaje de programacin est constituido por un conjunto de reglas sintcticas y semnticas. Las reglas sintcticas especifican la correcta formacin de palabras y oraciones en un lenguaje. Las reglas semnticas especifican el sentido o significado de un smbolo, una palabra o una oracin. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 10
Programacin Estructurada
La programacin estructurada es una filosofa para la implementacin de algoritmos a travs de un conjunto finito de estructuras debidamente organizadas. Fu propuesto, en 1965, por Edgser Dijkstra, en la Universidad de Hainover. Teorema de la estructura (Bohn y Jacopini). Son necesarios 3 estructuras bsicas para construir cualquier programa. 1. Una estructura de proceso. 2. Una estructura de decisin binaria.
Diagramas de Flujo
Un diagrama de flujo es la representacin grfica de un algoritmo; la construccin correcta de ste es muy importante porque nos permite escribir un programa en cualquier lenguaje de programacin estructurada. A continuacin presentamos los principales smbolos para representar a un algoritmo. Smbolo Descripcin Se utiliza para marcar el inicio y fin de un programa.
UAM Azcapotzalco
Pgina 11
Se utiliza para representar una decisin y dependiendo del resultado, el flujo del diagrama sigue por uno de los caminos alternativos. Se utiliza para representar una decisin mltiple y dependiendo del resultado, el flujo del diagrama sigue por uno de los caminos alternativos. Se utiliza para representar la estructura repetitiva for Se utiliza para representar la impresin de resultados. Expresa escritura. Expresan la direccin del flujo del diagrama.
O P
Expresa conexin dentro de una misma pgina. Expresa conexin entre diferentes pginas.
Se utiliza para expresar un mdulo de un problema. Es decir, un sub-problema que hay que resolver antes de continuar con el flujo del diagrama.
Reglas para construir un diagrama de flujo 1. Todo diagrama de flujo debe tener un inicio y un fin. 2. Las lneas de direccin deben ser rectas 3. Las lneas de direccin deben estar conectadas a un smbolo que exprese lectura, proceso, decisin, escritura, conexin o fin del programa. 4. Un diagrama de flujo debe construirse de arriba haca abajo y de izquierda a derecha. 5. La notacin utilizada en el diagrama de flujo debe ser independiente del lenguaje de programacin. 6. Al realizar una tarea compleja, es conveniente poner comentarios que ayuden a entenderla. 7. Si la construccin de un diagrama de flujo requiere ms de una hoja, debemos emplear los conectores adecuados y enumerar las pginas. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 12
2. No se deben cruzar
3. Conectadas a un smbolo
UAM Azcapotzalco
Pgina 13
Tipos de datos
Los datos que procesa una computadora se clasifican en: bsicos y estructurados a) Bsicos: Constituye un solo valor que puede ser: 1) entero, 2) real, 3) entero largo, 4) real de doble precisin o 5) carcter. Tipo de Dato int long float double char Bits 16 32 16 64 8 Descripcin Entero Entero largo Real Real de doble precisin Caracter Rango -32,768 a 32,767 -2147,483,648 a 2147,483,647 -3.4x10-38 a 3.4x1038 -1 -1.7x10-308 a 1.7x10308-1
0 255
b) Estructurados Hacen referencia a un grupo de valores. Arreglos (vectores y matrices): Todos los valores del arreglo son de un solo tipo bsico. Cadenas: Es un vector que guarda valores de tipo caracter. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 14
Variables. Empleamos un identificador para nombrar a una variable, la cual designa un conjunto de celdas, que guardarn un valor temporalmente; es decir que el valor cambiar durante el tiempo de ejecucin del programa. En el lenguaje C declaramos una variable, de los tipos mencionados en el apartado 6. Ejemplos:
int valor_1; float valor_2=5.4; //se asigna un valor inicial a la variable
NOTA: El signo de igual (=) significa, en lenguaje C, asignacin. El valor de la derecha del signo se asigna a la variable o constante de la izquierda. Constantes. Empleamos un identificador para nombrar a una constante, la cual designa un conjunto de celdas, que guardarn un valor que no cambia durante el tiempo de ejecucin del programa.
#define PI 3.14169 const float PI=3.14169;
Operadores
Distinguiremos tres tipos de operadores: 1) aritmticos, 2) relacionales y 3) lgicas. Tambin analizaremos los operadores simplificados, operadores incremento/decremento y el operador coma (,). Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 15
Smbolo + -
Ejemplos x=4.5+3; v=4.5+3; x=4.5 - 3; v=4.5 - 3; x=4.5 * 3; v=4.5*3; v=4*3; x= 4 / 3; x=4.0 / 3.0; v=4 / 3; v=4.0 / 3; v=(float) 4 / 3; v=((float) 5+3) / 6;
Resultados x=7 v=7.5 x=1 v=1.5 x=12 v=13.5 v=12.0 x=1 x=1 v=1.0 v=1.33 v=1.33 v=1.33
multiplicacin
divisin
Al evaluar expresiones aritmticas debemos respetar la jerarqua de los operadores y aplicarlos de izquierda a derecha. Mayor prioridad Menor prioridad *, /, % +, -
Operadores aritmticos simplificados. Nos permiten realizar la misma operacin utilizando una notacipon ms compacta. Operador += -= *= /= %= Lizbeth Gallardo - Pedro Lara Operacin larga x=x+5 y=y-2 x=x*y x=x/y x=x%y Operacin simplificada X+=5 y-=2 x*=y x/=y x%=y Pgina 16
UAM Azcapotzalco
Operadores de incremento y decremento. Se pueden utilizar antes o despus de la variable, pero los resultados son diferentes. Suponga que declaramos las variables x y y como enteras: int x,y; x=7; Operacin y=x++ y=++x y=x-y=--x Resultados y=7 x=8 y=8 x=8 y=7 x=6 y=6 x=6
Expresiones lgicas o booleanas. Estn formadas por nmeros, constantes, variables y operadores lgicos y relacionales. El valor que pueden tomar estas expresiones al ser evaluadas, es 1 (verdaderas) 0 (falso). Las expresiones lgicas se utilizan frecuentemente en estructuras selectivas y en estructuras repetitivas.
Operadores relacionales. Se utilizan para comparar 2 operando nmeros, caracteres, cadenas, constantes o variables.
Operador relacional
== != < > <= >=
Descripcin
igual a diferente de menor que mayor que Menor o igual que Mayor o igual que
Ejemplo
h==p h!=p 7<5 22>11 15<=2 35>=20
Resultado
0 (F) 1 (V) 0 (F) 1 (V) 0 (F) 1 (V)
Pgina 17
Operador , (coma) Sirve para encadenar expresiones. Ejemplo 1: int x, y, z, v; x= (v=3, v*5); Ejecutamos las operaciones de izquierda a derecha: 1) v = 3 2) x= v*3 = 3*5 3) x=15 Ejemplo 2: x=( y=(15>10), z=(2>=y), y && z ) Ejecutamos las operaciones de izquierda a derecha: 1) y=(15 > 10) y = 1 (verdadero) 2) z=(2 >= y) z = 1 3) x=(y && z) x=1 Prioridades de los operadores Las expresiones se evalan de izquierda a derecha, pero los operadores se aplican segn su prioridad. Prioridad (+) ( ) ! , ++, - *, /, % +, = =, !=, <, >, <=, >= &&, || + =, - =, * =, / =, % = , UAM Azcapotzalco Pgina 18
Tipos de datos
a) Bsicos: Son muy similares a los usados en C, solo en lugar de tipo caracter, se tiene el tipo cadena de caracteres: Tipo de Dato integer uinteger single double string Bits 32 32 32 64 Descripcin Entero largo Entero positivo Real Real de doble precisin Cadena de caracteres Rango -2147,483,648 a 2147,483,647 0 a 4294,967,295 -3.4x10-38 a 3.4x1038 -1 -1.7x10-308 a 1.7x10308-1 Cada caracter es de 8 bits
b) Estructurados: Hacen referencia a un grupo de valores. En Freebasic no se tiene estructuras de cadenas, porque es un tipo bsico. o Arreglos (vectores y matrices): Todos los valores del arreglo son de un solo tipo bsico. Se declara una cadena con la instruccin dim o Registros: Hacen referencia a un grupo de valores, donde cada uno de ellos puede ser de un tipo bsico; inclusive puede incluir tipos de datos estructurados (arreglos, cadenas o registros). Identificadores. Es el nombre que identifica a una o varias celdas de memoria, las cuales contendrn datos simples o estructurados. Un identificador se forma por medio de letras, dgitos y el carcter subrayado (_). Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 19
Se puede saber de una forma sencilla cuando se est usando una palabra reservada en editores de Freebasic como el FBI de porque todas las palabras clave se ponen en letras negritas azul obscuro Variables. Para declarar una variable en FreeBasic se usa la instruccin dim seguida del nombre y del tipo. Por ejemplo, para definir la variable num del tipo entero y la variable flotante del tipo real doble precisin se escribe: dim num as integer, flotante as double
Constantes. Las constantes que son variables que tienen el mismo valor durante todo el tiempo de ejecucin del programa, se definen exactamente igual que en C: #define PI 3.14169 const float PI=3.14169; Operadores. Se tiene los mismos tipos de operadores aritmticos, relacionales y lgicos en FreeBasic con exactamente las mismas caractersticas, con las siguientes diferencias en sintaxis nicamente: Operador igualdad desigualdad modulo entero lgico AND lgico OR lgico NOT En C == != % && || ! En FreeBasic = <> mod and or not
{
Declaracin_de_variables instruccin_1; Instruccin_2; return 0;
}
Ejemplo: mundo.c
#include <stdio.h> int main(void){ //Incluye las funciones de entrada/salida //inicia la funcin main
printf (Hola mundo!); //Imprimir en pantalla Hola mundo! return 0; //Valor que devuelve la funcin al sistema operativo //Fin de la funcin main
FreeBasic da por un hecho que cualquier cosa que no sea parte de otra funcin o subrutina, es parte de la funcin principal, por esta razn no requiere definirla.
UAM Azcapotzalco
Pgina 21
Es importante destacar que se puede controlar la cantidad de dgitos a imprimir en la pantalla, por ejemplo
% -6d % 4.2f Escribe un entero con seis dgitos, con justificacin a la izquierda Escribe un real con 4 dgitos, dos de ellos sern utilizados para los decimales, con justificacin a la derecha.
En FreeBasic para la entrada de datos se utiliza la funcin input: Input Dame la temperatura en grados Fahrenheit: , fahr Salida a monitor Salida con formato: Para imprimir en la pantalla una salida con un formato especfico, empleamos la funcin printf (cadena de caracteres, caracter de control y cdigo de formato, variable); Observe que printf puede incluir una cadena de caracteres para informar algo al usuario; luego, puede incluir un formato de impresin para los datos (tabulador, saltar una lnea), empleando los caracteres de control; adems puede incluir uno o varios cdigos de formato para indicar el tipo de dato que se va a imprimir; finalmente, incluye la o las variables que contienen los datos.
Carcter de control \n \t \v \f \a \ \ \\
Descripcin Saltar a una nueva lnea Tabulador horizontal Tabulador vertical Avanzar una pgina Sonido de alerta Imprimir apostrofe Imprimir comillas Imprimir diagonal inversa
En FreeBasic, para dar salida formateada de nmeros se escribe indicando las cifras significativas con el smbolo # print using "Decimales: ###.### - Enteros: ##"; 1/3,2.4 sleep
UAM Azcapotzalco
Pgina 22
fahrenheit.c
Caracteres de formato
Versin FreeBasic:
dim cent as double, fahr as double input "Dame la temperatura en Fahrenheit: ", fahr cent=5*(fahr-32)/9 print using "En centigrados es: ###.#####"; cent sleep fahrenheit.bas
NOTA: a partir de este momento, todos los programas propuestos tendrn una versin en C seguida una versin en FreeBassic. Programa 2: El TOEFL (Test of English as a Foreign Language, Prueba de nivel de Ingls como lengua extranjera) es una prueba que se pide a todos los estudiantes de intercambio, o aquellos que realizarn estudios de posgrado en pases de habla inglesa y otros pases (algunas universidades de Alemania y Rusia, por ejemplo). Este examen consiste en 3 secciones: 50 preguntas de opcin mltiple sobre comprensin de palabra hablada (listening comprehension), 40 preguntas sobre la habilidad para escribir correctamente (grammar) y 50 preguntas sobre comprensin de lectura (reading comprehension). Del nmero total de respuestas correctas en cada seccin, se utiliza la siguiente frmula para calcular el nmero de puntos obtenidos.
UAM Azcapotzalco
Pgina 23
UAM Azcapotzalco
Pgina 24
condicion
bloque_V
la condicion puede estar formada por una o varias condiciones que al ser evaluadas nos proporcionan un valor lgico (v-verdadero f-falso). bloque_V denota un conjunto de instrucciones que se ejecuta nicamente cuando el resultado de la condicin es verdadera
Ejercicio: Descuento en dulces para los nios menores de 12 aos En la tienda de Don Pascual hay una promocin que consiste en otorgar el 20% de descuento solo para los nios menores de 12 aos, cuya compra sea mayor o igual a 100. Realice un programa para que de manera automtica, Don Pascual no tenga que utilizar su calculadora cada que atienda a un nio con esas caractersticas.
#include <stdio.h> #define DESC 0.80 int main(void){ float venta=0.0; int esMenor=0; printf("Cual es la cantidad de la venta: "); scanf("%f",&venta);
UAM Azcapotzalco
Pgina 25
condicion
bloque_V
bloque_F
Ejercicio: Races de un polinomio de segundo grado. Hacer un algoritmo que encuentre las races de un polinomio de segundo grado. El algoritmo debe proporcionar las races imaginarias, si ese fuera el caso. x=((-b(b2-4ac))/(2a))
UAM Azcapotzalco
Pgina 26
ecuacion.c dim a as double, b as double, c as double dim det as double, aux as double print "Dame los 3 coeficientes de la ecuacion de segundo grado:" input "ax2+bx+c=0 :", a,b,c det=(b^2-4*a*c) aux=-b/(2*a) if det < 0 then print "x1 = ";aux; " + "; ((-det)^.5)/(2*a); " i" print "x2 = ";aux; " - "; ((-det)^.5)/(2*a); " i" else print "x1 = "; aux+(det^.5)/(2*a) print "x2 = "; aux-(det^.5)/(2*a) end if sleep ecuacion.bas
Anidada En trminos generales, una estructura selectiva puede contener a otras estructuras, por ejemplo: una estructura de proceso, una estructura de repeticin e incluso una nueva estructura selectiva. En particular, cuando una condicin que es verdadera nos lleva a evaluar una nueva condicin, decimos que las estructuras selectivas estn anidadas. Observe que en las estructuras anidadas se debe tener cuidado de no olvidar cerrar las llaves correspondientes a cada una de las estructuras; y tambin, se debe tener cuidado de cerrarlas en el lugar adecuado.
UAM Azcapotzalco
Pgina 27
condicion1
F
condicion2
bloque1_F
condicion3
bloque2_F
bloque3_V
bloque3_F
Ejercicio: construir un programa que simule el juego de piedra-papel-tijera. Como entrada el usuario proporciona un de los siguientes nmeros, donde cada uno tendr un significado distinto: 1significa piedra, 2 significa papel y 3 significa tijera. Como salida el programa deber indicar el ganador del juego. Es importante sealar que para simular la tirada de la computadora, en el programa deber seleccionarse uno de los tres valores de manera aleatoria, empleando la funcin que genere un nmero aleatorio (random en ingls) del lenguaje de programacin en que se desee codificar el algoritmo.
Entrada: 1 Salida: Tu opcion es Piedra, yo escogi Piedra Empatamos!
Tenemos que definir una tabla que nos permita identificar los casos de gane y pierde para ambos jugadores (la computadora y el usuario).
Computadora Usuario 1-Piedra 2-Papel 3-Tijera 1-Piedra Empate Gan Ganaste 2-Papel Gan Empate Ganaste 3-Tijera Ganaste Gan Empate
Gan, Ganaste y empate son expresiones provenientes del jugador simulado por la computadora.
UAM Azcapotzalco
Pgina 28
piedra-papel-tijera.c
print "1-piedra 2-Papel 3-Tijera" randomize timer dim opc as integer, num as integer num=int(rnd*3)+1 input "Escoge una opcion: ", opc if opc = 1 then if num = 1 then print "Yo escog if num = 2 then print "Yo escog if num = 3 then print "Yo escog end if if opc = 2 then if num = 1 then print "Yo escog if num = 2 then print "Yo escog if num = 3 then print "Yo escog end if if opc = 3 then if num = 1 then print "Yo escog if num = 2 then print "Yo escog if num = 3 then print "Yo escog
Piedra - Empatamos!" Papel - Gane!" Tijeras - Ganaste!" Piedra - Ganaste!" Papel - Empatamos!" Tijeras - Gane!" Piedra - Gan!" Papel - Ganaste!" Tijeras - Empatamos!"
UAM Azcapotzalco
Pgina 29
condicion1
bloque1_V
condicion2
bloque2_V
condicion3
bloque3_V
bloque3_F
if (condicion1){ bloque1_V; } else if (condicion2){ bloque2_V; } else if (condicion3){ bloque3_V; } else{ bloque3_F; }
Ejercicio: construir un programa que simule el juego de la pirinola, tambin llamada perinola o peonza. En este problema no hay una entrada por parte del usuario; es el programa quien genera un valor aleatorio, correspondiente a los lados de la pirinola, para luego indicar la accin que los jugadores deben realizar. La tabla de abajo determina el valor y la accin asociada. Lizbeth Gallardo - Pedro Lara UAM Azcapotzalco Pgina 30
Valor 1 2 3 4 5 6 7
#include<stdio.h> #include<stdlib.h> #include<time.h>
Accin Pon uno Pon dos Toma uno Toma dos Todos toman Todos ponen Pierdes todo
int main(void){ double num=0.0; srand(time(NULL)); printf("Pirinola/perinola/peonza digital \n"); printf("el numero es: %lf ", num=(rand()/(float)1e9)); if(num < 1.0/7.0) printf("Pon uno \n"); else if(num < 2.0/7.0) printf("Pon dos \n"); else if(num < 3.0/7.0) printf("Toma uno \n"); else if(num < 4.0/7.0) printf("Toma dos \n"); else if(num < 5.0/7.0) printf("Toma todo \n"); else if(num < 6.0/7.0) printf("Todos ponen \n"); else printf("Pierdes todo"); return 0; } pirinola.c
randomize timer dim num as double num=rnd print "Pirinola/perinola/peonza digital" if num < 1/7 then print "Pon uno" elseif num < 2/7 then print "Pon dos" elseif num < 3/7 then print "Toma uno" elseif num < 4/7 then print "Toma dos" elseif num < 5/7 then print "Toma Todo" elseif num < 6/7 then print "Todos Ponen" else print "Pierdes todo" endif sleep pirinola.bas
UAM Azcapotzalco
Pgina 31
x=
#include<stdio.h> #include<math.h> int main(void){ float x=0.0, y=0.0; printf("Introduce el valor de y: "); scanf("%f", &y); if(y>0.0 && y<=11.0) printf("x = %.2f", 3*y+36); else if(y>11.0 && y<=33.0) printf("x = %.2f", pow(y,2)+10); else if (y>33.0 && y<=64.0) printf("x=%.2f", pow(y,3)+pow(y,2)-1); else printf ("x=%.2f", x); return 0; } xyFuncion.c
dim x,y as double input "Introduce el valor de y: ",y if y>0.0 and y<=11.0 then print "x="; 3*y+36 elseif y>11.0 and y<=33.0 then print "x="; y^2+10 elseif y>33.0 and y<=64.0 then print "x="; y^3+y^2-1 else print "x="; x endif sleep xyFuncion.bas
UAM Azcapotzalco
Pgina 32
bloque1
bloque2
bloque3
bloqueD
switch(selector){ case 1: bloque1; break; case 2: bloque2; break; case 3: bloque3; break; default: bloqueD; break; }
Donde: case: denota un conjunto de instrucciones que deben ejecutarse en una opcin particular. selector: solo puede tomar valores de tipo enteros o de tipo carcter opcionN: denota un nmero entero un carcter, de acuerdo al selector bloqueD: denota un conjunto de instrucciones que deben ejecutarse en un caso particular break: indica el fin de las instrucciones un caso default: el conjunto de instrucciones que se ejecutar cuando el valor del selector no corresponda a ninguno de los casos anteriores.
Ejercicio: dado el sueldo, la categora y el costo por una hora extra de trabajo, calcular el sueldo total de un empleado en base a la siguiente tabla: Categora 1 2 3 4 Precio por hora extra 30 38 50 70
Nota: si el empleado trabaja ms de 30 horas extras solo se la pagan las primeras 30.
UAM Azcapotzalco
Pgina 33
UAM Azcapotzalco
Pgina 34
Conceptos bsicos
Formalmente: Sea L(p) la longitud de un programa cualquiera y sean l(p1) y l(p2) las longitudes de dos segmentos mutuamente excluyentes y complementarios del mismo programa p; de tal modo que la longitud del programa ser: L(p)=l(p1) + l(p2); donde p designa al programa completo y pi denota los subprogramas (cdigos) que conforman a p. Sean adems E(p), e(p1) y e(p2) los esfuerzos necesarios para obtener L(p), l(p1) y l(p2) respectivamente; en general se tendr que: E(p) >e(p1) + e(p2) Principios de diseo de una funcin: 1) Las partes altamente relacionadas, deben pertenecer a la misma funcin; y 2) las partes no relacionadas deben residir en otras funciones. Existen algunas reglas bsicas para definir y emplear las funciones en el lenguaje C: 1) declarar la funcin (tambin llamado prototipo de la funcin), 2) Definicin de la funcin, y 3) llamado de una funcin. 1) Para que el compilador reconozca una funcin como parte de un programa, sta debe ser declarada al inicio del programa, de la siguiente manera:
tipo_dato nombre_funcion (lista_parametros); Donde: Tipo_dato indica el tipo de dato que devolver la funcin al concluir su ejecucin, por elemplo: int, float, char Lista_parametros corresponde al conjunto de valores que recibir de la funcin que la llam. Los valores estn contenidos en variables, por lo tanto debern recibirse estos valores en variables locales (propias de la funcin receptora)
UAM Azcapotzalco
Pgina 35
NOTA: Si no se escribe el prototipo de una funcin, entonces su definicin debe presentarse antes de la funcin principal. 2) Definir una funcin significa especificar el conjunto de instrucciones que realizarn una tarea determinada dentro del programa.
tipo_dato nombre_funcion (lista_parametros){ declarar_variables; bloque_de_instrucciones; return <valor_de_regreso>; } Donde: Declarar_variables corresponden a variables locales que requerir la funcin para realizar su tarea. Bloque de instrucciones que determinan el comportamiento de la funcin return marca el fin de la funcin y devuelve, cuando as se requiera, un resultado cuyo tipo corresponde al definido en el prototipo de la funcin Nota: una funcin no necesariamente devuelve un valor y no necesariamente recibe parmetros, en este caso se indica con la palabra reservada void
3) El llamado a una funcin se realiza desde la funcin principal o desde cualquier otra funcin. Durante la ejecucin del programa, el llamado a una funcin implica un salto hacia ella para ejecutar su conjunto de instrucciones; al terminar se devuelve el control de la ejecucin a la funcin que la llam; en este caso a la funcin main(). Al hacer el llamado debe especificarse: 1) el nombre de la funcin; y 2) los valores que va a requerir para realizar su tarea, los valores contenidos en variables se escriben dentro del parntesis, siguiendo el orden y respetando el tipo de dato declarado.
int main(void){ : nombre_funcion(lista_de_valores) : return 0; }
UAM Azcapotzalco
Pgina 36
UAM Azcapotzalco
Pgina 37
UAM Azcapotzalco
Pgina 38
UAM Azcapotzalco
Pgina 39
Ejemplo: Escribir un programa que realice el intercambia de valores entre tres variables empleando paso de parmetros por referencia.
#include<stdio.h> void intercambia(int *x, int *y); int main(void){ int a=10, b=5; printf("\n Los valores de A y B son: %d y %d",a,b); intercambia(&a,&b); printf("\n Los valores actuales de A y B son: %d y %d", a,b); return 0; } void intercambia(int *x, int *y){ int aux; aux=*x; *x=*y; *y=aux; return; } intercambia.c
UAM Azcapotzalco
Pgina 40
Ejercicio: construya un programa en C que reciba un valor entero correspondiente a una cantidad en segundos. Escriba una funcin denominada convertir que reciba como parmetro, por valor, la cantidad de segundos; y los parmetros, por referencia, hora, min. La funcin habr de convertir y mostrar en pantalla la cantidad de segundos en su equivalente en horas, minutos y segundos restantes.
Entrada:3600 Salida: 1h 0m 0s
UAM Azcapotzalco
Pgina 41
UAM Azcapotzalco
Pgina 42
donde: exp1: establece un valor inicial a un contador. exp2: correspondiente a la condicin de paro donde se determina el valor mximo o mnimo que podr alcanzar el contador. exp3: corresponde al incremento decremento para el contador. bloque_V: conjunto de instrucciones que se repetir hasta que la condicin sea falsa. Cuando la condicin es falsa.
Ejercicio: Se dice que un nmero entero es perfecto si la suma de sus divisores excepto l mismo es igual al propio nmero. Por ejemplo seis es nmero perfecto porque 1*2*3=6 y 1+2+3 = 6. Escriba un programa que obtenga los nmeros perfectos comprendidos entre 1 y 10000.
#include<stdio.h> int main(void){ int num=0, sum=0, i=0; printf("Numeros perfectos \n\n"); for(num=1; num<=1e4; num++){ sum=0; for(i=1; i<=(num/2); i++) if(num%i==0) sum = sum+i; if(sum==num) printf ("%d es numero perfecto \n", num); } return 0; } 4perfectos.c
UAM Azcapotzalco
Pgina 43
Ejercicio: construir un programa que simule el juego de adivinar un nmero comprendido entre 1 y 100. El usuario tiene 7 oportunidades para lograrlo. El programa debe generar aleatoriamente el nmero y luego solicitar al usuario que lo adivine. Si el nmero del usuario es menor que el nmero aleatorio, se le indica mi nmero es mayor; pero si el nmero del usuario es mayor que el nmero aleatorio, se le indica mi nmero es menor; si el nmero del usuario es igual que el nmero aleatorio, se le indica Acertaste; si el usuario agota sus oportunidades simplemente termina el programa.
Entrada: 50 Salida: Mi nmero es mayor #include<stdio.h> #include<stdlib.h> #include<time.h> int main(){ int num, tuNum, i; srand(time(NULL)); printf("Adivina un nmero en 7 oportunidades o menos\n"); printf("\n El numero es un entero entre 1 y 100"); num=(rand()%100)+1; for(i=1; i<=7; i++){ printf("\n Intento # %i: ",i); scanf("%d", &tuNum); if(num < tuNum) printf("El numero es menor \n"); else if(num > tuNum) printf("El numero es mayor \n"); else{ printf("Acertaste!!! \n"); exit(1); } } printf("\n LAAASTIIIMAAA!!! Se acabaron tus intentos!\n\n"); return 0; } adivina.c randomize timer num=int(rnd*100)+1 print "Estoy pensando un numero, Adivina cual es en 7 oportunidades o menos:" for i=1 to 7
UAM Azcapotzalco
Pgina 44
adivina.bas
Construir un programa que determine los nmeros primos comprendidos entre 1 y 1e4. Un nmero es primo, si sus nicos divisores son l mismo y la unidad. No hay entrada por parte del usuario; como salida enlistar los nmeros primos con la siguiente leyenda: x es primo.
Salida:
#define LIM 1e4 dim num, cont as integer print "Numeros primos comprendidos entre 1 y "; LIM for num=2 to LIM flag=0 for i=2 to num/2 if num mod i = 0 then flag = 1 next i if flag = 0 then
UAM Azcapotzalco
Pgina 45
UAM Azcapotzalco
Pgina 46
condicion V bloque_V
Donde: condicion: mientras la condicin sea verdadera, el ciclo contina en ejecucin . La condicin de paro puede implicar varias condiciones unidas por los operadores lgicos && y || bloque_V: es el conjunto de instrucciones que conformarn el ciclo
UAM Azcapotzalco
Pgina 47
UAM Azcapotzalco
Pgina 48
donde: bloque_V: es el conjunto de instrucciones que se va a repetir mientras la condicin sea verdadera condicion: una varias condiciones relacionadas con operadores lgicos.
condicion V
Ejercicio: escribir un algoritmo que obtenga el promedio de los nmeros pares ingresados por el usuario y el promedio de los impares. El programa se detiene cuando el usuario introduce cero o un valor negativo.
#include <stdio.h> int main(void){ int num=0; float tpar=0.0,timp=0.0,npar=0.0,nimp=0.0; do{ printf("Introduce un entero positivo: "); scanf("%d",&num); if(num>0){ if(num%2==0){ tpar+=num; npar+=1; } else{ timp+=num; nimp+=1; } } }while(num>0); if(npar==0) printf("\nNo hubo numeros pares\n"); else printf("\nPromedio de los pares = %f \n",tpar/npar); if(nimp==0) printf("\nNo hubo numeros impares\n"); else printf("\nPromedio de los impares = %f \n",timp/nimp); return 0; } sumaPar-Impar.c
dim tpar as double, timp as double, npar as double, nimp as double do input "Introduce un entero positivo: ", num if num>0 then if num mod 2=0 then tpar+=num : npar+=1 else timp+=num : nimp+=1 end if loop while num>0 if npar=0 then print "No hubo numeros pares" else print "Promedio de los pares = "; tpar/npar
UAM Azcapotzalco
Pgina 49
Ejercicio: recordando que es un nmero perfecto, escriba un programa que reciba desde el teclado un nmero natural y determine si ste es un nmero perfecto. El programa debe validad que la entrada del usuario sea un nmero natural mayor que 0. Si el usuario introduce un 0 entonces el programa debe terminar.
#include<stdio.h> int main(void){ int num=0, i=0; int sum=0; printf("Numero perfecto? \n"); do{ printf("Teclee un numero entero positivo (0 para salir): "); scanf("%d", &num); }while(num<0); if(num!=0){ for(i=1; i<num; i++){ if(num%i==0) sum=sum+i; } if(sum==num) printf("%d es un numero perfecto\n",num); else printf("%d no es un numero perfecto\n",num); } return(0); } perfecto.c
dim num, i, sum as integer print "Numero perfecto?" do input "Teclee un numero entero positivo (0 para salir): ", num loop while num<0 if num<>0 then for i=1 to num-1 if num mod i=0 then sum=sum+i next i if sum=num then print num, "es un numero perfecto" else print num, "no es un numero perfecto" endif endif sleep perfecto.bas
UAM Azcapotzalco
Pgina 50
2 2 2 2 2 2
3 3 3 3 3
4 5 6 7 7 6 5 4 4 5 6 6 5 4 4 5 5 4 4 4
3 3 3 3 3
2 2 2 2 2 2
1 1 1 1 1 1 1
UAM Azcapotzalco
Pgina 51
Ejercicio: escriba un programa que muestre en pantalla todos los nmeros perfectos comprendidos en el rango de 1 a n, donde n es un nmero dado por el usuario. Nota: - El programa debe incluir una funcin - Si n = 0 termina el programa - Si n < 0 insiste con el usuario en solicitar un valor para n.
#include <stdio.h> void numPerfecto(int); int main(void){ int n=0; do{ printf("Limite para encontrar numeros perfectos: "); scanf("%d",&n); }while(n<0); if (n!=0){ numPerfecto(n); } return 0; } void numPerfecto(int n){ int i=0,sum=0,j=0; for (i=1;i<n;i++){ sum=0; for (j=1;j<=(i/2);j++){ if(i%j==0) sum=sum+j; } if (sum==i) printf("%d es numero perfecto \n",i); } return; } serie-perfectos.c
UAM Azcapotzalco
Pgina 52
UAM Azcapotzalco
Pgina 53
Arreglos unidimensionales
Declarar un arreglo unidimensional es similar a declarar una variable, pero indicando su tamao, por ejemplo:
int vector[10]; float num[40]; //corresponde a un arreglo llamado vector de tamao 10 y cuyos elementos debern ser de tipo entero //corresponde a un arreglo llamado num de tamao 40 y cuyos elementos debern ser de tipo real
int datos[]= {36,21,23} ; // cuando se omite el tamao de un arreglo, debe inicializarse con valores, y su tamao corresponder al nmero de valores de inicio
Se asigna un valor a cada celda. La asignacin se hace en el orden en que aparecen los valores. En tiempo de ejecucin, el arreglo vector se vera, en la memoria principal, como sigue: 0 1 2 3 4 5 6 7 vector 2 4 6 7 5 1 9 3 Todos los arreglos comienzan en con una posicin 0 (cero); por lo tanto, el tamao de vector es 8, pero su ltima posicin es 7. En general, para un arreglo de tamao n, su ltima posicin ser n-1. Para acceder a cualquier elemento, nos referimos a l a travs de su posicin, por ejemplo:
UAM Azcapotzalco
Pgina 54
Arreglos unidimensionales y funciones Cuando una funcin requiere pasar un arreglo (como parmetro) a otra funcin, ste pasa nicamente por referencia. Por lo tanto, cualquier modificacin que se realice sobre el arreglo, en la funcin que lo recibe, afectar al arreglo original que se localiza en la funcin que realiz el llamado. La siguiente tabla muestra una comparacin entre las dos notaciones que podemos emplear en el lenguaje C para manejar un arreglo que pasa como parmetro por referencia. El resultado de ambos es el mismo.
Prototipo: void calcula(int datos[], int n); Llamado: int main(void){ int datos[10]; calcula(datos, 10); : return 0; } Declaracin de funcin:
void calcula(int datos[], int n) { for(int i=0; i<n;i++) datos[i]= datos[i]-2; return;
Prototipo: void calcula(int* datos, int n); Llamado: int main(void){ int datos[10]; calcula(datos, 10); : return 0; } Declaracin de funcin:
void calcula(int* datos, int n) { for(int i=0; i<n;i++) *(datos+i)= *(datos+i)-2; return;
Ejercicio: Escriba un programa que calcule la suma de 2 arreglos unidimensionales de tipo entero. El resultado debe almacenarse en un tercer arreglo.
UAM Azcapotzalco
Pgina 55
sumaVectores.c
#define MAX 100 function tamVEC do input "Dame el tamao de los arreglos (1-100)", n
UAM Azcapotzalco
Pgina 56
sumaVectores.bas
Ejercicio: construir un programa que simule el lanzar 4 dados 1e7 veces; para luego, obtener la frecuencia con la que se present cada suma de caras en los lanzamientos.
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NDADOS 3 #define ITERA 1.0e7 void tiraDados(int []); void imprimeRes(int []); void imprimeCad(int lim, char car); int main(void){ int cara[100]={0}; time_t tiempo1, tiempo2; srand(time(NULL)); time(&tiempo1); tiraDados(cara); imprimeRes(cara); time(&tiempo2); printf("\nEl tiempo de ejecucion es: %f \n", (float)(tiempo2-tiempo1)); return(0); } void tiraDados(int cara[]){
UAM Azcapotzalco
Pgina 57
RANDOMIZE TIMER DIM a(100) as double tempo=TIMER iterac=1e6 tms=3 FOR i=1 TO iterac sum=0 FOR j=1 TO tms sum=sum+INT(RND*6+1) NEXT j a(sum)=a(sum)+1 NEXT i FOR i=tms TO tms*6 PRINT USING "###\\";i; PRINT USING " ######.######"; a(i)/iterac; PRINT " ",STRING$(CINT(100*a(i)/(iterac)),120) NEXT i PRINT "tiempo transcurrido: ";TIMER-tempo; " segs." INPUT; "ENTER para continuar" , b END dados.bas
Ejercicio: construir un programa que permita recibir dos valores: 1) un valor entero positivo a convertir a cualquier base numrica; y 2) un valor entero positivo correspondiente a la base para la conversin. Es importante mencionar que el programa funcionar bajo el siguiente criterio: si la base es 8 su nomenclatura estar formada por (1, 2,7); si la base es 16 su nomenclatura estar formada por (1, 2,15).
UAM Azcapotzalco
Pgina 58
dim a(100) as integer print "Decimal a cualquier base" input "Base en que quieres el numero: ", bas input "Dame el numero en decimal: ", num while num<>0 i+=1 a(i)=num mod bas num=(num-num mod bas)/bas max=i wend print "El numero en base "; bas; " es: "; for i=max to 1 step -1 print a(i); next i sleep decimalOtraBase.bas
Arreglos bidimensionales
Un arreglo bidimensional (tambin llamado tabla matriz) consta de renglones y columnas. Para acceder a un elemento debemos emplear dos ndices, el primero para denotar el rengln y el segundo para denotar la columna donde se encuentra el elemento. Declarar un arreglo bidimensional es similar a declarar un arreglo unidimensional, pero indicando, adems del nmero de renglones, el nmero de columnas, por ejemplo:
int matriz[3][4]; //corresponde a un arreglo llamado matriz de 3 renglones y 4 columnas; por lo tanto su tamao es de 3x4=12 elementos, todos de tipo entero
UAM Azcapotzalco
Pgina 59
Cuando declaramos un arreglo bidimensional, es posible darle valores iniciales, por ejemplo:
int matriz[3][4]={12,24,46,17,25,31,49,63, 42,21,89,96}; // se asignan los valores en el orden de aparicin, cubriendo cada rengln int matriz[3][4]={ {12,24,4617},{25,31,49,63},{ 42,21,89,96}}; // esta forma proporciona claridad a quien lee el cdigo int matriz[3][4]={0}; //incorrecto // Una arreglo bidimensional no puede inicializase con 0 (cero) de esta manera
Observe que tambin los arreglos bidimensionales comienzan en con una posicin 0 (cero) tanto en los renglones como en las columnas; por lo tanto, el nmero de renglones matriz es 3, pero su ltima posicin es 2; mientras que el nmero de columnas es de 4 pero su ltima posicin es 3, y el tamao de la matriz es de 3x4. En general, en tamao de una matriz est determinado por el producto nrenglonesxmcolumnas correspondiente al nmero de elementos que puede albergar el arreglo bidimensional. Para acceder a cualquier elemento, nos referimos a l a travs de su posicin, por ejemplo:
Referencia matriz[2][3] matriz en su posicin 2,3 matriz[0][1] matriz en su posicin 0,1 Elemento 96 24
Ejercicio: construir un programa que dada una matriz, obtenga la matriz traspuesta. Para este ejercicio emplear funciones.
#include <stdio.h> #define MAX 50 void leeMatriz(float MAT[][MAX], int* n, int* m); void traspuesta(float MAT1[][MAX],float MAT2[][MAX],int n, int m); void imprMatriz(float MAT[][MAX], int n, int m);
UAM Azcapotzalco
Pgina 60
UAM Azcapotzalco
Pgina 61
Ejercicio: Escriba un programa que al recibir como dato un arreglo bidimensional (matriz) cuadrado, determine si el mismo es simtrico. El programa debe incluir las siguientes funciones: 1) leeMatriz, 2) simetrica, 3) imprimeMatriz.
#include <stdio.h> #define MAX 50 int leeMatriz(float[][MAX]); int simetrica(float[][MAX],int); int main(void){ float MAT[MAX][MAX]; int n=0,resp=0; n=leeMatriz(MAT); resp=simetrica(MAT,n); if (resp==0) printf("\nLa matriz es simetrica\n"); else printf("\nLa matriz no es simetrica\n"); return 0; } int leeMatriz(float MAT[][MAX]){ int i=0, j=0, n=0; printf("Cual es el tamanio de la matriz cuadrada: "); scanf("%d",&n); for(i=0; i<n; i++){ for (j=0; j<n; j++){ printf("MAT[%d,%d]= ",i,j); scanf("%f",&MAT[i][j]); } printf("\n"); } return n; } int simetrica(float MAT[][MAX],int n){ int i=0, j=0, flag=0; for (i=0; i<n; i++){ for (j=i+1; j<n; j++){ if (MAT[i][j]!=MAT[j][i])
UAM Azcapotzalco
Pgina 62
Cadenas
Una cadena es un arreglo unidimensional empleado para guardar elementos de tipo caracter char. Una cadena se declara igual que los arreglos, por ejemplo:
char cad[10]; //corresponde a una cadena llamada cad de tamao 10 y cuyos elementos debern ser de tipo caracter
En el leguaje C, todas las cadenas terminan con un caracter nulo denotado por una diagonal inversa y el nmero cero \0; por lo tanto, al momento de definir el tamao de la cadena tenemos que contar la celda que ocupar este caracter. El caracter nulo \0 sirve para marcar el fin de una cadena. Cuando declaramos una cadena, es posible darle valores iniciales, por ejemplo:
char cadena[5]={h,o,l,a}; //los valores se asignan a cadena en el orden en que aparecen char cad[5]=hola; // otra forma vlida de inicializar a cad
UAM Azcapotzalco
Pgina 63
char cad[]= hola; //el tamao del arreglo queda definido como 5
Observe que si bien el tamao de la palabra hola es 4, la cadena es declarada como de tamao 5, y el caracter nulo \0 ocupa la ltima posicin en el arreglo, es decir la posicin 4. Al manipular una cadena se debe cuidar de no sustituir al caracter nulo \0 con algn otro valor. Los operadores de asignacin (=) y los relacionales (==, !=) no se emplean en el manejo de cadenas, salvo la asignacin al declarar e inicializar una cadena; tal y como vimos en los ejemplos anteriores. Para manipular a las cadenas en un programa, debemos emplear un conjunto de funciones que encontramos en las bibliotecas: string.h, stdlib.h y ctype.h. Entrada /Salida para cadenas y caracteres
Cadenas
scanf(%s,&cadena)
Caracteres
scanf(%c,&caracter) getc(caracter) Printf(%c,caracter) putc(caracter)
Entrada gets(cadena)
Printf(%s,cadena)
Salida
puts(cadena)
Cuando quiero leer una nueva cadena, debemos emplear la funcin fflush(stdin), para limpiar el buffer que permite recibir una cadena desde el teclado.
Descripcin
strcpy(destino, origen) Copia el valor de cadena origen hacia la cadena destino. Igual que la funcin strcpy de dos argumentos, slo que se copian cuando mucho el lmite caracteres. Concatena el valor de cadena origen con el final de la cadena destino Igual que la funcin strcat de dos argumentos, slo que se anexan cuando mucho lmite caracteres Devuelve un entero igual a la longitud de la cadena origen; el
Precauciones
No verifica que la cadena destino sea lo bastante grande como para almacenar el valor de la cadena origen. Si limite se elige con cuidado, esta funcin es ms segura que la versin strcpy. No verifica que la cadena destino sea lo bastante grande como para almacenar el resultado de la concatenacin Si limite se elige con cuidado, esta funcin es ms segura que la versin srtcat.
UAM Azcapotzalco
Pgina 64
Si cadena_1 es igual a cadena_ 2 esta funcin devuelve 0, lo que la convierte en falsa cuando se evala. Esto es lo inverso de lo que podramos esperar dado que las cadenas son iguales. Tener cuidado con la lgica que sigue esta funcin
Si limite se elige con cuidado, esta funcin es ms segura que la funcin strcmp de dos argumentos
Ejercicio: construir un programa que dada una cadena, determine si sta es una cadena palndrome. Se dice que una cadena es palndrome si al invertir el orden de los caracteres (de derecha a izquierda) se lee igual.
#include<stdio.h> #include<string.h> #define MAX 50 int palindrome(char cad[]); int main(void){ char cad[MAX]={'\0'}; int resp=0; printf("Ingresa la cadena a ser evaluada como palindrome,"); printf("\npero SIN ESPACIOS ENTRE LAS LETRAS:\n"); scanf("%s",cad); printf("la cadena mide %i y contiene %s", strlen(cad), cad); resp=palindrome(cad); if (resp==0) printf("\nLa cadena no es palindrome\n"); else printf("\nLa cadena es palidrome\n"); return 0; } int palindrome(char cad[]){ int i=0, j=0, flag=1; for (i=0, j=strlen(cad)-1; i<strlen(cad)/2 && j>=strlen(cad)/2; i++, j--){ printf("\n %c %c", cad[i],cad[j]); if(cad[i]!=cad[j]){ flag=0; j=-1; i=strlen(cad)+1; } } return flag; } palindrome.c
#define MAX 50 declare function palindrome(cad as string) as integer dim cad as string input "Ingresa la cadena a ser evaluada como palindrome: ", cad print "la cadena mide"; len(cad); " y contiene '"; cad; "'"
UAM Azcapotzalco
Pgina 65
Ejercicio: construir un programa que reciba desde el teclado el nombre del usuario; el programa debe iterar n veces, donde n es el tamao de la cadena que ingres el usuario; El propsito del programa es mezclar o desordenar la cadena en cada iteracin. El programa debe imprimir la cadena obtenida en cada iteracin.
#include <stdio.h> #include <time.h> #include <stdlib.h> #include<string.h> #define MAX 50 void desordena(char nom[]); int main(void){ char nom[MAX]={'\0'}; srand(time(NULL)); printf("Cual es tu nombre? "); scanf("%s",nom); desordena(nom); return 0; } void desordena(char nom[]){ int i=0, j=0, esc=0; char aux='\0'; for(j=1; j<=strlen(nom); j++ ){ for (i=0; i<strlen(nom); i++){ esc=rand()%(strlen(nom)-i)+i; aux=nom[i]; nom[i]=nom[esc]; nom[esc]=aux; } printf("\n"); printf("Hola %s !",nom); } return; } desordena.c
randomize timer dim as string nom, aux input "Cual es tu nombre? ", nom for i=1 to len(nom) for j=1 to len(nom)-1 esc=int(rnd*(len(nom)-j))+i+1 aux=mid$(nom,j,1) : mid$(nom,j,1)= mid$(nom,esc,1) : mid$(nom,esc,1)=aux
UAM Azcapotzalco
Pgina 66
UAM Azcapotzalco
Pgina 67
Las cosas se simplifican cuando separamos el programa de los datos con los que opera, si los datos se mantienen en archivos aparte y los problemas vuelven a ser cortos y simples de leer. Tenemos varios tipos de archivos, aquellos que usaremos para consulta, otros que usaremos para poner la informacin de una ejecucin en el mismo, y tambin archivos ya existentes donde se agregarn los datos recin procesados.
Conceptos bsicos
Un archivo es un conjunto de datos de distintos tipos: int, float, double, char, etc., que se guardan juntos, bajo un nombre comn, en un dispositivo secundario, a saber: disco duro, memoria USB, etc. Por ejemplo texto.txt sera un archivo de datos.
Los nombres de los archivos son reconocidos por el sistema operativo a travs de los comandos ls (unix) y dir (dos). Actualmente Unix y Windows (desde la versin 95) aceptan 255 caracteres para nombrar un archivo. El contenido de un archivo perdura hasta que una persona o programa lo modifica.
Descripcin Abrir archivo Cerrar un archivo Escribir un carcter en el archivo Lee un carcter de un archivo Escribir una cadena en un archivo Imprimir a un archivo Leer sobre un archivo Devuelve cierto cuando llega al fin del archivo Devuelve vierto si se ha producido un error colocar el indicador de posicin de un archivo al principio del mismo. eliminar un archivo vaciar el buffer que sirve para leer o escribir en el archivo. UAM Azcapotzalco Pgina 68
a r+
exit(valor_entero) es una funcin que termina de inmediato la ejecucin de un programa yforma parte de la biblioteca stdlib.h. Se puede usar cualquier valor entero, pero por convencin se emplea: 1 para indicar que el programa terminar porque durante la ejecucin del programa se incurri en algn error, previsto por el programador. 0 para indicar que el programa terminar sin que esto lo cause algn error. Ejercicio: construir un programa que permita escribir un conjunto de caracteres en un archivo llamado texto.txt. Los caracteres debern ser ingresados desde el teclado por un usuario.
#include <stdio.h> int main(void){ char car; FILE *ap; printf("Escriba una cadena para ser guardada en un archivo"); printf("\n El fin de la cadena lo marca un <ENTER>\n"); ap=fopen("texto.txt","w"); if (ap!=NULL){ while ((car=getchar())!='\n'){ fputc(car,ap); } fclose(ap); } else printf("No se puede abrir el archivo"); return 0; } escribirArchivo.c dim cad as string print "Escriba una cadena para ser guardada en un archivo" print " El fin de la cadena lo marca un <ENTER>"
UAM Azcapotzalco
Pgina 69
Ejercicio: construir un programa que permita leer el contenido de un archivo llamado texto.txt. El contenido del archivo deber desplegarse en pantalla.
#include <stdio.h> int main(void){ char car; FILE *ap; if ((ap=fopen("prueba.txt","r"))!=NULL){ while (!feof(ap)){ car=fgetc(ap); putchar(car); } fclose (ap); } else printf("No se puede abrir el archivo"); printf("\n"); return 0; } leerArchivo.c dim cad as string f=open("texto.txt" for input as #1) if f = 0 then while not eof(1) line input #1, cad print cad wend close #1 : print : print print " ---- FIN DE ARCHIVO ---" else print "No se puede abrir el archivo" end if sleep leerArchivo.bas
Ejercicio: Construir un programa que lea un archivo de texto fuente y lo codifique. El criterio para codificarlo es sumar 2 al caracter ascii que lea del archivo fuente. Todos los caracteres codificados debern guardarse en un nuevo archivo. Nota: el programa debe recibir desde el teclado, los nombres de los archivos (fuente y destino).
UAM Azcapotzalco
Pgina 70
Ejercicio: Construir un programa que lea un archivo de texto codificado y lo decodifique. El criterio para decodificarlo es restar 2 al caracter ascii que lea del archivo que contiene texto codificado con el criterio de sumar 2 al caracter ascci. Todos los caracteres decodificados debern guardarse en un nuevo archivo. Nota: el programa debe recibir desde el teclado, los nombres de los archivos (codificado y decodificado).
#include<stdio.h> #include<stdlib.h>
UAM Azcapotzalco
Pgina 71
Construir un programa que simule una bola 8 magica que adivina el futuro del usuario quien realiza una pregunta. Este juguete, que es muy parecida a una bola de billar, se agita y en la parte de atrs, se puede leer una de 20 respuestas (la bola tiene un icosaedro sumergido en tinta negra con una respuesta en cada cara); la bola debe dar 10 respuestas afirmativas, 5 ambiguas y 5 negativas, como se muestra en el archivo magica8.txt En particular, el programa que vamos a construir debe contar con dos funciones aparte de la funcin main. Una de ellas debe encargarse de solicitar al usuario preguntas o la palabra fin que pone trmino al juego. La otra debe proporcionar una respuesta. Como entrada, el programa recibe una cadena desde el teclado del usuario; y como salida, debe imprimir en pantalla una respuesta tomada al azar de un conjunto de respuestas previamente definidas por el programador. Si el usuario introduce la palabra fin o FIN, debe terminar el juego.
UAM Azcapotzalco
Pgina 72
dim respuesta(20) as string, pregunta as string open "8 magica.txt" for input as #1 for i =1 to 20 input #1, respuesta(i) next i randomize timer : print "Bola 8 magica" input "Realiza una pregunta: ", pregunta while pregunta<>"" sel=int(20*rnd)+1
UAM Azcapotzalco
Pgina 73
Ejercicio: una papelera necesita contar con un programa que le permita obtener la lista de sus precios con el iva correspondiente. El usuario deber proporcionar el nombre del archivo donde se encuentran los precios originales, en forma de lista; y a partir de este archivo, el programa debe calcular el nuevo precio con iva y colocarlo en el archivo que le indique el usuario.
#include<stdio.h> #include<stdlib.h> #define MAX 50 #define LON 15 void nombreArchivo(char[], char[]); int cargaDatos(float[]); float calculaTotal(float[],int); void guardaDatos(float[], float, int); int main(void){ float precios[MAX]={0.0}, total=0.0; int tam=0; tam = cargaDatos(precios); total = calculaTotal(precios, tam-1); guardaDatos(precios, total, tam-1); return(0); } void nombreArchivo(char tipo[], char nom[]){ printf("Cual es el nombre del archivo de %s: \n", tipo); gets(nom); return; }
UAM Azcapotzalco
Pgina 74
dim as double precios(MAX), total tam = cargaDatos(precios()) total = calculaTotal(precios(), tam-1) guardaDatos(precios(), total, tam-1) sub nombreArchivo(tipo as string, nom as string) print "Cual es el nombre del archivo de "; tipo input nom end sub function cargaDatos(precios() as double) dim as string nomArch, aux1 aux1="entrada" nombreArchivo(aux1,nomArch) dim cad as string f=open(nomArch for input as #1) if f = 0 then while not eof(1) input #1, precios(n)
UAM Azcapotzalco
Pgina 75
UAM Azcapotzalco
Pgina 76
UAM Azcapotzalco
Pgina 77