Vous êtes sur la page 1sur 102

Manual de Pr

acticas de Laboratorio
Programaci
on B
asica

Arturo Vega Gonzalez


Arturo Gonzalez Vega

Universidad de Guanajuato.
n de Ciencias e Ingenieras, Campus Leo
Divisio n.
Departamento de Ingenieras Qumica, Electro nica y Biome
dica.


c Copyright 2012
Introducci
on

El presente manual de practicas de laboratorio tienen por objetivo fundamental presentar


los conceptos basicos y relevantes del curso Programacion Basica, el cual se imparte en la
Division de Ciencias e Ingenieras de la Universidad de Guanajuato, Campus Leon. Los
lenguajes de programacion utilizados son C y Fortran, ambos en la plataforma de UNIX
(Linux - Fedora).
El manual de practicas consta de 8 practicas, las cuales cubren los conceptos basicos de
programacion. Cada practica contiene una introduccion donde se explican de forma breve
los conocimientos necesarios para el desarrollo de los ejercicios. Estos conceptos debieron
revisarse en clase, por lo que aqu se presentan en forma resumida.
Los ejercicios presentados al final de cada captulo constituyen una practica y estan pen-
sados para realizarse frente a una computadora. Los ejercicios sugeridos incluyen preguntas
donde el estudiante tiene que investigar un poco mas acerca del lenguaje de programacion o
bien reflexionar sobre el comportamiento y logica que se observa en la ejecucion del programa.
Los ejercicios tambien ayudan a desarrollar las habilidades del estudiante para la solucion de
problemas mediante un programa de computadora.
El tiempo requerido para realizar cada practica es entre una y dos sesiones de tres horas
cada una. Los autores de este manual recomiendan que los ejercicios se resuelvan en equipo
de dos personas. Esto contribuira al desarrollo de habilidades como comunicacion y trabajo
en equipo.
Finalmente, es importante mencionar que es la primer version del manual de practicas y
es factible que tenga algunos errores cometidos de manera involuntaria. Por ello los autores
agradeceremos las sugerencias que se tengan para mejorar el contenido de este manual de
practicas.

ii
Indice general

Introducci
on ii

1 Edici
on y Compilaci
on 1
1.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Edicion y Compilacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.1 Accediendo al sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.2 Comandos basicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.3 Editores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.4 Creando un programa ejecutable . . . . . . . . . . . . . . . . . . . . . 7
1.3 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Lenguaje de Programaci
on C 11
2.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Diagramas de Flujo y Pseudocodigo . . . . . . . . . . . . . . . . . . . . 12
2.3 Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1 Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2 Desplegando variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.3 Introduciendo datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.4 Operadores Aritmeticos . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3 Lenguaje de programaci
on Fortran 22
3.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2 Estructura y Compilacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.1 Tipos de datos en fortran . . . . . . . . . . . . . . . . . . . . . . . . . 22

iii
3.2.2 Desplegando Informacion . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4 Secuencias de Control 33
4.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Secuencias de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.1 Operadores relacionales y logicos . . . . . . . . . . . . . . . . . . . . . 33
4.2.2 Condicional Si-Entonces . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.3 Condicional Si-Entonces-sino . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.4 Seleccion de caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

5 Secuencias de Repetici
on 43
5.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Secuencias de repeticion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.1 for - do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.2 while - do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.3 Ciclos infinitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

6 Arreglos y Estructuras de Datos 53


6.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.2 Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.2.1 Declaracion de arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.2 Cadena de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.3 Estructura de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3.1 struct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3.2 type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.3.3 union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.3.4 enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.3.5 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.4 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

7 Funciones y Procedimientos 68
7.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

iv
7.2 El preprocesador de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
7.3 Funciones en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.4 Funciones y procedimientos en Fortran . . . . . . . . . . . . . . . . . . . . . . 73
7.5 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

8 Apuntadores y Archivos 82
8.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.2 Apuntadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.3 Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.3.1 Archivos en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.2 Archivos en Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
8.4 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Bibliografa 97

v
Pr
actica 1

Edici
on y Compilaci
on

1.1 Introducci
on
Esta practica introduce al estudiante al uso del sistema operativo Linux, as como a las
herramientas para editar, compilar y ejecutar un programa de computadora. Al termino
de la practica el estudiante habra comprendido la diferencia entre un editor de textos y un
procesador de palabras y sera capaz de editar, compilar y ejecutar un programa escrito en
lenguaje C.

1.2 Edici
on y Compilaci
on
A continuacion se presenta un breve resumen de los conceptos mas importantes que se re-
quieren para realizar la practica.

1.2.1 Accediendo al sistema


Para acceder al sistema operativo se requiere que el usuario o persona se identifique por
medio de:

login: username o nombre de usuario

password: contrase
na o clave

El usuario debio haber sido registrado por el administrador del sistema.

DCI - DIQEB, Universidad de Guanajuato


1.2 Edici
on y Compilaci
on 2

Figura 1.1: Ingreso al sistema linux

1.2.2 Comandos b
asicos
La lnea de comandos empieza en el prompt y termina en el momento que el usuario presiona

- , (Enter, Return). La primer palabra que se escribe en la lnea de comandos es el nombre
de un archivo ejecutable o de un comando del sistema.

Figura 1.2: Terminal

Comandos Basicos (ver tabla 1.1):

Los comandos tienen opciones y argumentos, los cuales van separados por espacios.

Los comandos indican que hacer

DCI - DIQEB, Universidad de Guanajuato


1.2 Edici
on y Compilaci
on 3

Las opciones indican como hacerlo

Los argumentos indican sobre quien hacerlo

1.2.3 Editores
Editor de texto vs. procesador de texto.

Un editor de texto es un programa que permite crear y modificar archivos digitales


compuestos u nicamente por texto sin formato, conocidos com
unmente como archivos
de texto o texto plano.

Un procesador de texto es un programa que permite crear y modificar archivos digitales


que contienen texto con formato, como negrillas, cursivas, margenes, etc. Generalmente
contienen mas caracteres de control para darle al texto un formato particular.

En Linux existen varios editores de texto, como vi, vim, pico y emacs, entre otros.

vi, vim, gvim

Vi es el editor estandar de los Sistemas Operativos de la familia Unix/Linux. Existen tres


modos o estados de vi (ver tabla 1.2):

Modo comando: este es el modo en el que se encuentra el editor cada vez que se
inicia. Las teclas ejecutan acciones (comandos) que permiten mover el cursor, ejecutar
comandos de edicion de texto, salir de vi, guardar cambios, etc.

Modo insercion o texto: este es el modo que se usa para insertar el texto. Existen varios
comandos que se pueden utilizar para ingresar a este modo. Para pasar de modo texto
 
a modo comando simplemente se debe presionar la tecla ESC  .

Modo lnea o ex: se escriben comandos en la u


ltima lnea al final de la pantalla.

emacs

EMACS significa, Editor MACroS y fue escrito por Richard M. Stallman. Los comandos
basicos se pueden consultar en la tabla 1.3

DCI - DIQEB, Universidad de Guanajuato


1.2 Edici
on y Compilaci
on 4

Tabla 1.1: Comandos de Linux. [] indica que son opcionales, ... indica que puede ir mas
de una opcion. Las opciones suelen comenzar con - o .
Comando Descripcion
ls [opciones...] [directori- Muestra el contenido del directo-
o/archivo ...] rio. Sin argumentos muestra el
contenido del directorio actual de
trabajo. La opcion mas habit-
ual es -l que muestra informacion
mas completa de cada directorio y
archivo.
cd [directorio] Cambia de directorio. Sin ar-
gumentos lleva al directorio del
usuario (HOME). Si el directorio es
.. sube un nivel.
pwd Imprime el directorio actual de tra-
bajo.
cat [opciones...] Muestra el contenido de los archivos
[archivos...] por la salida estandar. Si no se
especifican archivos, lee de la en-
trada estandar.
cp [opciones...] fuente... Permite copiar un archivo, o varios
destino archivos a un directorio. Quizas la
opcion mas usada es -r que per-
mite copiar recursivamente directo-
rios hacia otros directorios.
mv [opciones...] fuente... Cambia el nombre de un archivo
destino por otro o mueve una serie de
archivos y directorios a un directo-
rio destino.
mkdir [opciones...] direc- Crea el directorio con el nombre in-
torio dicado.
rmdir [opciones...] direc- Borra un o varios directorios si
torio... estan vacos
rm [opcions...] archivos Borra archivos. Las opciones mas
habituales son -f para forzar el
borrado sin preguntar al usuario (la
opcion contraria es -i). -r borra
recursivamente todos los subdirec-
torios .

DCI - DIQEB, Universidad de Guanajuato


1.2 Edici
on y Compilaci
on 5

Tabla 1.2: Comandos Basicos de vi


Comando Descripcion
Flechas Mover en la direccion de la flecha
h Mover hacia la izquierda
l Mover hacia la derecha
k Mover hacia arriba
j Mover hacia abajo
1G Lleva el cursor hasta el comienzo del archivo
G Lleva el cursor hasta el final del archivo
i Inserta texto a la izquierda del cursor
a Inserta texto a la derecha del cursor
A Inserta texto al final de la lnea donde se encuentra
el cursor
I Inserta texto al comienzo de la lnea donde se en-
cuentra el cursor
o Abre una lnea debajo de la actual
O Abre una lnea encima de la actual
x Borra el caracter bajo el cursor
dd Borra la lnea donde se encuentra el cursor
ndd Borra las proximas n lneas
D Borra desde donde se encuentra el cursor hasta el
final de la lnea
dw Borra desde donde se encuentra el cursor hasta el
final de una palabra

DCI - DIQEB, Universidad de Guanajuato


1.2 Edici
on y Compilaci
on 6

Figura 1.3: Ventana principal del editor gvim

Tabla 1.3: Comandos Basicos de emacs


Comando
      
Descripcion
Ctrl 
 +  x 
  Ctrl + f  Abrir o crear archivo.
 
Ctrl 
 +  x Ctrl
   +  s  Guardar archivo.

 Ctrl 
+  x  Ctrl  + Guardar como.

w  
   
 Ctrl +
  x  Ctrl + Cerrar Emacs.


c   
Ctrl 
 + z 
 Minimizar Emacs.
Ctrl + h  t  Abre un buffer con un breve tutorial
    de Emacs, se hace en 15 minutos.
Ctrl + h  m  Abre un buffer con una breve de-
    scripcion de los modos activos.
Ctrl + h  a  Permite buscar entre las funciones
    de Emacs.
Ctrl + h  c  Muestra en el minibuffer la funcion
que ejecuta la combinacion de teclas
   que se pulse a continuacion.
Ctrl +g  Salir del minibuffer.

DCI - DIQEB, Universidad de Guanajuato


1.3 Ejercicios 7

1.2.4 Creando un programa ejecutable


El proceso de crear un programa ejecutable puede describirse en tres pasos (ver figura 1.4):

Preprocesador: Transforma el programa fuente, convirtiendolo en otro archivo fuente


predigerido. Elimina comentarios, incluye otros archivos y sustituye las definiciones.

Compilador: Convierte el fuente entregado por el preprocesador en un archivo en lenguaje


maquina: archivo objeto.

Enlazador: Un archivo objeto es codigo maquina, pero no se puede ejecutar, porque le falta
codigo que se encuentra en otros archivos binarios. El enlazador genera el ejecutable
binario, a partir del contenido de los archivos objetos y de las bibliotecas.

Programa fuente
(Cdigo fuente)

Preprocesador

Compilador

Enlazador

Programa ejecutable

Figura 1.4: Procesos involucrados en la creacion de un programa ejecutable

1.3 Ejercicios
El objetivo de esta sesion es aprender a editar, compilar y ejecutar un programa en C.
NOTA: Todos los programas deben ir comentados y con el nombre del autor.

1. Ejercicio 1: Programa 1
Crear un archivo con el nombre programa1.c e introducir el siguiente programa:

DCI - DIQEB, Universidad de Guanajuato


1.3 Ejercicios 8

#include <s t d i o . h>

int main ( void )


{
p r i n t f ( Programacion b a s i c a . \ n ) ;
return 0 ;
}

El programa editado en GVim se observa en la figura 1.5

Figura 1.5: Edicion del programa1.c en el editor de textos GVim

2. Compilando y ejecutando el programa


Para compilar y ejecutar el programa, ejecute los siguientes comandos:

gcc programa1.c -o programa1.out


./programa1.out

La salida del programa se observa en la figura 1.6

3. Modifique el programa1.c para que imprima el nombre del autor. Pruebe editar el
archivo con otro editor de textos (ej. gedit, vi, pico, etc.). Guarde su archivo como
programa2.c

DCI - DIQEB, Universidad de Guanajuato


1.3 Ejercicios 9

Figura 1.6: Compilacion y ejecucion del programa1.c

#include <s t d i o . h>

int main ( void )


{
p r i n t f ( Programacion b a s i c a . \ n ) ;
p r i n t f ( Programa e s c r i t o por : Arturo Vega . \ n ) ;

return 0 ;
}

4. Editor de palabras
Edite, compile y ejecute un archivo con el nombre programa3.c utilizando un editor
de palabras (ej. open office, word, etc. ), e introduzca el siguiente texto:

#include <s t d i o . h>

int main ( void )


{
p r i n t f ( Programacion b a s i c a , usando un e d i t o r de p a l a b r a s . \ n ) ;
return 0 ;
}

Compile y ejecute el programa. Cual es la diferencia? Porque suceden estas diferen-


cias?

DCI - DIQEB, Universidad de Guanajuato


1.3 Ejercicios 10

Cuales son las diferencias entre un editor de textos y un procesador de palabras?


Que herramienta se debe utilizar para escribir programas de computadora?

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 2

Lenguaje de Programaci
on C

