Está en la página 1de 19

Clase 1: Generalidades, estructura de un programa y funciones.

Declaracin char unsigned char int short int long int unsigned int unsigned short unsigned long float double long double void char ... [99] char* Tipos de datos Descripcin Formato Carcter %c Carcter %u Entero %d Entero corto %hd Entero largo Entero sin signo Entero corto sin signo Entero largo sin signo Real Real doble precisin Real 19 dgitos significativos Sin valor Cadena (no es un tipo) %ld %u %hu %lu %f %e %le %s Bytes 1 1 2 2 4 2 2 4 4 8 10 0 Rango -128 a 127 0 a 255 -32.768 a 32.767 Idem. int -2.147483.648 a 2.147483.647 0 a 65.535 Idem unsigned int 0 a 4294967295 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 3.4E-4932 a3.4E+4932

Smbolo () [ ] -> . ++ -- & * sizeof (tipo) * / % + < <= >= > == != ! && || ?: =

Operadores Descripcin asociar, ndices, campos auto incremento y decremento, direccin, indireccin, tamao en bytes (*) conversin de tipo producto, divisin, resto entero suma, resta menor, menor igual, mayor igual, mayor igual, distinto negacin y o condicional (*) asignacin (*)

En la tabla anterior el orden de la precedencia es de arriba hacia abajo. Si en una expresin se encuentran operadores de la misma prioridad, se evala de izquierda a derecha, salvo los marcados con (*) que se evalan de derecha a izquierda. Caracteres no representables Secuencia Descripcin \0 NUL (nulo) \n Salto de lnea \f Salto de pgina \t Tabulacin horizontal \ Apstrofo \ Comillas \\ Barra invertida
1 -

Algoritmos y Estructuras I - Programacin en C

Ejemplos de funciones que retornan un solo resultado: 1-Desarrollar una funcin entra que indique si un carcter es vocal
#include <stdio.h> #include <conio.h> #include <ctype.h> int esvocal(char letra); int main(void) { char letra; system(cls); printf("Ingrese una letra: "); scanf("%c", &letra); fflush(stdin); if (esvocal(letra)) printf("es una vocal"); else printf("NO es una vocal"); getch(); return 0; } int esvocal(char letra) { letra = toupper(letra); /*al ser letra parmetro valor, la modificacin no se registra en el parmetro actual*/ return ( letra =='A' || letra =='E' || letra =='I' || letra =='O' || letra =='U'); }

2-Desarrollar una funcin entera, que a partir de un entero N devuelva la suma de 1 a N.


#include <stdio.h> #include <conio.h> unsigned int suma(unsigned int n); int main(void) { int m; system(cls); printf("Ingrese un numero: "); scanf("%u", &m); printf("La suma es %u", suma(m)); getch(); return 0; } unsigned int suma(unsigned int n) { unsigned int aux, i; /*variables automaticas*/ aux= 0; for(i = 1; i <= n; i ++) aux += i; return aux; }

3-Desarrollar una funcin (real) que a partir de dos fracciones devuelva su suma
#include <stdio.h> #include <conio.h> float sumaf( int n1, int d1, int n2, int d2); int main(void) { int n1, d1, n2, d2; system(cls); printf("Ingrese numerador y denominador de la 1ra. fraccion: "); scanf("%d %d", &n1, &d1); printf("Ingrese numerador y denominador de la 2da. fraccion: "); scanf("%d %d", &n2, &d2); if (d1 * d2 != 0) printf("La suma es: %10.2f", sumaf(n1, d1, n2, d2)); else printf("No son datos validos"); getch(); return 0; } float sumaf(int n1, int d1, int n2, int d2) { return (float)(n1 * d2 + n2 * d1) / (d1 * d2); }

