tipos de datos compuestos estáticos en c · pdf filem

30
TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C Ing. Karina Esquivel Alvarado UNIVERSIDAD NACIONAL AUTÓNOMA DE NICARAGUA, UNAN – LEÓN DEPARTAMENTO DE COMPUTACIÓN INGENIERÍA EN SISTEMAS / TELEMÁTICA

Upload: lamque

Post on 14-Feb-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

TIPOS DE DATOS COMPUESTOS

ESTÁTICOS EN C

Ing. Karina Esquivel Alvarado

UNIVERSIDAD NACIONAL AUTÓNOMA DE NICARAGUA, UNAN – LEÓN

DEPARTAMENTO DE COMPUTACIÓN

INGENIERÍA EN SISTEMAS / TELEMÁTICA

Page 2: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

ARRAYS (listas y tablas) EN C � INTRODUCCIÓN:

Sin embargo, muchos de estos problemas se podrían r esolver si aplicáramos en cambio tipos estructurados de datos, los cuales ocupan un grupo de casillas nombre. � DEFINICIÓN DE ARRAY: Formalmente definimos un arreglo de la siguiente ma nera: finita, homogénea y ordenada de elementosreferencia a cada elemento del arreglo por medio de un índic

• Finita: porque todo arreglo tiene un límite, es decir, se d ebe determinar cuál es el número máximo de elementos de l arreglo.

• Homogénea: porque todos los elementos del arreglo deben ser del mismo tipo.

• Ordenada: porque se puede determinar cuál es el prelemento, cuál el segundo y así sucesivamente.

Los arreglos se caracterizan por: ♦ Almacenar los elementos en posiciones contiguas de memoria.♦ Tienen un mismo nombre de variable que representa a todos los

elementos. ♦ Para hacer referencia a esos eleme

índice que especifica el lugar que ocupa cada eleme nto dentro del archivo.