2.1 Introducci
on
En esta segunda practica se explora el lenguaje de programacion C, la estructura de un pro-
grama es explicada a detalle para que posteriormente el alumno explore el lenguaje. Tambien
se explica que es un algoritmo y los principales pasos en la solucion de un problema mediante
el uso de un programa de computadora.

2.2 Algoritmo
Un algoritmo es una secuencia ordenada y finita de pasos para realizar una tarea particular
y debe cumplir las siguientes especificaciones:

Cada paso o instruccion del algoritmo debe estar bien definido(a)

Un algoritmo debe tener un principio y un fin

Cada paso debe tener una secuencia sucesiva e indicar claramente el camino a seguir
en la solucion del problema

Un programa es una secuencia ordenada y finita de instrucciones para realizar una tarea
particular. Se puede decir que un programa es la implementacion de un algoritmo en un
lenguaje de programacion.

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 12

2.2.1 Recomendaciones
Programar es un proceso metodico, por lo que se puede recomendar los siguientes pasos en
la solucion de problemas computacionales que involucren crear un programa.

1. Definicion del problema de forma clara y precisa (Determinar el problema)

2. Describir los datos de entrada, resultados esperados y en su caso variables requeridas

3. Realizar un ejemplo a mano

4. Desarrollar un algoritmo para solucionar el problema (diagrama de flujo, seudocodigo)

5. Codificar el algoritmo

6. Probar el algoritmo con una variedad de datos de entrada, donde para estos datos se
conoce el resultado.

2.2.2 Diagramas de Flujo y Pseudoc


odigo
Los diagramas de flujo son diagramas que emplean smbolos graficos para representar los
pasos o etapas de un algoritmo. Tambien nos ayudan a describir la interaccion de los pasos
y analizar la eficiencia del algoritmo.

El pseudocodigo nos ayuda a describir algoritmos en un lenguaje humano simplificado.


El pseudocodigo no es dependiente de ning
un lenguaje de programacion.

2.3 Lenguaje C
El lenguaje C es un lenguaje imperativo, es decir, es un lenguaje que le indica a la
computadora de forma inequvoca las instrucciones a seguir para la solucion de un
problema. Otros lenguajes como LISP y PROLOG son declarativos

El Lenguaje C es un lenguaje estructurado, es decir, la estructura del texto del pro-


grama nos ayuda a entender la funcion que realiza (basado en el tipo de tarea que el
sistema debe realizar). Otros lenguajes como C++ y Java son orientados a objetos.

Primer programa:

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 13

#include <s t d i o . h>

int main ( void )


{
p r i n t f ( Programacion b a s i c a . \ n ) ;
return 0 ;
}

#include <s t d i o . h>

Inclusion de libreras o biblioteca de funciones (Archivos de cabecera) mediante:

#include

Entonces:

#include <s t d i o . h>


#include <math . h>
#include O t r a s F u n c i o n e s . h
#include b i b l i o t e c a . h

En nuestro programa se indica que incluya la librera estandar de entrada y salida (teclado
y pantalla)

int main ( void )

La funcion principal del programa se indica con main (nombre especial que indica donde
comienza el programa). Todo programa en C debe tener una funcion principal. Las funciones
en C pueden o no regresar un valor, en nuestro caso regresa un valor entero. Para indicar
que regresa un valor entero se antepone la clausula int (abreviacion de integer). La palabra
reservada void entre parentesis indica que la funcion main no tiene parametros. Si los tuviese,
entonces escribimos por ejemplo:

int main ( int argc , char argv [ ] )

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 14

Las llaves

{ }

indican inicio y fin de un grupo o bloque de instrucciones, en este caso indican el inicio y fin
de la funcion main.

p r i n t f ( Programacion b a s i c a . \ n ) ;

Aqu se invoca o llama a la funcion printf, que es una funcion de salida estandar y nos
ayuda a desplegar informacion en pantalla. Aqu el parametro o argumento que se le pasa a
la funcion es una cadena de caracteres, la cual es:

Programacion b a s i c a . \ n

Donde

\n

Indica salto de lnea


La ultima lnea es:

return 0 ;

Aqu se indica que finaliza la funcion main y regresa al sistema operativo un valor de 0.
El cero se utiliza por convencion para indicar que el programa termino sin errores o que fue
exitoso.

Importante: Toda instruccion en C termina con punto y coma.

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 15

Tabla 2.1: Tipos de datos en C


char signed unsigned char
char
Enteros signed short signed int signed long
int int
unsigned unsigned unsigned long
short int int int
Reales float double long double

2.3.1 Tipos de datos


Tipos de datos

De forma abreviada:

Tabla 2.2: Tipos de datos en C, forma abreviada


char signed unsigned char
char
Enteros short int signed long
unsigned unsigned unsigned long
short
Reales float double long double

2.3.2 Desplegando variables


La funcion printf nos permite desplegar valores
char c ;
...
p r i n t f ( %c , c ) ;

int i ;
...
p r i n t f ( %d , i ) ;

long x ;
...
p r i n t f ( %l d , x ) ;

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 16

float f ;
...
p r i n t f ( %f , f ) ;

double d ;
...
p r i n t f ( %l f , d ) ;

long double r ;
...
p r i n t f ( %Lf , r ) ;

p r i n t f ( P l a n t i l l a de formato , l i s t a de v a r i a b l e s ) ;

2.3.3 Introduciendo datos


La funcion scanf permite introducir datos desde el teclado
char c ;
...
s c a n f ( %c ,& c ) ;

int i ;
...
s c a n f ( %d ,& i ) ;

long x ;
...
s c a n f ( %l d ,&x ) ;

float f ;
...
s c a n f ( %f ,& f ) ;

DCI - DIQEB, Universidad de Guanajuato


2.3 Lenguaje C 17

double d ;
...
s c a n f ( %l f ,&d ) ;

long double r ;
...
s c a n f ( %Lf ,& r ) ;

s c a n f ( P l a n t i l l a de formato , l i s t a de r e f e r e n c i a a v a r i a b l e s ) ;

2.3.4 Operadores Aritm


eticos
Los operadores aritmeticos nos permiten hacer operaciones como suma, resta, multipli-
cacion, division, etc.

El resultado de la operacion es dependiente del tipo de dato

Tabla 2.3: Operadores aritmeticos en lenguaje C


Operador Descripcion
Resta
+ Suma
Multiplicacion
/ Division
% Modulo

Variables:

Constante: Son elementos que contienen datos, el valor asignado a una constante es
fijo y no se puede cambiar durante toda la ejecucion de un programa.

Variable: Son elementos que se utilizan para contener datos de distintos tipos. El valor
contenido en una variable puede cambiar a lo largo de la ejecucion de un programa

Expresion: Las expresiones son combinaciones de constantes, variables, operadores,


parentesis y nombres de funciones.

DCI - DIQEB, Universidad de Guanajuato


2.4 Ejercicios 18

2.4 Ejercicios
El objetivo de esta sesion es del de aprender a declarar variables de diferentes tipos y manip-
ularlas en operaciones basicas.

NOTA: Todos los programas deben ir comentados y con el nombre del autor.

1. Edite y compile el siguiente programa y dibuje el diagrama de flujo asociado al pro-


grama.
#include <s t d i o . h>

int main ( void )


{
int v a l o r 1 , v a l o r 2 , suma ;

valor1 = 50;
valor2 = 25;
suma = valor1 + valor2 ;
printf ( La suma de %d y %d e s %d\n , v a l o r 1 , v a l o r 2 , suma ) ;
return 0;
}

2. Para el siguiente diagrama de flujo, escriba, edite, compile y ejecute el programa en C


correspondiente. Considere tipos de datos enteros.

3. Asignacion de variables: Analice el siguiente programa y determine sin editar, compilar


y ejecutar el programa lo siguiente:

(a) Si las asignaciones son correctas


(b) El valor que tendra cada variable al finalizar el programa.

#include <s t d i o . h>

int main ( void )


{
double x = 1 . 3 4 3 , y ;

DCI - DIQEB, Universidad de Guanajuato


2.4 Ejercicios 19

Inicio

valor1,
valor2

suma = valor1 + valor2

suma

Fin

Figura 2.1: Diagrama de flujo para el inciso 2

int i;

y = i = x;
p r i n t f ( %f \n , y ) ;
return 0 ;
}

4. Modifique el programa anterior para que imprima todas las variables y su valor. Es
decir que la salida del programa muestre el valor de la variable despues de la asignacion,
ejemplo de una posible salida:
x = 0
y = 0
i = 0

Edite, compile y ejecute el programa. Son los valores mostrados por el programa
anterior similares a los de su respuesta del inciso anterior? Explique el por que de los

DCI - DIQEB, Universidad de Guanajuato


2.4 Ejercicios 20

diferentes valores.

DCI - DIQEB, Universidad de Guanajuato


2.4 Ejercicios 21

5. Operaciones: el operador de division /, realiza su operacion de acuerdo al tipo de datos.


Si las variables o datos son int, entonces se realiza una division entera. Si los datos
o variables son float o doble, entonces se realiza una division con punto flotante. De
acuerdo a esto, la salida del siguiente programa es: . Edite, compile y
ejecute el programa, Cual es la salida del programa? Explique el por que de ese valor.

#include <s t d i o . h>

int main ( void )


{

float a ;
a = 1 / 3;

p r i n t f ( %f \n , a ) ;
return 0 ;
}

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 3

Lenguaje de programaci
on Fortran

3.1 Introducci
on
En esta practica se introduce al alumno al lenguaje de programacion Fortran. Los ejercicios
incluyen una comparacion con el lenguaje C e invitan al estudiante a reflexionar sobre la
forma de operar de ambos lenguajes.

3.2 Estructura y Compilaci


on
Estructura de un programa en Fortran
program programa1

print , Programacion b a s i c a

end program programa1

Para compilar y ejecutar el programa, ejecute los siguientes comandos:

gfortran programa1.f90 -o programa1.out

./programa1.out

3.2.1 Tipos de datos en fortran


Los diferentes tipos de datos se encuntran listados en la tabla ??

DCI - DIQEB, Universidad de Guanajuato


3.2 Estructura y Compilaci
on 23

Tabla 3.1: Tipos de datos en fortran

logical Las variables logicas solo pueden tener dos valores:


.true. (verdadero) y .false. (falso).

integer Valores enteros (sin punto decimal), guardados en 4


bytes.

real Valores reales guardados en 4 bytes y con 8 cifras


significativas. Se indican con punto decimal, y de ser
necesario el exponente de la potencia de 10 despues
de una E: 1., -3.1416, 6.25E-10, etc.

double Valores reales de doble precision guardados en 8


bytes y con16 cifras significativas, tambien se deno-
tan por real(8). Se indican con punto decimal y el
exponente de la potencia de 10 despues de una D:
1.D0, -3.1416D0, 6.25D-10, etc. Son muy u tiles en
calculos numericos largos, donde los errores de re-
dondeo pueden hacer que las u ltimas 4 o 5 cifras
significativas de un n
umero real sean basura.

complex Dos valores reales formando un par y que en opera-


ciones matematicas se tratan como la parte real e
imaginaria de un n umero complejo: (1.,-2.), (1.0E0,-
2.0E0). Tambien existen versiones de doble y
cuadruple precision.

character Variables que corresponden a cadenas de caracteres.


Al declarar una variable de este tipo se debe es-
pecificar cuantos caracteres puede tener. Estas vari-
ables deben estar contenidas en comillas: hola,
abcdef, etc.

quadruple Valores reales de cuadruple precision guardados en


16 bytes y con 32 cifras significativas, tambien se
denotan por real(16). Se indican con punto decimal
y el exponente de la potencia de 10 despues de una
Q: 1.Q0, -3.1416Q0, 6.25Q-10, etc.

DCI - DIQEB, Universidad de Guanajuato


3.2 Estructura y Compilaci
on 24

3.2.2 Desplegando Informaci


on
Una forma de desplegar la informacion en pantalla es mediante el comando print, como se
muestra en el siguiente ejemplo:
program programa2

! Declaramos l a s v a r i a b l e s
i m p l i c i t none
integer i , k
r e a l f1 , a

i = 10
k = 1
f1 = 5.0
a = f1

print , i , k , f1 , a

end program programa2


Para indicar el formato de lectura en un programa en Fortran se utiliza una plantilla de
formato, como:

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 25

Tabla 3.2: Opciones de formato en Fortran

Tipo Sintaxis Ejemplo Datos Descripcion


integer nIw 2i4 1234, -12 n es el numero de enteros a leer y w el
numero total de caracteres contando el
signo.

real nFw.d 2f8.3 1234.678, n es el de reales por leer, w es el n


umero
-234.678 total de caracteres incluyendo el punto dec-
imal y el signo y d es el numero de cifras
despues del punto decimal.

character nAw 2a6 abcdef, n es el n


umero de palabras a leer y w el
qwerty n
umero de caracteres en cada palabra.

espacios nx 2x n es el n
umero total de espacios en blanco
a leer

3.3 Ejercicios
Los objetivo de esta sesion son:

Aprender a compilar y ejecutar un programa en Fortran

Aprender a declarar variables de diferentes tipos y manipularlas en operaciones basicas


en C y Fortran

Operaciones de entrada y salida en Fortran

NOTA: Todos los programas deben ir comentados y con el nombre del autor.

1. Incremento y decremento: Para el siguiente programa:

(a) Analice el programa y determine el valor que tendran las variables en cada paso
del programa.
(b) Edite, compile y ejecute el programa (programa9.c).
(c) Verifique si su deduccion fue correcta.
(d) Explique el por que de los resultados obtenidos.

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 26

#include <s t d i o . h>

