LIBRO - Programacion C
LIBRO - Programacion C
LIBRO - Programacion C
Medina
LENGUAJE C
Ken Thompson desarrolló un mini sistema UNIX con el lenguaje B. Dennis Ritchie revisa
el lenguaje B y crea el lenguaje C en los Laboratorios Bell de la AT&T , en 1972.
En 1978 Brian Kernighan y D. Ritchie publican el lenguaje C y lo hacen popular
ESTRUCTURA DE UN PROGRAMA EN C
Un programa básico
#include <stdio.h>
int main()
{
/* Aquí va el cuerpo del programa */
printf( "Hola mundo\n" );/* Esto imprime hola mundo en pantalla
*/
return 0;
}
#include <stdio.h>
#include se llama una directiva. Sirve para indicar al compilador que incluya otro
archivo. Cuando en compilador se encuentra con esta directiva la sustituye por el
archivo indicado. En este caso es el archivo stdio.h que es donde está definida la
función printf, que se verá más adelante.
int main()
Es la función principal del programa. Todo programa de C debe tener una función
llamada main. Es la que primero se ejecuta. El int (entero) que la precede, significa
que cuando la función main termina devolverá un valor entero. Normalmente este
valor será 0 si todo ha ido bien, o un valor distinto si se ha producido algún error. De
esta forma si el programa se ejecuta desde otro el programa 'padre' sabe como ha
finalizado, si ha habido errores o no.
Se puede usar la definición 'void main()', que no necesita devolver ningún valor. A lo
largo del curso veremos muchos ejemplos con el uso 'void main' y falta el return 0.
Son llaves que indican el comienzo de bloque de sentencias o de una función, en este
caso la función main.
/* Este es un comentario
que ocupa dos líneas */
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
printf es una función de salida, muestra un mensaje por la pantalla. Al final del
mensaje "Hola mundo" aparece el símbolo '\n'; este hace que después de imprimir el
mensaje se pase a la línea siguiente.
El ";" del final de cada sentencia es la forma que se usa en C para separar una
sentencia de otra. Se pueden poner varias en la misma línea siempre que estén
separadas por ; .
return 0;
Cierre de llave, indica el término del bloque de sentencias o término de una función,
en este caso el término de la función principal. Todos los programas finalizan cuando
se llega al final de la función main.
Conceptos Básicos
En la escritura de un programa se pueden utilizar letras mayúsculas, minúsculas, dígitos y
símbolos especiales. Las funciones propias del C, como main y printf del programa
anterior, deben ser escritas en minúscula al igual que las palabras reservadas del lenguaje.
Identificadores
Es un nombre que se da a un elemento del programa (variable, función, arreglo, etc.).
Está formado por letras y dígitos donde el primero de ellos es una letra o el símbolo
carácter _. El lenguaje C diferencia entre las letras mayúsculas y minúsculas.
No se pueden poner más que letras de la 'a' a la 'z' (la ñ no vale), números y el
símbolo '_'. No se puede poner acentos, signos de exclamación, interrogación,
operadores aritméticos, u otros.
Palabra reservada
Es un identificador que tiene un significado en el lenguaje y sólo sirve para ser
utilizado para su propósito.
Las palabras reservadas en C++ son :
_seg short
_seg _cs cdelc near _interrupt
continue void far unsigned return
default private asm for do
firend _loadds _esport _ss _ds
float register goto sizeof double
inline typedef delete volatile exterm
operator struct protected enum case
template const float break if
union long this public else
while switch new auto interrupt
Tipos de datos
TipoDato variable[,lista_var];
Ejemplo:
double a,b;
char respuesta ;
unsigned int x4 ;
Las variables pueden ser de distintos tipos dependiendo del tipo de dato que se quiera
ingresar. No es lo mismo almacenar un nombre que un número. Hay que recordar
también que la memoria de la computadora es limitada, así que cuando se almacena
un dato, se debe usar sólo la memoria necesaria.
Tipo char
Las variables de tipo char sirven para almacenar caracteres. Los caracteres se
almacenan en realidad como números del 0 al 255. Los 128 primeros (0 a 127) son el
ASCII estándar. El resto es el ASCII extendido y depende del idioma y de la CPU.
Declaración de una variable de tipo char :
char letra;
o
char respuesta, ch;
En una variable char sólo se puede almacenar solo una letra, no se puede almacenar
ni frases ni palabras. Las frases se verán más adelante (cadenas). Para almacenar un
dato en una variable char se tienen dos posibilidades:
letra = 'A';
o
letra = 65; /*significa el número del la Tabla ASCII del carácter ‘A’*/
unsigned char significa sin signo modifica el rango de valores que puede contener
una variable. Sólo admite valores positivos.
Esta variable en vez de tener un rango de -128 a 128 pasa a tener un rango de 0 a
255.
Para declarar una cadena de caracteres, se debe indicar la cantidad de caracteres que
se quiere almacenar, de la siguiente forma:
char nombre[30]; o
char linea[]=”esto es una línea de caracteres”;
Tipo int
En una variable de este tipo almacena números enteros (sin decimales). El rango de
valores que admite es -32767 a 32768. Cuando se define una variable int, lo que se
está haciendo es decirle al compilador que reserve una zona de la memoria para
almacenar datos de tipo int. Para almacenar el valor se necesita 16 bits de la memoria
del ordenador (215=32768). Para poder usar una variable primero hay que declararla
como:
int numero;
y se asigna un valor
numero=24;
Tipo float
En este tipo de variable se almacenan números decimales, no sólo enteros como en
los anteriores. El rango de posibles valores es del 3,4E-38 al 3,4E38.
Declaración de una variable de tipo float:
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
float numero;
asignación:
numero=3.141516;
Tipo double
En las variables tipo double se almacenan números reales del 1,7E-307 al 1,7E308.
Se declaran como:
double numero;
Constante
Una constante tiene un valor que no se puede cambiar durante la ejecución del
programa.
Definición de Constante Simbólica
Una constante simbólica es un nombre que el pre-procesador sustituye por una
secuencia de caracteres
Por ejemplo:
#define PI 3.1416
#define LARGO_M AX 100
Ejemplo:
#include <stdio.h>
#define PI 3.1416
int main()
{
int radio ;
float perimetro;
radio = 20;
perimetro = 2 * PI * radio;
printf( "El perímetro es: %f", perimetro );
}
Tipos de constantes
• Constante Entera :
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Es un número con un valor entero. Puede ser escrita en los tres sistemas numéricos:
Decimal : Combinación de dígitos 0,1,2,.....9
Octal : Digitos 0,1,2,...y 7, el primero debe ser 0
Hexadecimal : Dígitos 0,1,2....,7, A, B, C, D, E, y F, el primero debe ser 0X
Ejemplo
#define MAYOR_DE 18
#define TRUE 1
#define MASCARA 0XA3D
Ejemplo :
#define K 07777U
#define VALOR_CLAVE 0X500000L
#define CONSTANTE 123456789UL
Ejemplo :
#define X 1.0
#define Pi 3.14156
#define COTA 4.1e-12
• Constante Carácter
Son constantes que contienen un carácter.
Ejemplo :
#define RESPUESTA_AFIRMATIVA ‘S’
#define ESPACIO_BLANCO ‘‘
Ejemplo :
#define TITULO “Programación de Computadoras”
• Secuencias de Escape
Son secuencias de caracteres que siempre comienzan con \ y seguido de uno
o más caracteres especiales.
\a sonido \b retroceso
\f fromfeed \n nueva línea
\r retorno de carro \t tabulador hor.
\v tab vertical \\ backslash
\’ apóstrofe \” comillas
\? interrogación \0 nulo
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ejemplo:
#define RETORNO ‘\n’
Asignación
*0 Simple
Con una asignación se puede dar un valor inicial a una variable.
Identificador = expresión
Obs :
El valor del resultado de la expresión del lado derecho se convierte al tipo de
dato del identificador del lado izquierdo.
- Punto flotante (float) se trunca al ser asignado a un entero (int)
- Doble precisión (double) se redondea a punto flotante (float).
- Entero (int) es alterado a un entero corto (short int) o a carácter (char).
*1 Múltiple
OPERADORES
Un operador permite manipular datos. Los hay de varios tipos; aritméticos, de asignación,
de relación, lógicos, y de manipulación de bits.
<variable><operador> o, <operador><variable>.
Signo (-)
Se utiliza para cambiar de signo. Anteponiéndolo delante de una variable o
constante equivale a multiplicarla por -1.
Ejemplo:
#include <stdio.h>
int main()
{
int a, b;
a = 5;
b = -a;
printf( "a = %d, b = %d\n", a, b );
return 0;
}
Operadores Aritméticos
Los operadores aritméticos son:
+, -, *, /, %
Su sintaxis es:
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
binarios:
<variable1><operador><variable2>
Suma (+)
Este operador permite sumar variables o constantes numéricas.
Ejemplo:
#include <stdio.h>
void main() {
int a , b, c;
a=2;
b=3;
c = a + b;
printf ( "Resultado = %i\n", c );
}
Resta(-)
Este operador permite sumar variables o constantes numéricas.
Ejemplo:
#include <stdio.h>
#define K 10
void main() {
int a , b;
a=2;
c = a - K;
printf ( "Resultado = %i\n", c );
}
Multiplicación (*)
Este operador permite multiplicar variables o constantes numéricas.
Ejemplo:
#include <stdio.h>
#define PI 3.14
void main() {
int radio,altura;
float volumen;
radio=20;
altura = 10;
volumen= PI*radio*radio*altura;
printf ( "Resultado = %f\n", volumen );
}
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
División (/)
Este operador funciona al igual que los anteriores pero se debe tener cuidado. Si se
dividen dos números en punto flotante (tipo float) se tiene la división con sus
correspondientes decimales. Pero si se dividen dos enteros se obtiene un número
entero. Es decir 4/3 se tiene como resultado 1. El redondeo se hace por
truncamiento, simplemente se eliminan los decimales y se deja la parte entera.
Si se dividen dos enteros el resultado es un número entero, aunque se saque por
pantalla usando %f o %d no se obtiene la parte decimal.
Ejemplo:
Observaciones:
• Si dos operando son de punto flotante de distinta precisión el resultado se
expresa en la notación más alta.
• Si un operando es de punto flotante y el otro entero o carácter el resultado se
convierte al mayor
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
• Conversión de tipo
Se puede convertir el resultado de una expresión a un tipo de dato
diferente.
(tipoDato)expresión
Ejemplo :
#include <stdio.h>
#define PI 3.14
void main() {
int x,r;
double d;
x = 20;
d = 10.5;
r = ((int)(x+d)%4);
printf ( "Resultado = %d\n", r );
}
• Prioridad
* / % mayor
+ - menor
Ejemplo :
Si a=1.0, b=2.0, c=3.0 y d=4.0 entonces a-b/c*d es -1.66666.... Esto
se calcula de la siguiente manera : a-((b/c)*d)=1-((2/3)*4).
Se puede utilizar también los paréntesis para dar otra prioridad que la
establecida.
Operador de asignación
La mayoría de los operadores aritméticos binarios explicados anteriormente
tienen su correspondiente operador de asignación:
+= Suma
-= Resta
*= Multiplicación
/= División
%= Módulo (resto)
sintáxis
Ejemplo :
i+ = 5 ; /*es equivalente a escribir i= i+5; */
j * = (i-2) ; /* es equivalente a escribir j = j*(i-2); */
Operadores relacionales
Estos operadores se utilizan para comparar y formar expresiones lógicas que pueden
tener los valores verdadero (valor no 0) o falso ( valor 0).
En C existen seis operadores relacionales básicos:
< menor
<= menor o igual
> mayor
>= mayor o igual
== igual
!= distinto
Ejemplo:
Se desea escribir la expresión
Si la edad de una persona es mayor de 18 años.
int edad;
…….
if ( edad >18) ……. /* la sentencia if se estudiará más adelante */
…….
No sólo se pueden comparar variables, también se pueden comparar constantes.
Ejemplo:
Si el usuario ingresó una respuesta afirmativa
if( respuesta==SI) …..hacer algo
Operadores Lógicos
Estos operadores son conectivos lógicos. Permiten combinar expresiones lógicas
individuales para formar otras más complejas.
&& and
|| or
! not
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Tabla de verdad
p !p q p&&q p||q
1 0 1 1 1
1 0 0 0 1
0 1 1 0 1
0 1 0 0 0
Ejemplo :
Se desea escribir la expresión
Si la edad de una persona está comprendida entre 20 y 30 años.
int edad;
…….
if ( edad >=20 && edad<=30) …hacer algo….
…….
Operador condicional
Ej. : (x>=0) ? x : -x
Función printf()
La función printf, que sirve para mostrar información por pantalla, tanto de valores
numéricos, caracteres y cadena de caracteres.
printf(FormatoControl, listaVariables);
Longitud: especifica la longitud máxima del valor que aparece por pantalla. Si la
longitud es menor que el número de dígitos del valor, éste aparecerá ajustado a la
izquierda.
l/L: se utiliza l cuando se trata de una variable de tipo long y L cuando es de tipo
double.
Función scanf()
scanf(FormatoControl, listaVariables);
La función scanf() permite el ingreso de datos desde el teclado y asigna el valor a una
variable.
En la cadena de control se indican los modificadores que harán referencia al tipo de
dato de los argumentos. Al igual que en la función printf los modificadores estarán
formados por el caracter % seguido de un caracter de conversión.
Función getchar()
la función getchar() retorna el carácter leído desde la entrada estandar.
La referencia de la función es:
ch=getchar();
Función putchar()
Esta escribe un solo carácter en la salida estándar.
putchar(ch);
Ejemplos:
#include <stdio.h>
int main(){
char letra;
Función gets()
Permite leer una cadena de caracteres desde teclado. El último carácter es la secuencia de
escape ‘\n’.
La función gets() ofrece una alternativa sencilla que la función scanf(), con la diferencia
que acepta un argumento.
gets(linea);
Donde línea debe ser declarado como una cadena de caracteres; char linea[80];
Función puts()
Permite escribir en pantalla una cadena de caracteres hasta encontrar la secuencia de escape
carácter nulo
puts(linea);
Función getch()
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
ch=getch();
Ejemplo
#include <stdio.h>
#define K 32
void main()
{
float grados_C, grados_F ;
printf(”Ingrese grados Fahrenheit \n” );
scanf(“%f”,&grados_F) ;
grados_C = (5. / 9. )*(grados_F - K) ;
printf(“La temperatura de %4.2f grados
Fahrenheit \n equivale a %3.1f grados Celsius \n”,
grados _F, grados_C “);
Otras funciones en C
El lenguaje C contiene un número de funciones de biblioteca que realizan operaciones o
cálculos de uso frecuente. Estas funciones no son parte del lenguaje. Algunas retornan un
tipo de dato, otras realizan una cierta tarea o bien permiten comparar datos.
Estas funciones se encuentran agrupadas en diferentes archivos dependiendo de su
propósito. Estos archivos son parte del compilador de C y no existe una normalización
respecto a todas las funciones, por lo tanto pueden existir algunas diferencias entre las
funciones entre las distintas versiones del lenguaje. Es necesario antes de usarlas, recurrir la
manual de referencia de su versión C que Ud. posee.
Algunas funciones más utilizadas son:
En math.h
En conio.h
• void clrscr(void): limpia la pantalla en modo texto
• int getch(void): captura un carácter desde teclado
• void gotoxy(x,y): posiciona el cursor en la posición (x,y) de la pantalla
• int kbhit(void): chequea si una tecla fue pulsada
• void textcolor(color): selecciona el color de escritura en modo texto
• int cprintf(argumento): al igual que printf() pero escribe con el color selecionado en
modo texto.
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Sentencias de control
Decisión
Este tipo de sentencias permiten variar el flujo del programa en base a determinadas
condiciones.
Sentencia IF
La sentencia de decisión simple if se utiliza para realizar un test lógico y a
continuación llevar acabo una acción dependiendo del resultado del test.
if ( expresión) sentencia
Obs : La sentencia será ejecutada si la expresión tiene un valor no nulo (es cierta).
Ejemplo:
#include <stdio.h>
void main() {
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
if (num == 10) printf( "El número es correcto\n"
);
}
if (expresión) {
sentencia1 ;
sentencia2 ;
.......
}
Ejemplos :
if (x >=0) printf(“ el valor es positivo \n”) ;
if (a>=’0’ && a<=’9’) printf (“La variable es un dígito \n”) ;
if ( ! x%2) printf(” Es un numero par \n” );
if (ch==‘\n’){
numlinea++;
printf( “Se contó una línea más\n”) ;
}
IF - ELSE
La sentencia de control de decisión, if-else, se utiliza para realizar un test lógico y a
continuación llevar acabo una de las acciones dependiendo del resultado del test.
if ( expresión)
sentencia_1
else
sentencia_2
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ejemplo:
#include <stdio.h>
void main() /* Simula una clave de acceso */{
int usuario,clave=18276;
printf("Introduce tu clave: ");
scanf("%d",&usuario);
if(usuario==clave)
printf("Acceso permitido");
else
printf("Acceso denegado");
}
Ejemplo:
int cantidadImpares,cantidadPares;
cantidadImpares=cantidadPares=0;
……..
if ( x%2 ) cantidadImpares++ ;
else cantidadPares++ ;
Decisiones anidadas
if ( expresión_1)
sentencia_1
else if ( expresión_2)
sentencia_2
else sentencia_3
if (expresión1) sentencia1;
if(expresión2) sentencia2;
else sentencia3;
..............................................
if (expresión1)
{ sentencia1;
if(expresión2) sentencia2;
}
else sentencia3;
Obs : El esle va con el if más cercano, al menos que las {} ( inicio y fin de bloque )
indiquen lo contrario.
Ej. : Realizar un programa para determinar el mayor de tres números ingresados por
el usuario
#include <stdio.h>
main()
{
int x,y,z,Mayor ;
scanf(“%d,%d,%d”,& x,&y,&z) ;
if ( x > y)
if ( x > z) Mayor = x ;
else
Mayor = z ;
else if ( y > z) Mayor = y ;
else
Mayor = z ;
printf( “ El número mayor es %d \n “ , Mayor) ;
return 0 ;
}
SWITCH
En ocasiones se necesita elegir entre varias alternativas. Este tipo de selección se
puede realizar mediante una cadena de if...else if ....else if.... else.... pero esto es más
conveniente realizarlo mediante la sentencia switch
Selección múltiple
switch(expresión){
case constante1: sentencia_1;[break;]
case constante2: sentencia_2; [break;]
.........................
[default: sentencia_n;]
}
Ejemplo :
......
printf(“Ingrese dos numeros \n” );
scanf(“%d, %d “,&x ,&y) ;
printf(“Pulse +, -,* o / para realizar la operación \n”) ;
ch=getch();
switch(ch){
case ‘+’: r = x+y ;break;
case ‘-’ : r = x-y ; break ;
case ‘*’: r =x*y ; break;
case ‘/’: if (y) r = x/y ;
else printf(“división por cero \n”) ;
break;
default: printf(“No conozco la operación %c \n”,ch);
};
......
Ejemplo:
............
ch=getch() ;
if((ch>=‘a’ &&ch<=‘z’)||( ch>=‘A’ &&ch<=‘Z’))
switch(ch){
case ‘I’:
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Repeticiones - Bucles
WHILE
while (expresión)
sentencia
La sentencia while permite repetir una sentencia cierta cantidad de veces mientras la
expresión sea cierta ( no 0).
Características
Las expresiones se verifican antes de entrar al cuerpo del ciclo.
Las variables deben estar definidas e inicializadas antes de ejecutar el ciclo
El bucle WHILE se ejecuta mientras la condición sea verdadera (no nulo).
Dentro del bucle debe existir una sentencia que modifique la expresión, pues
de lo contrario se crea un ciclo infinito
Si la expresión es nula al comenzar el bucle, este no se realizará
Tipos de bucles
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Por centinela
Variable que permite ser leída y procesada cada vez que el cuerpo del bucle
se ejecuta. Esta debe ser del mismo tipo que los datos que se están leyendo o
procesando pero su valor no debe corresponder a uno de ellos.
Ejemplo
printf(“Ingrese caracteres, pulse * para terminar”);
ch=getche(); /* ch variable centinela*/
while (ch!='*')
{
putchar(ch);
ch=getch(); /* la variable es leída en el interior del ciclo*/
};
....…
Ejemplo: Aplicando el concepto de ciclo controlado por centinela, realizar
un programa lea números enteros positivos, y muestre en pantalla el promedio de los
valores pares ingresados.
Por indicador
Una variable booleana que se utiliza para controlar el flujo lógico del bucle.
Esta variable permite registrar si se ha producido un suceso en el interior del
cuerpo del bucle.
Ejemplo
enum { FALSE,TRUE};
……
suma=0;
hayUnNegativo=FALSE; /*inicialización de variable indicador*/
while (! hayUnNegativo)
{
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
scanf(“%d”,&numero);
if (numero<0)
hayUnNegativo=TRUE; /* ocurrió suceso */
else
suma+=numero;
};
printf(“Total ingresado %d “,suma);
Ejemplo :
int n;
.........
n=32;
while(n>0){
--n/ = 2 ;
printf(“%d”, n+1) ;
}
Ejemplo:
.........
n=3 ;
i=3 ;
while(n) i- = n ;
........
Cuidado con las variables de punto flotante que conforman la expresión. Las
variables de punto flotante dependen del número de dígitos de precisión.
Ejemplo:
float x ;
x=1. ;
while( x !=1.1 ) x+ = 0.1e-30 ;
.....
Ejemplo :
....
int i ;
float x ,y ;
int i=1 ;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
while( i<10) {
y = sqrt(x) ;
if( x == y*y ) /* cambiar la expresión por x == sqrt(y)*sqrt(y) */
printf(“valor exacto \n”) ;
else printf(”No exacto \n” );
x/ = i ;
}
......
DO - WHILE
La sentencia do-while permite repetir una sentencia una o más veces mientras la
expresión sea cierta ( no 0).
do
sentencia
while (expresión);
Ejemplo.
…………..
int n, sonIguales;
scanf(“%d”,&n);
contador=0;
do{
contador++;
printf(“valor del contador %d\n”, contador);
sonIguales = (contador == n)? 1 : 0;
}while (!sonIguales);
........
Ejercicio: ¿qué pasa si la línea contador++ se encuentra al final del cuerpo del
ciclo?
Características
Se garantiza que el cuerpo del bucle se ejecuta al menos una vez.
El término del bucle se produce cuando la expresión o condición de salida es
falsa.
do-while es un bucle con condición de salida. Esto significa que la sentencia
se realiza al menos una vez.
....
Obs : Las variables que componen la expresión pueden ser inicializada dentro del
bloque.
Ejemplo :
..........
scanf(“%d %d”,&x,&y) ;
z=0 ;
u=x ;
do{
z+=y ; u-- ;
}while (u)
.......
Estudie el ejemplo anterior si x=0.
Ejemplo:
N=10;
do while(++N<10);
Traza
Es el procedimiento de repetir ordenadamente en el tiempo los valores que van
tomando la variables para una determinada entrada.
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ej. :
#include <stdio.h>
void main()
{
int w,x,y,z ;
/* ingresar valores para x=2 e y=3 */
scanf(“%d %d “,&x, &y) ; //1
z=0 ; //2
while (x != 0) { //3
w=0 ; //4
while(w != y){ //5
z++ ; w++ ; //6
}
x--- ; //7
}
printf(“valor de z :%d”,z) ; //8
}
Traza w X y Z Observaciones.
1 2 3 Se ingresan por teclado los valores
2 0
3 2!=0 es verdadero
4 0
5 0 !=3 es verdadero
6 1 1 1 !=3 es verdadero
6 2 2 2 !=3 es verdadero
6 3 3 3 !=3 es falso se sale del ciclo (5)
7 1
3 1 !=0 es verdadero
4 0
5 0 !=3 es verdadero
6 1 4 1 !=3 es verdadero
6 2 5 2 !=3 es verdadero
6 3 6 3 !=3 es falso se sale del ciclo (5)
7 0
3 0 !=0 es falso se sale del ciclo (3)
8 Se escribe en salida estándar 6
FOR
La sentencia for reúne tres secciones separadas por “;” para controlar un bucle. La
inicialización se ejecuta una sola vez antes de entrar al ciclo y es utilizada
generalmente para dar un valor inicial a la variable de control del ciclo. Si el test es
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
El ciclo se repite mientras el test sea cierto. El ciclo for es un bucle con condición
de entrada. Es posible que no se ejecute ninguna vez la sentencia.
Ejemplos de ciclo for:
Ej. : pot = 1 ;
for(i=1; i <= exponente; i++) /*Forma progresiva */
pot*=base;
Ej. : pot = 1 ;
for(i=expomente; i >= 1; i--) /*Forma regresiva */
pot*=base;
Ej. : suma=0 ;
for( i=0 ; i <= n ;i+=2)
suma+=i ;
Ej. : mes=1 ;
for( deuda= 100000 ; mes<=12 ; deuda*=i)
{
mes++ ;
printf(“%f \n“,deuda );
}
Ejemplo. :
#include <stdio.h>
#define LIMITE 15
void main()
{
int contador ;
float suma, p ;
for( suma=0. , p=1. ; contador=1 ; contador <=LIMITE ; contador++,
p*=2)
{
suma+=1/p ;
printf(“Para %d el total es %f \n“, contador, suma) ;
}
}
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Se puede dejar una sección vacía, pero debe separarse por punto y coma con
respecto de las demás secciones. El test vacío se considera cierto por lo tanto
for(;;) es una repetición infinita.
BREAK y CONTINUE
La sentencia break fuerza la salida inmediata de un bucle for, do-while o while y
de la sentencia switch.
Ej. :
for( ; ; )
{
......
printf(“Pulse S para salir”);
ch= getch() ;
if(ch == ’S’) break ;
......
}
La sentencia continue produce un salto a la siguiente iteración del ciclo for, do-
while+ o while.
Ej:.......
while((ch=gethc())!=EOF) {
if(ch==‘\n’) continue; // salta a la siguiente iteración
putchar(ch);
}
Ejemplo.
#include <stdio.h>
void main()
{
int nc,np,nl;
char ch;
enum{No,Si};
int palabra=No;
nc=np=nl=0;
while((ch=getch())!=’*’ ){
if(ch==EOF) break;
nc++;
if (ch=='\n')nl++;
if(ch!=' '&& ch!='\n'&& ch!='\t'&& palabra==No){
palabra =Si;
np++;
}
if((ch==' '|| ch=='\n'||ch=='\t')&& palabra==Si)
palabra=No;
printf(“%c”,ch);
}
printf("Líneas %d y Palabras %d\n",nl, np);
}
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ejercicios
1.- Sea N un número entero positivo, considere sus divisores sin incluir N. El número se
dice:
• abundante si la suma de sus divisores es mayor que el número
• Deficiente si la suma de sus divisores es menor que el número.
Perfecto si la suma es igual al número
Diseñar un programa que permita clasificar los números comprendidos entre a y b ,
imprimiendo la cantidad de cada tipo.
2.- Existe un algoritmo para generar números pseudo aleatorios, que consiste en:
• Se entrega una semilla que es un número de 4 cifras y además es par.
• Se eleva este número al cuadrado y del resultado se sacan la cuatro cifras
correspondientes a las centenas, unidad de mil, decenas de mil y centenas de mil.
El número obtenido se escribe y se repite el proceso, utilizando este número como semilla.
Construya un programa que permita generar 100 números aleatorios teniendo en cuenta lo
siguiente:
a) Debe verificar que la semilla inicial sea par y de cuatro cifras.
b) Debe comprobar el número aleatorio recién obtenido con el que se obtuvo
anteriormente, si son iguales se detiene el proceso y enviar un mensaje que no se puede
continuar.
3.- Un computador sufrió un grave desperfecto que dejó inutilizable las operaciones
aritméticas de multiplicación y división enteras. Se estima que la reparación tomará más de
un mes por la ineficiencia del técnico. A fin de que el computador pueda seguir
funcionando se pide a los estudiantes de programación que diseñen un programa que
permita implementar tales operaciones, utilizando solo adiciones y sustracciones, las cuales
funcionan correctamente, de tal modo que al ingresar dos números N y M enteros positivos
el programa escriba:
a) el producto P=N*M por suma
b) el cuociente C=M div N por restas
obs: El programa deberá detectar y enviar un mensaje si existe división por cero
4.- La famosa agencia espacial PAZA, está planificando su próxima misión que consiste
en los siguiente: en la tierra existe una estación de control que por medio de un computador
tele opera (maneja a distancia) un robot que se instaló en el planeta Miércoles. Cada orden
de tamaño M que se transmite desde la tierra viaja vía satélite. Se sabe que existen N
satélites posibles por donde transmitir, cada uno con velocidad de transmisión Vk y que el
tiempo que se tarda en transmitir una orden a través de un satélite es:
TiempoK = M/Vk
Para que la comunicación sea eficiente, el sistema debe elegir el satélite que tarde el
mínimo tiempo en la transmisión.
Además, se sabe que una vez que la orden i-ésima llegue al robot, el tiempo que le toma en
procesarla viene dada por:
(i −1)!
T (i ) =
2i
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Dado las condiciones anteriores, realice un programa que calcule y escriba en pantalla el
tiempo total transcurrido desde que se envía la primera orden hasta cuando bel robot ha
procesado la última. Suponga que se envían R órdenes y que el tiempo total está dado por:
Tiempo total=(Tiempo de transmisión de R órdenes de tamañoM) + (Tiempo de procesamiento de R órdenes de tamaño M)
Obs:
• Los valores de cada una de las velocidades de los posibles satélites a emplear debe
leerse desde teclado.
• Las R órdenes que se transmiten tienen el mismo tamaño.
• Los valores de M,N y R son constantes.
Rutee el programa para valores de entrada 271 y 323. Explique que realiza el programa
Funciones en C
Introducción
Se han utilizado algunas funciones de librería de C para realizar ciertas operaciones
de uso común, como son las funciones de entrada y salida (scanf(),
printf(),getchar(), putchar() y otras) y funciones matemáticas como son sqrt(),
pow(), sin(), cos(), etc. C como otros lenguajes, permite que el programador pueda
crear sus propias funciones.
/* Cuerpo de la función */
Ejemplo.
/* factorial()es el identificador de la función */
long int factorial( int n) /* se recibe un valor entero y retorna un entero largo
*/
{
/* declaración de variables locales */
int i;
long int producto=1.0;
/* cuerpo de la función */
for(i=1; i<=n ;i++)
producto*=i;
/* valor que la función retorna al lugar de donde se invocó */
return producto;
}
Ejemplo.
void linea(void ) /* la función línea no recibe ni retorna valores */
{ /* sólo escribe una línea de asteriscos */
int i;
for(i=1; i<=LARGOLINEA;i++) putchar('*');
putchar('\n');
}
Ejemplo
/* retorna la cantidad de dígitos de un número entero*/
numeroDigitos(long int n)
{
int c=0;
do{
n=n/10;
c++;
}while( n>=0);
return c;
}
Llamada a función
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Se pueden realizar varias llamadas a una función desde diferentes partes del
programa.
No se puede llamar a la función principal main() desde otra función.
La llamada puede ser parte de una expresión o una sentencia, dependiendo si la
función retorna o no un valor. Por ejemplo la función factorial() puede ser parte de
una expresión ( o fórmula matemática) en la llamada.
Ejemplo:
void main()
{
.......
printf(“ Ingrese un valor entero \n”);
scanf( “%d”, &x);
y=0.5*factorial(x); /* se realiza una llamada a la función factorial() */
........ /* pasando x como valor actual */
}
Ejemplo:
void main()
{
.......
printf(“ Ingrese un valor entero \n”);
scanf( “%d”, &n);
/* se realiza una llamada a la función numeroDigitos () */
printf(“ la cantidad de dígitos de %d es %d ”,n, numeroDigitos(n));
........ /* notase que la llamada se realizó desde el argumento de otra
función*/
}
Si una función A realiza una llamada a otra función B, entonces la función B debe
ser declarada o definida antes que A. En caso contrario se debe declarar, dentro
del cuerpo de la función A, indicando que se utilizará la función B, la cual se
encuentra definida después de A. Esta declaración se llama declaración forward o
declaración por adelantado.
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
/* cuerpo de la función */
for(i=0; i<=n ;i++)
producto*=i;
Ejemplo 2.
#include<stdio.h>
long int factorial(int); /*declaración por prototipo */
void main()
{
int n;
.......
printf(“ Ingrese un valor entero \n”);
scanf( “%d”, &n);
y=0.5*factorial(n);
........
}
/* cuerpo de la función */
for(i=0; i<=n ;i++)
producto*=i;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
/* cuerpo de la función */
for(i=0; i<=n ;i++)
producto*=i;
/* valor que la función retorna al lugar de donde se invocó */
return producto;
}
Obs: La declaración por prototipo indica que la función será reconocida desde el
punto de su declaración hasta el resto del programa por las demás funciones. En
cambio la declaración por adelantado permite que la función sea reconocida solo
por la función que la declaró.
• Automática (auto)
Son variables que se declaran siempre dentro de la función y estas son locales a
la función. En este caso su ámbito es sólo el cuerpo de la función. Por ejemplo
la variable i o producto de la función factorial().
Cualquier variable declarada dentro de la función es interpretado como variable
automática y no es necesario anteponerle la palabra auto.
Las variables automáticas definidas en funciones diferentes son independientes
entre sí incluso si tienen el mismo nombre. Por ejemplo la variable n en el
ejemplo 2.
Las variables automáticas se crean en el momento que se hizo la llamada y son
destruidas cuando la ejecución del programa hace abandono de la función, por
lo tanto su contenido se pierde y no puede ser usado posteriormente.
• Externas (extern)
Estas no están confinadas a una función y se reconocen como variables globales.
Son declaradas fuera de las funciones y su ámbito se extiende desde el punto de
su declaración hasta el resto del programa.
La declaración de una variable externa es idéntica que una variable normal con la
diferencia que se encuentra fuera de una función.
Se puede acceder a una variable externa desde cualquier función, siempre que la
función esté dentro de su ámbito. Si se asigna un valor a una variable externa
dentro de una función, su valor permanece al termino de la ejecución de esta, y
su valor puede ser utilizado por otras funciones.
Si en la definición de la función, que utiliza una variable externa, precede a la
declaración de esta, en la función se debe incluir la declaración de la variable
externa anteponiendo la palabra extern seguido por su tipo y su identificador.
Formato
extern TipoDato IdentificadorVarExterna;
int y;
y=t++;
a=funcionB(y,1);
printf(“%d ,%d, %d \n”,a,y,z);
}
void main()
{
int x,y z;
x=a;
y=x++;
z=funcionB(y,x);
funcionA(x);
printf(“%d,%d,%d,%d\n”,x,y,z,a);
}
• Estáticas (static)
En un programa con un archivo simple las variables estáticas se define dentro de
las funciones y tiene el mismo ámbito que las variables automáticas.
Las variables estáticas se diferencian de la variables automáticas porque estas
retienen su valor durante el tiempo de ejecución del programa.
• Operador &
Formato
&IdentificadorVariable
Ejemplo.
#include <stdio.h>
void main()
{
int x,y;
x=45;
y=25;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
• Operador *
Formato
Tipodato *identificadorVariablePuntero;
Ejemplo.
#include <stdio.h>
void main()
{
int x; /* declaración de variable */
int *p; /* declaración de puntero */
x=45; /* definición de variable */
p=&x; /* obtención de la dirección de memoria de x*/
printf(“ la dirección de x es %d “, p);
printf(“\n y su contenido en esa dirección es %d “, *p);
*p= 25;
printf(“ \nSu contenido fue modificado y es %d “, *p);
*p= *p+3;
printf(“ \nSu contenido fue de nuevo modificado y es %d “, *p);
}
void main()
{
int a,b;
printf( “ingrese dos valores enteros \n”);
scanf (“ %d %d “, &a,&b);
printf(( “ Antes de llamar a swap1() a=%d y b=%d\n”,a,b );
swap1(a,b);
printf(( “ Después de llamar a swap1() a=%d y b=%d\n”,a,b );
swap2(&a,&b);
printf(( “ Después de llamar a swap2() a=%d y b=%d\n”,a,b );
}
Ejercicios: Realizar la traza de los siguientes programas.
1.-
# include <stdio.h>
int d=3;
int p;
void algo(int *j)
{
int y,i,k;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
y=10;
* j=(*j+y)%3; p=0; k=*j;
for(i=0; i<k; i++){
*j=d-p;
printf(“%d, %d”, y,*j);
}
}
void que_hace(int *x, int *y, int z)
{
int t;
t=*x+2; *x=t+1; z=*x+3; * y= t;
printf(“%d, %d, %d,%d “, t,*y, *x,z);
}
void main()
{
int x,y,z;
x=2; y=1; z=0;
printf(“%d, %d, %d”,x,y,z);
que_hace(&x,&y,z);
printf(“%d, %d, %d”,x,y,z);
algo(z);
printf(“%d”,z);
}
2.-
#include <stdio.h>
int b,c;
void r( int x, int y, int *z)
{
*z= x+y+*z; x=y;
printf(“%d, %d, %d”,x,y,*z);
}
printf(“%d,%d,%d”,a,b,c)
}
Ejercicio: Escribir una función digito(n,k) que entregue el valor del dígito que está k
posiciones desde la derecha del número n.
Ejercicio: Escriba una función simetrico(n) que entregue verdadero si las cifras del número
tienen simetría respecto de su centro, en caso contrario retorne falso. Por ejemplo:
simetrico(12345) falso simetrico(123321) verdadero simetrico(2) verdadero
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Arreglos
Nota
Ej. :
int x[10] ; /* Contiene 10 elementos c/u de tipo entero */
float y[300] ; /* Contiene 300 elementos c/u de tipo float */
char ch[40]; /* Contiene 40 elementos c/u de tipo char */
Ej. :
#define MAX 400
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
.........
int X[MAX] ;
Para asignar valores a los elementos de un arreglo se debe calcular el valor del
índice y luego accesar a la estructura y asignar el valor del elemento
correspondiente.
NombreArreglo[índice] = valor ;
Ej. :
X[3]=6 ; // En la cuarta posición del arreglo se asigna el valor 6
Para ingresar valores a un arreglo se puede utilizar un ciclo for, do-while o while
donde la variable índice comience desde 0.
Ej. :
#define MAX 20
.......
int x[MAX] , i ;
for(i=0 ; i<MAX ; i++)
scanf(“%d”,x[i ]); // se lee el valor de la entrada estándar y se asigna en el
arreglo x
.........
donde valor_1 será asignado al primer elemento del arreglo, valor_2 será asignado
al segundo elemento del arreglo y así sucesivamente.
Ej. :
int digitos[10] ={0,1,2,3,4,5,6,7,8,9} ;
float x[8] ={-0.34, 1.54, 2., 3.15} ; /* Al resto de los elementos se le asigna 0*/
char digito[10] = {‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’};
C=A+B ; // ilegal
Consiste en revisar cada elemento del arreglo con un valor a buscar partiendo desde
un extremo. Si el elemento i del arreglo coincide con el valor a buscar se detiene la
búsqueda en caso contrario se continua hasta llegar al final del arreglo. Es necesario
utilizar una variable que indique cuando detener la búsqueda.
enum{ FALSE,TRUE} ;
int i , SeEncontro ;
......
i=0 ;
SeEncontro=FALSE ;
while( (! SeEncontro) && (i<MAX) )
if( A[i]==DatoBuscar) SeEncontro=TRUE ;
else i++ ;
if( SeEncontro) printf(“El dato se encuentra en la posición %d“, i) ;
else printf(“El dato no se encontró \n”) ;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
i=0 ;
while ( (DatoBuscar != A[i]) && (i<MAX) )i++ ;
if (i<MAX) printf(”El dato se encuentra en la posición %d“,i) ;
else printf(“El dato no se encuentra \n” );
Búsqueda binaria
TipoDato IdentificadorMatriz[Dimensión_1][Dimensión_2] ;
Ej.
float A[50][50] ; // arreglo de 50 fila por 50 columnas
int B[10][5] ; // arreglo de 10 filas por 5 columnas
Para recorrer una matriz se puede realizar por filas o por columnas. Si se realiza por
filas se debe tener una variable i que indique la fila en que se encuentra y una
variable j para recorrer todos los elementos de la fila. Por lo tanto para cada fila i se
recorre cada elemento j de la fila, donde 0≤ i<Número_de_Filas y
0≤ j<Número_de_Columnas, es decir:
for(i=0,i<MAX_FILAS ;i++)
for(j=0 ; j<MAX_COLUMNAS ; j++)
printf(“%f”,A[i][j] );
Para el recorrido de la matriz por columnas. En cada columna j se recorre todos los
elemento i de la columna, es decir :
A una matriz se le pueden definir valores iniciales. Estos valores deben estar en el
orden en que serán asignados a los elementos de la matriz.
Ej. :
int A[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ; // matriz de tres filas por 4 columnas
es equivalente de haber asignado
A[0][0]=1 ; A[0][1]=2 ; A[0][2]=3 ; A[0][3]=4 ;
A[1][0]=5 ; A[1][1]=6 ; A[1][2]=7 ; A[1][3]=8 ;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ej. :
int A[3][4]={ {1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12} } ;
Ej. :
int A[3][4]={ {1, 2, 3},
{4, 5, 6},
{7, 8, 9} } ;
1 2 3 0 es equivalente a
4 5 6 0
7 8 9 0
Nótese que no es lo mismo
int A[3][4]={1,2,3,4,5,6,7,8,9 } ;
ya que genera la matriz
1 2 3 4
5 6 7 8
9 0 0 0
Si existen más valores que la dimensión de la matriz se produce un error.
Los arreglos bidimensionales o matrices se procesan del mismo modo que los
arreglos unidimensionales o vectores sobre la base de elemento a elemento.
Arreglos Muldidimencionales
Ej. :
int A[10][20][30]={ { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} },
{ {13, 14, 15}, {16, 17, 18}, {19, 20, 21} } }
Los valores son asignados al arreglo de la siguiente forma :
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
Ej.
#include <stdio.h>
void promedio( int X[], int c)
{
int i, suma=0;
void main()
{
int A[10]={ 3,5,6,7,8,4,5,6,3,4};
int n;
printf(“Ingrese la cantidad de elemento que quiere calcular el promedio);
scanf(“%d”,&n);
promedio(A,n);
}
Ej.
#include <stdio.h>
#include <conio.h>
#define N 100
{
int i;
printf("\n");
for(i=0;i<l ;i++)
printf("%d ",A[i]);
}
void menu()
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
{
printf("\n\n Opciones\n\n");
printf("Imgreso\n");
printf("Promedio\n");
printf("Ordenar\n");
printf("Listar\n");
printf("Salir\n\n");
}
enum boolean {falso, verdadero};
void main()
{
char ch;
int i,n,A[N],COPIA[N];
int cantidad=0;
boolean salir=falso;
do{
menu();
printf("ingrese una alternativa");
switch(ch=getche()){
case 'I':case 'i':ingreso(A,&cantidad);break;
case 'P':case 'p': printf("Ingrese número de elementos \n");
scanf("%d",&n);
if(n>cantidad) printf("No hay tantos elementos \n");
else
printf("\nEl promedio de los %d primeros es %f \n ", n, calculoPromedio(A,n));
break;
case 'O':case 'o': for(i=0;i<cantidad;i++)
COPIA[i]=A[i];
ordenar(COPIA,cantidad);
break;
case 'L':case 'l': listar(A,cantidad);break;
case 'S':case 's': salir=verdadero;break;
default : printf("pulse sólo I,O,P,L o S\n");
}
}while( !salir);
}
Para el caso de una matriz se puede pasar una fila o columna o la matriz completa a
una función.
En los parámetros formales de la función se debe declarar la matriz como:
TipoDato IdentificadorMatriz[][Tamaño]
#include <stdio.h>
#define N 3
void main()
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
{
void mayorFila(int []),listar(int [][N]);
static int A[N][N]={ {2,4,5},{7,2,4},{3,5,6}};
int i;
Cadena de Caracteres
Es un arreglo unidimensional donde cada componente es de tipo carácter (char).
Toda cadena en C debe terminar con el carácter NULL (‘\0’) que indicará el
término de la cadena. Por lo tanto es necesario reservar el espacio de memoria
suficiente para almacenar el carácter NULL.
#include <stdio.h>
#include <stdlib.h>
/* ordena alfabéticamente una lista de cadenas este programa usa un array
bidimensional de caracteres */
void main()
{
int i, n = 0;
char x[10][12] , temp[12];
printf(“Ingresar cada cadena en una línea separada\n\n”);
printf(“Escribir FIN para terminar el ingreso\n\n”);
Estructuras
El arreglo es un tipo básico de estructura de datos cuyos elementos son todos del
mismo tipo. Un registro es un tipo de estructura donde los elementos individuales
pueden ser de distinto tipo de dato. Así un registro puede contener elementos
enteros, de carácter, de punto flotante, arreglos, incluso otras estructuras.
Definición de una estructura
Es necesario primeramente definir el patrón que tendrá la estructura a utilizar.
struct identificadorRegistro {
miembro1;
miembro 2;
.......
};
Ej.
struct FichaAlumno{
longint ROL;
char nombre[30];
int notaCat;
int notaLab;
};
Obs: Esta definición no es una variable donde se almacenarán los datos. Solamente
indicará el tipo de estructura ( forma) que tendrá la variable.
Ej.
struct FichaAlumno X,Y;
En este caso X e Y son variables que tienen la estructura de almacenaje del tipo
FichaAlumno. Es decir en X se puede almacenar el rol del alumno, su nombre y sus
notas.
struct identificadorEstructura{
miembro 1;
miembro 2;
........
} listaVariables;
Ej.
struct FichaAlumno{
longint ROL;
char nombre[30];
int notaCat;
int notaLab;
} X,Y;
También se pueden inicializar las variables del tipo struct al igual que se hace con
las variables simple y los arreglos.
Por ejemplo se puede inicializar la variable X de la siguiente forma
O bien
struct {
longint ROL;
char nombre[30];
int notaCat;
int notaLab;
} X={ 9921021, “Juana de Arco”, 70,70};
Notase que en este caso se omitió el identificador de la estructura
Para el caso de un arreglo donde los elementos del arreglo son de un tipo de
estructura, se declaran de la misma forma teniendo en cuenta que la variable es un
arreglo. Por ejemplo, para el caso de un curso.
#define N 45
struct FichaAlumno Alumno[N];
O bien
struct {
longint ROL;
char nombre[30];
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
int notaCat;
int notaLab;
} Alumno[N];
También puede ser inicializado el arreglo como:
IdentificadorVariable.miembro
Notase que el punto separa el nombre de la variable del nombre del miembro. De
esta manera se debe indicar en que variable y en que miembro se almacena el valor.
Ej.
X.notaCat=60;
Alumno[2].notaLab=50;
Los miembros de una estructura se pueden procesar al igual que las variables
simples. Por ejemplo
Printf( “ Alumno %s tiene %f“ , Alumno[i].nombre, Alumno[i].notaCat*0.9
+Alumno[i].notaLab*0.1);
X.ROL=Y.ROL;
strcpy(X.nombre,Y.nombre);
X.notaCat=Y.notaCat;
X.notaLab=Y.noatLab;
Ejercicio: Desarrolle un programa en C que permita ingresar el rol, nombre y notas de los
alumnos de un curso. El programa debe permitir mostrar en pantalla el nombre y su
promedio sabiendo que el promedio de cátedra tiene una ponderación de 80% y de
laboratorio 20%.
Se puede traspasar a una función una estructura completa o un miembro de ella ya sea por
valor o por referencia.
struct tipoRegistro {
char nombre[20];
int N_cuenta;
float saldo;
};
void espaciosblancos(int n)
{
int i;
for(i=1; i<=n ; i++)
putchar(' ');
}
void linea()
{
int i;
for(i=1; i<=LARGOLINEA;i++) putchar('*');
putchar('\n');
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
void main()
{
static struct tipoRegistro cliente[N]={
{"Pérez Juan", 111,300000},
{"Alfaro María",231,500000},
{"Fernández Pedro",432,100000},
{"Carvallo Carmelo",131,1000000}
};
int i;
float sumaSaldos=0.0;
for(i=0; i<N; i++){
mostrar(cliente[i]); /* se traspasa todo el registro i */
sumaSaldos+=cliente[i].saldo;
linea();
}
printf("Total saldo %f \n", sumaSaldos);
}
Nótese que la función listar() recibe un arreglo de registro que es traspasado por referencia,
pero en este caso no son modificados sus elementos, por lo tanto no es necesario pasar una
copia de él.
Ej.
#include <stdio.h>
#define N 4
struct tipoRegistro {
char nombre[20];
int N_cuenta;
float saldo;
};
void main()
{
static struct tipoRegistro cliente[N]={
{"Pérez Juan", 111,300000},
{"Alfaro María",231,500000},
{"Fernández Pedro",432,100000},
{"Carvallo Carmelo",131,1000000}
};
int n;
float sumaSaldos=0.0;
struct tipoRegistro {
char nombre[20];
int N_cuenta;
float saldo;
};
void main()
{
static struct tipoRegistro cliente[N]={
{"Pérez Juan", 111,300000},
{"Alfaro María",231,500000},
{"Fernández Pedro",432,100000},
{"Carvallo Carmelo",131,1000000}
};
int n;
float sumaSaldos=0.0;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
struct tipoRegistro {
char nombre[20];
int N_cuenta;
float saldo;
};
return(i);
}
for(i=0;i<N ;i++){
printf("\n%s\n",X[i].nombre);
printf(" cuenta %d \n", X[i].N_cuenta);
printf(" saldo %f \n", X[i].saldo);
}
}
void main()
{
static struct tipoRegistro cliente[N]={
{"Pérez Juan", 111,300000},
{"Alfaro María",231,500000},
{"Fernández Pedro",432,100000},
{"Carvallo Carmelo",131,1000000}
};
int p,cantidad=4;
Ej.
typedef int posicion;
En este caso posicion e int tienen el mismo significado para el compilador, es decir,
permiten declarar variables de tipo entero.
Ej.
posicion i; /* es equivalente a escribir int i*/
printf(“ingrese la posición del alumno en el listado”);
scanf(“%d”,&i);
printf/”%s”,Alumno[i].nombre);
Ej.
typedef float altura[100];
......
altura hombres, mujeres;
en este caso se define altura como arreglo de 100 elementos de punto flotante.
hombres y mujeres son arreglos de 100 elementos de punto flotante cada uno.
Ej.
typedef struc FichaAlumno Curso;
....
Curso Alumno[N];
Otra forma
typedef struct FichaAlumno RegistroAlumno[N];
.....
RegistroAlumno Alumno;
Archivos en C
FILE es un tipo especial de estructura (registro) que se encuentra definido en stdio.h. Esta
estructura es de la forma:
En ella se encuentra declarado un puntero al buffer, la dirección base del buffer de entrada
y salida, un número del archivo, etc.
Función fopen()
Una vez declarado el descriptor de archivo es necesario abrir el archivo e indicar cómo será
utulizado el archivo, si es sólo lectura, escritura o ambos. Para esto se utiliza la función
fopen()
Formato de uso:
PtroArchivo= fopen(nombreArchivo,modo)
NombreArchivo es una cadena de caracteres que representa el nombre del archivo que se
encuentra en el disco.
Modo representa la forma de cómo se trabajará con el archivo. Este modo puede ser:
• “r” permite leer desde un archivo existente.
• “w” crea un archivo de escritura. Si este existe el contenido será borrado.
• “a” permite agregar información al final del archivo de uno que existe
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
fopen() retorna NULL si hay un error en la apertura. Por ejemplo si el nombre es erróneo,
o si no existe el disco, o no existe el camino o path donde se encuentra el archivo, si se va
escribir y el disco está protegido, u otro error con el disco.
Función fclose()
Una vez utilizado el archivo este se debe cerrar. La función fclose() permite realizar esta
operación.
Forma de uso:
fclose(PtroArchivo).
Escritura en un archivo
Se puede escribir en un archivo secuencial al igual que la salida obtenida por las funciones
que permiten mostrar datos en pantalla.
Función putc()
Ej.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
char ch;
fp=fopen(“A:datos.dat”,”w”);
if(fp==NULL) { printf(“ERROR en la apertura del archivo\n”);
exit(0);
}
do{
ch=getche() /* se puede usar getchar() o getch() */
putc(ch,fp);
}while( ch!=’\n’);
fclose(fp);
}
Función fputc()
Es una función macro de putc(). Funciona forma análoga que la anterior.
Ejemplo:
Función fprintf()
Escribe una secuencia de caracteres, bajo un formato especificado de salida en un archivo
de texto, al igual de la función printf().
Formato
fprintf( descriptorArchivo,FormatoControl,listadeVariables);
Ejemplo.
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
struct tipoRegistro{
char nombre[20];
int creditoUF;
float tasaInteres;
};
void main()
{
FILE *fp;
struct tipoRegistro cliente;
char ch;
fp=fopen("datos.dat","w");
if(fp!=NULL){
do{
ch=getche();
fflush(stdin);
}while( toupper(ch)=='S');
fclose(fp);
}
else printf("Error en abrir archivo\n");
getch();
}
Observaciones:
Se debe tener en cuenta los espacios que están en el formato de control ya que estos serán
escritos en el archivo.
Función puts()
Escribe una cadena de caracteres en un archivo de texto.
Lectura de un archivo
Función getc()
Retorna el carácter leído desde un archivo de texto e incrementa el puntero al siguiente
carácter. Si llegó al final del archivo o detecto un error en la lectura del carácter retorna
EOF (End Of File).
Formato
int ch;
ch=getc(descriptorArchivo)
Ejemplo.
#include <stdio.h>
#include <conio.h>
void main()
{
FILE *fp;
int ch;
fp=fopen("datos.dat","r");
if(fp!=NULL){
ch=getc(fp);
while(ch!=EOF){
putchar(ch);
ch=getc(fp);
}
fclose(fp);
}
else printf("Error en abrir archivo\n");
getch();
}
Ej.
#include <stdio.h>
#define EOF -1
void main()
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
{
FILE *fp;
int ch;
if(( fp=fopen(“A:datos.dat”,”r”))!=NULL ) {
while( (ch=getc(fp))!=EOF )putchar(ch);
fclose(fp);
}
else printf(“ERROR en la apertura del archivo\n”);
#include <stdio.h>
#define EOF –1
void main()
{
FILE *in,*out;
char archLectura[30], archEscritura[30];
int ch;
printf(“ingrese nombre del archivo a leer\n”);
scanf(“%s”,archLectura);
printf(“Ingrese nombre del archivo a escribir \n”);
scanf(“%s”,archEcritura);
if(( in=fopen(archLectura,”r”))==NULL ) {
printf(“ERROR en la apertura del archivo\n”);
exit();
}
out=fopen(archEscritura,”w”);
while((ch=getc(in))!=EOF) putc(ch,out);
fclose(in);
fclose(out);
}
Ej.
#include <stdio.h>
//#define EOF -1
void main()
{
FILE *fp;
char s[50];
int ch;
if(( fp=fopen("A:datos.dat","r"))!=NULL ) {
while( (fgets(s,20,fp))!=NULL )puts(s);
fclose(fp);
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
}
else printf("ERROR en la apertura del archivo\n");
En los archivos de carácter también se pueden usar otras funcione tales como;
fprintf() y fscanf() que escriben y leen datos en forma análoga que printf() y scanf(), sólo
se requiere agregar como primer argumento el descriptor de archivo.
Función fscanf()
Lee datos con formato especificado desde un archivo de texto. Retorna EOF si llegó al final
del archivo o detecto un error de lectura
Ej.
#include <stdio.h>
//#define EOF -1
void main()
{
FILE *fp;
char s[50];
int n, suma=0;
if(( fp=fopen("E:\\basura\\datos.txt","r"))!=NULL ) {
while( fscanf(fp,"%d",&n)!=EOF ){
suma+=n;
printf("%d ",suma);
}
fclose(fp);
}
else printf("ERROR en la apertura del archivo\n");
}
Ejemplo
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct tipoRegistro{
char nombre[22];
int creditoUF;
float tasaInteres;
};
void main()
{
FILE *fp;
struct tipoRegistro cliente;
char c,cadena[25];
int uf,j=0;
float i;
fp=fopen("datos.dat","r");
if(fp!=NULL){
while(fgets(cadena,21,fp)){
fscanf(fp,"%d %f",&uf,&i);
Lenguaje C (Apuntes Versión Beta) Prof. H. Hoffmann y J. C. Medina
printf("%4d ",++j);
strcpy(cliente.nombre,cadena);
cliente.creditoUF=uf;
cliente.tasaInteres=i;
printf("%20s %10d %5.2f\n",cliente.nombre,cliente.creditoUF,cliente.tasaInteres);
getch();
};
fclose(fp);
}
else printf("Error en abrir archivo\n");
getch();
}
Operaciones con archivos