Un array (lista o tablaque se referencian por un nombre común. elementos del array El tipo de elementos almacenados en el array puede ser cualquier tipo de dato C, incluyendo estructuras definidas po r el usuario. Normalmente el array se utiliza para almacenar tipo s tales como char, int o float .

Tipos de Datos Compuestos Estáticos en C

2

ARRAYS (listas y tablas) EN C

En la práctica es frecuente que enfrentemos problemas cuya solución sería muy difícil de hallar si utilizáramos tipos simples de datospara resolverlos. Es decir, datos que ocupan una sola casilla de memoria.

Sin embargo, muchos de estos problemas se podrían r esolver si aplicáramos en cambio tipos estructurados de datos, los cuales ocupan un grupo de casillas de memoria y se identifican con un

DEFINICIÓN DE ARRAY:

Formalmente definimos un arreglo de la siguiente ma nera: finita, homogénea y ordenada de elementos , en la que se hace referencia a cada elemento del arreglo por medio de un índic

porque todo arreglo tiene un límite, es decir, se d ebe determinar cuál es el número máximo de elementos de l arreglo.

porque todos los elementos del arreglo deben ser del mismo tipo.

porque se puede determinar cuál es el prelemento, cuál el segundo y así sucesivamente.

Los arreglos se caracterizan por: los elementos en posiciones contiguas de memoria.

Tienen un mismo nombre de variable que representa a todos los

Para hacer referencia a esos eleme ntos es necesario utilizar un índice que especifica el lugar que ocupa cada eleme nto dentro

(lista o tabla ) es una colección de datosque se referencian por un nombre común. Los datos se llaman

y se numeran consecutivamente 0, 1, 2, 3, etc. El tipo de elementos almacenados en el array puede ser cualquier tipo de dato C, incluyendo estructuras definidas po r el usuario. Normalmente el array se utiliza para almacenar tipo s tales como

Tipos de Datos Compuestos Estáticos en C

En la práctica es frecuente que enfrentemos problemas cuya solución sería muy difícil de hallar si

tipos simples de datos para resolverlos. Es decir, datos que ocupan una sola casilla de memoria.

Sin embargo, muchos de estos problemas se podrían r esolver si aplicáramos en cambio tipos estructurados de datos, los cuales

de memoria y se identifican con un

Formalmente definimos un arreglo de la siguiente ma nera: “Colección , en la que se hace

referencia a cada elemento del arreglo por medio de un índic e”. porque todo arreglo tiene un límite, es decir, se d ebe

determinar cuál es el número máximo de elementos de l arreglo. porque todos los elementos del arreglo deben ser

porque se puede determinar cuál es el pr imer elemento, cuál el segundo y así sucesivamente.

los elementos en posiciones contiguas de memoria. Tienen un mismo nombre de variable que representa a todos los

ntos es necesario utilizar un índice que especifica el lugar que ocupa cada eleme nto dentro

datos del mismo tipo Los datos se llaman

numeran consecutivamente 0, 1, 2, 3, etc. El tipo de elementos almacenados en el array puede ser cualquier tipo de dato C, incluyendo estructuras definidas po r el usuario. Normalmente el array se utiliza para almacenar tipo s tales como

Page 3: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

3

Cada ítem del array se denomina elemento . Los elementos de un array se numeran consecutivamente 0, 1, 2, 3... Estos números se denominan valores índice o subíndice del array. El término “subíndice” se utiliza ya que se especifica igual q ue en matemáticas, como una secuencia a0, a 1, a 2, a 3… Estos números localizan la posición del elemento dentro del array , proporcionando acceso directo al array.

Si el nombre del array es "a" , entonces a[0] es el nombre (valor) del elemento que está en la posición 0, a[1] es el nombre (valor) del elemento que está en la posición 1, etc. En gen eral, el elemento i-ésimo está en la posición i-1 . De modo que si el array tiene n elementos, sus nombres son a[0], a[1], a[2], …., a[n-1]. Gráficamente se representa así el array “a” de 6 elementos: int a[6]; //Declara un array de 6 elementos enter os

Figura: Array de 6 elementos .

El array tiene 6 elementos: a[0] contiene 5, a[1] c ontiene 8, a[2] contiene 6, a[3] contiene 10, a[4] contiene 9, a[5] contiene 4. En un array sus elementos se almacenan siempre en una secuencia de posiciones de memoria contiguas. En C los índices de un array siempre tiene como lím ite inferior 0 y como índice superior el tamaño del array menos 1. � DEFINICIÓN Y DECLARACIÓN DE ARRAYS EN C: Al igual que con cualquier tipo de variable, se deb e declarar un array antes de utilizarlo. Un array se declara de f orma similar a otros tipos de datos, excepto que se debe indicar a l compilador el tamaño o longitud del array. La sintaxis para declarar un array es simple:

tipo nombreArray[numerodeElementos];

Page 4: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

4

Siendo: ♦ tipo: El tipo de los elementos que conformarán el array. ♦ nombreArray: El nombre de nuestro array . ♦ numerodeElementos: Un número entero mayor que cero que indica el

tamaño del array. Ejemplos de declaración de arrays: int datos[45]; /* Declara un array de 45 element os enteros */ char caracteres[15]; /* Declara un array de 15 ca racteres */ float valores[20]; /* Declara un array de 20 eleme ntos en coma flotante*/ Si por ejemplo, se quiere crear un array de números reales y su tamaño es una constante representada por un parámet ro: #define NELEM 20 float valores[NELEM]; Para acceder al tercer elemento y leer un valor de entrada del array: scanf(“%f”,&valores[2]); Precaución: C no comprueba que los índices del arra y están dentro del rango definido. Así, por ejemplo, se puede intentar acceder a valores[21], el compilador no producirá ningún erro r, lo que puede producir un fallo en su programa, dependiendo del c ontexto en que se encuentre el error. � SUBÍNDICES DE UN ARRAY: El índice de un array se denomina, con frecuencia, subíndice del array . El término procede de las matemáticas, en las que un subíndice se utiliza para representar un elemento d eterminado. int numeros[4]; numeros 0 equivale a numeros[0] numeros 1 equivale a numeros[1] numeros 2 equivale a numeros[2] numeros 3 equivale a numeros[3] El método de numeración del elemento i-ésimo con el índice o subíndice i-1 se denomina indexación basada en cero . Su uso tiene el efecto de que el índice de un elemento del array es siempre el mismo que el número de pasos desde el elemento inic ial numeros[0] a ese elemento. Por ejemplo, numeros[3] está a 3 paso s o posiciones del elemento numeros[0].

Page 5: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

5

� ALMACENAMIENTO EN MEMORIA DE LOS ARRAYS: Los elementos de los arrays se almacenan en bloques contiguos. Así por ejemplo, los arrays:

int edades[5]; char codigos[5];

Precaución: C permite asignar valores fuera de rango a los subíndices. Se debe tener cuidado no hacer esta acc ión, debido a que se sobreescribirían datos o código. Los arrays de caracteres funcionan de igual forma que los arrays numéricos, partiendo de la base de que cada carácte r ocupa normalmente un byte. Así, por ejemplo, un array lla mado ciudad se puede representar de la siguiente manera: Ejemplo: char ciudad[]= “Leon”; Es importante tomar en cuenta que en las cadenas de caracteres el sistema siempre inserta un último carácter (nulo, ‘\0’) para indicar el fin de cadena. � INICIALIZACIÓN DE UN ARRAY Se deben asignar valores a los elementos del array antes de utilizarlos, tal como se asignan valores a variable s. Para asignar valores a cada elemento del array de enteros “ edades ”, se puede escribir: edades [0] = 15; edades [1] = 25; edades [2] = 30; edades [3] = 35;

ciudad

[0]

[1]

[2]

[3]

L

e

o

n

\0

Page 6: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

6

La primera sentencia fija edades[0] al valor 15, ed ades[1] al valor 25, etc. Sin embargo, este método no es práctico cu ando el array contiene muchos elementos. El método utilizado, nor malmente, es inicializar el array completo en una sola sentencia . Ejemplo: int edades[4]={15,25,30,35}; Cuando se inicializa un array, el tamaño del array se puede determinar automáticamente por las constantes de in icialización. Estas constantes se separan por comas y se encierra n entre llaves, como en los siguientes ejemplos: int numeros[6] = {10, 20, 30, 40, 50, 60}; int n[ ]= {3, 4, 5}; //Declara e inicializa un arra y de 3 elementos char c[ ] = {‘L’,’u’,’i’,’s’}; //Declara e iniciali za un array de 4 elementos En C las cadenas de caracteres, se caracterizan por tener un carácter final que indica el fin de la cadena, es e l carácter nulo (‘\0’). Lo habitual es inicializar un array de cara cteres (una variable cadena) con una constante cadena. Ejemplo: char cad [ ] = “Hola mundo”; El método de inicializar arrays mediante valores co nstantes después de su definición es adecuado cuando el número de el ementos del array es pequeño. Ejemplo #1: Programa para inicializar un array de 10 elementos enteros a 1. #include<stdio.h> int main() { int datos[10],i; printf("\nElemento\tValor"); for(i=0;i<=9;i++) { datos[i]=1; printf("\n%d\t\t%d",i,datos[i]); } return 0; } Ejemplo de Salida:

Page 7: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

7

Ejemplo #2: Programa en C que declara e inicializa un arreglo de N datos, de modo que los elementos de índice par valg an 0 y los de índice impar valgan 1. Solución (Pseudocódigo) Proceso posiciones_array Definir datos_array,v Como Entero; Dimension datos_array[100]; Escribir "Cuantos datos desea en el arreglo?"; Leer ndatos; Para v<-0 Hasta ndatos-1 Hacer Si v % 2 = 0 Entonces datos_array[v]<-0; Sino datos_array[v]<-1; FinSi Escribir "Dato[",v,"]=",datos_array[v]; FinPara FinProceso Solución (Código C) #include <stdio.h> int main(int argc, char *argv[]) { int datos_array[100],v,ndatos; printf("Cuantos datos desea en el arreglo?"); scanf("%d",&ndatos); for(v=0;v<ndatos;v++) { if(v%2==0) datos_array[v]=0; else datos_array[v]=1; printf("Dato[%d]=%d\n",v,datos_array[v]); } return 0; } � Se pueden asignar constantes simbólicas como valore s numéricos, de modo que las sentencias siguientes so n válidas: #define ENE 31 #define FEB 28 #define MAR 31 #define ABR 30 int meses [12] = {ENE, FEB, MAR, ABR };

Page 8: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

8

� Pueden asignarse valores a un array utilizando un b ucle for, while o do-while y éste suele ser el sistema más empleado normalmente. Ejemplo #3: Programa en C que, al recibir como dato un arreglo unidimensional de tipo entero de N elementos, deter mina si el arreglo es palíndrome. #include<stdio.h> int main() { int numd=0,alto=0,d,ndatos,longarray; printf("Cuantos datos?"); scanf("%d",&ndatos); int palindro[ndatos]; for(d=0;d<ndatos;d++) scanf("%d",&palindro[d]); longarray=ndatos-1; while((numd<ndatos) && !alto) { if(palindro[numd] != palindro[longarray]) alto=1; numd++; longarray--; } if(!alto) printf("El array es PALINDROMO\n"); else printf("El array NO es PALINDROMO\n"); return 0; } Ejemplo #4: Programa en C que lea en un arreglo las marcas obtenidas por N corredores en una carrera e imprimi r cuántos tienen una marca mayor y cuántos tienen una marca menor qu e el promedio. Solución en Pseudocódigo: Proceso marca Dimension marcascorredor[10]; m<-0; menorprom <-0; mayorprom <- 0; sumamarc <- 0;

Page 9: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

9

Mientras m < 10 Hacer Escribir 'Marca del corredor[',m+1,']'; Leer marcascorredor[m]; sumamarc <- sumamarc + marcascorredor[m]; m<-m+1; FinMientras promediomarc <- sumamarc/m; Para mc<-0 hasta 9 Hacer Si marcascorredor[mc]> promediomarc Entonces mayorprom <- mayorprom +1; FinSi Si marcascorredor[mc] < promediomarc Entonces menorprom <- menorprom +1; FinSi FinPara Escribir 'Hay ',mayorprom,' corredores con marca MA YOR que el PROMEDIO = ',promediomarc; Escribir 'Hay ',menorprom,' corredores con marca ME NOR que el PROMEDIO = ',promediomarc; FinProceso Programa en C: #include <stdio.h> int main(int argc, char *argv[]) {

int marcascorredor[10],mc=0,menorprom=0,mayorprom=0 ; int sumamarc =0,promediomarc,m=0;

while(m<10) { printf("Marca del corredor[%d]:",m+1); scanf("%d",&marcascorredor[m]); sumamarc = sumamarc + marcascorredor[m]; m++; } promediomarc = sumamarc/m; for(mc=0;mc<=9;mc++) { if (marcascorredor[mc]>promediomarc) mayorprom++; if (marcascorredor[mc]<promediomarc) menorprom = menorprom +1; }

printf("Hay %d corredores con marca MAYOR que el PR OMEDIO = %d\n",mayorprom,promediomarc); printf("Hay %d corredores con marca MENOR que el PR OMEDIO = %d\n",menorprom,promediomarc); return 0;

}