4- Modificar el ejercicio 3 para calcular la suma de varios pares de fracciones. Utilizar el resultado de la funcin scanf() para controlar el ciclo while, ingresando un * para finalizar.
#include <stdio.h> #include <conio.h> #include <ctype.h> int findatos(void); float sumaf(int n1, int d1, int n2, int d2); int main(void) { int n1, d1, n2, d2; system(cls); printf("Ingrese numerador y denominador de la 1ra. fraccion: "); while(scanf("%d %d", &n1, &d1)) { printf("Ingrese numerador y denominador de la 2da. fraccion: "); scanf("%d %d", &n2, &d2); printf("La suma es: %10.2f\n\n", sumaf(n1, d1, n2, d2)); printf("Ingrese numerador y denominador de la 1ra. fraccion: "); } return 0; } float sumaf(int n1, int d1, int n2, int d2) { return ((float)(n1 * d2 + n2 * d1)) / (d1 * d2); }

3 -

Algoritmos y Estructuras I - Programacin en C

5-Desarrollar una funcin entera que a partir de la medida de tres segmentos determine si forman tringulo. Utilizar esta funcin en un programa que lea un conjunto de datos (cada uno es una tripla, tres segmentos que pueden o no constituir un tringulo) calcule e imprima % de trngulos sobre el total de datos (triplas) ledos. Ejemplo : (3, 4, 6), (10, 12, 7), (2, 3, 8), (8, 8, 45), (16, 9, 20) 60%
#include <stdio.h> #include <conio.h> int estriangulo (float a, float b, float c); int main(void) { float a, b, c; int i, cant, conttrian; system(cls); printf(ingrese la cantidad de triplas); scanf(%d; &cant); conttrian = 0; for(i = 1; i <=cant; i++) { printf("Ingresar los 3 lados del triangulo: "); scanf("%f %f %f", &a, &b, &c); if (estriangulo (a, b, c)) conttrian++; } printf("El porcentaje es = %10.2f",(float)(conttrian * 100)/cant); getch(); return 0; } int estriangulo (float a, float b, float c) { return (a < b+c && b < a+c && c < a+b); }

Ejemplos de funciones que escriben o retornan mas de un resultado: 6-Leer dos valores reales, mostrar su suma y su producto, utilizar : 6_a - Funcin que a partir de dos valores reales imprima su suma y su producto 6_b - Funcin que a partir de dos valores reales devuelva su suma y su producto, el programa invocante imprime los resultados.
#include <stdio.h> /*6_a*/ #include <conio.h> void calculaimprime(float w, float z); int main(void) { float x, y; system(cls); printf("Ingrese dos numeros: "); scanf("%f %f", &x, &y); calculaimprime (x, y); /* invoca a la funcin */ getch(); /* x e y parmetros actuales */ return 0; } void calculaimprime(float w, float z) /* define la funcin */ { /* w y z parametros formales de entrada */ printf("La suma es = %10.2f\n", w + z); printf("El producto es = %10.2f", w * z); }

#include <stdio.h> /*6_b*/ #include <conio.h> void calcula(float w, float z, float *dsum, float *dprod); int main(void) { float x, y, sum, prod; system(cls); printf("Ingrese dos numeros: "); scanf("%f %f", &x, &y); calcula(x, y, &sum, &prod); /* invoca la funcin, con las direcciones de las variables que retornan resultados */ printf("La suma es = %10.2f\n", sum); printf("El producto es = %10.2f", prod); getch(); return 0; } /* define funcin, w y z parametros de entrada */ /* dsum y dprod son las direcciones de las variables que almacenaran suma y producto respectivamente*/ void calcula(float w, float z, float *dsum, float *dprod) { *dsum = w + z; *dprod = w * z; }

7 - Funcin que a partir de dos variables reales intercambia el contenido ..............


void intercambia (float *da, float*db) /* da y db son las direcciones de las variables a ser intercambiadas */ { float aux; aux =*da; *da = *db; *db = aux; }

8- Se tiene un conjunto de datos de los clientes de una compaa de electricidad, estos son: Cdigo de cliente Estado actual del medidor (en kw) Estado anterior del medidor Desarrollar un programa que lea de teclado los datos de los clientes, calcule el consumo, el importe e imprima las boletas. La boleta deber contener el nmero de usuario, la cantidad de Kw consumida y el importe. Para este ltimo considerar bsico fijo de $15 y ms un monto variable que depende del consumo, se establece una escala de valores para el precio por kw segn rangos de consumo: $0.54 consumo <=100 $0.48 100< consumo <=250 $0.37 250 < consumo Se muestran dos versiones: los datos ingresan de teclado los datos ingresan de archivo
5 -

