Sei sulla pagina 1di 20

Universidad de El Salvador

Facultad de Ingeniera y Arquitectura


Escuela de Ingeniera Elctrica
Introduccin a la informtica IIE-115

Reporte del Laboratorio N 9:


ANSI C: Estructuras y funciones

Instructor: Arturo Posada (Gracias por atendernos en los labs este ciclo )
Grupo de laboratorio N 2

Integrantes:

Carnet:

Hernndez Nieto, Jairo Alejandro


HN14001
Sorto Castillo, Jairo Josu
SC14009
Vargas Rosa, Sergio Manuel
VR14003
Roque Vidal, Jos Arnoldo (No se ha presentado a las ultimas 3 practicas)

Ciudad Universitaria, Viernes 19 de junio de 2015

Introduccin:
La presente gua est dedicada a explotar las virtudes de las estructuras y funciones en ANSI C lo
cual facilita y simplifica los programas ordenndolo de una forma ms esttica y entendible para las
personas externas que lo reutilicen.
Cabe destacar que esta gua consta claramente de dos partes, la primera est concentrada en l
trabaja de estructuras y typedef y, la segunda se dedica a funciones.
Con relacin a las estructuras se llega al clmax de los tipos de datos ya que con ellas se logra
integrar muchas caractersticas en un solo tipo nuevo de dato y, mejor aun con estos nuevos tipos
de datos se puede hacer arreglos unidimensionales y pluridimensionales, proporcionando as
varios grados de libertad para la explotacin de inmensurables cantidades de datos. Para
complementar se abordan las funciones que son la unidad bsica de programacin en ANSI C,
con las funciones se logra un cdigo modular y reutilizable, con ests dos caractersticas se obtiene
un cdigo fcil de corregir y depurar en el futuro as como tambin, velocidad en el desarrollo de
nuevas aplicaciones ya que se puede reutilizar las funciones previamente implementadas. As es
que con esta gua (que quizs es la ms importante que se ha desarrollado hasta ahora) se espera
que los alumnos exploren sus nuevas habilidades de ANSI C y las pongan en marcha y, que
tambin, vean sus limitaciones informticas y que las superen con sus propios cdigos.
A continuacin se presenta la asignacin y procedimiento del laboratorio N 8:

Objetivos:

Utilizar los arreglos estructuras y funciones en programas de ANSI C para la resolucin de


problemas.

puedan implementar propios tipos de datos utilizando struct y typedef.

Desarrollar programas modulares a travs de funciones hechas por nuestros propios medios
as como tambin usar y crear libreras.

Pgina 2 de 20

IIE-115

Ciclo 1-2015

Procedimiento:

Problema 1:
#include <stdio.h>
struct estructura_amigo
{char nombre[30], apellido[40];
char telefono[10];
int edad; float altura;
};
int main(int argc, char *argv[ ] )
{
struct estructura_amigo
amigo = { "Armando Esteba",
"Quito Parado",
"244-4444", 25, 1.75 };
printf("INTRO edad y altura: ");
scanf("%d %f", &amigo.edad, &amigo.altura );
printf( "%s %s tiene el %d aos tiene una altura de %.3fy se le puede contactar al
telefono %s .\n", amigo.nombre, amigo.apellido, amigo.edad,amigo.altura ,amigo.telefono);
return 0;
}
#include <stdio.h>
#define ELEMENTOS 3

Problema 2

struct estructura_amigo {
char nombre[30], apellido[40];
char telefono[10];
int edad; float altura;
};
int main(int argc, char *argv[ ] )
{
int num_amigo;
struct estructura_amigo amigo[ ELEMENTOS ];
for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
{
printf( "\nDatos del amigo numero %i:\n", num_amigo+1 );
printf( "Nombre: " ); fflush( stdout );
gets(amigo[num_amigo].nombre);
printf( "Apellido: " ); fflush( stdout );
gets(amigo[num_amigo].apellido);
printf( "Telfono: " ); fflush( stdout );
Pgina 3 de 20

IIE-115

Ciclo 1-2015

gets(amigo[num_amigo].telefono);
printf( "Edad: " ); fflush( stdout );
scanf( "%i", &amigo[num_amigo].edad );
while( getchar()!='\n' );
}
/* Ahora imprimimos sus datos */
for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
{
printf( "El amigo %s ", amigo[num_amigo].nombre );
printf( "%s tiene ", amigo[num_amigo].apellido );
printf( "%i anos ", amigo[num_amigo].edad );
printf( "y su telfono es el %s.\n" ,
amigo[num_amigo].telefono );
}
return 0;
}

Problema 3
#include <stdio.h>
#include <string.h>
typedef struct {
char codigo[ 15 ];
char nombre[ 25 ];
char apellido[ 25 ];
float saldo, deuda;
} CUENTA;
void leer_desde_teclado( CUENTA * );
void leer_desde_archivo( CUENTA *, char * );
void imprimir ( CUENTA );
void linea ( void );
int main ( void )
{
CUENTA juan;
leer_desde_teclado( &juan );
imprimir( juan );
return 0;
} // fin main

Pgina 4 de 20

IIE-115

Ciclo 1-2015

void leer_desde_teclado( CUENTA * A )


{
printf( "INTRO nombres : " ); fflush( stdout );
gets( A-> nombre );
printf( "INTRO apellidos : " ); fflush( stdout );
gets( A -> apellido );
printf( "INTRO codigo : " ); fflush( stdout );
gets( A -> codigo );
printf( "INTRO saldo y deuda : " ); fflush( stdout );
scanf( "%f%f", &A-> saldo , &A-> deuda );
while( getchar()!='\n' );
} // fin leer_desde_teclado
void leer_desde_archivo( CUENTA *A , char *archivo )
{
/*Debe ser implementada en el laboratorio, por lo que cada estudiante deber llevar su propia
versin*/
printf("\n\nQue da como tarea \n\n");
} // fin leer_desde_archivo
void imprimir ( CUENTA A )
{
linea( );
printf( "Apellidos // Nombres : %s%s \n" , A . apellido, A . nombre );
printf( "Saldo: %0.2f // Deuda : %0.2f ", A . saldo , A .deuda );
linea( );
} // fin imprimir
void linea ( void )
{
int k;
printf("\n");
for ( k=0; k<45; k++ )//ar aqu (primer uso en esta funci
printf("=");
printf("\n");
} // fin linea

Problema 4:
Pgina 5 de 20

IIE-115

Ciclo 1-2015

#include <stdio.h>
#include <string.h>
#define DIM 200
int k;
typedef struct {
char codigo[ 15 ];
char nombre[ 25 ];
char apellido[ 25 ];
float saldo, deuda;
}CUENTA;
void ordena_por_codigo ( CUENTA * );
int ascendente ( const void * , const void * );
int descendente( const void * , const void * );
void leer_desde_teclado( CUENTA * );
void leer_desde_archivo( CUENTA *, char * );
void cuenta_a_cero( CUENTA * );
void cuentas_a_cero ( CUENTA [ ] );
void imprimir ( CUENTA );
void imprimirtodas ( CUENTA [ ] );
void linea ( void );
int main ( void )
{
CUENTA microempresa [ DIM ] = {
{ "XXTd", "Artura Luis", "Barrango Esquina", 12., 32.},{ }, { }, { }, // Tres cuentas vacias
{ "XDEr3", "Rosita Linda", "Del Palomar", 653., 234.2 },{ }, { }, { }, { }, { }, // Cinco
cuentas vacias
{ "AZDEWd", "Rossy Quina", "Quimera Artica", 498., 309.3 }
};
printf( "Estado inicial del arreglo\n" );
imprimirtodas( microempresa );
printf( "\n\nEstado final del arreglo\n" );
ordena_por_codigo ( microempresa );
imprimirtodas( microempresa );
printf("\n\nFin de unidad\n\n");
return 0;

Pgina 6 de 20

IIE-115

Ciclo 1-2015

} // fin main
int ascendente( const void *a, const void *b ) // A - Z
{
return strcmp( (char *) a, (char *) b); }
int descendente( const void *b, const void *a ) // Z A
{
return strcmp( (char *) a, (char *) b); }
//En esta funcion se hace ordena el arreglo de estructuras
void ordena_por_codigo ( CUENTA *A )
{
qsort( A , // Direccion de inicio
DIM, //Cantidad de elementos
sizeof ( CUENTA ), // Tamango de un elemento
ascendente ); //En que orden
}// fin ordena_por_codigo
/*Borra e inicializa una cuenta*/
void cuenta_a_cero( CUENTA * A ) {
strcpy( A -> nombre , " " );
strcpy( A -> apellido, " " );
strcpy( A -> codigo , " " );
A -> saldo = 0.;
A -> deuda = 0.;
}// fin cuentas_a_cero
//Esta funcion borra los datos de las cuentas
void cuentas_a_cero( CUENTA A[ ] )
{
for ( k = 0; k < DIM; k++ )
cuenta_a_cero( & A[ k ] );
}// fin cuentas_a_cero
//Imprime todas las cuentas
void imprimirtodas ( CUENTA A [ ] )
{
for ( k = 0; k < DIM; k++ )
{
if ( A [k] . deuda + A[k] . saldo == 0. ) continue ;
else

Pgina 7 de 20

IIE-115

Ciclo 1-2015

{
printf("\n\nCuenta #%d\t\tCodigo: %s\n", k + 1, A [k] . codigo );
imprimir ( A [ k ] );
}
}
} // fin imprimirtodas
void leer_desde_teclado( CUENTA * A )
{
printf( "INTRO nombres : " ); fflush( stdout );
gets( A -> nombre );
printf( "INTRO apellidos : " ); fflush( stdout );
gets( A -> apellido );
printf( "INTRO codigo : " ); fflush( stdout );
gets( A -> codigo );
printf( "INTRO saldo y deuda : " ); fflush( stdout );
scanf( "%f%f", &A -> saldo , &A -> deuda );
while( getchar()!='\n' );
} // fin leer_desde_teclado
void leer_desde_archivo( CUENTA * A , char * archivo )
{
printf("\n\nQue da como tarea\n\n");
} // fin leer_desde_archivo
void imprimir ( CUENTA A )
{
linea( );
printf( "Apellidos // Nombres : %s %s \n" , A.apellido, A.nombre );
printf( "Saldo: %0.2f // Deuda : %0.2f\n", A.saldo , A.deuda );
linea( );
} // fin imprimir
void linea ( void )
{
int k;
for ( k=0; k<60; k++ )
printf("=");
printf("\n");
} // fin linea
Pgina 8 de 20

IIE-115

Ciclo 1-2015

Asignacin:
1. Hacer funciones que puedan realizar las siguientes operaciones con
matrices:
1. Suma,
2. Resta,
3. Multiplicacin,
4. Clculo del determinante para una matriz de nxn,
5. Clculo de transpuesta,
6. Multiplicacin por un escalar,
7. y Clculo de matriz inversa.
1. Suma:
void suma(float A[][MAX],float B[][MAX]){
int i,j,fil,col;
float C[MAX][MAX];
for(i=0;i<fil;i++){
for(j=0;j<col,j++){
C[i][j]=A[i][j]+B[i][j]; }}
for(i=0;i<fil;i++){
for(j=0;j<col,j++){
printf(%d\t,C[i][j]);
printf(\n); } }
}

2. resta:
void suma(float A[][MAX],float B[][MAX]){
int i,j,fil,col;
float C[MAX][MAX];
for(i=0;i<fil;i++){
for(j=0;j<col,j++){
C[i][j]=A[i][j]-B[i][j]; }}//solo cambia este signo
for(i=0;i<fil;i++){
for(j=0;j<col,j++){
printf(%d\t,C[i][j]);
printf(\n); } }
return C[i][j];
}

Pgina 9 de 20

IIE-115

Ciclo 1-2015

3. Multiplicacin
Void multiplicacion(float A[af][ac], float B[bf][bc]){
int C[af][bc];
int af, ac, bf, bc, i, j, k;
for(i=0;i<af;i++){
for(j=0;j<bc;j++){
C[i][j]=0;
for(k=0;k<ac;k++){
C[i][j]=(C[i][j]+(A[i][k]*B[k][j]));
}

for(i=0;i<af;i++){
printf("\n\t\t");
for(j=0;j<bc;j++){
printf(" %6d ", C[i][j]);

4. Calculo de determinante de una matriz de nxn


Float determiante(float A[][max]){
int i,j; int p;
float sum = 0;
float C[m][m];
for(i=0;i<m;i++){
for(j=0;j<m;j++){
printf("%f ",b[i][j]); }
printf("\n"); }
if(m==2){
printf("Determinant for m=2");
sum = b[0][0]*b[1][1] - b[0][1]*b[1][0];
return sum; } for(p=0;p<m;p++){
int h = 0,k = 0; for(i=1;i<m;i++){
for( j=0;j<m;j++){
if(j==p)
continue;
c[h][k] = b[i][j];
k++;
if(k == m-1)
{
h++;
k = 0;
}
} }
m=m-1;
Pgina 10 de 20

IIE-115

Ciclo 1-2015

sum = sum + b[0][p]*pow(-1,p) * determinant(c); }


return sum; }
}

5. Calculo de la transpuesta:
void trans(float A[][MAX]){
int i,j,fil,col; int B[MAX][MAX];
for(i=0;i<fil;i++) for(j=0;j<col,j++)
B[i][j]=A[j][i];
for(i=0;i<fil;i++){
for(j=0;j<col,j++){
printf(%d\t,B[i][j]);
printf(\n); } }

6. Multiplicacin por un escalar


float esc(float A[][MAX],float n){
int i,j,fil,col; for(i=0;i<fil;i++)
for(j=0;j<col,j++)
A[i][j]=n*A[i][j];
return A[i][j[; }

7. Clculo de matriz inversa


#include <stdio.h>
#include <math.h>
#define DIM 100 fl
oat determinante(float A[][DIM], int n);
void inversa(float A[][DIM], int n, float A_inv[][DIM]);
void main() {
float A[DIM][DIM],A_inv[DIM][DIM];
int n,i,j;
FILE* fsal;
fsal=fopen("datos.txt","w");
printf("Introduce la dimensin de la matriz:");
scanf("%d",&n);
printf("Introduce los elementos de la matriz por columnas\n");
for(j=0;j<n;j++){
for(i=0;i<n;i++){
Pgina 11 de 20

IIE-115

Ciclo 1-2015

scanf("%f",&A[i][j]); /*llamada a la funcin inversa*/


inversa(A,n,A_inv);
fprintf(fsal,"La matriz inversa es:\n");
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
fprintf(fsal,"%f ",A_inv[i][j]);
fprintf(fsal,"\n"); }
fclose(fsal); }
void inversa(float A[][DIM],
int n, float A_inv[][DIM]) {
float A_trasp[DIM][DIM];
float X[DIM][DIM];
int i,j,k,t; /*clculo de la traspuesta*/
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
A_trasp[i][j]=A[j][i];
for(i=0;i<n;i++)[
for(j=0;j<n;j++) {
for(k=0;k<i;k++) {
for(t=0;t<j;t++){
X[k][t]=A_trasp[k][t];
for(t=j+1;t<n;t++){
X[k][t-1]=A_trasp[k][t]; }
for(k=i+1;k<n;k++) {
for(t=0;t<j;t++){
X[k-1][t]=A_trasp[k][t];
for(t=j+1;t<n;t++){
X[k-1][t-1]=A_trasp[k][t]; }
A_inv[i][j]=(float)(pow(-1,(i+j+2)))*determinante(X,n -1)/determinante(A,n); }
}

Pgina 12 de 20

IIE-115

Ciclo 1-2015

2. Hacer una funcin que calcule el factorial de un nmero.


int fatorial(int n){
int k,fact;
fact=n;
k=n-1;
while(k>=1){
fact*=k; k=k-1;
}
printf(El factorial de %d es %d\n,n,fact); return fact; }

Pgina 13 de 20

IIE-115

Ciclo 1-2015

3. Hacer una funcin que calcule la raz cuadrada utilizando el mtodo de Newton.

float raiz(float n){


float r0;
double fact;
int k=1;
r0=n/2;
do{
fact=0.5*(r0+n/r0);
r0=fact;
k++;
}while(k<20);
printf(La raiz cuadrada de %f es %.8lf\n,n,raiz);
return 0; }

Pgina 14 de 20

IIE-115

Ciclo 1-2015

Problema 4:
Hacer una Base de Datos para una empresa de 100 empleados, donde estn categorizados por:
nombre completo, ISSS, NIT, DUI, NUP, nmero de empleado (cdigo: 00-xx es jefe, 01-xx es
ordenanza, 02-xx es operario, 03-xx vigilante, 04-xx cocinero) y salario dependiendo el cdigo. Los
datos se deben de mantener en un archivo binario, y al momento de cargar el programa, se debe
de crear la estructura respectiva, claro se debe usar memoria dinmica para agregar empleados o
despedir. Tambin se debe de tener un MENU, que despliegue en pantalla: Introducir empleado,
borrar empleado, mostrar datos de empleado (Cdigo, Nombre completo, nmero de ISSS,
nmero de NUP, nmero de DUI, calculo de salario con el detalle de descuentos), mostrar todos
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
char nombreEmp[40];
char dui[20];
char isss[20];
char nit[20];
char nup[20];
char num_emp[20];
float salario;
}datos;
void menu (char* nombreArchivo);
datos crearnombre();
void guardarnombre(datos nombre, char* nombreArchivo);
void mostrar(char* nombreArchivo, int x);
void tipo(int x);
void modificar (char* nombreArchivo);
void pausar();

int main (){


char nombreArchivo[12]="lista.bin";
menu(nombreArchivo);
return 0;
}
void menu(char* nombreArchivo){
int opcion, nom=0;
do {
system("cls");
printf("Ingrese una opcion:\n1. Introducir empleado\n2. mostrar datos de los empleados\n3. borrar
empleado\n4. salir\n");
Pgina 15 de 20

IIE-115

Ciclo 1-2015

scanf("%i",&opcion);
fflush(stdin);
if (opcion>0&&opcion<=4){
switch(opcion){
case 1:
guardarnombre(crearnombre(), nombreArchivo);
nom++;
break;
case 2:
system("cls");
mostrar(nombreArchivo, nom);
break;
case 3:
break;
case 4:
printf("Fin del programa\n");
pausar();
break;
}
}
else {
printf("Opcion no valida\n");
pausar();
}
} while (!(opcion==4));
return ;
}

datos crearnombre(){
datos nombre;
printf("\ningrese el Nombre del trabajador: ");
gets(nombre.nombreEmp);
fflush(stdin);
printf("\ningrese el DUI: ");
gets(nombre.dui);
fflush(stdin);
printf("\ningrese el NIT: ");
gets(nombre.nit);
fflush(stdin);
printf("\ningrese el ISSS: ");
gets(nombre.isss);
Pgina 16 de 20

IIE-115

Ciclo 1-2015

fflush(stdin);
printf("\ningrese el NUP: ");
gets(nombre.nup);
fflush(stdin);
printf("\ningrese el codigo de empleado: ");
gets(nombre.num_emp);
fflush(stdin);
printf("\ningrese el salario neto del empleado: ");
scanf("%f",&nombre.salario);
return nombre;
}
void guardarnombre(datos nombre, char* nombreArchivo){
FILE* file=fopen(nombreArchivo, "ab");
if(file==NULL){
system("cls");
printf("Error al intentar acceder al archivo");
pausar();
}
else {
fwrite(&nombre,sizeof(datos),1,file);
printf("Trabajador aadido\n");
pausar();
fclose(file);
}
}
void mostrar(char* nombreArchivo, int x){
char codigo[4];
int cod;
FILE* file=fopen(nombreArchivo,"rb");
if(file==NULL){
system("cls");
printf("Error al intentar acceder al archivo.");
pausar();
}
else{
datos nombre;
while(fread(&nombre,sizeof(datos),1, file)){
printf("Empleado: %s\n",nombre.nombreEmp);
printf("DUI: %s\n",nombre.dui);
printf("NIT: %s\n",nombre.nit);
printf("ISSS: %s\n",nombre.isss);
printf("NUP: %s\n",nombre.nup);
printf("codigo de empleado: %s\n",nombre.num_emp);
Pgina 17 de 20

IIE-115

Ciclo 1-2015

strncpy(codigo,nombre.num_emp,2);
cod=atoi(codigo);
tipo(cod);
printf("salario neto del empleado %0.2f\n\n",nombre.salario);
}
fclose(file);
printf("\n\n");
pausar();
}
}

void tipo(int x){


switch (x){
case 0:
printf("Cargo: JEFE\n");
break;
case 1:
printf("Cargo: ORDENANZA\n");
break;
case 3:
printf("Cargo: VIGILANTE\n");
break;
case 4:
printf("Cargo: COCINERO\n");
break;
default:
printf("Cargo: DESCONOCIDO\n");
break;
}
return;
}

void pausar(){
printf("Presione ENTER para continuar");
while (getchar() != '\n');
getchar();
}

Pgina 18 de 20

IIE-115

Ciclo 1-2015

Conclusiones:
-

Las estructuras y funciones nos ayudan para ordenar y agilizar un programa, optimizarlo para
ser ms verstil y con menos cdigo.

Quiz el mayor reto en la utilizacin de estructuras es el poner los smbolos propios de esta
funcin.

La estructuras nos ayudan a agilizar una base de datos o operaciones como la aritmtica de
complejos.

Bibliografa:
Zelaya, W. (2012) Introduccin a la Informtica. Ed. Imprenta Universitaria UES. San Salvador, pg., 147
al 167.

Sitios de Internet:

https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Estructuras_y_Uniones

http://c.conclase.net/curso/?cap=011%20
http://es.slideshare.net/carolina00/estructuras-en-c%20
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Instrucciones_de_control
http://www.pablin.com.ar/computer/cursos/c2/manc5.htm%20
http://es.slideshare.net/javi2401/funciones-en-c-presentation%20%20
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Uso_de_funciones

Pgina 19 de 20

IIE-115

Ciclo 1-2015

Anexos:
Memes sobre la programacion

Potrebbero piacerti anche