Page 10: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

10

Ejemplo #5: Programa en C que almacene en un arreglo unidimens ional los 20 primeros números primos. Un número primo es un número entero mayor que cero, que tiene exactamente dos divisores positivos. También podemos definirlo como aquel número entero positivo que no puede expresarse como producto de dos números enter os positivos más pequeños que él, o bien, como producto de dos enter os positivos de más de una forma. Conviene observar que con cualqui era de las dos definiciones el 1 queda excluido del conjunto de lo s números primos. #include <stdio.h> #define MAX 20 int primos[MAX]; int indice=0; int main() { int bandera,numero,i,p; numero=1; while(indice<MAX) { bandera=1; for(i=1;i<=numero;i++) { if((numero%i)==0) if(i!=1 && i!=numero) bandera=0; } if(bandera) { primos[indice]=numero; indice++; } numero++; } for(p=0;p<MAX;p++) printf(" %d",primos[p]); return 0; }

Page 11: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

11

Ejemplo #6: Programa en C que almacena en un arreglo unidimens ional de tipo entero los primeros 10 números de la serie Fibonacci. #include <conio.h> #define MAX 10 int main() { int fibonacci[MAX],f,primero=0,segundo=1,i; fibonacci[0]=0; fibonacci[1]=1; for(i=2;i<=MAX;i++) { fibonacci[i]=primero+segundo; primero=segundo; segundo=fibonacci[i]; } for(f=0;f<MAX;f++) printf(" %d",fibonacci[f]); return 0; } Ejemplo #7: Escriba un programa que lee dos vectores A y B de 20 elementos cada uno y multiplica el primer elemento de A por el ultimo de B y así sucesivamente hasta llegar al últ imo elemento de A por el primero elemento de B. El resultado de la multiplicación se almacena en un vector C. #include <stdio.h> #define MAX 5 int main() { int i,a[MAX],b[MAX],c[MAX]; /* se leen los elementos del vector */ printf("Introduzca los elementos del vector A \n") ; for (i=0;i<MAX;i++) { printf("Vector A[%d]:",i+1); scanf("%d",&a[i]); } printf("Introduzca los elementos del vector B \n") ; for (i=0;i<MAX;i++) { printf("Vector B[%d]:",i+1); scanf("%d",&b[i]); }