Algoritmos y Estructuras I - Programacin en C

#include <stdio.h> #include <conio.h> void boleta (int estact, int estant, float *dimp, int *dcons); int main(void) { char codigo[10]; /* el nombre de un arreglo es una constante que indica la direccion de comienzo del mismo, */ int estact, estant, cons, i, n; float imp; // se ingresa desde un archivo system(cls); //se conoce la cantidad y se ingresa FILE *fp; printf("Ingresar cantidad de clientes: "); // por teclado fp= fopen(clientes.txt, r); scanf("%d", &n); while(fscanf (fp, %s %d %d, codigo, &estact, &estant)==3) for(i=1;i<=n;i++) { { boleta (estact, estant, &imp, &cons); printf("Usuario: "); scanf("%s", codigo); printf("Usuario: %s Consumo: %d Importe: %10.2f\n", codigo,cons, imp); printf("Estado Actual: "); scanf("%d", &estact); } printf("Estado Anterior: "); scanf("%d", &estant); fclose(fp); boleta (estact, estant, &imp, &cons); printf("Usuario: %s Consumo: %d Importe: %10.2f\n", codigo, cons, imp); } getch(); return 0; } void boleta (int estact, int estant, float *dimp, int *dcons) { float precio; *dcons = estact - estant; if (*dcons <= 100) precio = 0.54; else if (*dcons <= 250) precio = 0.48; else precio = 0.37; *dimp = 15 + *dcons * precio; }

Clase 2: Programas que utilizan VECTORES El siguiente programa lee un vector, calcula e imprime segn las opciones de un men: la suma de sus elementos la cantidad de nmeros pares los impares el mnimo otro vector con los elementos divisibles por k busca un valor x

#include <stdio.h> #include <conio.h> void leevector(int a[], int *dn); int suma(int a[], int n); int cuentapares(int a[], int n); void escpospares(int a[], int n); int minimo(int a[], int n); void generaotro (int a[], int n, int k, int b[], int *dm); int busca(int v[], int n, int x ); void escvector(int v[], int l); void menu (int *dop); int main(void) { /*programa principal*/ int n, m, k, x, op, pos; int a[20], b[20]; /*el nombre de un arreglo es una direccin constante, por lo tanto no se puede asignar a=b*/ system(cls); leevector(a, &n); do { menu(&op); switch (op) { case 1: printf("La suma de los elementos del arreglo es: %d\n", suma(a, n)); getch(); break; case 2: printf("La cantidad de elementos pares del arreglo es: %d\n", cuentapares(a, n)); getch(); break; case 3: printf("Elementos de las posiciones pares del arreglo\n"); escpospares(a, n); getch();break; case 4: printf("El minimo del arreglo es: %d\n", minimo(a, n)); getch(); break; case 5: printf("Ingrese un valor de K para seleccionar los multiplos de K: ");scanf("%d", &k); generaotro (a, n, k, b, &m);printf("Elementos de multiplos de %d\n", k); escvector(b, m); getch();break; case 6: printf("Ingrese un valor a buscar en el arreglo: "); scanf("%d", &x); pos = busca(a, n, x); if (pos == -1) printf("El valor no se encuentra en el arreglo\n"); else printf("El valor se encuentra en la posicion %d del arreglo\n", pos); getch(); break; } } while (op != 7); return 0; }

7 -

Algoritmos y Estructuras I - Programacin en C