i n t main ( v o i d )
{

int a ,b;
b = 3;
a = b++ + 6 ;
p r i n t f ( a = %d , b = %d \n , a , b ) ;

b = 3;
a = ++b + 6 ;
p r i n t f ( a = %d , b = %d \n , a , b ) ;

return 0 ;
}

2. Dibuje el diagrama de flujo para calcular la area de un triangulo y escriba el programa


en C correspondiente.
basealtura
area = 2

Los datos de base y altura los debe preguntar el programa.

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 27

3. Programa en Fortran: El siguiente programa es equivalente al programa1.c pero en


lenguaje de programacion Fortran

program programa1

print , Programacion b a s i c a

end program programa1

Para compilar y ejecutar el programa, ejecute los siguientes comandos:

gfortran programa1.f90 -o programa1.out


./programa1.out

Edite, compile y ejecute el programa 1 en Fortran. Que diferencias nota entre C y


Fortran? En Fortran cual es la instruccion equivalente a la instruccion printf de C ?

4. Variables en Fortran: El siguiente programa es equivalente al programa de la practica


2 pero en lenguaje de programacion Fortran

program programa2

real x , y
integer i

x = 1.23

i = x
y = i

print , x , i , y

end program programa2

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 28

Figura 3.1: Consola en Linux. Se muestra la forma de compilar y ejecutar el programa en


Fortran. Observe la salida del programa.

Verifique que el programa en Fortran que usted escribio sea similar al mostrado aqu.
Que diferencias nota entre C y Fortran respecto a la asignacion de valores a las variables
y a su funcionamiento? En Fortran cual es el tipo de dato equivalente al tipo float de
C?

5. Lectura de datos en Fortran: Edite, compile y ejecute el siguiente programa (pro-


grama3.f90):

program v a l o r e s

! Declaramos l a s v a r i a b l e s
i m p l i c i t none
l o g i c a l Bandera
integer i , j
real a , b , c
character ( 3 0 ) t e x t o

! Asignamos v a l o r e s a n u e s t r a s v a r i a b l e s
i =1

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 29

a = 2.5
b = a + i
c = a + a
Bandera = . false .
j = i 2
texto = E s t a s son l a s v a r i a b l e s :

! Desplegamos en p a n t a l l a l o s c o n t e n i d o s de l a s v a r i a b l e s
print , t e x t o
print , Bandera , i , j , a , b , c

end program v a l o r e s

Figura 3.2: Consola en Linux. Se muestra la forma de compilar y ejecutar el programa en


Fortran. Observe la salida del programa.

Funcionan las operaciones aritmeticas igual en C y Fortran? Como funciona el oper-


ador de division /, en Fortran? En C hay un tipo de dato equivalente al tipo logical
de Fortran ?

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 30

6. Entrada y salida en Fortran: En Fortran la entrada y salida de datos se realiza mediante


las funciones read(,) y write(,). Ambas funciones tienen dos argumentos, el primero
indica la unidad de entrada o salida, y el segundo indica el formato en el que estan
los datos. La version mas simple es:

read(*,*)
write(*,*)

Aqu el primer * indica la entrada o salida estandar (teclado o pantalla) y el segundo


* indica formato libre. La instruccion write(*,*) puede ser substituida por print *
seguido de una coma.
Edite, compile y ejecute el siguiente programa (programa4.f90):

program programa4
! Declarar v a r i a b l e s .
i m p l i c i t none
character ( 2 0 ) nombre

! Pregun ta r por e l nombre d e l u s u a r i o .


print
write ( , ) Cua l e s tu nombre ?
print

! Leer r e s p u e s t a d e s d e e l t e c l a d o .
read ( , ) nombre

! U t i l i z a r l a v a r i a b l e para r e f e r i r n o s a l u s u a r i o por su nombre .


print
write ( , ) Hola , nombre , Como e s t a s ?
print

end program programa4

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 31

Que observa en la salida del programa? Que sucede si el nombre es mayor de 20


caracteres? Que indica la instruccion implicit none?

7. Entrada y salida con formato. Para indicar el formato de lectura en un programa en


Fortran se utiliza una plantilla de formato, ejemplo:
read ( , ( i 4 ) ) m
read ( , 1 0 0 ) i
100 format ( i 4 )
read ( , 1 0 0 ) n

En todos los casos se indica al codigo que debe leer un n umero entero de maximo 4
digitos de longitud i4. La ventaja del segundo metodo es que se puede usar el mismo
formato o plantilla de formato en mas de una instruccion, ejemplo:
read ( , ( i 4 ) ) m
read ( , 1 0 0 ) i
100 format ( i 4 )
read ( , 1 0 0 ) n
read ( , 1 0 0 ) k
read ( , 1 0 0 ) j

El siguiente programa ejemplifica la lectura de datos con formato.

program programa5
! Declarar v a r i a b l e s .
i m p l i c i t none

integer i ,m, n
real a , b

! Se S o l i c i t a n l o s d a t o s .
print , t e c l e a e l v a l o r de m ( e n t e r o ) :
read ( , ( i 4 ) ) m
print , ahora t e c l e a e l v a l o r de i :
read ( , 1 0 0 ) i
100 format ( i 4 )

DCI - DIQEB, Universidad de Guanajuato


3.3 Ejercicios 32

print , ahora t e c l e a e l v a l o r de n :
read ( , 1 0 0 ) n
print , ahora t e c l e a e l v a l o r de un r e a l :
read ( , 1 0 1 ) a
101 format ( f 3 . 2 )
b = a m

! Desplegar l a s v a r i a b l e s .
print
write ( , ) m = , m, i = , i
write ( , ) a = , a , b = a m , b
print

end program programa5

Es posible usar una plantilla de formato para desplegar una variable? Si es as, escriba
un programa que ejemplifique la salida con formato en fortran. En C como especifi-
camos el numero de decimales que deseamos se despliegue en pantalla, cuando es una
variable de tipo float? Escriba un programa en C que ejemplifique la entrada y salida
con formato.

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 4

Secuencias de Control

4.1 Introducci
on
Esta practica introduce al estudiante al uso de las secuencias de control en lenguaje C y
Lenguaje Fortran. Al termino de la practica el estudiante habra comprendido las secuencias
de control y sera capaz de utilizarlas para la resolucion de problemas mediante alg
un lenguaje
de programacion.

4.2 Secuencias de Control


Las secuencias de control o secuencias de decision permiten tomar un curso de accion deter-
minado por una condicion dada. Para evaluar la condicion los lenguajes de programacion
utilizan operadores relacionales y logicos. En las siguientes secciones se comentara breve-
mente los operadores y las diferentes secuencias de control.

4.2.1 Operadores relacionales y l


ogicos
Los operadores pueden dividirse en las clases siguientes: aritmeticos, relacionales y logicos.
Los primeros se revisaron en las practicas anteriores y son u
tiles en la manipulacion de opera-
ciones aritmeticas. Los operadores relacionales y logicos se utilizan para producir resultados
VERDADERO / FALSO y frecuentemente se utilizan juntos. En C cualquier n umero dis-
tinto de cerose considera VERDAD. Sin embargo, una expresion relacional o logica produce
el n
umero 1 para VERDAD y el 0 (cero) para FALSO. Fortran tiene un tipo de dato logico
(.logic.) para la manipulacion de resultados relacionales o logicos. A continuacion se listan
los operadores relacionales y logicos para ambos lenguajes de programacion.

DCI - DIQEB, Universidad de Guanajuato


4.2 Secuencias de Control 34

Tabla 4.1: Operadores relacionales y logicos en C y Fortran


C Fortran Fortran Descripcion
> > .GT. Mayor que
>= >= .GE. Mayor o igual que
< < .LT. Menor que
<= <= .LE. Menor o igual que
== == .EQ. Igual que
!= /= .NE. Diferente que
&& .AND. AND logico
|| .OR. OR logico
! .NOT. NOT logico

4.2.2 Condicional Si-Entonces


La secuencia de control Si-Entonces nos ayuda para realizar un proceso dependiendo de una
condicion o pregunta (ver figura 4.1 y tabla 4.2).

NO
Condicin

SI

Proceso

Figura 4.1: Diagrama de flujo de la secuencia de control si-entonces

DCI - DIQEB, Universidad de Guanajuato


4.2 Secuencias de Control 35

Tabla 4.2: Expresiones en lenguaje de programacion para la secuencia de control si-entonces

C Fortran

i f ( c o n d i c i o n ) i f ( c o n d i c i o n ) then
{
proceso proceso
}
endif

4.2.3 Condicional Si-Entonces-sino


Nos ayuda para realizar uno u otro proceso dependiendo de una condicion o pregunta (ver
figura 4.2 y tabla 4.3).

SI NO
Condicin

Proceso Proceso

Figura 4.2: Diagrama de flujo de la secuencia de control si-entonces

DCI - DIQEB, Universidad de Guanajuato


4.2 Secuencias de Control 36

Tabla 4.3: Expresiones en lenguaje de programacion para la secuencia de control si-entonces-


sino

C Fortran

i f ( c o n d i c i o n ) i f ( c o n d i c i o n ) then
{ proceso 1
proceso 1 else
} proceso 2
else endif
{
proceso 2
}

Fortran contempla la forma else-if then. Los siguientes programas son equivalentes:

i f ( c o n d i c i o n 1 ) then
proceso1
e l s e i f ( c o n d i c i o n 2 ) then
proceso2
endif

i f ( c o n d i c i o n 1 ) then
proceso1
else
i f ( c o n d i c i o n 2 ) then
proceso2
endif
endif

DCI - DIQEB, Universidad de Guanajuato


4.2 Secuencias de Control 37

En Fortran cada secuencia IF puede tener asociado un nombre. El compilador verificara


que la secuencia de ifs anidados sea consistente!

uno : i f ( c o n d i c i o n 1 ) then
dos : i f ( c o n d i c i o n 2 ) then
tres : i f ( c o n d i c i o n 3 ) then
cuatro : i f ( c o n d i c i o n 4 ) then
Proceso4
endif c u a t r o
else t r e s
p r o c e s o 5 ! cuando no s e cumplio l a c o n d i c i
on 3
endif t r e s
endif dos
endif uno

4.2.4 Selecci
on de caso
Nos ayuda para realizar un proceso de muchos dependiendo de una condicion o pregunta (ver
figura 4.3)

Proceso Proceso Proceso

Figura 4.3: Diagrama de flujo de la secuencia de seleccion de caso

DCI - DIQEB, Universidad de Guanajuato


4.2 Secuencias de Control 38

C Fortran

switch ( o p c i o n ) s e l e c t case ( o p c i o n )
{ case ( A )
case A : P r o c e s o 1 ; proceso 1
break ; case ( B )
case B : P r o c e s o 2 ; proceso 2
break ; case ( C )
case C : P r o c e s o 3 ; proceso 3
break ; case default
default : P r o c e s o n ; proceso n
break ; end s e l e c t
}

DCI - DIQEB, Universidad de Guanajuato


4.3 Ejercicios 39

4.3 Ejercicios
Los objetivo de esta sesion son:

Solucionar dudas sobre sesiones anteriores

Comprender como funcionan las secuencias de control en C y Fortran

NOTA: Todos los programas deben ir comentados y con el nombre del autor.

1. Operaciones aritmeticas: Explique el proposito de cada una de las siguientes expresiones

(a) a b
(b) a (b + c)
(c) a >= b
(d) (a%5) == b
(e) d = a (b + c)

2. Manipulacion de variables: Un programa en C contiene las siguientes declaraciones

i n t i =8, j =5, k ;
f l o a t x = 0 . 0 0 5 , y = 0.01 , z ;
char a , b , c = c , d = d ;

Determine el valor de cada una de las siguientes expresiones:

(a) z = (x + y)
(b) a = b = d
(c) i = j = 1.1
(d) i+ = 2
(e) i% = j
(f) k = (j == 5)?i : j
(g) z = (x >= 0)?x : 0

DCI - DIQEB, Universidad de Guanajuato


4.3 Ejercicios 40

3. Escriba un algoritmo con ayuda de un diagrama de flujo que sea capaz de intercambiar
el contenido de tres variables. El algoritmo debe funcionar de tal forma que: dadas las
variables A, B C, el valor de B se almacene en A, El valor de C en B y el valor de A
en C. Los valores de las tres variables deben ser introducidas por el usuario, y deben
ser desplegadas en pantalla, posteriormente hacer el intercambio y volver a mostrar los
valores de las variables.

4. Escriba un programa en Fortran que realice el algoritmo del inciso anterior

5. El diagrama de flujo de la figura 1 describe el algoritmo para obtener el promedio de 5


numeros. Con ayuda del diagram de flujo, escriba un programa en Fortran que realice
el algoritmo. Considere que los datos son enteros y el promedio de tipo real o punto
flotante.

Inicio

C1, C2,
C3, C4,
C5

Prom = (C1 + C2 +
C3 + C4 + C5) /5

Prom

Fin

Figura 4.4: Promedio de 5 n


umeros. Diagrama de flujo para la lectura de cinco n
umeros y
estimacion de su promedio

6. Escriba un algoritmo con ayuda de un diagrama de flujo que teniendo como entrada
la calificacion de un alumno(a) en un examen despliegue un mensaje en pantalla. El
mensaje debe decir aprobado(a) si la calificacion es mayor o igual a 8.00 y debe decir
No aprobado si la calificacion es menor a 8.0.

7. Escriba un programa en C y uno en Fortran que realice el algoritmo del inciso anterior

DCI - DIQEB, Universidad de Guanajuato


4.3 Ejercicios 41

8. Escriba un algoritmo con ayuda de un diagrama de flujo que dado como dato el sueldo
de un trabajador, le aplique un aumento del 17% si su sueldo es inferior a 1000 y 12%
en caso contrario. El algoritmo tambien debe imprimir el nuevo sueldo del trabajador.

9. Escriba un programa en C y uno en Fortran que realice el algoritmo del inciso anterior