Page 12: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

12

/* proceso de calculo, resultado se almacena en ar reglo c */ for(i=0;i<MAX;i++) c[i] = a[i] * b[(MAX-1)-i]; /* se imprime el resultado, los elementos el arreg lo c */ printf("El vector C es:"); for (i=0; i<MAX; i++) printf(" %d ",c[i]); return 0; } Ejemplo #8: Programa en C que permite introducir una lista con los pesos de los N estudiantes de la asignatura de Prog ramación Estructurada e imprime los pesos ordenados en forma to ascendente por el método de la búrbuja. La Ordenación de búrbu ja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento . Funciona revisando cada elemento de la lista que va a ser or denada con el siguiente, intercambiándolos de posición si están e n el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual signi fica que la lista está ordenada. #include<stdio.h> #define MAXE 100 int main() { float pesos[MAXE],temp; int i,j,nest; printf("Cuantos estudiantes son?: "); scanf("%d",&nest); for(i=0;i<nest;i++) { printf("Peso del Estudiante[%d]: ",i+1); scanf("%f",&pesos[i]); } printf("\n****ARRAY ORIGINAL****\n"); for (i = 0;i<nest;i++) printf("Peso[%d]: %.1f\n",i+1,pesos[i]); /*Ordenación del array con el método de la búrbuja en formato ascendente*/ for (i=0;i<nest;i++) for(j=0;j<(nest-1);j++) if(pesos[j] > pesos[j+1]) { temp=pesos[j]; pesos[j] = pesos[j+1]; pesos[j+1] = temp; }

Page 13: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

13

printf("\n****ARRAY ORDENADO EN FORMATO ASCENDENTE ****\n"); for (i = 0;i<nest;i++) printf("Peso[%d]: %.1f\n",i+1,pesos[i]); return 0; } � ARRAYS MULTIDIMENSIONALES Es una colección finita, homogénea y ordenada de da tos, en las que se hace referencia a cada elemento del arreglo por medio de dos índices. El primero de los índices se utiliza para indicar la fila, y el segundo, para indicar la columna. Un arreglo bidimensional permite almacenar N * M el ementos del mismo tipo (enteros, reales, caracteres, cadenas de caracteres, etc) y acceder a cada uno de ellos. Los arrays más usuales son los de dos dimensiones, conocidos también por el nombre de tablas o matrices . Sin embargo, es posible crear arrays de tantas dimensiones como requieran s us aplicaciones. Un array de dos dimensiones equivale a una tabla de múltiples filas y múltiples columnas.

Estructura de un array de dos dimensiones.

Si las filas se etiquetan de 0 a m y las columnas de 0 a n , el número de elementos que tendrá el array será el res ultado del producto (m+1) x (n+1) . El sistema para localizar un elemento será por las coordenadas representadas por el número de fila y su número de columna (a, b). � DECLARACIÓN DE ARRAYS BIDIMENSIONALES El espacio que los arreglos ocupan en memoria se re serva en el momento de realizar la declaración de los mismos. La sintaxis para la declaración de un array de dos dimensiones es:

Page 14: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

14

<tipo_de_datoElemento> <nombre array>[<Número de Fi las>] [<Número de Columnas>] Ejemplos de declaración de tablas: char Pantalla[25][80]; int puestos[6][8]; int equipos[4][30]; int matriz[4][2]; Un array de dos dimensiones en realidad es un array de arrays. Es decir, es un array unidimensional y cada elemento n o es un valor entero, o de coma flotante o carácter, sino que cad a elemento es otro array. Los elementos de los arrays se almacenan en memoria de modo que el subíndice más próximo al nombre del array es la fil a y el otro subíndice, la columna. � INICIALIZACIÓN DE ARRAYS MULTIDIMENSIONALES Los arrays multidimensionales se pueden inicializar , al igual que los de una dimensión, cuando se declaran. La inicia lización consta de una lista de constantes separadas por comas y en cerradas entre llaves. Ejemplo: int tabla[4][2];