void leevector(int a[], int *dn) { int i; //se conoce la cantidad y se ingresa por teclado printf("Ingrese la cantidad de elementos del vector<=20: "); scanf("%d", dn); for(i=0; i<*dn; i++) { printf("Ingrese el elemento %d: ", i+1); scanf("%d", &a[i]); } } int suma(int a[], int n) { int i, sum = 0; for(i=0; i < n; i++) sum += a[i]; return sum; } int cuentapares(int a[], int n) { int i, cont = 0; for(i=0; i < n; i ++) if (a[i] % 2 == 0) cont++; return cont; } void escpospares(int a[], int n) { int i; for(i=1; i < n; i+=2) printf("%d ",a[i]); } int minimo(int a[], int n) { int i, min = a[0]; for(i=1; i < n; i ++) if (a[i] < min) min = a[i]; return min; }

// se ingresa desde un archivo void leevector(int a[], int *dn) { FILE *fp; fp= fopen(numeros.txt, r); *dn=0; while(fscanf (fp, %d, &a[(*dn)++] )==1); (*dn)--; fclose(fp); } // se ingresa desde un archivo, otra versin void leevector(int a[], int *dn) { FILE *fp; fp= fopen(numeros.txt, r); *dn=0; while(! feof(fp)) fscanf (fp, %d, &a[(*dn)++] ); fclose(fp); }

void generaotro (int a[], int n, int k, int b[], int *dm) {int i; *dm= 0; for(i=0; i < n; i++) if (a[i] % k == 0) { b[*dm] = a[i]; (*dm)++; } } void escvector(int v[], int l) {int i; for(i=0; i < l; i ++) printf("%d ", v[i]); }

int busca(int v[], int n, int x) { int i = 0; while ( i< n && x != v[i] ) i++; if (i<n) return i; else return -1; } void menu (int *dop) { system(cls); printf("Menu de opciones\n"); printf("1 - Suma los elementos del arreglo\n"); printf("2 - Cuenta los elementos pares\n"); printf("3 - Imprime los elementos de las posiciones pares\n"); printf("4 - Calcula el minimo\n"); printf("5 - Genera un arreglo con los elementos multiplos de K\n"); printf("6 - Busca la posicion de un elemento en el arreglo\n"); printf("7 - Salir\n"); do { printf(" Ingrese su opcion: "); scanf("%d", dop); } while( *dop < 1 || 7 < *dop ); }

Intercalacin, fusin o mezcla de dos arreglos ordenados , resultando un tercero ordenado


void intercalacion (int v1[], int v2[], int n, int m, int v3[], int *dk) { int t, i = 0,j = 0; *dk = 0; while ( i<n && j<m) { if (v1[i] < v2[j]) { v3[*dk]= v1[i]; i++; } else if (v1[i] > v2[j]) { v3[*dk]= v2[j]; j++; } else /* inserta una sola vez. los elementos iguales */ { v3[*dk]= v1[i]; i++; j++; } (*dk)++; } for(t=i; t < n; t++) { v3[*dk]= v1[t]; (*dk)++; } for(t=j; t <m; t++) { v3[*dk]= v2[t]; (*dk)++; } }
9 -

Algoritmos y Estructuras I - Programacin en C

Lee el nombre y la edad de N personas , calcular e imprimir: Listado de nombres de las personas de mas de X aos. Porcentaje de las personas mayores de edad sobre el total. Obtener un arreglo que contenga los nombres de las personas con edad entre E1 y E2.
#include <stdio.h> #include <conio.h> #include <string.h> void leeparalelo ( char vnom[][25], int vedad[], int *dn); void listado(char vnom[][25], int vedad[] , int n,int x); float porcen(int vedad[], int n); void personas (char vnom[][25], int vedad[] , int e1,int e2, int n, char perso[][25], int *dk); void escribevec( char v[][25], int m); int main(void) { char vnom[10][25], per[10][25]; int vedad[10], k, x, e1, e2, n,m; leeparalelo(vnom, vedad, &n); printf("Ingrese edad minima para listado de nombres: "); scanf("%d", &x); listado(vnom, vedad, n, x); printf("El porcentaje de personas mayores de edad es %10.2f", porcen(vedad, n)); printf("Ingrese intervalo para nuevo arreglo: " ); scanf("%d %d", &e1, &e2); personas (vnom, vedad, e1, e2, n, per, &k); escribevec (per, k); return 0; } void leeparalelo( char vnom[][25], int vedad[], int *dn){ int i; printf("Ingresar cantidad de personas: "); scanf("%d", dn); for(i = 0; i < *dn; i++) { printf("Ing. nombre persona %d", i+1); scanf("%s", vnom[i]); printf("Ing. edad persona %d", i+1); scanf("%d", &vedad[i]); } } void listado(char vnom[][25], int vedad[] , int n,int x){ int i; for(i= 0; i < n; i ++) if (vedad[i] > x) printf("%s ", vnom[i]); } float porcen(int vedad[], int n){ int i, cont = 0; for(i=0; i < n; i ++) if (vedad[i] >= 21) cont++; return (float)(cont * 100) / n; } void personas (char vnom[][25], int vedad[] , int e1,int e2, int n, char perso[][25], int *dk) { int i; *dk = 0; for(i = 0; i < n; i ++) if(vedad[i] >= e1 && vedad[i] <= e2) { strcpy(perso[*dk], vnom[i]); (*dk)++; } }

/* lee hasta el primer blanco*/

void escribevec( char v[][25], int m){ int i; for(i= 0; i < m; i ++) printf(%s \n, v[i]); }

Clase 3: Arreglos unidimensionales Cadenas


Una secuencia de caracteres, almacenada en un arreglo, se interpreta como cadena si el ltimo carcter es un \0. Solo en ese caso es tratada correctamente como parmetro de las funciones para cadenas. En la lectura, las funciones scanf con formato %s y gets insertan el carcter nulo al final de la secuencia leda. La escritura, las funciones printf con formato %s y puts muestran la cadena cuya direccin contiene el puntero (parmetro). Una secuencia de caracteres encerrada entre es una cadena constante y contiene al final el carcter nulo en memoria. En una sentencia de declaracin, una arreglo puede ser iniciado declarando entre llaves la lista de valores, esta puede ser menor que la dimensin del arreglo, completando con valores neutros del tipo correspondiente. Si el arreglo es iniciado en la declaracin y no se especifica el tamao, este se ajusta a la cardinalidad de la lista. Declaraciones
char vec1[10], cad1[20], *pcad; char vec2[] = {M, P , 3}, cad2[25] = {M, P , 3, \0}; char *cartel = cadena constante;

Sentencias correctas
gets(cad1); gets (vec1); scanf(%s, cad1); printf( la longitud de la cadena es %d \n, strlen(cad2));

If (strcmp(cad1,cartel))
strcpy(cad2, cad1); pcad = cad1; strcpy(pcad, cartel); puts(++pcad);

Sentencia incorrectas
gets(cartel); /* cartel es la direccin de la constante, no hay lugar de memoria para leer */ vec1 = vec2; /* se esta tratando de asignar una direccin a una direccin constante*/ cad1= valor; /* se esta tratando de asignar una direccin a una direccin constante*/ strcpy(pcad, cartel); /*pcad no apunta a una zona de memoria, para almacenamiento de una cadena*/ vec2[] = {M, P , 3}, /* no se puede asignar, si iniciar en la declaracin */ cad2[5] = {M, P , 3, \0}; /* no se puede asignar, si iniciar en la declaracin */

11 -

Algoritmos y Estructuras I - Programacin en C

Macros versus Funciones


#include<stdio.h> #define sum(x, y) ((x)+(y)) int suma(int x, int y); ................ printf(la macro sum calcula %d + %d = %d\n, z, w, sum(z,w)); /*se reemplaza por z + w*/ printf(la funcion suma calcula %d + %d = %d\n, z, w, suma (z,w)); /*se reemplaza por un salto a la direccin de suma*/ ............. int suma(int x, int y) { return x + y; }

El preprocesador reemplaza la expresin definida en la macro en el lugar de la invocacin, por lo tanto el cdigo se repite tantas veces como invocaciones haya. En tiempo de compilacin, el llamado a la funcin se reemplaza por un salto al cdigo de la misma (en otra rea de memoria). No se duplica el cdigo (que es nico), pero requiere tiempo de ejecucin adicional. Cada posibilidad: macro o funcin tiene sus pro y sus contra Cul elegir?. Considere que: Una macro esta en general compuesta de una sola lnea (hay compiladores que no tienen esta restriccin), por lo tanto este es un condicionamiento en el momento de decidir. Una macro invocada en un ciclo reemplaza el cdigo en un solo lugar, aunque se ejecuta la sentencia repetidas veces, por lo tanto no existe el problema de la repeticin de cdigo.

Clase 4: Arreglos bidimensionales

Declaraciones
int mat1[10][5], mat2[3][3] = {{2, 0, 5},{6, 1, -3},{0, 7, 4}}, mat3[2][4] ={0}; float a[][3] = {{2.6, 8.0, 4.2},{1.4, 0.5, 7.0}}; char s1[4][10], s2[3][6] = {Pia, Luis, Ana};

Sentencias correctas
for (i=0; i< 10; i++) for (j=0; j< 5; j++) scanf(%d, &mat1[i][j]); /* lee toda la matriz por filas*/

for (i=0; i< 10; i++) printf(%d, mat1[i][0]); /*escribe el primer elemento de cada fila*/

for (i=0; i< 4; i++) scanf(%s, s1[i]); /* tambin gets(s1[i]), lee una cadena por fila,*/

for (i=0; i< 3; i++) puts(s2[i]); /* tambin printf(%s\n, s2[i]), escribe la cadena almacenada en cada fila,*/

int total,parcial, i, j; for (total = 0, i=0; i< 10; total += parcial, i++) { for (parcial = 0, j=0; j< 5; parcial += mat1[i][j], j++); printf (la suma de la fila %d es %d \n, i, parcial); } printf (la suma de todos los elementos de la matriz es %d \n, total);

Sentencias incorrectas
for (i=0; i<= 10; i++) for (j=1; j< 5; j++) /*mal los limites de fila y columna */ printf(%d, mat1[i][j]); for (i=0; i< 3; i++) for (j=0; j< 6; j++) puts(s2[i][j]); /*el argumento de puts es un carcter y debe ser una cadena*/

13 -

Algoritmos y Estructuras I - Programacin en C

Ejercicio 1 - Leer una matriz de reales, informar para cada fila que tenga al menos un cero la cantidad de elementos que superan el promedio de la matriz
#include<stdio.h> #define N 5 void lee_matriz(float a[][N], int *dn); int un_cero(float f[], int n); float promedio(float a[][N], int n); int cuantos_superan(float a[][N], float prom, int i, int n ); void main() { float a[N][N]; int i,n; float prom; lee_matriz(a, &n); prom = promedio(a, n); printf("Fila Elementos que superan el promedio de la matriz \n"); for (i=0; i< n; i++) if (un_cero(a[i],n)) printf(" %d %d \n", i, cuantos_superan(a, prom, i, n)); } void lee_matriz(float a[][N], int *dn) { int i,j; scanf("%d", dn); for (i=0; i< *dn; i++) for (j=0; j< *dn; j++) scanf("%f", &a[i][j]); } int un_cero(float f[], int n) // notar que el parmetro es un arreglo unidimensional { int i = 0; while (i<n && f[i]) i++; return i<n; } float promedio(float a[][N], int n) { int i,j; float sum = 0; for (i=0; i< n; i++) for (j=0; j< n; j++) sum += a[i][j]; return sum/(n*n); } int cuantos_superan(float a[][N], float prom, int i, int n ) { int j, cont =0; for (j=0; j< n; j++) if (a[i][j]> prom) cont++; return cont; }

Ejercicio 2 - En una empresa trabajan 500 empleados, distribuidos en 10 secciones. A fin de mes se tiene un archivo de texto con los siguientes datos de los empleados que faltaron: - Nro. de seccin (1 - 10 ). - Dia (1 - 31) - Cantidad de faltas Se pide un programa que ingrese por teclado los datos (no estn ordenados) e imprima cual fue la seccin que registr mayor porcentaje de faltas y para dicha seccin cual fue el da con ms faltas y cuantos das no se registraron faltas.
#include<stdio.h> #define N 10 /* cantidad de secciones */ #define D 31 /* cantidad de dias */ void ingresa_faltas(int a[][D]); int mayor_porcentaje (int a[][D], int secciones[]); void calculos (int a[], int *sinfaltas, int *masfaltas ); int total(int a[]); void main(){ int a[N][D] = {0}; int secciones[N] ={50, 50, 50, 50, 50, 60, 30, 20, 15, 55}; /*se inicia la cantidad de empleados por seccin, para % de ausentismo*/ int max_sec, sinfaltas, masfaltas; ingresa_faltas(a); max_sec= mayor_porcentaje (a, secciones); if(max_sec) { calculos (a[max_sec - 1], &sinfaltas, &masfaltas ); printf("la seccion con mas porcentaje de ausentismo es %d \n", max_sec); printf("en dicha seccion el dia con mas faltas fue el %d \n", masfaltas); printf("en dicha seccion hubo %d dias sin faltas\n", sinfaltas); } else printf("no se registraron faltas \n"); } void ingresa_faltas(int a[][D]) { int dia, seccion, faltas; printf("ingrese seccion (* = fin de datos), da y cantidad de faltas \n"); while (scanf("%d %d %d", &seccion, &dia, &faltas)) a[seccion -1 ][dia -1] = faltas; } int mayor_porcentaje(int a[][D], int secciones[] ){ int i, imax =0, max = 0, porcen; for (i =0; i<N; i++) { porcen = total(a[i])*100/(D*secciones[i]); if(porcen > max) { max = porcen; imax = i + 1; } } return imax ; }
15 -

Algoritmos y Estructuras I - Programacin en C

int total(int a[]) { int j, sum = 0; for (j=0; j< D; sum += a[j], j++); return sum; } void calculos (int a[], int *sinfaltas, int *masfaltas) { int j, max =0; for (*sinfaltas=j=0; j<D; j++) if (a[j]) { if(a[j] > max) { max = a[j]; *masfaltas = j + 1; } } else (*sinfaltas)++; }

Actividad: modificar el programa para que la cantidad de das del mes se ingrese por teclado. Algunas consideraciones sobre una matriz cuadrada : diagonal principal a00 a10 a20 a30 a40 a01 a11 a21 a31 a41 a02 a12 a22 a32 a42 a03 a13 a23 a33 a43 a04 a14 a24 a34 a44 Diagonal secundaria a00 a10 a20 a30 a40 a01 a11 a21 a31 a41 a02 a12 a22 a32 a42 a03 a13 a23 a33 a43 a04 a14 a24 a34 a44 triangular superior a00 0 0 0 0 a01 a11 0 0 0 a02 a12 a22 0 0 a03 a13 a23 a33 0 a04 a14 a24 a34 a44

Ejemplo 3 - Desarrollar un funcin que determine si una matriz es triangular superior. Se presentan tres soluciones

int triangular(int a[][N], int n) { int i = 1, j, cumple; do{ j=0; do{ cumple= !a[i][j++]; }while(cumple && j < i); i++; } while(cumple && i < n); return cumple; }

int triangular(int a[][N], int n) { int i=1, j,cumple; do{ j=0; do{ }while((cumple=!a[i][j++]) && j < i); } while(cumple && ++i < n); return cumple; }

int triangular(int a[][N], int n) { int i, j,cumple; for(i=1,cumple=1; i<n && cumple; i++) for(j=0; j<i && (cumple=!a[i][j]); j++); return cumple; }

Ejercicio 4 - Desarrollar un programa que genere un cuadrado mgico de orden N (impar).


Consiste en una matriz cuadrada de NxN que contiene nmeros naturales de 1 a N 2, tal que la suma de cualquier columna, fila o diagonal coincide. Se construye de la siguiente manera: El nmero 1 se coloca en la casilla central de la primera fila. Cada nmero siguiente se coloca en la casilla correspondiente a la fila anterior y columna posterior. Si el nmero es el que sigue a un mltiplo de N, se coloca en la casilla de la fila posterior en la misma columna. Se considera fila anterior a la primera, la ltima. Se considera columna posterior a la ltima, la primera

#include<stdio.h> #define N 9 /* la dimensin del cuadrado mgico debe ser impar*/ void cuadrado_magico(int a[][N], int n); void muestra (int a[][N], int n); void main(){ int a[N][N], n; printf("ingrese la dimensin del cuadrado mgico \n"); 17 scanf("%d", &n); 23 cuadrado_magico(a, n); 4 muestra (a, n); 10 } void cuadrado_magico(int a[][N], int n){ 11 int k, i=0, j=n/2, tope=n*n; for(k=1; k<=tope; k++) { a[i][j]=k; if(k % n) { if(i==0) i=n-1; else i--; if(j==n-1) j=0; else j++; } else i++; } } void muestra (int a[][N], int n){ int i,j; for (i=0; i< n; i++) { for (j=0; j< n; j++) printf("%d ", a[i][j]); printf("\n"); } }

24 1 8 15 5 7 14 16 6 13 20 22 12 19 21 3 18 25 2 9

17 -

Algoritmos y Estructuras I - Programacin en C

Clase 5 : Struct Arreglo de Structs


Ejemplos: a) Definir un struct para almacenar nombre, ao de edicin y precio de un libro
struct libro { char nom[25]; int anio; float precio; };

