Practicas Prog Basica PDF
Practicas Prog Basica PDF
Practicas Prog Basica PDF
acticas de Laboratorio
Programaci
on B
asica
Universidad de Guanajuato.
n de Ciencias e Ingenieras, Campus Leo
n.
Divisio
nica y Biome
dica.
Departamento de Ingenieras Qumica, Electro
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 pensados 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
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
Edicion y Compilacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1
Accediendo al sistema . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2
Comandos basicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3
Editores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4
. . . . . . . . . . . . . . . . . . . . .
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3
2 Lenguaje de Programaci
on C
11
2.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2
Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3
2.4
2.2.1
Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2
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
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Lenguaje de programaci
on Fortran
22
3.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2
Estructura y Compilacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.1
3.2.2
3.3
Desplegando Informacion . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Secuencias de Control
33
4.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2
Secuencias de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3
4.2.1
4.2.2
Condicional Si-Entonces . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.3
Condicional Si-Entonces-sino . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.4
Seleccion de caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Secuencias de Repetici
on
43
5.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2
Secuencias de repeticion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.3
5.2.1
for - do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.2
while - do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.3
Ciclos infinitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
53
6.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.2
Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.3
6.4
6.2.1
Declaracion de arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.2
Cadena de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
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
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7 Funciones y Procedimientos
7.1
68
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
iv
7.2
El preprocesador de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
7.3
Funciones en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.4
7.5
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8 Apuntadores y Archivos
82
8.1
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.2
Apuntadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.3
Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.4
8.3.1
Archivos en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.2
Archivos en Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Bibliografa
97
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 requieren 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.
1.2 Edici
on y Compilaci
on
1.2.2
Comandos b
asicos
1.2 Edici
on y Compilaci
on
Las opciones indican como hacerlo
Los argumentos indican sobre quien hacerlo
1.2.3
Editores
emacs
EMACS significa, Editor MACroS y fue escrito por Richard M. Stallman. Los comandos
basicos se pueden consultar en la tabla 1.3
1.2 Edici
on y Compilaci
on
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 directoo/archivo ...]
rio. Sin argumentos muestra el
contenido del directorio actual de
trabajo. La opcion mas habitual es -l que muestra informacion
mas completa de cada directorio y
archivo.
cd [directorio]
Cambia de directorio.
Sin argumentos lleva al directorio del
usuario (HOME). Si el directorio es
.. sube un nivel.
pwd
Imprime el directorio actual de trabajo.
cat
[opciones...] Muestra el contenido de los archivos
[archivos...]
por la salida estandar. Si no se
especifican archivos, lee de la entrada estandar.
cp [opciones...] fuente... Permite copiar un archivo, o varios
destino
archivos a un directorio. Quizas la
opcion mas usada es -r que permite copiar recursivamente directorios 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 directorio destino.
mkdir [opciones...] direc- Crea el directorio con el nombre intorio
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 subdirectorios .
1.2 Edici
on y Compilaci
on
Comando
Flechas
h
l
k
j
1G
G
i
a
A
I
o
O
x
dd
ndd
D
dw
1.2 Edici
on y Compilaci
on
1.3 Ejercicios
1.2.4
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
1.3
Ejercicios
1.3 Ejercicios
#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
1.3 Ejercicios
1.3 Ejercicios
Cuales son las diferencias entre un editor de textos y un procesador de palabras?
Que herramienta se debe utilizar para escribir programas de computadora?
10
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 programa 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.
2.3 Lenguaje C
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
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
Primer programa:
12
2.3 Lenguaje 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 ) ;
return 0 ;
}
#include <s t d i o . h>
Entonces:
#include
#include
#include
#include
<s t d i o . h>
<math . h>
O t r a s F u n c i o n e s . h
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 [ ] )
13
2.3 Lenguaje C
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.
14
2.3 Lenguaje C
15
Tabla 2.1: Tipos de datos
char
signed
char
Enteros signed short signed int
int
unsigned
unsigned
short int
int
Reales float
double
2.3.1
en C
unsigned char
signed
long
int
unsigned long
int
long double
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
2.3 Lenguaje C
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
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 ) ;
16
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, multiplicacion, division, etc.
El resultado de la operacion es dependiente del tipo de dato
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.
2.4 Ejercicios
2.4
18
Ejercicios
El objetivo de esta sesion es del de aprender a declarar variables de diferentes tipos y manipularlas 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 programa.
#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
valor2
suma =
printf
return
= 50;
= 25;
valor1 + valor2 ;
( La suma de %d y %d e s %d\n , v a l o r 1 , v a l o r 2 , suma ) ;
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.
2.4 Ejercicios
19
Inicio
valor1,
valor2
suma
Fin
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
diferentes valores.
20
2.4 Ejercicios
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
. Edite, compile y
acuerdo a esto, la salida del siguiente programa es:
ejecute el programa, Cual es la salida del programa? Explique el por que de ese valor.
21
Pr
actica 3
Lenguaje de programaci
on Fortran
3.1
Introducci
on
3.2
Estructura y Compilaci
on
3.2.1
integer
real
double
complex
Dos valores reales formando un par y que en operaciones 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.
23
3.2.2
Desplegando Informaci
on
24
3.3 Ejercicios
25
Tabla 3.2: Opciones de formato en Fortran
Tipo
integer
Sintaxis
nIw
Ejemplo
2i4
Datos
1234, -12
Descripcion
n es el n
umero de enteros a leer y w el
n
umero total de caracteres contando el
signo.
real
nFw.d
2f8.3
1234.678,
-234.678
character
nAw
2a6
abcdef,
qwerty
n es el n
umero de palabras a leer y w el
n
umero de caracteres en cada palabra.
espacios
nx
2x
3.3
n es el n
umero total de espacios en blanco
a leer
Ejercicios
3.3 Ejercicios
26
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.
area =
basealtura
2
3.3 Ejercicios
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
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
27
3.3 Ejercicios
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 (programa3.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
28
3.3 Ejercicios
a = 2.5
b = a +
c = a +
Bandera
j = i
texto =
29
i
a
= . false .
2
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
Funcionan las operaciones aritmeticas igual en C y Fortran? Como funciona el operador de division /, en Fortran? En C hay un tipo de dato equivalente al tipo logical
de Fortran ?
3.3 Ejercicios
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
30
3.3 Ejercicios
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
31
3.3 Ejercicios
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 especificamos 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.
32
Pr
actica 4
Secuencias de Control
4.1
Introducci
on
4.2
Secuencias de Control
Las secuencias de control o secuencias de decision permiten tomar un curso de accion determinado por una condicion dada. Para evaluar la condicion los lenguajes de programacion
utilizan operadores relacionales y logicos. En las siguientes secciones se comentara brevemente 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 operaciones aritmeticas. Los operadores relacionales y logicos se utilizan para producir resultados
VERDADERO / FALSO y frecuentemente se utilizan juntos. En C cualquier n
umero distinto 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.
4.2.2
34
relacionales y logicos en C y 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
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
35
Fortran
i f ( c o n d i c i o n )
{
proceso
}
i f ( c o n d i c i o n ) then
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
36
Fortran
i f ( c o n d i c i o n )
{
proceso 1
}
else
{
proceso 2
}
i f ( c o n d i c i o n ) then
proceso 1
else
proceso 2
endif
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
37
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
38
Fortran
switch ( o p c i o n )
{
case A : P r o c e s o 1 ;
break ;
case B : P r o c e s o 2 ;
break ;
case C : P r o c e s o 3 ;
break ;
default : P r o c e s o n ;
break ;
}
s e l e c t case ( o p c i o n )
case ( A )
proceso 1
case ( B )
proceso 2
case ( C )
proceso 3
case default
proceso n
end s e l e c t
4.3 Ejercicios
4.3
Ejercicios
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 ;
39
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
n
umeros. 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
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
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, encuentre 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?
41
4.3 Ejercicios
42
p r i n t f ( \n El numero e s c u a t r o \n ) ;
p r i n t f ( \n El numero e s c i n c o \n ) ;
p r i n t f ( \n El numero e s t r e s \n ) ;
p r i n t f ( \n El numero e s dos \n ) ;
p r i n t f ( \n El numero e s uno\n ) ;
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 ) ;
}
Pr
actica 5
Secuencias de Repetici
on
5.1
Introducci
on
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 programa se ejecute n veces. Esta secuencia de repeticion tambien se conoce como secuencia de
DCI - DIQEB, Universidad de Guanajuato
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
Condicin
NO
SI
Proceso
Incremento
45
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
5.2.2
46
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 )
{
proceso ;
}
do while ( c o n d i c i o n )
proceso
enddo
Nota :
F o rt r a n no p r o v e e una o p c i o n
para v e r i f i c a r l a 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 !
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.
5.2.3
48
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
C
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
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 :
enddo
,k
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?
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
}
y
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
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
1
1
1
1
1
1
1
1
x
x
x
x
x
x
x
x
x
1
2
3
4
5
6
7
8
9
=
=
=
=
=
=
=
=
=
1
2
3
4
5
6
7
8
9
5.3 Ejercicios
1 x 10 = 10
G r a c i a s por u s a r e s t e programa .
52
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
6.2 Arreglos
54
x[0]
15
x[1]
19
x[2]
6
6.2.1
Declaraci
on de arreglos
C
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
6.2 Arreglos
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 caracteres.
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.
55
6.2 Arreglos
#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
56
6.3
6.3.1
57
Estructura de Datos
struct
int
double
cha
r
float
_
tro
o
tip
...
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
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
58
...
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
59
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
X
byte 1
ch
DCI - DIQEB, Universidad de Guanajuato
byte 2
61
62
/ 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 /
/ 10 /
/
15 /
6.3.4
enum
6.3.5
typedef
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 )
...
63
6.4 Ejercicios
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
Ejercicios
1. El siguiente programa en Fortran ejemplifica el uso de arreglos (declaracion y manipulacion).
(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
64
6.4 Ejercicios
(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
65
6.4 Ejercicios
for ( i = 0 ; i <
for ( i = 0 ; i <
66
9 9 ; i ++) a [ i ]= 98 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 n
umero 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
ci,j =
m
X
ai,k bk,j i, j
k=1
(x2 x1 )2 + (y2 y1 )2
Pr
actica 7
Funciones y Procedimientos
7.1
Introducci
on
7.2
El preprocesador de C
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
#i f ,
e s %d\n , A[ i ] , B [ i ] , MIN(A[ i ] , B [ i ] ) ) ;
#i f d e f
Eval
ua una expresion constante entera. Siempre se debe terminar con #endif para delimitar el fin de esta sentencia. Se puede utilizar else ( #elif o #else)
Elemplo
#define
#define
Maximo 300
Minimo 0
#define MEX 0
DCI - DIQEB, Universidad de Guanajuato
7.2 El preprocesador de C
#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. Sintaxis:
#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.
70
7.3 Funciones en C
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 realizan 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
71
7.3 Funciones en C
72
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
// a s i g n a un v a l o r de acuerdo a l o s par
a metros
return (m) ;
// r e g r e s a e l v a l o r
7.4
Una funcion o procedimiento es un conjunto de instrucciones (declaraciones, definiciones, ...), 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
73
74
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
76
7.5 Ejercicios
7.5
Ejercicios
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
77
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
r e a l function p o t e n c i a ( a ,m)
DCI - DIQEB, Universidad de Guanajuato
7.5 Ejercicios
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
79
7.5 Ejercicios
80
qi qj
|~rij |
Uexc
1 XX
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 peque
no. Definir otra macro
min3(a,b,c) en terminos de min(a,b). Incorporar las macros en un programa demostrativo 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:
d(P1 , P2 ) =
(x2 x1 )2 + (y2 y1 )2
7.5 Ejercicios
81
\n ) ;
\n ) ;
// 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
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 termino 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
8.2 Apuntadores
83
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 direccion fsica de memoria
donde la variable es almacenada (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
i p t r = &a ;
// i p t r apunta a l c o n t e n i d o de a
iptr
jptr
kptr
jptr = iptr
// j p t r apunta a l o que apunta i p t r
iptr
jptr
kptr
8.2 Apuntadores
jptr = 100;
// s e a c c e s a e l e s p a c i o
// de memoria a l que apunta
k p t r = NULL;
// apuntador v a c i o
// 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
84
100
iptr
jptr
kptr
100
iptr
jptr
kptr
8.2 Apuntadores
85
Arreglos
Apuntadores
int f ( ) {
int g ( ) {
int a [ 1 0 ] , i p t r ;
iptr = a ;
iptr [ 0 ] = 5;
int a [ 1 0 ] , i p t r ;
iptr = a ;
iptr = 5;
return 0 ;
return 0 ;
}
}
...
...
x [ i ]=10;
a[ i ][ j ]
( x+i )=10;
(( a + i ) + j )
8.2 Apuntadores
86
8.3 Archivos
87
Intercambio Incorrecto
Intercambio correcto
int tmp ;
tmp = x ;
x = y;
y = tmp ;
int tmp ;
tmp = x ;
x = y ;
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
8.3 Archivos
88
8.3.1
Archivos en C
8.3 Archivos
89
// 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
{
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
90
8.3 Archivos
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
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
91
8.3 Archivos
92
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
end program
8.4
Ejercicios
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
94
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
#include <stdio.h>
#include <stdio.h>
int_pointer = &count;
x = *int_pointer;
*char_pointer = '(';
printf ("%c %c\n", c, *char_pointer);
return 0;
(a)
Program 11.1 Output
(b)
Program 11.2 Output
count = 10, x = 10
/ /
( (
3.
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,
int count =segmento
10, x, *int_pointer;
El siguiente
de codigo ejemplifica el uso
de that
apuntadores
automeaning
whatever valueyisoperadores
stored inside thisde
variable
should be treated as an indire
reference
(pointer)
to
a
character.
Notice
that
you
can
assign
an initial value to this vari
Next, the address
operator isla
applied
to the variable
count.This has theCu
effectaof
creating
incremento.
Siguiendo
secuencia
de instrucciones,
l es
el valor
(contenido)
able intothe
fashion.The
value that
you assign to de
char_pointer in the program
a pointer to this variable, which is then assigned by the program
thenormal
variable
a pointer to the variable c, which is obtained by applying the address operator to the
cada
variable. ?
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 refx = *int_pointer;
erenced in an expression.)
declaration
of the variable char_pointer and the assignment of its initial value
proceeds as follows:The indirection operator tells the C systemThe
to treat
the variable
could
have
been
equivalently
expressed in two separate statements as
int_pointer as containing a pointer to another data item.This pointer is then used to
DCI - DIQEB,
Universidad de Guanajuato char *char_pointer;
access the desired data item, whose type is specified by the declaration
of the pointer
char_pointer
= &c;
variable. Because you told the compiler that int_pointer points
to integers
when you
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
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 ;
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 ) ;
}
96
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.