Ejemplos: int tabla [2] [3] = {51, 52, 53, 54, 55, 56}; O bien:

♦ int tabla [2] [3] = {{51, 52, 53}, {54, 55, 56}};

♦ int tabla [2] [3] = { {51, 52, 53},

{54, 55, 56} };

Page 15: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

15

� ACCESO A LOS ELEMENTOS DE LOS ARRAYS BIDIMENSIONALES Se puede acceder a los elementos de arrays multidim ensionales de igual forma que a los elementos de un array unidime nsional. La diferencia reside en que en los elementos bidimensi onales deben especificarse los índices de la fila y la columna . El formato general para asignación directa de valor es a los elementos es: ♦ Inserción de elementos: <Nombre array> [índice fila] [índice columna] = val or elemento; ♦ Extracción de elementos: <Variable> = <nombre array> [índice fila] [índice c olumna]; � ACCESO A ELEMENTOS MEDIANTE BUCLES Se puede acceder a los elementos de arrays bidimens ionales mediante bucles anidados. Su sintaxis es: int indicefila, indicecolum; for(indicefila = 0; indicefila < NumFilas; ++indice fila)

for(indicecolum = 0; indicecolum < NumColumnas; ++i ndicecolum) Procesar Elemento [indicefila] [indicecolum]; Ejemplo #1: Programa en C que permite inicializar a 1 todos los elementos de un array bidimensional de 3 filas y 4 columnas. #include<stdio.h> int main() { int i,j,datos[3][4]; printf("\n***Visualizacion del Array 3F x 4C***\n" ); for(i=0; i<3; i++) for(j=0;j<4;j++) datos[i][j]=1; for(i=0; i<3; i++) for(j=0;j<4;j++) printf("%d ",datos[i][j]); printf("\n"); return 0; }

Page 16: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

16

Ejemplo #2 Escribir un programa que rellene automáticamente un a matriz N*M con la suma de sus índices (Es decir, el elemento a[1][1]=1+1=2, a[3][2]=3+2=5). El programa mostrará la matriz resultante por pantalla. #include<stdio.h> #define MAXF 10 #define MAXC 10 int main() { int indices[MAXF][MAXC]; int fil,col,f,c; do { printf("NUMERO DE FILAS: "); scanf("%d",&fil); }while(fil < 1 || fil > MAXF); do { printf("NUMERO DE COLUMNAS: "); scanf("%d",&col); }while(col < 1 || col > MAXC); //Lectura de los datos de la matriz for(f=0;f<fil;f++) for(c=0;c<col;c++) indices[f][c]=f+c; //Escribir el array resultante for(f=0;f<fil;f++) { for(c=0;c<col;c++) printf("%d ",indices[f][c]); printf("\n"); } return 0; } Ejemplo #3: Realizar un programa que almacene números en una m atriz de N * M. Imprimir la suma de los números almacenad os en la matriz. #include<stdio.h> #include<stdlib.h> int main() { int suma=0,f,c,fil,col;

Page 17: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

17

printf("NUMERO DE FILAS: "); scanf("%d",&fil); printf("NUMERO DE COLUMNAS: "); scanf("%d",&col); int matriz[fil][col]; for(f=0;f<fil;f++) { for(c=0;c<col;c++) { printf("Elemento[%d][%d]: ",f,c); scanf("%d",&matriz[f][c]); suma = suma+matriz[f][c]; } } printf("\nLa suma de la matriz es: %d\n", suma); return 0; } Ejemplo #4: Pseudocódigo y programa en C que lee un array de N *M elementos y que guarda 0 en las posiciones pares y 1 en las posiciones impares. Imprimir el array resultante. Pseudocódigo: Proceso ubicar_posiciones Definir matriz_ejemplo,fila,columna,indice como En tero; Dimension matriz_ejemplo[3,4]; Para fila<-0 Hasta 2 Con Paso 1 Hacer Para columna<-0 Hasta 3 Con Paso 1 Hacer indice<-fila+columna; Si indice MOD 2 = 0 Entonces matriz_ejemplo[fila,columna] <- 0; Sino matriz_ejemplo[fila,columna] <- 1; FinSi

Escribir Sin Saltar matriz_ejemplo[fila,columna]," ";

FinPara Escribir ""; FinPara FinProceso

Page 18: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

18

Programa en C: #include<stdio.h> #include<stdlib.h> int main() { int f,c,fil,col,indice; printf("NUMERO DE FILAS: "); scanf("%d",&fil); printf("NUMERO DE COLUMNAS: "); scanf("%d",&col); int matriz[fil][col]; for(f=0;f<fil;f++) { for(c=0;c<col;c++) { indice=f+c; if(indice%2 == 0) matriz[f][c]=0; if(indice%2 != 0) matriz[f][c]=1; printf("%d ",matriz[f][c]); } printf("\n"); } return 0; } Ejemplo #5: Programa en C que lee una matriz de n filas por m columnas y calcula e imprime el producto de la diag onal principal y la suma de la diagonal secundaria. #include<stdio.h> int main() { int f,c,fil,col,suma_ds=0,prod_dp=1; printf("NUMERO DE FILAS: "); scanf("%d",&fil); col=fil; int diagonales[fil][col]; for(f=0;f<fil;f++) { for(c=0;c<col;c++) { printf("Elemento[%d][%d]: ",f,c); scanf("%d",&diagonales[f][c]);