b) Dar valor inicial a una variable struct libro


struct libro lib = { Ser digital, 2002, 32.40, };

c) Funcin que lee una variable struct libro


void lee (struct libro *lib) { printf(ingrese nombre del libro \n ); gets( (*lib). nom); printf(ingrese aio y precio \n ); scanf(%d %f, &(*lib).anio, &(*lib).precio); }

d) Funcin que escribe una variable struct libro


void escribe (struct libro lib) { printf( nombre del libro \n ); puts( lib. nom); printf( aio %d precio % f \n , lib.anio, lib.precio); }

e) A continuacin un segmento de cdigo que muestra el uso de structs


.................. struct libro lib1, lib2; lee(&lib1); lee(&lib2); if (lib1.precio < lib2.precio) { printf(el libro mas barato es\n); escribe (lib1); } else if (lib1.precio > lib2.precio) { printf(el libro mas barato es\n); escribe (lib2); } else printf(ambos libros cuestan %f \n, lib1.precio); ....................

f) Leer el nombre y la edad de N personas , calcular e imprimir: Listado de nombres de las personas de mas de X aos. Porcentaje de las personas mayores de edad sobre el total.
#include <stdio.h> #include <conio.h> #include <string.h>

struct datos{ char nom[25]; int edad; }; void lee(struct datos v[], int *dn); /* lee un arreglo de structs*/ void escribe(struct datos v[], int n ); void listado(struct datos v[], int n, int x); float porcen(struct datos v[], int n); int main(void) { struct datos v[10]; int x, n; lee(v, &n); escribe(v, n ); printf("\nIngrese edad minima para listado de nombres: "); scanf("%d", &x); listado(v, n, x); printf("\nEl porcentaje de personas mayores de edad es %10.2f", porcen(v, n)); return 0; } void lee(struct datos v[], int *dn) { int i; printf("Ingresar cantidad de personas: "); scanf("%d", dn); for(i = 0; i < *dn; i++) { printf("Ing. nombre persona %d", i+1); scanf("%s", v[i].nom); /* lee hasta el primer blanco*/ printf("Ing. edad persona %d", i+1); scanf("%d", &v[i].edad); } } void escribe (struct datos v[], int n ) { int i; for(i= 0; i < n; i ++) printf("\nnombre %s edad %d", v[i].nom, v[i].edad); } void listado ( struct datos v[] , int n, int x) { int i; for(i= 0; i < n; i ++) if (v[i].edad > x) printf("\n%s ", v[i].nom); } float porcen(struct datos v[], int n) { int i, cont = 0; for(i=0; i < n; i ++) if (v[i].edad >= 21) cont++; return (float)(cont * 100) / n; }

Actividades propuestas: 1. Desarrollar el programa completo, probarlo e investigar el uso de -> para referenciar un campo a partir de un puntero. Ejemplo : (*lib). Precio y lib->precio 2. Investigar el uso de typedef y utilizarlo para reescribir las descripciones de tipo en el programa anterior 3. Desarrollar una funcin que a partir de una matriz de NxM elementos enteros, devuelva en un arreglo de structs, fila, columna y valor de las componentes de la matriz divisibles por N + M
19 -

Algoritmos y Estructuras I - Programacin en C

También podría gustarte