10. Escriba un algoritmo con ayuda de un diagrama de flujo que dado tres n umeros, encuen-
tre cual es el menor y cual es el mayor. El algoritmo debe imprimir los valores en orden
creciente. Considere que los valores son introducidos por el usuario y almacenados en
tres variables de tipo entero.

11. Escriba un programa en Fortran y uno en C que realice el algoritmo del inciso anterior.
Compare el codigo y comente las diferencias. Cual lenguaje le parece mas adecuado
para este algoritmo (detalle su respuesta)?

12. En las olimpiadas pasadas el tiempo que realizan los participantes en la competencia
de velocidad en pista se mide en minutos, segundos y centesimas. La distancia que
recorren se expresa en metros. Escriba un algoritmo con ayuda de un diagrama de flujo
que calcule la velocidad de los participantes en kilometros por hora. Considere que
el usuario proporcionara al algoritmo la distancia en metros y el tiempo en minutos,
segundos y centesimas de segundo.

13. Escriba un programa en Fortran y uno en C que realice el algoritmo del inciso anterior.
Compare el codigo y comente las diferencias. Cual lenguaje le parece mas adecuado
para este algoritmo (detalle su respuesta)?

14. El siguiente programa en C utiliza la secuencia switch para imprimir un mensaje de


acuerdo al valor entero que teclee el usuario. Tan solo observando el listado, Cual es
la salida del programa para el numero 3 y cual para el n
umero 12?

DCI - DIQEB, Universidad de Guanajuato


4.3 Ejercicios 42

#include <s t d i o . h>