Page 19: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

19

//Diagonal Principal

if((f+c)==(fil-1)) suma_ds+= diagonales[f][c];

//Diagonal Secundaria if(f==c) prod_dp *= diagonales[f][c]; } } for(f=0;f<fil;f++) { for(c=0;c<col;c++) { printf("%d ",diagonales[f][c]); } printf("\n"); } printf("\nEl producto de la DIAGONAL PRINCIPAL es: %d\n",prod_dp); printf("\nLa suma de la DIAGONAL SECUNDARIA es: %d\ n",suma_ds); return 0; } Ejemplo #6: Pseudocódigo y programa en C que lee una matriz de N filas y M columnas de valores enteros. A continuac ión, debe pedir el número de una fila (Recuerde validar dicho dato) . El programa devuelve el mayor elemento de esa fila. Proceso ElementoMayorFila

Definir matriz_ejemplo,fila,columna,fil,col,may,pos fil,c como entero; Escribir "Filas: "; Leer fil; Escribir "Columnas: "; Leer col; Escribir fil,col; Dimension matriz_ejemplo[fil,col]; Para fila<-0 Hasta fil-1 Hacer

Para columna<-0 Hasta col-1 Hacer Escribir Sin Saltar "Numero[",fila,",",columna,"]:" ; Leer matriz_ejemplo[fila,columna];

FinPara FinPara may<-0; Escribir Sin Saltar "¿Que fila desea evaluar? "; Leer posfil;

Page 20: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

20

Si posfil>0 Y posfil<=fil-1 entonces Para c<-0 Hasta col-1 Hacer

Si matriz_ejemplo[posfil,c]>may Entonces may<-matriz_ejemplo[posfil,c];

FinSi FinPara Escribir "El mayor elemento de la fila: ",posfil," es : ",may;

Sino Escribir "Numero de fila invalido";

FinSi Para fila<-0 Hasta fil-1 Con Paso 1 Hacer

Para columna<-0 Hasta col-1 Con Paso 1 Hacer Escribir Sin Saltar matriz_ejemplo[fila,columna], " "; FinPara Escribir "";

FinPara FinProceso Programa en C: #include<stdio.h> int main() {

int f,c,fil,col,may,posfil; printf("Numero de Filas: "); scanf("%d",&fil); printf("Numero de Columnas: "); scanf("%d",&col); int matriz_ejemplo[fil][col]; for (f=0;f<fil;f++) { for(c=0;c<col;c++) { printf("Numero[%d][%d]: ",f,c); scanf("%d",&matriz_ejemplo[f][c]); } } printf("¿Que fila desea evaluar(A partir de Fila #1 )?: "); scanf("%d",&posfil); if(posfil>=0 && posfil<=fil-1) { may=0;

Page 21: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

21

for(c=0;c<col;c++) { if(matriz_ejemplo[posfil][c]>may) may=matriz_ejemplo[posfil][c]; }

printf("El mayor elemento de la fila #%d es: %d\n",posfil,may);

} else

printf("Numero de fila invalido\n"); return 0;

} � CARACTERES Y CADENAS DE CARACTERES Caracteres: Un carácter , es un tipo de dato simple que representa un número, una letra o cualquier carácter especial disponible del teclado de la máquina. Cuando se asigna un carácter a una variable tipo char, éste siempre se debe escribir entre após trofos ‘ ’. Una cadena de caracteres: Es un tipo de datos estru cturado compuesto por caracteres. En el lenguaje de program ación C, una cadena de caracteres se define como un arreglo de c aracteres que termina con el carácter nulo (‘\0’). Cuando se asig na una cadena de caracteres a una variable de tipo char, ésta se deb e escribir entre comillas “ ” .

� Ejemplo: char Cadena[]= “Programacion”; Es importante comprender la diferencia entre un arr ay de caracteres y una cadena de caracteres. Las cadenas contienen u n carácter nulo al final del array de caracteres.

Array de Caracteres Cadena

Cadena[0] P Cadena[1] r Cadena[2] o Cadena[3] g Cadena[4] r Cadena[5] a Cadena[6] m Cadena[7] a Cadena[8] c Cadena[9] i Cadena[10] o Cadena[11] n

Cadena[0] P Cadena[1] r Cadena[2] o Cadena[3] g Cadena[4] r Cadena[5] a Cadena[6] m Cadena[7] a Cadena[8] c Cadena[9] i Cadena[10] o Cadena[11] n

Cadena[12] \0 Carácter Nulo

Page 22: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

22

Las cadenas se señalan incluyendo un carácter final de la cadena; el carácter nulo (\0), cuyo valor en el código ASCI I es 0. El medio más fácil de inicializar un array de caracteres es hacer la inicialización de la declaración: ♦ char Cadena[13]=”Programacion”; El compilador añade automáticamente un carácter nul o al final de la cadena, de modo que la secuencia real sería: ♦ char Cadena[13]=”Programacion”;