i n t main ( v o i d )
{
int i ;

p r i n t f ( T e c l e a un e n t e r o : ) ;
s c a n f ( %d ,& i ) ;

switch ( i )
{
case 4 : p r i n t f ( \n El numero e s c u a t r o \n ) ;
case 5 : p r i n t f ( \n El numero e s c i n c o \n ) ;
case 3 : p r i n t f ( \n El numero e s t r e s \n ) ;
case 2 : p r i n t f ( \n El numero e s dos \n ) ;
case 1 : p r i n t f ( \n El numero e s uno\n ) ;
default : p r i n t f ( \n El numero e s d e s c o n o c i d o ! \ n ) ;

return ( 0 ) ;
}

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 5

Secuencias de Repetici
on

5.1 Introducci
on
Esta practica introduce al estudiante al uso de las secuencias de repeticion en lenguaje C y
Lenguaje Fortran. Al termino de la practica el estudiante habra comprendido las secuencias
de repeticion y sera capaz de utilizarlas para la resolucion de problemas mediante alg un
lenguaje de programacion.

5.2 Secuencias de repetici


on
Las secuencias de repeticion, conocidas tambien como secuencias iterativas, permiten que un
segmento de programa se ejecute n veces hasta que se cumpla una condicion dada. Esta clase
se secuencias explota la velocidad de la computadora y ayudan a realizar procesos que se
repiten.

Nos ayuda para realizar un proceso de forma repetitiva

Iteracion: Un bloque de codigo es repetido hasta que una condicion se cumpla. La


condicion puede ser evaluada antes o despues de que se ejecute el codigo

Se utilizan las secuencias de repeticion: While, For y DO

No se utiliza la sentencia goto en ninguno de los casos

5.2.1 for - do
Las secuencias de repeticion for y do permiten que un segmento determinado de un pro-
grama se ejecute n veces. Esta secuencia de repeticion tambien se conoce como secuencia de

DCI - DIQEB, Universidad de Guanajuato


5.2 Secuencias de repetici
on 44

repeticion indizada, ya que utiliza un contador para el control del ciclo. El diagrama de flujo
de la secuencia de repeticion for puede observarse en la figura 5.2.

Iteraci
on indizada: Un bloque de codigo es ejecutado repetidamente un n
umero
determinado de veces.

El control se realiza mediante el uso de un ndice o contador.

Esta secuencia de repeticion consta de tres partes , una inicializacion del contador,
una condicion de terminacion y un incremento o decremento del contador.

Se utiliza la instruccion for en C o DO en Fortran

while y do-while tambien se puede tambien utilizar como una secuencia de repeticion
indizada si se incluyen las tres partes por separado.

Inicializacin

NO
Condicin

SI

Proceso

Incremento

Figura 5.1: Diagrama de flujo de una secuencia de repeticion for o do

Esta secuencia de repeticion consta de tres partes, una inicializaci


on del contador,
una condicion de terminacion y un incremento o decremento del contador.

DCI - DIQEB, Universidad de Guanajuato


5.2 Secuencias de repetici
on 45

Se utiliza la instruccion for en C o DO en Fortran

La sintaxis en C y Fortran es como sigue:


C

for ( i n i c i a l i z a c i o n ; c o n d i c i o n ; i n c r e m e n t o )
{

proceso

Fortran

do i n i c i a l i z a c i o n , lm i t e , i n c r e m e n t o

proceso

enddo
Ejemplo de un ciclo que se repite 12 veces. Observe que si el proceso es una sola sentencia,
entonces no es necesario las llaves.
C

for ( k=1 ; k <= 12 ; k++)

p r i n t f ( El v a l o r de k e s : %d , k ) ;

Fortran

do k=1, 1 2 , 1

p r i n t , El v a l o r de K e s : ,k

enddo

DCI - DIQEB, Universidad de Guanajuato


5.2 Secuencias de repetici
on 46

5.2.2 while - do
Las secuencias de repeticion while- do y do-while son secuencias que permiten procesar un
segmento de codigo o conjunto sentencias de forma iterativa. A diferencia de la secuencia
for no requiere de un ndice o contador. Los diagramas de fujo correspondientes a estas
secuencias de repeticion se pueden observar en la figura ??. La sintaxis en C y Fortran es
como sigue:
Condicion al inicio de la secuencia (while):

C
Fortran
while ( c o n d i c i o n )
{ do while ( c o n d i c i o n )
proceso ; proceso
} enddo

Condicion al final de la secuencia (do-while):

C
Fortran
do
{
Nota :
F o rt r a n no p r o v e e una o p c i o n
proceso ;
para v e r i f i c a r l a c o n d i c i o n
} while ( c o n d i c i o n ) ; a l f i n a l de l a s e c u e n c i a !

DCI - DIQEB, Universidad de Guanajuato


5.2 Secuencias de repetici
on 47

NO
Condicin
Proceso

SI

Proceso
SI
Condicin

NO

(a) (b)

Figura 5.2: Diagrama de flujo de una secuencia de repeticion while y do-while. Observe
que la diferencia es el momento en que se realiza la condicion. Evidentemente el valor de la
condicion debe alterarse dentro del alcance de la secuencia, de lo contrario la proposicion se
ejecutara indefinidamente.

DCI - DIQEB, Universidad de Guanajuato


5.2 Secuencias de repetici
on 48

5.2.3 Ciclos infinitos


Ciclos infinitos son aquellos bloques de codigo que utilizan secuencias de repeticion que se
repiten indefinidamente.
C

for ( ; ; )

p r i n t f ( a l i n f i n i t o y mas a l l a ! . . . . . );

Fortran

do

p r i n t , a l i n f i n i t o y mas a l l a ! . . .

endo
Para terminar un ciclo infinito ...
Fortran

do
! ciclo infinito
p r i n t , T e c l e a un numero e n t r e 1 y 10
read , i
i f ( i >=1 .AND. i <=10) EXIT
! la condicion fue f a l s a
p r i n t , Entre 1 y 10 !!

endo

while ( 1 )
{
p r i n t f ( T e c l e a un numero e n t r e 1 y 10 ) ;
s c a n f ( %d ,& i ) ;
i f ( i >0 && i <=10)

DCI - DIQEB, Universidad de Guanajuato


5.3 Ejercicios 49

break ;

p r i n t f ( Entre 1 y 10 !! );
}

5.3 Ejercicios
Los objetivo de esta sesion son:

1. Solucionar dudas sobre sesiones anteriores

2. Comprender como funcionan los arreglos y su relacion con las secuencias de repeticion

NOTA: Todos los programas deben ir comentados y con el nombre del autor.

Ejercicios

1. Evaluacion y terminacion de un ciclo for: Que diferencia existe en el comportamiento


del ciclo for cuando se altera la condicion dentro del cuerpo del ciclo?

(C)
n = 10;
for ( k=1; k <=n ; k++)
{
n=20;
p r i n t f ( El v a l o r de k e s : %d , k ) ;
}

(Fortran)
n = 10
do k=1,n
n=20
p r i n t , El v a l o r de K e s : ,k
enddo

DCI - DIQEB, Universidad de Guanajuato


5.3 Ejercicios 50

2. Ciclos: En el siguiente programa el primer ciclo funciona, pero el segundo no. Por
que? Que modificara para que funcione?

#include <s t d i o . h>


int main ( void )
{
short int i ;
signed char ch ;

for ( i = 0 x80 ; i != 0 ; i = ( i >> 1 ) ) {


p r i n t f ( i e s %x (%d ) \n , i , i ) ;
}

for ( ch = 0 x80 ; ch != 0 ; ch = ( ch >> 1 ) ) {


p r i n t f ( ch e s %x (%d )\ n , ch , ch ) ;
}
return ( 0 ) ;
}

3. Escriba un programa en C y uno en Fortran que a partir de un numero N, dado por el


usuario, despliegue la suma de los numero impares y la multiplicacion de los numero
pares de la secuencia de 1 a N. El numero N tiene que ser mayor que 0 y menor que
20. De otra forma el programa debe indicar el error con el mensaje Por favor, teclea
un numero entero entre 1 y 20. y volver a pedir el dato (N). Por ejemplo si el N es 5
entonces la salida debe ser:
T e c l e a N: 5
La suma de l o s impares e s : 9
El prod ucto de l o s p a r e s e s : 8

Como ayuda recuerde que:

for ( i n i c i a l i z a c i o n ; c o n d i c i o n ; i n c r e m e n t o )
{

DCI - DIQEB, Universidad de Guanajuato


5.3 Ejercicios 51

proceso
}

do i n i c i a l i z a c i o n , c o n d i c i o n , i n c r e m e n t o
proceso
end do

4. Escriba un programa en C o Fortran, que muestre una tabla de multiplicar el pro-


grama:

(a) Debe utilizar secuencias de repeticion


(b) Preguntar un n
umero del 1 al 10
(c) Si el n
umero no cumple con la condicion anterior, contin
ue preguntando por un
n
umero valido
(d) Una vez que se obtenga un n
umero valido, imprimir la tabla de multiplicar corre-
spondiente a ese n
umero
(e) La tabla de multiplicar debe contener las 10 primeras multiplicaciones (1 al 10) y
(f) la salida debe ser similar a:

T e c l e a un n
u mero d e l 1 a l 10 : 1

La t a b l a de m u l t i p l i c a r de 1 e s :

1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9

DCI - DIQEB, Universidad de Guanajuato


5.3 Ejercicios 52

1 x 10 = 10

G r a c i a s por u s a r e s t e programa .

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 6

Arreglos y Estructuras de Datos

6.1 Introducci
on
Esta practica introduce al estudiante al uso de las secuencias de arreglos (vectores y matrices)
y estructuras de datos en lenguaje C y Lenguaje Fortran. Al termino de la practica el
estudiante habra comprendido el manejo de arreglos y estructuras de datos.

6.2 Arreglos
Un arreglo consta de un conjunto ordenado de componentes. Se puede hacer referencia
(tener acceso) a un componente de un arreglo mediante uno o mas ndices, dependiendo de
la dimension del arreglo que haya sido declarada (ver figura 6.1).

Los arreglos son un conjunto de datos del mismo tipo que tienen un ndice para distin-
guirlos

La notacion xi es equivalente en C a: x[i]. donde i es el ndice de la variable x

El conjunto de datos se almacena en espacios de memoria contigua.

Los indices en C comienzan en cero (0)

Los indices en Fortran generalmente comienzan en uno (1), pero se puede especificar el
rango de los indices.

Los arreglos pueden ser n-dimensionales.

DCI - DIQEB, Universidad de Guanajuato


6.2 Arreglos 54

x[0] x[1] x[2]


15 19 6
Figura 6.1: Representacion grafica de un arreglo. La figura muestra la representacion grafica
del vector x. En la parte superior se tiene la forma de hacer referencia a un componente o
elemento particular del vector. Por ejemplo x[1] significa que se hace referencia al elemento
2 del vector x (ya que en C los ndices comienzan en cero). En la parte inferior se muestra el
contenido de cada elemento, as, el contenido del componente 2 del vector x es 19.

6.2.1 Declaraci
on de arreglos

f l o a t A[ 2 0 ] ;
float B[ 5 ] = {0.0 , 2.0 , 1.5 , 1.0 , 0.5}
int a [ 1 0 ] = { 2 } ;

Fortran

r e a l , dimension ( 3 ) : : x
r e a l , dimension ( 4 , 5 ) : : z

r e a l , dimension ( 0 : 8 ) , A1
r e a l , dimension ( 2 : 5 ) , A2

r e a l : : xx ( 3 ) , z z ( 4 , 5 )

6.2.2 Cadena de caracteres


Cadena o string se utiliza para manipular smbolos o caracteres alfanumericos

Una Cadena es basicamente un arreglo de caracteres o del tipo char


La terminacion de la cadena se debe especificar con un caracter nulo \0
Por lo que hay que considerar un espacio mas!

Las cadenas no se manipulan igual que los enteros o flotantes

Ejemplos del uso de cadenas pueden observarse en las figura 6.2, 6.3 y 6.4. Las funciones
para manejo de cadenas se encuentran definidas en string.h (ver tabla 6.1).

DCI - DIQEB, Universidad de Guanajuato


6.2 Arreglos 55

Tabla 6.1: Algunas de las funciones para manipulacion de cadenas de caracteres en C (incluir
string.h)
Funcion Descripcion
char *strcpy(const char Copia la cadena de caracteres apuntada
*dest, const char *orig) por orig al vector apuntado por dest.
int strcmp(const char *s1, Compara las dos cadenas de caracteres s1
const char *s2) y s2. Devuelve un entero menor, igual
o mayor que cero si se encuentra que s1
es, respectivamente, menor que, igual a, o
mayor que s2.
int strlen(const char *s) Calcula la longitud de la cadena de carac-
teres.
char *strncat(char *s1, Agrega n caracteres de s2 a s1
const char *s2, size t n)

#i n c l u d e <s t d i o . h>

int main ( void ) {

char cadena [ 5 ] = h o l a ;
char cadena2 [ 5 ] = { h , o , l , a , \0 } ;
char nombre [ 1 5 ] , a p e l l i d o s [ 3 0 ] ;

p r i n t f ( I n t r o d u c e tu nombre : ) ;
s c a n f ( %s , nombre ) ;
p r i n t f ( Introduce tus a p e l l i d o s : ) ;
s c a n f ( %s , a p e l l i d o s ) ;
p r i n t f ( Tu Nombre e s %s %s \n , nombre , a p e l l i d o s ) ;
}

Figura 6.2: Ejemplo 1 de declaracion y manipulacion de una cadena de caracteres en lenguaje


C.

DCI - DIQEB, Universidad de Guanajuato


6.2 Arreglos 56

#i n c l u d e <s t d i o . h>

int main ( void ) {

char nombre [ 1 5 ] , a p e l l i d o s [ 3 0 ] , nombrecompleto [ 5 0 ] ;

nombre = Ana Mara ; \ I n c o r r e c t o \


a p e l l i d o s = go mez go mez ; \ I n c o r r e c t o \
nombrecompleto = nombre + a p e l l i d o s ; \ I n c o r r e c t o \

Figura 6.3: Ejemplo 2 de declaracion y manipulacion de una cadena de caracteres en lenguaje


C. Los elementos de la cadena deben manipularse de forma individual

char ch ;
while ( ch=g e t c h a r ( ) , ch>=0 )
// s i e s menor que c e r o e n t o n c e s f i n de d a t o s

...

char ch ;
while ( s c a n f ( %c , &ch ) == 1 )
// s c a n f r e g r e s a c e r o s i e l c a r a c t e r e s n u l o .

Figura 6.4: Ejemplo 3 de declaracion y manipulacion de una cadena de caracteres en lenguaje


C. ejemplo de getchar y scanf para leer mientras exista un dato

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 57

6.3 Estructura de Datos


6.3.1 struct
Una estructura de datos es:

Conjunto de N elementos que estan agrupados por medio de un u


nico nombre.

Pueden ser de distinto tipo


Es un tipo definido dentro del programa
Los elementos o miembros de la estructura pueden a su vez ser otra estructura

double o
_ tip
tro
int

o
float
cha
r ...

Figura 6.5: Representacion conceptual de una estructura de datos

struct

Definicion y declaracion en C (1)

struct Nombre
{
t i p o 1 Campo1 ;
t i p o 2 Campo2 ;
...
tipoN CampoN ;
} Alumno ;
Alumno es una variable del tipo Nombre
Definicion (2)

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 58

struct Nombre
{
t i p o 1 Campo1 ;
t i p o 2 Campo2 ;
...
tipoN CampoN ;
};
Declaracion

struct Nombre Var1 ;

struct t r a b a j a d o r
{
char nombre [ 2 0 ] ;
char a p e l l i d o s [ 4 0 ] ;
int edad ;
};

struct t r a b a j a d o r Academicos [ 2 0 ] ;
struct t r a b a j a d o r A d m i n i s t r a t i v o s [ 2 0 ] ;

Figura 6.6: Ejemplo de arreglos de estructuras de datos en C. La estructura contiene arreglos


y se declaran arreglos de la estructura.

6.3.2 type
En Fortran se utiliza la palabra reservada type para declarar una estructura.
Ejemplo:
type ele mento
c h a r a c t e r : : s i m b o l o 2
i n t e g e r : : numero atomico
r e a l : : peso atomico
end type elemento
...

type ( elemento ) : : h i d r og e n o , oxygeno

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 59

donde hidrogeno es una variable del tipo elemento


Acceso a los elementos de una estructura de datos.

Se realiza indicando nombre de la variable tipo estructura y el elemento individual


separados por un porciento %
VariableEstructura%ElementoEstructura

El procesamiento de una estructura solo se puede hacer elemento por elemento.

type ele mento


c h a r a c t e r : : s i m b o l o 2
i n t e g e r : : numero atomico
r e a l : : peso atomico
end type elemento

...
type ( elemento ) : : h i d r og e n o , oxygeno
type ( elemento ) : : &carbon =( C , 1 2 , 1 2 . 0 )
real : : peso del agua

p e s o d e l a g u a = 2 . 0 h i d r o g e n o%p e s o a t o m i c o + oxygeno%p e s o a t o m i c o

Figura 6.7: Ejemplo 1 de declaracion y manipulacion de una estructura en Fortran

6.3.3 union
Conjunto de N elementos que estan agrupados por medio de un u
nico nombre.

Pueden ser de distinto tipo


Es un tipo definido dentro del programa
Los elementos o miembros de la estructura pueden a su vez ser otra union
Se utiliza la palabra reservada union para declarar una union
Entonces, Cual es la diferencia entre una estructura y una union?

La diferencia entre las dos es que en una estructura, los miembros ocupan diferentes
areas de la memoria, pero en una union, los miembros ocupan la misma area de memo-
ria.

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 60

type coordenada
real : : x
real : : y
end type coordenada

type l i n e a
coordenada : : i n i c i o , f i n
real : : y
end type l i n e a

type ( coordenada ) : : A, B
type ( l i n e a ) : : &d=l i n e a ( coordenada ( 0 , 0 ) , coordenada ( 1 0 , 2 0 ) )

r ead ,A%x ,A%y


r ead ,B%x , B%y

Figura 6.8: Ejemplo 2 de declaracion y manipulacion de una estructura en Fortran

Los miembros pueden ser de distinto tipo


El tama
no de una union es el de su miembro de mayor tama
no
Es una variable la cual podra guardar (en momentos diferentes) objetos de difer-
entes tama
nos y tipos

Cuando dos o mas variables comparten la misma memoria, entonces se define una union.
ejemplo:
union tom
{
char ch ;
int x ;
} t;

El codigo anterior declara una union que se vera as en memoria.

X
byte 1 byte 2

ch

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 61

Definicion y declaracion(1)

union
{
int i ;
float f ;
} VariableU ;
variableU es una union de dos miembros (i, f)
Definicion (2)

union Nombre
{
t i p o 1 Campo1 ;
t i p o 2 Campo2 ;
...
tipoN CampoN ;
};
Declaracion

union Nombre VarU ;

El acceso es de forma similar a la de una estructura

Se realiza indicando nombre de la variable tipo union y el elemento individual


separados por un punto .
VariableUnion.ElementoUnion
Cuando se utilizan apuntadores (pointer), el separador es: >
VariableUnion->ElementoUnion

El procesamiento de una union solo se puede hacer elemento por elemento.

Recordar que los elementos ocupan la misma area de memoria. Del ejemplo anterior:
Como variableU.i y variableU.f ocupan la misma area de memoria, modificar uno
modifica el valor del otro, algunas veces de maneras impredecibles.

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 62

union word byte / Se d e c l a r a l a union w o r d b y t e /


{
unsigned short word ; / 2 b y t e s /
unsigned char byte [ 2 ] ; / 2 b y t e s /
};
/ El taman o de l a union e s de dos b y t e s /

union word byte wb ; / Se d e c l a r a una v a r i a b l e t i p o union /

wb . word = 0 x 0 f 0 a ; / Se a s i g n a un v a l o r a e s t a v a r i a b l e /

/ Por medio d e l o t r o miembro s e a c c e s a e l v a l o r a s i g n a d o /

p r i n t f ( byte b a j o : %d\n , wb . byte [ 0 ] ) ; / 10 /

p r i n t f ( byte a l t o : %d\n , wb . byte [ 1 ] ) ; / 15 /

Figura 6.9: Ejemplo de declaracion y manipulacion de una union en lenguaje C.

6.3.4 enum
Es un conjunto de constantes enteras con nombre.

En su declaracion se especifica todos los valores legales que puede tener una variable
del tipo enum

Se declara de forma similar a la de una estructura:

enum nombre enumeracion { l i s t a d e e n u m e r a c i o n } l i s t a d e v a r i a b l e s ;

Los valores de una enumeracion se inician con 0 a menos que se indique otro valor, y
se incrementan en 1.

Los identificadores en una enumeracion deben ser u


nicos. Los nombres de las constantes
no pueden ser modificados en el programa.

6.3.5 typedef
Typedef: Nuevos tipos de datos

DCI - DIQEB, Universidad de Guanajuato


6.3 Estructura de Datos 63

enum ComunidadDCI { a d m i n i s t r a t i v o , e s t u d i a n t e , p r o f e s o r } ;

...
enum ComunidadDCI p e r s o n a ;
for ( i=a d m i n i s t r a t i v o ; i<=p r o f e s o r ; i ++)
...

persona = administrativo ;
i f ( p e r s o n a == e s t u d i a n t e )
...

enum ComunidadDCI { a d m i n i s t r a t i v o =200 , e s t u d i a n t e , p r o f e s o r } ;

...

enum ComunidadDCI { a d m i n i s t r a t i v o , e s t u d i a n t e =200 , p r o f e s o r } ;

Figura 6.10: Ejemplo de declaracion y manipulacion de una enumeracion en lenguaje C.

Se puede dar un nombre nuevo a cualquier tipo de datos mediante typedef.

Es comun utilizarlo para dar un alias o sinonimo al nombre de la estructura, de esta


forma se evita el tener que poner struct NombreEstructura cada vez que se declare
una variable.

Sintaxis:

typedef struct
{
...
} NombreEstructura ;

...

NombreEstructura V a r i a b l e ;

DCI - DIQEB, Universidad de Guanajuato


6.4 Ejercicios 64

typedef int e n t e r o ;

typedef struct
{
char nombre [ 3 0 ] ;
char c a l l e [ 4 0 ] ;
char ciu dad [ 2 0 ] ;
char e s t a d o [ 3 ] ;
unsigned int c o d i g o ;
} sdireccion ;

sdireccion info direccion ;


s d i r e c c i o n Agenda [ 1 0 0 ] ;

e n t e r o a , b=3;

Figura 6.11: Ejemplo de declaracion y manipulacion de una struct en lenguaje C utilizando


typedef.

6.4 Ejercicios
Los objetivo de esta sesion son:

1. Solucionar dudas sobre sesiones anteriores

2. Comprender como funcionan los arreglos y su relacion con las secuencias de repeticion

3. Comprender como funcionan las estructuras

NOTA: Todos los programas deben ir comentados y con el nombre del autor. El reporte
debe incluir una explicacion del comportamiento del programa as como comentarios sobre
lo aprendido.

Ejercicios

1. El siguiente programa en Fortran ejemplifica el uso de arreglos (declaracion y manipu-


lacion).

(a) Comente el programa


(b) Modifique el programa anterior para que imprima la matriz a, b y c en una forma
mas entendible (filas y renglones)

DCI - DIQEB, Universidad de Guanajuato


6.4 Ejercicios 65

(c) Indique cuales son las diferencias en el uso de arreglos y matrices con respecto al
lenguaje C
(d) Investigue/Verifique si en Fortran se puede obtener la matriz inversa con una sola
instruccion.

program o p e r a c i o n e s
r e a l : : a ( 3 , 3 ) , b ( 3 , 3 ) , c ( 3 , 3 ) , v1 ( 3 ) , v2 ( 3 ) , t =3. , c1 , c2
integer : : i , j

do i =1 ,3
do j =1 ,3
a ( i , j )=( i+j )
end do
v1 ( i )= i 6 . 5
end do
b=t a ! producto elemento a elemento
c=a+b
c=c
b=c a
v2=s i n ( v1 )
v1=t v1+5v2 ! combinacion l i n e a l
print ,a , b , c
end program o p e r a c i o n e s

2. Escriba un programa en C que lea una cadena de caracteres en min usculas y la de-
spliegue en Mayusculas sin usar alguna funcion de la libreria string.h (tip: ver tabla
ASCII)

3. Escribir un programa que use el tipo enumeracion para mostrar el nombre de un mes,
su predecesor y su sucesor. El mes se ingresara desde el teclado dando un n
umero entre
1 y 12 (verificar que el n
umero se encuentre en el rango permisible.

4. Ciclos y arreglos: Suponga que el arreglo a es declarado como int a[99]. cual es el
contenido del arreglo a despues de las siguientes instrucciones?

DCI - DIQEB, Universidad de Guanajuato


6.4 Ejercicios 66

for ( i = 0 ; i < 9 9 ; i ++) a [ i ]= 98 i ;


for ( i = 0 ; i < 9 9 ; i ++) a [ i ]= a [ a [ i ] ] ;

5. Contando n
umeros: Escriba un programa en C o Fortran que (programa15):

(a) El programa debe utilizar secuencias de repeticion


(b) El programa debe utilizar arreglos
(c) Pregunte un n
umero del 1 al 20
(d) Si el n
umero no cumple con la condicion anterior, contin
ue preguntando por un
n
umero valido
(e) Una vez que se obtenga un numero valido, solicite al usuario tantos n
umeros como
haya indicado en el primer numero.
(f) Almacene los n
umeros en un arreglo
(g) Cuente cuantos n
umeros del arreglo son menores a 10 y cuantos mayores a 100
(h) Despliegue en pantalla el resultado de la operacion.
(i) Posteriormente pregunte al usuario por un numero.
(j) El programa debe buscar si el n
umero solicitado se encuentra en el arreglo de
numeros
(k) Si el n
umero se encuentra en el arreglo desplegar la posicion en la que se encuentra
(ejemplo: El numero se encuentra en la posici on 3)
(l) Si el n
umero no se encuentra en el arreglo indicarlo con un mensaje (ejemplo: El
n
umero no se encuentra en la lista)

6. Escriba un program en Fortran que lea una matriz de 5 renglones y 5 columnas de


valores enteros. Una vez leda la matriz el programa debe desplegar la matriz en forma
ordenada y debe desplegar un men u para realizar las siguientes operaciones:

1. Mnimo y maximo de la matriz


2. Buscar un n
umero
3. Promedio de los valores de la matriz
4. Promedio por renglones
5. Promedio por columnas

DCI - DIQEB, Universidad de Guanajuato


6.4 Ejercicios 67

6. Elementos mayores al promedio


7. Elementos menores al promedio
8. Salir del programa

El programa debe regresar al men u despues de realizar la operacion seleccionada (ex-


cepto cuando se selecciona - salir del programa-, aqu el programa finaliza)
En la opcion numero dos, el programa debe preguntar al usuario por el n
umero a buscar.
En las opciones 1, 2, 6 y 7 el programa debe indicar la posicion del elemento(s), as
como el valor del elemento (ejemplo: El numero 80 se encuentra en la posicion a(2,3),
Los elementos mayores al promedio son: a(1,1) = 100, a(3,2) = 300, etc. )

7. Dibuje un diagrama de flujo que lea dos matrices del mismo tamano (numero de ren-
glones y columnas iguales) y efect
ue el producto de las mismas.
Recuerde que si A, B y C son matrices, donde sus elementos son ai,j , bi,j yci,j entonces
el producto de las matrices A y B (C = A B ), se puede definir como:

m
X
ci,j = ai,k bk,j i, j
k=1

8. Escriba un programa en C y uno en Fortran que lea un numero entero y despliegue


como salida la suma de cada uno de los dgitos que forman al n umero leido. Ejemplo:
si el n
umero de entrada es 2155, entonces la salida debe ser: 13 (2+1+5+5).

9. Escriba un programa en C que :

utilice una estructura (struct), para definir un punto en el plano cartesiano (X,Y)
(tipo float)
Pida al usuario dos puntos
Calcule y despliegue la distancia de un punto a otro
p
d(P1 , P2 ) = (x2 x1 )2 + (y2 y1 )2

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 7

Funciones y Procedimientos

7.1 Introducci
on
Esta practica introduce al estudiante al uso de las secuencias de control en lenguaje C y
Lenguaje Fortran. Al termino de la practica el estudiante habra comprendido las secuencias
de control y sera capaz de utilizarlas para la resolucion de problemas mediante alg
un lenguaje
de programacion.

7.2 El preprocesador de C
Preprocesador: Transforma el programa fuente, convirtiendolo en otro archivo fuente
predigerido. Elimina comentarios, incluye otros archivos y sustituye las definiciones.

El preprocesador tiene su propio lenguaje


Los programas son mas faciles de leer
Los programas son mas faciles de modificar
Facilita la transferencia a otros arquitecturas

#include

Se utiliza para incluir otro archivo de definiciones o archivo de biblioteca y de esta forma
compilar otro archivo.
#include <archivo>

DCI - DIQEB, Universidad de Guanajuato


7.2 El preprocesador de C 69

#include archivo
Elemplo:
#include <s t d i o . h>
#include <math . h>
#include < l i b r e r i a e s p e c i a l . h>
Cuando se indica <archivo> se le dice al compilador que busque donde estan los archivos
de biblioteca o del sistema. Si se usa la forma archivo entonces el compilador busca en el
directorio actual, es decir, donde el programa esta siendo ejecutado.

#define

Se utiliza para definir constantes o una macro. Esta definicion es sustituida por el codigo
establecido por el programador. #define acepta argumentos en la definicion de macros.

#define <Nombre-Cte-Macro> <Nombre-de-Remplazo>

Elemplo
#define Maximo 300
#define Minimo 0
#define F a l s o 0
#define Verdadero 1
#define MIN( a , b ) ( a<b ) ? a : b
...
for ( i=Minimo ; i <Maximo ; i ++)
p r i n t f ( El minimo de %d y %d e s %d\n , A[ i ] , B [ i ] , MIN(A[ i ] , B [ i ] ) ) ;

#i f , #i f d e f

Eval ua una expresion constante entera. Siempre se debe terminar con #endif para delim-
itar el fin de esta sentencia. Se puede utilizar else ( #elif o #else)
Elemplo
#define Maximo 300
#define Minimo 0

#define MEX 0

DCI - DIQEB, Universidad de Guanajuato


7.2 El preprocesador de C 70

#define EUA 1
#define GB 2
#define PAIS ACTIVO MEX

#i f PAIS ACTIVO == MEX


char moneda [ ] = p e s o s ;
#e l i f PAIS ACTIVO == EUA
char moneda [ ] = d o l a r ;
#e l s e
char moneda [ ] = l i b r a ;
#endif
Otro metodo de compilacion condicional es utilizar las clausulas #ifdef y #ifndef. Sin-
taxis:

#i f d e f <nombre macro>
<s e c u e n c i a de s e n t e n c i a s >
#endif
...
#i f n d e f <nombre macro>
<s e c u e n c i a de s e n t e n c i a s >
#endif
#undef se utiliza para quitar una definicion de una constante o macro que se haya definido
previamente. El formato general es:
#undef <nombre macro>
El compilador se puede utilizar para controlar los valores asignados o definidos en la lnea
de comandos. Para esto, se usa la opcion -Dmacro[=defn], por ejemplo:
gcc -DTAMLINEA=80 prog.c -o prog.out
Esto es equivalente a:
#define TAMLINEA 80
Tambien se puede poner un smbolo sin valor, por ejemplo:
gcc -DDEBUG prog.c -o prog.out
En donde el valor que se toma es de 1 para esta macro.

DCI - DIQEB, Universidad de Guanajuato


7.3 Funciones en C 71

7.3 Funciones en C
Un programa en C es una coleccion de una o mas funciones. Una de ellas debe ser la funcion
main() ya que la ejecucion del programa comenzara en esta funcion. Tradicionalmente,
main() es la primer funcion en un programa, sin embargo, podra ir en cualquier parte del
programa.

Una funcion es un conjunto de instrucciones (declaraciones, definiciones, ...), que real-


izan una tarea especifica.

En C, la funcion main es la que indica donde comienza la ejecucion de nuestro programa,


es decir es la funcion principal

Funciones vs. Procedimientos

Una funcion regresa un valor


Un procedimiento no regresa un valor, pero puede modificar sus argumentos.

En C, una funcion puede o no regresar un valor y puede o no modificar sus argumentos.

Recordando el primer programa ...

#include <s t d i o . h>

int main ( void )


{
p r i n t f ( Programacion b a s i c a . \ n ) ;
return 0 ;
}
Podemos escribir una funcion que realice lo mismo

void imprimeMensaje ( void )


{
p r i n t f ( Programacion b a s i c a . \ n ) ;
}
La diferencia entre la funcion imprimeMensaje y la funcion main, esta en la primer linea,
la cual indica:

DCI - DIQEB, Universidad de Guanajuato


7.3 Funciones en C 72

Quien puede invocarla

El tipo de valor que regresa

Su nombre

Los argumentos que requiere

Escribiendo e invocando una funcion. Valor de retorno?

#include <s t d i o . h>

void imprimeMensaje ( void )


{
p r i n t f ( Programacio n b a s i c a . \ n ) ;
}

int main ( void )


{
imprimeMensaje ( ) ;
return 0 ;
}
El formato general de una funcion en C es:

Tipo dato que regresa Nombre De La Funcio n ( L i s t a d e A r g u m e n t o s )


{
D e c l a r a c i o n de v a r i a b l e s l o c a l e s

Co digo de l a f u n c i o n

r e g r e s o de a lg u
n v a l o r de acuerdo a l t i p o
}

La seleccion del nombre de la funcion es tan relevante como la seleccion del nombre de
las variables. estos tienen que ser relevantes y acorde a su uso, de tal forma que la lectura
del programa sea facil.
Si la funcion no tiene parametros o argumentos entonces no se necesita declaracion de
parametros. El tipo de la declaracion es opcional - Si no esta explcita la declaracion del tipo,
el tipo de la funcion por defecto es entero -

DCI - DIQEB, Universidad de Guanajuato


7.4 Funciones y procedimientos en Fortran 73

Todas las funciones, excepto las declaradas como void, devuelven un valor. El tipo del
valor devuelto debe coincidir con el declarado. Si no ha habido una declaracion anterior,
entonces el valor devuelto es entero por defecto. Si es parte de la funcion la sentencia return,
entonces el valor de la funcion es el valor en la sentencia return. Si no esta presente return,
entonces la funcion devolvera cero.
Ejemplo:

// f u n c i
o n que d e v u e l v e e l mnimo de dos n
u meros e n t e r o s
int minimo ( int a , int b )
{

int m; // d e c l a r a l a v a r i a b l e m para almacenar e l r e s u l t a d o

i f ( a<b ) // a s i g n a un v a l o r de acuerdo a l o s par


a metros
m = a;
else
m = b;

return (m) ; // r e g r e s a e l v a l o r
}

7.4 Funciones y procedimientos en Fortran


Una funcion o procedimiento es un conjunto de instrucciones (declaraciones, defini-
ciones, ...), que realizan una tarea especifica (unidad programatica).

En Fortran, el procedimiento program es la que indica donde comienza la ejecucion de


nuestro programa, es decir es el programa principal (procedimiento principal)

Funciones vs. Procedimientos

Una funcion regresa un valor


Un procedimiento no regresa un valor, pero puede modificar sus argumentos.

En Fortran existen cuatro tipos de unidades programaticas:

1. program que es la unidad programatica principal.

DCI - DIQEB, Universidad de Guanajuato


7.4 Funciones y procedimientos en Fortran 74

2. subroutine (subrutina o procedimiento) unidad programatica que contempla instruc-


ciones ejecutables.

3. function (funcion) unidad programatica que contempla instrucciones ejecutables

4. module unidad programatica que contempla instrucciones de declaracion de variables,


inicializacion de variables, interfaces entre funciones y subrutinas.

Una subrutina es subprograma de orden jerarquico de nivel inferior al programa principal.


Sintaxis:

subroutine <nombre >[(< argumentos ( f i c t i c i o s ) >)]


! i n s t r u c c i o n e s de d e c l a r a c i o n de l o s argumentos ( f i c t i c i o s )
:
! i n s t r u c c i o n e s de d e c l a r a c i o n de l o s o b j e t o s ( v a r i a b l e s ) l o c a l e s
:
! instrucciones ejecutables
:
end subroutine <nombre>

Donde los <argumentos (ficticios)>, en el caso que sean utilizados, son los objetos,
sobre los cuales la subrutina trabajara preferentemente, estan separados por comas y pueden
ser variables, funciones, subrutinas, arreglos, apuntadores o procedimientos de modulo.
La subrutina es invocada por otra unidad programatica por medio de la instruccion call.

< i d e n t i f i c a c i o n unidad p rograma tica >


:
c a l l <nombre>[<argumentos ( usados ) >]
:
end <unidad p rogram a ti ca >
Ejemplo: procedimiento para obtener el area de un crculo

SUBROUTINE A r e a C i r c u l o ( r , a )
IMPLICIT NONE
REAL, INTENT(IN) : : r
REAL, INTENT(OUT) : : a
REAL, PARAMETER : : Pi = 3 . 1 4 1 5 9 2 7

DCI - DIQEB, Universidad de Guanajuato


7.4 Funciones y procedimientos en Fortran 75

A = Pi r r
RETURN
END SUBROUTINE A r e a C i r c u l o
Invocacion:

PROGRAM C i r c u l o
IMPLICIT NONE
REAL : : r a d i o , a r e a
INTERFACE
SUBROUTINE A r e a C i r c u l o ( r , a )
IMPLICIT NONE
REAL, INTENT(IN) : : r
REAL, INTENT(OUT) : : a
END SUBROUTINE A r e a C i r c u l o
END INTERFACE
!
write ( , ) Radio d e l c i r c u l o (m)
read ( , ) r a d i o
CALL A r e a C i r c u l o ( r a d i o , a r e a )
! Escribir resultado
write ( , ) El a r e a d e l un c i r c u l o con r a d i o , r a d i o , (m) e s , area , m2
!
STOP
END PROGRAM C i r c u l o
En Fortran es conveniente especificar que tipos de datos utiliza un procedimiento

interface
subroutine l e e d a t o s ( z )
real : : z
end subroutine l e e d a t o s
end i n t e r f a c e
Una funcion es un subprograma de orden jerarquico de nivel inferior al programa principal.
Sintaxis:

FUNCTION Nombre funcion ( l i s t a de argumentos ) RESULT ( v a r i a b l e r e s u l t a d o )

DCI - DIQEB, Universidad de Guanajuato


7.4 Funciones y procedimientos en Fortran 76

IMPLICIT NONE
! i n s t r u c c i o n e s de d e c l a r a c i o n de t i p o de l o s argumentos
:
:
! i n s t r u c c i o n e s de d e c l a r a c i o n de t i p o de v a r i a b l e r e s u l t a d o
:
:
! i n s t r u c c i o n e s de d e c l a r a c i o n de t i p o de l a s v a r i a b l e s l o c a l e s
:
:
! instrucciones ejecutables
:
:
RETURN
END FUNCTION Nombre funcion
Una FUNCTION se invoca de la misma forma que una funcion intrnseca. Es decir, en
aquellas expresiones aritmeticas en las que se desee evaluar el valor de la funcion se escribe:

Nombre funcion ( a r g 1 , a r g 2 , . . . , a r g n )
Ejemplo: Obtener el mayor de tres n
umeros

FUNCTION Mayor (A, B,C) RESULT (D)

IMPLICIT NONE
REAL : : D ! V a r i a b l e r e s u l t a d o
REAL, INTENT(IN) : : A, B, C ! Argumentos de l a f u n c i
on
REAL : : Dummy ! V a r i a b l e l o c a l

IF (A <= B)THEN
D = B
ELSE IF (A <= C) THEN
D = C
ELSE
D = A
END IF

DCI - DIQEB, Universidad de Guanajuato


7.5 Ejercicios 77

END FUNCTION Mayor

7.5 Ejercicios
Los objetivo de esta sesion son:

1. Solsucionar dudas sobre sesiones anteriores

2. Comprender como operan los arreglos , estructuras y su relacion con las funciones y
procedimientos

3. Comprender el uso de funciones y procedimientos

4. comprender el alcance de las variables.

NOTA: Todos los programas deben ir comentados y con el nombre del autor. El reporte
debe incluir una explicacion del comportamiento del programa as como comentarios sobre
lo aprendido.

Ejercicios

1. El siguiente programa en Fortran calcula las potencias de un conjunto de n


umeros dados
por el usuario. El programa utiliza una funcion y un procedimiento.

Edite y compile el programa


Verifique su funcionamiento
Comente el programa
A partir del codigo fuente genere el diagrama de flujo correspondiente.

program Cpotencia
! Declarar v a r i a b l e s .
i m p l i c i t none
r e a l , dimension ( 1 0 ) : : d a t o s
integer , dimension ( 1 0 ) : : n p o t e n c i a s
r e a l , external : : p o t e n c i a
integer : : Max = 5 0 ;

DCI - DIQEB, Universidad de Guanajuato


7.5 Ejercicios 78

integer k

do while ( ( Max . l t . 0 ) . o r . (Max . g t . 1 0 ) )


print , Cuantos numeros d e s e a s c a l c u l a r su p o t e n c i a (1 10)?
read ,Max
enddo

c a l l l e e d a t o s ( datos , n p o t e n c i a s , Max)
print , X | n | Y
print ,

do k=1,Max
write ( , 1 0 0 ) d a t o s ( k ) , n p o t e n c i a s ( k ) , p o t e n c i a ( d a t o s ( k ) , n p o t e n c i a s ( k ) )
100 format ( 1 x , f 4 . 1 , 1 x , | , 1 x , i 3 , 2 x , 1 x , | , 1 x , f 7 . 1 )
enddo
stop Programa p o t e n c i a s termino de forma normal

end program Cpotencia

subroutine l e e d a t o s ( dat , nPot , n )


integer : : j , n
real , dimension ( 1 0 ) : : dat
integer , dimension ( 1 0 ) : : nPot

do j =1,n
write ( , 1 0 0 ) j
100 format ( T e c l e a e l v a l o r ( x ) y su p o t e n c i a ( n ) , i 3 , : )
read , dat ( j ) , nPot ( j )
enddo
return
end subroutine l e e d a t o s

r e a l function p o t e n c i a ( a ,m)

DCI - DIQEB, Universidad de Guanajuato


7.5 Ejercicios 79

integer : : m, j
real : : a
r e a l : : pot

pot = 1 . 0
do j =1,m
pot = pot a
enddo
p o t e n c i a = pot
return
end function p o t e n c i a

2. Modifique la funcion potencia descrita anteriormente, como se muestra a continuacion


y mencione cuales son las diferencias al ejecutar el programa. Cual es su explicacion
para que exista tal diferencia?
r e a l function p o t e n c i a ( a ,m)
integer : : m, j
real : : a
r e a l : : pot = 1 . 0

do j =1,m
pot = pot a
enddo
p o t e n c i a = pot
return
end function p o t e n c i a

3. Escriba un programa en Fortran que lea un arreglo de enteros de 10 elementos y en-


cuentre el minimo y maximo, utilizando funciones y procedimientos

4. Escriba un programa en Fortran que lea un arreglo de enteros de 10 elementos y los


ordene. Utilize funciones y procedimientos

5. Escriba un programa en Fortran para resolver un sistema de partculas cargadas. El


programa debe utilizar funciones y subrutinas. El programa tambien puede utilizar
estructuras.

DCI - DIQEB, Universidad de Guanajuato


7.5 Ejercicios 80

Considere un sistema de N = 100 partculas puntuales, confinadas en el plano xy


dentro de una caja cuadrada de longitud L = 10. Dichas partculas interaccionan va
el potencial de Coulomb, es decir

qi qj
u(|~rij |) = K
|~rij |

donde qi y qj son la carga de i-esima y j-esima partcula respectivamente, K es la


amplitud del potencial de Coulomb y |~rij | es la distancia que hay entre las dos partculas.

|~rij | = |~ri ~rj |

En ausencia de un campo externo, la energa de exceso total se define como:

N N
1 XX
Uexc = u(|~rij |)
2 i=1 j=1

Notas:

(a) Utilice un generador de n


umeros aleatorios para colocar las N partculas de manera
aleatoria dentro de la caja cuadrada.
(b) Calcule la energa de exceso total considerando que 500 partculas tienen carga
q+ = 1 y el resto tienen carga q = 1 para un valor de K = 1.8.
(c) Todos los valores son adimensionales

6. Escribir un programa que use el tipo enumeracion para mostrar el nombre de un mes,
su predecesor y su sucesor. El mes se ingresara desde el teclado dando un n
umero entre
1 y 12 (verificar que el n
umero se encuentre en el rango permisible.

7. Definir una macro min(a,b) para determinar el entero mas pequeno. Definir otra macro
min3(a,b,c) en terminos de min(a,b). Incorporar las macros en un programa demostra-
tivo en donde se pida al usuario tres n
umeros y se muestre el mas peque
no.

8. El siguiente programa en C calcula la distancia entre dos puntos utilizando la siguiente


ecuacion:

p
d(P1 , P2 ) = (x2 x1 )2 + (y2 y1 )2

DCI - DIQEB, Universidad de Guanajuato


7.5 Ejercicios 81

Modifique el programa para que el calculo de la distancia se realice mediante una


funcion llamada Distancia

#include <s t d i o . h>


#include <math . h>

int main ( void )


{
struct Punto {
double x ;
double y ;
};

struct Punto A, B ;
double D i s t a n c i a ;
p r i n t f ( T e c l e a l o s v a l o r e s d e l punto A ( x , y ) \n ) ;
s c a n f ( %l f %l f , &A. x , &A. y ) ;
p r i n t f ( T e c l e a l o s v a l o r e s d e l punto B ( x , y ) \n ) ;
s c a n f ( %l f %l f , &B . x , &B . y ) ;

// c a l c u l a m o s l a d i s t a n c i a e n t r e ambos p u n t o s .

D i s t a n c i a = s q r t ( pow ( (B . xA. x ) ,2)+pow ( (B . yA. y ) , 2 ) ) ;


p r i n t f ( La d i s t a n c i a e s : %l f \n , D i s t a n c i a ) ;

return ( 0 ) ;
}

Nota: Recuerde que para crear el ejecutable incluir la libreria math.h en el enlazador
(caso particular de fedora)

gc c NombrePrograma . c lm o NombrePrograma . out

DCI - DIQEB, Universidad de Guanajuato


Pr
actica 8

Apuntadores y Archivos

8.1 Introducci
on
Esta practica introduce al estudiante al uso de apuntadores y archivos en lenguaje C. Al ter-
mino de la practica el estudiante habra comprendido la relacion entre apuntadores y archivos.
por lo que sera capaz de utilizar estas herramientas para la resolucion de problemas mediante
alg
un lenguaje de programacion.

8.2 Apuntadores
Los apuntadores son u
tiles para obtener acceso indirecto al contenido de las variables.

Un apuntador es una variable que almacena la direccion de memoria donde el dato de


interes esta almacenado.

Cuando deseamos que un apuntador no contenga una direccion asociada a un dato, se


dice que el apuntador no apunta a ning
un lado y se expresa como NULL.

Cuando se declara un apuntador, una cierta cantidad de memoria se reserva para con-
tenerlo.

Nunca se debe asumir que un apuntador tiene un tama


no definido.

Para declarar una apuntador se utiliza el *

int i p t r ; // s e d e c l a r a un apuntador t i p o e n t e r o
double dptr ; // s e d e c l a r a un apuntador t i p o d o u b l e

DCI - DIQEB, Universidad de Guanajuato


8.2 Apuntadores 83

Para declarar una apuntador se utiliza el *

int o p c i o n ; // s e d e f i n e una v a r i a b l e t i p o e n t e r o l l a m a d a o p c i
on
int p t r o p c i o n ; // s e d e f i n e una apuntador a una v a r i a b l e t i p o e n t e r o

int i p t r ; // s e d e c l a r a un apuntador t i p o e n t e r o
double dptr ; // s e d e c l a r a un apuntador t i p o d o u b l e
Los operadores en el uso de apuntadores en C estan listados en la tabla 8.1

Tabla 8.1: Operadores utilizados con apuntadores


OperadorDescripcion
* dereference : indica que se
accesa el contenido de la
variable o memoria a la cual
apunta el apuntador
& Direccion: Indica la di-
reccion fsica de memoria
donde la variable es almace-
nada (dada una variable, &
apunta hacia la variable)

A continuacion se ejemplifica como funcionan los apuntadores en C por medio de el codigo


y su representacion grafica correspondiente.

a
iptr
jptr
int a , i p t r , j p t r . k p t r kptr

a
iptr
i p t r = &a ;
jptr
// i p t r apunta a l c o n t e n i d o de a kptr

jptr = iptr iptr


jptr
// j p t r apunta a l o que apunta i p t r kptr

DCI - DIQEB, Universidad de Guanajuato


8.2 Apuntadores 84

jptr = 100; a 100

// s e a c c e s a e l e s p a c i o iptr
jptr
// de memoria a l que apunta kptr

k p t r = NULL; a 100

// apuntador v a c i o iptr
jptr
// no apunta a a l g u n a v a r i a b l e o c o n t e n i d o kptr

Los apuntadores tambien son u tiles para acceder a contenidos de memoria de forma
ordenada y contigua. Para esto se hace necesario reservar un espacio en memoria y despues
accederlo mediante un apuntador.
Reservando espacio para un apuntador

#include < s t d l i b . h>

int g ( int i p t r ) {

i f ( ( i p t r = ( int ) m a l l o c ( s i z e o f ( int ) ) ) = = NULL)


return 1;

return 0 ;

malloc : reserva espacio de memoria


free: libera la memoria reservada por malloc

Referencias: arreglos y apuntadores. Loas apuntadores tambien pueden ser utilizados


para la manipulacion de arreglos. Los siguientes segmentos de codigo son similares en la
manipulacion de arreglos pero uno es por medio de arreglos y otro por medio de apuntadores.

DCI - DIQEB, Universidad de Guanajuato


8.2 Apuntadores 85

Arreglos
Apuntadores
int f ( ) {
int g ( ) {
int a [ 1 0 ] , i p t r ;
iptr = a ; int a [ 1 0 ] , i p t r ;
iptr [ 0 ] = 5; iptr = a ;
iptr = 5;
return 0 ;
return 0 ;
}
}

... ...

x [ i ]=10; ( x+i )=10;


a[ i ][ j ] (( a + i ) + j )

Figura 8.1: Ejemplo de manipulacion de datos continuos utilizando arreglos.

Argumentos por valor y por referencia

DCI - DIQEB, Universidad de Guanajuato


8.2 Apuntadores 86

Figura 8.2: Ejemplo de manipulacion de datos continuos utilizando apuntadores.

En C, los argumentos de las funciones siempre pasan solo su valor. Es decir, se


hace una copia del valor de cada argumento, y son estas copias las que se procesan en la
funcion. Como consecuencia, la variables que pasan como argumentos a las funciones
NO CAMBIAN.

El uso de apuntadores permite el paso de argumentos por referencia, de esta forma los
argumentos puede CAMBIAR su contenido. Aqu entonces deben pasarse direcciones
de variables como argumentos.

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 87

Intercambio Incorrecto Intercambio correcto

void cambio1 ( int x , int y ) void cambio2 ( int x , int y )


{ {

int tmp ; int tmp ;


tmp = x ; tmp = x ;
x = y; x = y ;
y = tmp ; y = tmp ;

return ; return ;

} }

. .
. .
. .

cambio1 ( a , b ) ; cambio2(&a ,&b ) ;

Uso en funciones

Arreglos Apuntadores

int f 1 ( int a [ ] ) { int f 2 ( int a ) {

a [ 0 ] = 5; a = 5 ;

return 0 ; return 0 ;

} }

8.3 Archivos
Un archivo es un conjunto de informacion o datos que se encuentran almacenados en
una memoria permanente, como un disco duro.

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 88

Un archivo se define por su nombre y su extension

La extension del archivo nos indica parcialmente el tipo y contenido del archivo

Los lenguajes de programacion contienen funciones basicas para accesar y manipular


archivos

8.3.1 Archivos en C
Declarando y abriendo un archivo

La funcion fopen se utiliza para abir un archivo, y asociarle una variable apuntador a
archivo con la cual el programa puede referirse a la fuente del archivo. El prototipo de
fopen es:

FILE f o p e n ( const char nombreDELarchivo , const char modo ) ;

fopen retorna un apundador al archivo si la llamada fue exitosa, de otra forma regresa
NULL

Existen diversas formas de abrir o crear un archivo (ver tabla 8.2)

Tabla 8.2: modos de acceso para un archivo en C

Modo Uso
r Abre para lectura
w Abre o crea para escritura. Descarta (destruye)
cualquier contenido previo
a Abre o crea para escritura. Agrega a (escribe de-
spues de) cualquier contenido previo
r+ Abre para modificaciones (lectura y escritura)
w+ Abre o crea para modificacion. Descarta (de-
struye) cualquier contenido previo
a+ Abre o crea para modificacion. Agrega a cualquier
contenido previo

Ejemplo de declaracion, apertura y cierre de un archivo:

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 89

#include < s t d l i b . h>


#include <s t d i o . h>

FILE A r c h i v o p t r ; // s e d e c l a r a e l a r c h i v o

// e j e m p l o de a p e r t u r a de un a r c h i v o
A r c h i v o p t r = f o p e n ( d a t o s . t x t , w ) ;

// para c e r r a r l o s a r c h i v o s s e u t i l i z a l a f u n c i o n f c l o s e
f c l o s e ( FILE A r c h i v o p t r ) ;
Lectura

f s c a n f ( FILE a r c h i v o , const char formato , ....);

Escritura

f p r i n t f ( FILE a r c h i v o , const char formato , ....);

Otras funciones

f g e t c ( FILE a r c h i v o )
f p u t s ( const char s , FILE a r c h i v o ) ;
f p u t c ( int c , FILE a r c h i v o ) ;
s p r i n t f ( char b u f f e r , const char format , . . . ) ;
s s c a n f ( char b u f f e r , const char format , . . . ) ;
...
A continuacion se da un ejemplo completo para la apertura y cierre de archivos de texto
#include <s t d i o . h>
int main ( ) {
char NombreArch [ 8 0 ] ;
FILE ArchivoPtr ;

p r i n t f ( Archivo a a b r i r ? ) ;
s c a n f ( %79s , NombreArch ) ;

ArchivoPtr = f o p e n ( NombreArch , r ) ;
i f ( ArchivoPtr == NULL)

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 90

{
f p r i n t f ( s t d e r r , No s e puede a b r i r e l a r c h i v o : %s \n , NombreArch ) ;
return 1 ; / Termina e l programa /
}

/ Aqu va e l c o d i g o para manipular e l a r c h i v o /

return 0 ;
}

8.3.2 Archivos en Fortran


Existen diversas formas de abrir o crear un archivo (ver tabla 8.3)

Tabla 8.3: Comados basicos para manipulacion de archivos en Fortran


Comando Descripcion
open Apertura de un archivo. Asigna un nu-
mero de unidad para referir el archivo.
close Cierra un archivo. Requiere el numero
de unidad para realizar el cierre del
archivo
read Lectura de datos desde un archivo.
write Escritura de datos hacia el archivo.
rewind Posiciona el control de acceso del
archivo al inicio del mismo.
Backspace Retrocede el control de acceso al reg-
istro anterior.

Ejemplo del uso de comandos para apertura y lectura de un archivo


open ( u n i t =1, f i l e = Datos )

r ead ( u n i t =1, FMT=100) X


Con open se asigna la unidad 1 al archivo Datos, con read se lee un valor de la unidad 1
y formato 100. El valor leido se asigna a X
Al igual que C, Fortran contempla unidades predeterminadas de entrada/salida (ver
tabla 8.4)
Ejemplo:

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 91

Tabla 8.4: Unidades predeterminadas de Entrada y Salida en Fortran


unidad Descripcion
0 Se predetermina como pantalla o como
teclado.
5 Se predetermina como teclado.
6 Se predetermina como pantalla.
* Se predetermina como pantalla y teclado.

...
write (0 ,100)
100 format ( dame un v a l o r de x )
read ( 5 , 2 0 0 ) x
200 format ( f 5 . 1 )
write (6 ,300) x
300 format ( i 5 , f 5 . 1 , / )
...
Sintaxis del comando open

open ( [ u n i t =] unidad [ , a c c e s s=a c c e s o ]


[ a c t i o n=a c c i o n ] [ , blank= b l a n c o s ]
[ , b l o c k s i z e= tama no d e l b l o q u e ]
[ , c a r r i a g e c o n t r o l= c o n t r o l de c a r r o ]
[ , delim= l m i t e ] [ , e r r=e r r o r ] [ , f i l e = a r c h i v o ]
[ , form= forma ]
[ , i o f o c u s= punto l o g i c o e n t r a d a / s a l i d a ]
[ , i o s t a t= edo de e n t r a d a / s a l i d a ] [ , pad=b l a n c o s ]
[ , p o s i t i o n= p o s i c i o n ] [ , r e c l= r e l l a m a d a ]
[ , s h a r e= compartido ] [ , s t a t u s= e s t a d o ] )
Sintaxis del comando close, las opciones son similares a las del comando open.

c l o s e ( [ u n i t =] u n i t s p e c [ , e r r=e r r l a b e l ]
[ , i o s t a t=i o s t a t ] [ , s t a t u s=s t a t u s ] )
Ejemplos en Fortran utilizando archivos:
program programa
i m p l i c i t none

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 92

Tabla 8.5: Descripcion de las opciones del comando open


opcion Descripcion
unit Entero que especifica el n umero de la unidad externa.
acess Modo de acceso para el archivo. Uno de APPEND, DIRECT, o
SEQUENTIAL (Por Omision, en forma automatica).
action Que accion se pretende realizar dentro del archivo. Puede ser: READ
(el proceso es solo leer el archivo), WRITE (se pretende solo escribir en
el archivo), o READWRITE (se pretende realizar las dos acciones leer
y escribir)..
file Nombre del archivo que se desea abrir.
form Determina la forma de apertura puede ser CON FORMATO o SIN
FORMATO, o BINARIO.
position Indica la posicion de inicio dentro del archivo. Puede ser ASIS (En
forma automatica), REWIND, o APPEND. Si es REWIND, un
archivo existente se posiciona en el principio. Si es APPEND, en un
archivo existente el apuntador de registro se mueve hasta el final. Si es
ASIS, la posicion en un archivo activo no cambia, mientras que en un
archivo inactivo la posicion sera hasta el principio.
status Cadena que describe la naturaleza del archivo a ser abierto: OLD El
archivo debe existir. Si existe, se abre. Si no existe, ocurre un error de
entrada salida, que dice Archivo In-existente.
NEW El archivo no debe existir. Si no existe el archivo es creado. Si
existe, entonces genera un error que dice Archivo ya existente .
SCRATCH Si se omite el parametro file al abrir el archivo, el valor del
estado del archivo es SCRATCH. Los archivos Scratch son temporales
( Volatiles). Estos archivos son borrados cuando la unidad se cierra o
termina el programa.
REPLACE El archivo abierto reemplaza a uno del mismo nombre. Si no
existe un archivo con el mismo nombre, este se creara. UNKNOWN (en
forma automatica ) Primero se trata de abrir un archivo existente (status
igual a OLD), y despues con el status NEW. Si el archivo existe, se
abre; si no existe lo crea..

DCI - DIQEB, Universidad de Guanajuato


8.3 Archivos 93

i n t e g e r numero

print , Introduzca enteros p o s i t i v o s :


numero = 0

open ( u n i t =1, f i l e = numeros . dat , s t a t u s= unknown )

do while ( numero>=0)
read , numero
i f ( numero>=0) then
w r i t e ( 1 , ) numero
end i f
end do

close (1)

end program
Ejemplo 2
program programa
i m p l i c i t none
type alumno
c h a r a c t e r 64
nombre c h a r a c t e r 128 a p e l l i d o s
end type alumno

type ( alumno ) datos alumno


open ( u n i t =1, f i l e = P r o g b a s i c a . d a t , s t a t u s=unknown )

do while ( . not . e o f ( 1 ) )
read ( 1 , ) datos alumno
p r i n t , Nombre : , datos alumno%nombre , A p e l l i d o s : , datos alumno%a p e l l i d o s
! datos alumno%a p e l l i d o s
end do

close (1)

DCI - DIQEB, Universidad de Guanajuato


8.4 Ejercicios 94

end program

8.4 Ejercicios
Los objetivo de esta sesion son:

1. Solucionar dudas sobre sesiones anteriores

2. Entender el uso de apuntadores y su relacion con los arreglos

3. Entender el uso de las funciones y procedimientos.

4. Entender el uso de archivos

NOTA: Todos los programas deben ir comentados y con el nombre del autor. El reporte
debe incluir una explicacion del comportamiento del programa as como comentarios sobre
lo aprendido.

Ejercicios

1. El siguiente programa en C ejemplifica el uso de apuntadores. Edite, compile y ejecute el


programa. Describa el funcionamiento del programa y comente cada linea del programa
de acuerdo a lo observado en la ejecucion del programa

#include <s t d i o . h>

int main ( void )


{

int o b j e t o v a r ;

int o b j e t o p t r ;

objeto var = 2;

p r i n t f ( o b j e t o %d\n , o b j e t o v a r ) ;

DCI - DIQEB, Universidad de Guanajuato


8.4 Ejercicios 95

o b j e t o p t r = &o b j e t o v a r ;

objeto ptr = 3;

p r i n t f ( o b j e t o %d\n , o b j e t o v a r ) ;

p r i n t f ( o b j e t o %d\n , o b j e t o p t r ) ;
11 0672326663 CH11 6/10/04 2:03 PM Page 238

return ( 0 ) ;

11 0672326663 CH11 6/10/04 2:03 PM Page 237


}

238 Chapter 11 Pointers

Program 11.2 illustrates some interesting properties of pointer variables. Here, a


pointer
2. Cual es la salida de los programas en la figura 8.3 to
? acomente
character is cada
used. linea del programa
Defining a Pointer Variable 237
de acuerdo a las acciones realizadas . Program 11.2 More Pointer Basics
// Further examples of pointers
Program 11.1 Illustrating Pointers
// Program to illustrate pointers #include <stdio.h>

#include <stdio.h> int main (void)


{
char c = 'Q';
int main (void)
char *char_pointer = &c;
{
int count = 10, x;
printf ("%c %c\n", c, *char_pointer);
int *int_pointer;
c = '/';
int_pointer = &count;
printf ("%c %c\n", c, *char_pointer);
x = *int_pointer;
*char_pointer = '(';
printf ("count = %i, x = %i\n", count, x); printf ("%c %c\n", c, *char_pointer);

return 0; return 0;
} }

(a) (b)
Program 11.1 Output Program 11.2 Output
count = 10, x = 10 Figura 8.3: Programa que utilizan
Q Q apuntadores.
/ /
( (
The variables count and x are declared to be integer variables in the normal fashion. On
the next line, the variable int_pointer is declared to be of type pointer to int. Note
The character variable c is defined and initialized to the character 'Q'. In the next line
that the two lines of declarations could have been combined into the single line
of the program, the variable char_pointer is defined to be of type pointer to char,
3. El siguiente
int count =segmento de codigo ejemplifica el uso
10, x, *int_pointer; meaningde that
apuntadores
whatever valueyisoperadores
stored inside thisde auto-
variable should be treated as an indire
Next, the address operator isla
applied to the variable reference (pointer)
count.This has theCu to
effectaof a character.
creating Notice that you can assign an initial value to this vari
incremento. Siguiendo secuencia de instrucciones,
able intothe l es el valor (contenido)
you assign to de
a pointer to this variable, which is then assigned by the program thenormal fashion.The
variable value that char_pointer in the program
cada variable. ? a pointer to the variable c, which is obtained by applying the address operator to the
int_pointer
variable c. (Note that this initialization generates a compiler error if c had been defined
Execution of the next statement in the program,
after this statement because a variable must always be declared before its value can be ref-
x = *int_pointer; erenced in an expression.)
proceeds as follows:The indirection operator tells the C systemThe declaration
to treat of the variable char_pointer and the assignment of its initial value
the variable
could have been equivalently
int_pointer as containing a pointer to another data item.This pointer is then used to
expressed in two separate statements as
DCI - DIQEB, Universidad de Guanajuato char *char_pointer;
access the desired data item, whose type is specified by the declaration of the pointer
variable. Because you told the compiler that int_pointer points to integers
char_pointer when you
= &c;
declared the variable, the compiler knows that the value referenced by the expression
*int_pointer is an integer. And because you set int_pointer to point to the integer
8.4 Ejercicios 96

int a r r a y [ 1 0 ] ;

int main ( ) {

int d a t a p t r ;
int v a l u e ;

d a t a p t r = &a r r a y [ 0 ] ;

v a l u e = d a t a p t r ++;
v a l u e = ++d a t a p t r ;
v a l u e = ++d a t a p t r ;

4. La siguiente funcion calcula el factorial de un numero de forma recursiva. Escriba un


programa en C para verificar el funcionamiento del codigo. Explique que es la recursi
on
en programacion y como esta siendo aplicada en la funcion fact.

int f a c t ( int n ) {

i f (n < 0)
return 0 ;
e l s e i f ( n == 0 )
return 1 ;
e l s e i f ( n == 1 )
return 1 ;
else
return n f a c t ( n 1 ) ;
}

5. Escriba un programa en C que despliegue en pantalla la informacion contenida de un


archivo de texto. El archivo (nombre y ubicacion debe ser dado por el usuario)

DCI - DIQEB, Universidad de Guanajuato


Bibliografa

[1] Programming in C, Stephen Kochan. Sams 3rd Ed.

[2] C primer plus Stephen Prata. Ed. Sams 5th Ed.

[3] C Programming Language, Brian W. Kernighan, Dennis M. Ritchie Prentice Hall; 2 ed.

[4] Computing For Scientist Principles Of Programming With Fortran 90 And C++ Barlow
R., Barnett R.

[5] Revistas y Artculos especficos sobre programacion.

DCI - DIQEB, Universidad de Guanajuato

Vous aimerez peut-être aussi