Cadena La asignación de valores a Cadena se puede hacer de l modo siguiente : Cadena[0]= P' Cadena[1]= r' Cadena[2]= o' Cadena[3]= g' Cadena[4]= r' Cadena[5]= a' Cadena[6]= m' Cadena[7]= a' Cadena[8]= c' Cadena[9]= i' Cadena[10]= o' Cadena[11]= n' Cadena[12]= \0' Para copiar una constante cadena o copiar una varia ble de cadena a otra variable de cadena se debe utilizar la función de la biblioteca estándar: strcpy(cadena1,cadena2) permite copiar una constante de cadena en una cadena. Para copiar el n ombre "karen" en el array nombre, se puede escribir strcpy(nombre, " karen" ) ; strcpy, añade un carácter nulo al final de la caden a. Ejemplo: #include <stdio.h> #include <string.h> #define MAXLON 10 int main(void) {

char original[MAXLON+1] = "cadena"; char copia[MAXLON+1]; strcpy (copia, original ); //Copia el contenido de original en copia.

return 0; }

P r o g r a m a c i o n \0

Page 23: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

23

Ejemplo #1: Programa en C que al recibir como datos una cadena de caracteres y una posición de la cadena, determine s i el carácter correspondiente a la posición dada es una letra min úscula. #include<stdio.h> #include<string.h> #include<ctype.h> int main() { char p,cad[50]; int n; printf("Ingrese la cadena de hasta 50 caracteres: "); gets(cad);

printf("Ingrese la posicion en la cadena que desea verificar: ");

scanf("%d",&n); if((n>=0) && (n<50)) { p=cad[n-1]; if(islower(p)) printf("\n%c es una letra minuscula\n",p); else printf("\n%c no es una letra minuscula\n",p); } else printf("\nEl valor de la posición es incorrecto") ; return 0; } Las cadenas de caracteres se pueden almacenar fácil mente en cualquier tipo de arreglo, utilizando una represent ación de este tipo se pueden resolver de manera eficiente una gra n cantidad de problemas. La única característica importante que d ebemos considerar es la siguiente: “Dado que una cadena se define como un arreglo unidimensional, si queremos almacenar caden as de caracteres en arreglos unidimensionales debemos de trabajar de forma similar a como lo hacemos con arreglos bidimensionales”. En l as filas almacenamos las cadenas y en las columnas los carac teres de cada cadena. Es decir, si queremos almacenar un grupo de 10 cadenas de 30 caracteres como máximo en el arreglo unidimensio nal Cadena, éste lo debemos declarar de la siguiente forma: char Cadena[10][30]; El primer índice se utiliza para indicar la fila y el segundo para señalar el carácter de la cadena.

Page 24: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

24

Ejemplo #2: Programa en C que al recibir como dato un arreglo unidimensional de tipo cadena de caracteres, determ ina el número de minúsculas y mayúsculas que hay en cada cadena. #include<stdio.h> #include<string.h> #include<ctype.h> int main() { char frase[20][50]; //Arreglo Unidimensional de cadena de caracteres

int n,i,mi=0,ma=0,ca; printf("Ingrese el numero de cadenas a leer: "); scanf("%d",&n); for(i=0;i<n;i++) { /*Para cada fila se lee la cadena correspondiente */ printf("Cadena[%d]: ",i+1); fflush(stdin); gets(frase[i]); } for(i=0;i<n;i++) { ca=0; mi=0; ma=0; while(frase[i][ca] != '\0') { if(islower(frase[i][ca])) mi++; else

if(isupper(frase[i][ca])) ma++; ca++; }

printf("\n%s tiene %d letras MINUSCULAS y %d letras MAYUSCULAS \n",frase[i],mi,ma);

} return 0; }

Page 25: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

25

Ejemplo #3: Programa en C que al recibir como datos cadenas de caracteres de hasta 80 caracteres como máximo, cuen ta el número de palabras que tiene cada línea. Cada cadena se lee l lamando a la función gets() y para contar las palabras se recorr e el array cadena contando el número de espacios, la longitud de la cadena se determina con una llamada a la función strlen(). El número de palabras será el número de espacios(blancos) contad os, más uno ya que la última palabra no termina con un espacio sin o con el retorno de carro. La ejecución termina tecleando al inicio de una línea ∧∧∧∧Z (Ctrl+Z); entonces la función gets() devuelve NULL y termina el bucle. #include<stdio.h> #include<string.h> int main() { char cadena[80],*apunta; int car,np; printf("Introducir Cadena: "); apunta=gets(cadena); while(apunta != NULL) { np=0; for(car=0;car<strlen(cadena);car++) { if(cadena[car] == ' ') np++; } if(car>0) np++; printf("\n%s tiene %d palabras\n",cadena,np); printf("Introducir Cadena: "); apunta=gets(cadena); } return 0; } Ejemplo #4: Programa en C que al recibir como datos cadenas de caracteres que contienen números reales, calcula e imprime la suma y el promedio de dichos números. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h>

Page 26: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

26

int main(void) { char cad[10],r; int i=0; float sum=0.0; printf("\nDesea ingresar una cadena de caracteres? "); r=getchar(); while(toupper(r) =='S') { printf ("\nIntroduce una cadena de caracteres: ") ; fflush(stdin); gets(cad); i++; sum += atof(cad);

printf("\nDesea ingresar otra cadena de caracteres( S/N)? ");

r = getchar(); } printf("\nSuma = %.2f\n",sum); printf("\nPromedio = %.2f\n",(sum/i)); return 0; } Ejemplo de Salida:

Ejemplo #5: Programa en C que al recibir como datos cadenas de caracteres, calcula e imprime la cantidad de vocale s en minúscula y mayúscula que hay en dicha cadena. #include <stdio.h> #include <string.h> #define MAXLON 80 int main(void) {

Page 27: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

27

char cadena[MAXLON+1]; int i, longitud,contmin=0,contmay=0;

printf ("Introduce una cadena (max. %d caracteres.) : ", MAXLON);

gets(cadena); longitud = strlen(cadena); for (i = 0; i < longitud ; i++) {

if (cadena[i] =='a' || cadena[i] == 'e' || cadena[i ] == 'i' || cadena[i] == 'o' || cadena[i] == 'u')

contmin++; if (cadena[i] =='A' || cadena[i] == 'E' || cadena[i ] == 'I' || cadena[i] == 'O' || cadena[i] == 'U')

contmay++; } printf ("***Hay %d Vocales Minusculas***\n", contm in); printf ("***Hay %d Vocales Mayusculas***\n", contm ay); return 0; }

Ejemplo #6: Programa para leer una lista de cadenas de caracte res, y encuentra la cadena de mayor longitud sin utiliza r la función strlen e imprime la cadena y el número de caractere s de la misma.

#include <stdio.h> #include <string.h> int main() { int i, n,cadmay=-1,posmay=0,ncar=0; char cad[50],frase[20][50]; printf("Cuantas cadenas desea leer? "); scanf("%d",&n); for(i=0;i<n;i++) { printf("Cadena[%d]: ",i+1); fflush(stdin); gets(frase[i]); } for(i=0;i<n;i++) { ncar=0; strcpy(cad,frase[i]); while(cad[ncar]!='\0') { ncar++; }

Page 28: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

28

if(ncar>cadmay) { cadmay=ncar; posmay=i; } }

printf("\nLa cadena No.%d: %s es la que tiene mayor longitud con %d caracteres\n",posmay+1,frase[posmay],cadmay) ;

return 0; } Ejemplo de Salida:

Ejemplo #7: Programa en C que, al recibir como dato una línea d e texto (cadena de caracteres), imprime esa cadena en forma inversa. #include <stdio.h> int main() { char palabra[30]; int i=0; printf("Ingrese una cadena:"); gets(palabra); puts(palabra); while(palabra[i] != '\0') i++; printf("%s tiene %d letras.\n", palabra, i); printf("%s escrita al reves es: ",palabra); while (i>=0) { printf("%c",palabra[i]); i--; } return 0; }

Page 29: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

29

EJERCICIOS PROPUESTOS:

1. Realice un programa en C que declare y lea un arreg lo de N

elementos, imprimir la suma de los números pares y el producto de los números impares del arreglo.

2. Escriba un programa que lee dos vectores A y B de 2 0 elementos

cada uno y multiplica el primer elemento de A por e l último de B y así sucesivamente hasta llegar al último elemen to de A por el primero elemento de B. El resultado de la multip licación se almacena en un vector C.

3. Realice un programa en C que lea un arreglo de N da tos y

asigne a sus elementos los valores 1, 4, 9, 16..... ...etc ( 12, 2 2, 3 2...).

4. Realice un programa en C que lea en un arreglo las edades de

N personas y que calcule e imprima la edad moda. La moda es la edad que más veces aparece (si dos o más edades apa recen muchas veces con la máxima frecuencia, asumiremos q ue cualquiera de ellas es la moda).

5. Realice un programa en C que calcule e imprima la t ranspuesta de una matriz. La transpuesta de una matriz se obti ene al escribir las filas de la matriz como columnas y las columnas como filas.

6. Realice un programa en C que intercambie las M fila s de un

arreglo bidimensional. Los elementos de la primera fila se intercambian con los de la última fila, los de la s egunda con los de la penúltima y así sucesivamente.

7. Escribir un programa en C que lea un array de N * 5 indicando que una empresa tiene N vendedores cada uno de los cuales vende 5 productos. El array almacena los ingresos o btenidos por cada vendedor en cada producto, imprimir el tot al de cada vendedor y obtener los ingresos totales de la tiend a.

8. Escribir un programa en C que, al recibir como dato s una cadena de caracteres y un carácter X, determine cuá ntas veces se encuentra el carácter X en dicha cadena.

9. Realice un programa en C que, al recibir como dato una cadena de caracteres, escriba esa línea en forma inversa.

10. Escribir un programa que, al recibir como dato una cadena de caracteres, convierta el primer carácter de cada palabra si ésta fuera una letra, de minúscula a mayúscula.

Page 30: TIPOS DE DATOS COMPUESTOS ESTÁTICOS EN C · PDF filem

Tipos de Datos Compuestos Estáticos en C

30

BIBLIOGRAFÍA BÁSICA:

• Ceballos, Francisco Javier: C/C++ Curso de Programación , 2da

Edición. Editorial RA-MA, 2002.

• Joyanes Aguilar, Luis; Zahonero Martínez Ignacio: Programación en C. McGraw Hill, 2001.

• Gottfried, Byron S: Programación en C . McGraw Hill, 1991.