Professional Documents
Culture Documents
PROGRAMACIN ESTRUCTURADA
TIPOS DE DATOS
COMPUESTOS ESTTICOS EN
C
2012
INTRODUCCIN:
Arreglo: Un Arreglo es una estructura de datos que almacena bajo el mismo nombre (variable)
a una coleccin de datos del mismo tipo. 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 elementos es necesario utilizar un ndice que especifica el
lugar que ocupa cada elemento dentro del archivo.
Un array (lista o tabla) es una coleccin de datos del mismo tipo que se referencian por un
nombre comn. Los datos se llaman elementos del array 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 por el usuario. Normalmente el array se utiliza para
almacenar tipos tales como char, int o float.
Cada tem del array se denomina elemento. Los elementos de un array se numeran
consecutivamente 0, 1, 2, 3... Estos nmeros se denominan valores ndice o subndice del
array. El trmino subndice se utiliza ya que se especifica igual que en matemticas, como una
secuencia a0, a1, a2, a3 Estos nmeros localizan la posicin 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
posicin 0, a[1] es el nombre (valor) del elemento que est en la posicin 1, etc. En general, el
elemento i-simo est en la posicin i-1. De modo que si el array tiene n elementos, sus
nombres son a[0], a[1], a[2], ., a[n-1].
Grficamente se representa as el array a de 6 elementos:
int a[6];
En C los ndices de un array siempre tiene como lmite inferior 0, como ndice superior el
tamao del array menos 1.
Al igual que con cualquier tipo de variable, se debe declarar un array antes de utilizarlo. Un
array se declara de forma similar a otros tipos de datos, excepto que se debe indicar al
compilador el tamao o longitud del array.
La sintaxis para declarar un array es simple:
tipo nombreArray [numerodeElementos];
Siendo:
tipo: El tipo de los elementos que conformarn el array.
nombreArray: El nombre de nuestro array .
numerodeElementos: Un nmero entero mayor que cero que indica el tamao del array.
Declaracin de arrays (Ejemplos):
int array1[100]; /* Declara un array de 100 elementos enteros */
char array2[15]; /* Declara un array de 15 caracteres */
Si por ejemplo, se quiere crear un array de nmeros reales y su tamao es una constante
representada por un parmetro:
#define NE 20
float array[NE];
Para acceder al elemento 3 y leer un valor de entrada del array: scanf(%f,&array[2]);
Por ejemplo, para crear un array (lista) de diez variables enteras, se escribe:
int numeros[10];
Esta declaracin hace que el compilador reserve espacio suficiente para contener diez valores
enteros. En C los enteros ocupan, normalmente, 2 bytes, de modo que un array de diez enteros
ocupa 20 bytes de memoria.
Precaucin: C no comprueba que los ndices del array estn dentro del rango definido. As, por
ejemplo, se puede intentar acceder a numeros [12] y el compilador no producir ningn error,
lo que puede producir un fallo en su programa, dependiendo del contexto en que se encuentre
el error.
SUBNDICES DE UN ARRAY:
El ndice de un array se denomina, con frecuencia, subndice del array. El trmino procede de
las matemticas, en las que un subndice se utiliza para representar un elemento determinado.
int numeros[4];
numeros0
equivale a
numeros1
equivale a
numeros2
equivale a
numeros3
equivale a
numeros[0]
numeros[1]
numeros[2]
numeros[3]
El mtodo de numeracin del elemento i-simo con el ndice o subndice i-1 se denomina
indexacin basada en cero. Su uso tiene el efecto de que el ndice de un elemento del array es
siempre el mismo que el nmero de pasos desde el elemento inicial numeros[0] a ese elemento.
Por ejemplo, numeros[3] est a 3 pasos o posiciones del elemento numeros[0].
Ejemplos:
int edad[5]; //Array edad, contiene 5 elementos: el primero edad[0] y el ltimo edad[4]
int pesos[25], longitudes[100];
// Declara dos arrays de enteros
float salarios[25];
//Declara un array de 25 elementos float
double temperaturas[50];
//Declara un array de 50 elementos double
char letras[15];
//Declara un array de caracteres
Los elementos de los arrays se almacenan en bloques contiguos. As por ejemplo, los arrays:
int edades[5];
char codigos[5];
Precaucin: C permite asignar valores fuera de rango a los subndices. Se debe tener cuidado
no hacer esta accin, debido a que se sobreescribiran datos o cdigo.
Los arrays de caracteres funcionan de igual forma que los arrays numricos, partiendo de la
base de que cada carcter ocupa normalmente un byte. As, por ejemplo, un array llamado
ciudad se puede representar de la siguiente manera:
Ejemplo:
[0]
[1]
[2]
[3]
\0
Es importante tomar en cuenta que en las cadenas de caracteres el sistema siempre inserta un
ltimo carcter (nulo, \0) para indicar el fin de cadena.
INICIALIZACIN DE UN ARRAY
Se deben asignar valores a los elementos del array antes de utilizarlos, tal como se asignan
valores a variables. Para asignar valores a cada elemento del array de enteros edades, se
puede escribir:
edades [0] = 15;
edades [1] = 25;
edades [3] = 30;
edades [4] = 35;
La primera sentencia fija edades[0] al valor 15, edades[1] al valor 25, etc. Sin embargo, este
mtodo no es prctico cuando el array contiene muchos elementos. El mtodo utilizado,
normalmente, es inicializar el array completo en una sola sentencia.
Ejemplo: int edades[4]={15,25,30,35};
Cuando se inicializa un array, el tamao del array se puede determinar automticamente por
las constantes de inicializacin. Estas constantes se separan por comas y se encierran entre
llaves, como en los siguientes ejemplos:
int numeros[6] = {10, 20, 30, 40, 50, 60};
int n[ ]= {3, 4, 5}; //Declara un array de 3 elementos
char c[ ] = {L,u,i,s}; //Declara un array de 4 elementos
En C las cadenas de caracteres, se caracterizan por tener un carcter final que indica el fin de
la cadena, es el carcter nulo (\0). Lo habitual es inicializar un array de caracteres (una
variable cadena) con una constante cadena. Ejemplo: char cad [ ] = Hola mundo;
Ejemplo de Salida:
Se pueden asignar constantes simblicas como valores numricos, de modo que las
sentencias siguientes son vlidas:
#define ENE 31
#define FEB 28
#define MAR 31
{ENE, FEB, MAR, ABR, MAY, JUN, JUL, JUL, AGO, SEP, OCT,
Pueden asignarse valores a un array utilizando un bucle for, while o do-while y ste
suele ser el sistema ms empleado normalmente.
Ejemplo #3: Programa que lee en un array las edades de un grupo de N estudiantes y
visualiza el promedio de edad de dicho grupo.
Pseudocdigo:
Proceso edad_promedio
Dimension aEdades[5];
sum<-0;
prom<-0.0;
indice<-1;
Mientras indice <= 5 Hacer
Escribir 'Ingrese la edad de la persona ', indice, ': ';
Leer aEdades[indice];
indice <- indice + 1;
FinMientras
indice<-1;
Mientras indice <= 5 Hacer
sum <- sum + aEdades[indice];
indice <- indice + 1;
FinMientras
7
prom<-sum/5;
Escribir 'La edad promedio es: ', prom;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int aEdades[100],indice=1,nest,sum=0;
float prom=0.0;
printf("\nCUANTOS ESTUDIANTES?");
scanf("%d",&nest);
while(indice<=nest)
{
printf("Ingrese la edad de la persona %d: ",indice);
scanf("%d",&aEdades[indice]);
indice++;
}
indice=1;
while(indice<=nest)
{
sum+= aEdades[indice];
indice++;
}
prom=sum/nest;
printf("La edad promedio es:%.f\n",prom);
}
Ejemplo de Salida:
Ejemplo #4: Programa en C que al recibir como dato un arreglo unidimensional de nmeros
reales, obtenga como resultado la suma del cuadrado de los nmeros.
//cuadrado_array.c
Solucin en Pseudocdigo:
Proceso cuadrado_array
Dimension numeros[10];
sum<-0;
indice<-1;
Mientras indice <= 10 Hacer
Escribir 'Ingrese el numero';
Leer numeros[indice];
cuadrado <- numeros[indice]* numeros[indice];
suma <-suma + cuadrado;
indice <- indice + 1;
FinMientras
Escribir 'La suma de los cuadrados de los ',indice-1,' numeros',' es ',suma;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<math.h>
void main()
{
int numeros[10],indice=1,cuadrado,sum=0;
while(indice<=10)
{
printf("Ingrese el numero %d:",indice);
scanf("%d",&numeros[indice]);
cuadrado=pow(numeros[indice],2);
sum+=cuadrado;
indice++;
}
printf("La suma de los cuadrados de los %d numeros es:%d\n",indice-1,sum);
}
Ejemplo de Salida:
Ejemplo #5: Programa en C que almacene en un arreglo unidimensional de tipo entero los
primeros 10 nmeros primos.
Cdigo en Lenguaje C
//primos_array.c
#include <stdio.h>
int main(void)
{
int n, i,p=0,nprimos[10];
printf("\nLos 10 primeros numeros primos son:\n\n");
/*Se analizarn los nmeros empezando desde 1, 2, 3, etc hasta que se muestren 10 nmeros
primos, es decir, hasta que p sea igual a 10*/
for(n=1; ;n++ )
{
/*Para disminuir el nmero de divisiones debemos empezar en 2 y terminar en un
valor igual a la mitad del nmero analizado. La divisin por nmeros mayores
tendrn un residuo que ser siempre mayor a 0*/
for(i=2; i <= n/2; i++)
{
/*Si hay algn nmero dentro del rango 2 a n/2 por el cual n sea divisible,
ya no tiene sentido seguir dividiendo porque n ya no sera primo; por lo
tanto, se debera salir del lazo*/
if (n%i == 0)
break;
}
10
if (i >= n/2+1 )
{
/*Si es que se ha probado con todas las divisiones cuyo divisores estn en
el rango 2 a n/2, el nmero ser primo y ser impreso en la tabla*/
nprimos[p]=n;
//Cada vez que se muestra un nmero primo, se incrementa el contador p
p++;
if (p==10)
//Cuando se cuenta 10 nmeros primos impresos se saldr del lazo
break;
}
}
//Impresin de los nmeros primos
for(i=0; i <10; i++)
printf("%d -> ",nprimos[i]);
return 1;
}
Ejemplo de Salida:
Ejemplo #6: Realice un programa en C que cree un array de N elementos enteros, cuyos
valores numricos se ingresaran por teclado, y luego obtenga la suma y el promedio de
los elementos ubicados en las posiciones pares del array.
Solucin en Pseudocdigo:
Proceso pospares
Dimension pospares[10];
pospar<-0;
sum<-0;
Para in<-1 Hasta 10 Con Paso 1 Hacer
Escribir 'Ingrese el numero', in;
Leer pospares[in];
Si in % 2 = 0 Entonces
pospar <- pospar +1;
sum <- sum + pospares[in];
FinSi
FinPara
prom <- sum / pospar;
Escribir 'La Suma de los ',pospar, 'que hay en posiciones pares es: ', sum;
11
Escribir 'El Promedio de los ',pospar, 'que hay en posiciones pares es: ', prom;
FinProceso
Cdigo en Lenguaje C:
#include<stdio.h>
#include<math.h>
void main()
{
int pospares[50],in,nelem,pospar=0,sum=0;
float prom;
printf("Cuantos elementos?");
scanf("%d",&nelem);
for(in=0;in<nelem;in++)
{
printf("Ingrese el numero %d:",in+1);
scanf("%d",&pospares[in]);
if(in%2==0)
{
pospar++;
sum+=pospares[in];
}
}
prom=sum/pospar;
printf("La suma de los %d numeros que hay en posiciones pares es:%d\n",pospar,sum);
printf("El promedio de los %d numeros que hay en posiciones pares
es:%.2f\n",pospar,prom);
}
Ejemplo de Salida:
12
Ejemplo #7: Realice un programa en C que lea en un array la edad de los N estudiantes
de la asignatura de Programacin Estructurada, calcule y muestre cual es la edad mnima
y mxima.
Cdigo en Lenguaje C:
//edadmax_min.c
#include<stdio.h>
void main()
{
int edades[100],e,nest,emax = 0,emin = 100;
printf("Cuantos estudiantes?");
scanf("%d",&nest);
for(e=0;e<nest;e++)
{
printf("Edad[%d]: ",e+1);
scanf("%d",&edades[e]);
if(edades[e]>emax)
emax = edades[e];
if(edades[e]<emin)
emin= edades[e];
}
printf("\n\t***LISTA DE EDADES***\n");
for(e=0;e<nest;e++)
{
printf(" %d ",edades[e]);
}
printf("\n\nLa edad minima es =%d\n",emin);
printf("\nLa edad maxima=%d\n\n",emax);
}
Ejemplo de Salida:
13
Cadena[0]
Cadena[1]
Cadena[2]
Cadena[3]
Cadena[4]
Cadena[5]
Cadena[6]
Cadena[7]
Cadena[8]
Cadena[9]
Cadena[10]
Cadena[11]
P
r
o
g
r
a
m
a
c
i
o
n
Cadena[0]
Cadena[1]
Cadena[2]
Cadena[3]
Cadena[4]
Cadena[5]
Cadena[6]
Cadena[7]
Cadena[8]
Cadena[9]
Cadena[10]
Cadena[11]
Cadena[12]
Cadena
Array de Caracteres
P
r
o
g
r
a
m
a
c
i
o
n
\0
Carcter Nulo
Las cadenas se sealan incluyendo un carcter final de la cadena; el carcter nulo (\0), cuyo
valor en el cdigo ASCII es 0. El medio ms fcil de inicializar un array de caracteres es hacer
la inicializacin de la declaracin:
char Cadena[13]=Programacion;
El compilador aade automticamente un carcter nulo al final de la cadena, de modo que la
secuencia real sera:
char Cadena[13]=Programacion;
Cadena
14
\0
15
Ejemplo #8: Programa en C que compara las longitudes de dos cadenas de caracteres
ledas por teclado, e imprime un mensaje indicando si ambas cadenas tienen o no la misma
longitud.
Cdigo en Lenguaje C:
//longitud.c
#include<stdio.h>
void main()
{
char cad1[30],cad2[30];
int c1=0,c2=0;
printf("Cadena 1:");
gets(cad1);
printf("Cadena 2:");
gets(cad2);
while(cad1[c1] != '\0')
c1++;
while(cad2[c2] != '\0')
c2++;
printf("\nLa cadena 1 tiene %d caracteres\n",c1);
printf("\nLa cadena 2 tiene %d caracteres\n",c2);
if(c1==c2)
printf("%s y %s tienen LA MISMA LONGITUD\n",cad1,cad2);
else
printf("%s y %s tienen DIFERENTE LONGITUD\n",cad1,cad2);
}
Ejemplo de Salida:
16
Ejemplo #9: Programa en C que permite al usuario introducir una cadena, y determina si
la cadena es un palndromo comprobando la igualdad de los smbolos comenzando por
ambos extremos de la cadena.
Cdigo en Lenguaje C
#include<stdio.h>
#include<string.h>
void main()
{
char palabra[30];
int longcad,numc=0,alto=0;
printf("Introduzca la cadena:");
scanf("%s",palabra);
longcad=strlen(palabra)-1;
while((numc<=longcad) && !alto)
{
if(palabra[numc] != palabra[longcad])
alto=1;
numc++;
longcad--;
}
if(!alto)
printf("%s es PALINDROMO\n",palabra);
else
printf("%s NO es PALINDROMO\n",palabra);
}
Ejemplo de Salida:
17
Ejemplo #10: Este programa lee una cadena de caracteres y convierte los caracteres de
minscula a mayscula y viceversa.
Cdigo en Lenguaje C
//mayuscula_minu.c
#include <stdio.h>
void main(void)
{
char texto[20];
int i=0,n,dif;
dif = 'a'-'A';
printf("Introduzca una cadena: ");
scanf("%s",texto);
while (texto[i] != '\0')
{
if ((texto[i] >='a')&&(texto[i] <='z'))
texto[i] -= dif;
else if ((texto[i]>='A')&&(texto[i]<='Z'))
texto[i] += dif;
i++;
}
texto[i] = '\0';
printf("\n****RESULTADO****\n");
for (n=0; n<=i; n++)
{
printf("%c", texto[n]);
}
printf("\n\n");
}
Ejemplo de Salida:
18
Ejemplo #11: Programa en C que pide al usuario ingrese una cadena de caracteres e
imprime la cadena sin los signos de puntuacin ni los nmeros. Adems los caracteres
alfabticos en minscula se convierten a mayscula.
Cdigo en Lenguaje C
//Signos_numeros.c
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
void main()
{
char cadena[50];
int i=0;
printf("Introduzca una cadena que incluya digitos y signos de puntuacion:\n");
gets(cadena);
while(cadena[i] != '\0')
{
if((ispunct(cadena[i]) ==0) && (isdigit(cadena[i])==0))
{
if((islower(cadena[i])) != 0)
cadena[i]= toupper(cadena[i]);
printf("%c",cadena[i]);
}
i++;
}
}
Ejemplo de Salida:
19
Ejemplo #12: Programa en C que cuenta e imprime las vocales en minscula y mayscula
de una cadena de caracteres leda por teclado.
Cdigo en Lenguaje C:
//cuentavocales.c
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#define MAXLON 80
int main(void)
{
char a[MAXLON+1];
int i, longitud,contmin=0,contmay=0;
printf ("Introduce una cadena (max. %d caracteres.): ", MAXLON);
gets(a);
longitud = strlen(a);
for (i = 0; i < longitud ; i++)
{
if (a[i] =='a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
contmin++;
if (a[i] =='A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')
contmay++;
}
printf ("***Hay %d Vocales Minusculas***\n", contmin);
printf ("***Hay %d Vocales Mayusculas***\n", contmay);
return 0;
}
Ejemplo de Salida:
20
ARRAYS MULTIDIMENSIONALES
Los arrays multidimensionales son aquellos que tienen ms de una dimensin y en consecuencia,
ms de un ndice. Los arrays ms usuales son los de dos dimensiones, conocidos tambin por el
nombre de tablas o matrices. Sin embargo, es posible crear arrays de tantas dimensiones
como requieran sus aplicaciones.
Un array de dos dimensiones equivale a una tabla de mltiples filas y mltiples columnas.
21
Los arrays multidimensionales se pueden inicializar, al igual que los de una dimensin, cuando se
declaran. La inicializacin consta de una lista de constantes separadas por comas y encerradas
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}
};
int tabla2 [3] [4] = { {1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
Se puede acceder a los elementos de arrays multidimensionales de igual forma que a los
elementos de un array unidimensional. La diferencia reside en que en los elementos
bidimensionales deben especificarse los ndices de la fila y la columna.
El formato general para asignacin directa de valores a los elementos es:
Insercin de elementos
<Nombre array> [ndice fila] [ndice columna] = valor elemento;
Extraccin de elementos:
<Variable> = <nombre array> [ndice fila] [ndice columna];
22
LECTURA
Y
BIDIMENSIONALES
ESCRITURA
DE
ELEMENTOS
DE
ARRAYS
Por ejemplo:
int tabla[3][4];
double resistencias[4][5];
scanf(%d, &tabla[2][3]);
printf(%d,tabla[1][1]);
scanf(%lf,&resistencias [2][4]);
if( asientosLibres [3][1])
puts(VERDADERO);
else
puts(FALSO);
Ejemplo de Salida:
Ejemplo #14: Programa en C que lee un array bidimensional cuadrado e imprime los
elementos de la diagonal principal de dicha matriz.
Solucin en Pseudocdigo:
Proceso imprimirdiagonal
Dimension matrizA[3,3]; //arreglo de dos dimensiones (12 elementos)
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
Escribir 'Elemento[',f, ', ',c, ']:';
Leer matrizA[f,c]; //se almacena el elemento
FinPara
FinPara
Escribir "***DATOS DE LA MATRIZ***";
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
Escribir matrizA[f,c]; //se imprime el elemento
FinPara
FinPara
Escribir "Diagonal Principal";
Para f <- 1 Hasta 3 Con Paso 1 Hacer
Para c<- 1 Hasta 3 Con Paso 1 Hacer
si f = c Entonces
Escribir matrizA[f,c]; //se imprime el elemento
FinSi
FinPara
FinPara
FinProceso
24
Cdigo en Lenguaje C
//diagonal.c
#include<stdio.h>
#define MAXF 3
#define MAXC 3
void main()
{
int matrizA[MAXF][MAXC],f,c;
printf("Datos de la matriz\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
printf("Elemento[%d][%d]:",f+1,c+1);
scanf("%d",&matrizA[f][c]);
}
}
printf("\n***DATOS DE LA MATRIZ***\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
printf("%d ",matrizA[f][c]);
}
printf("\n");
}
printf("\nDiagonal Principal\n");
for(f=0;f<MAXF;f++)
{
for(c=0;c<MAXC;c++)
{
if(f==c)
printf("%d ",matrizA[f][c]);
}
printf("\n");
}
}
25
Ejemplo de Salida:
Ejemplo #15: Programa en C que lee una matriz de N*M elementos enteros y determine
la posicin [fila,columna] del nmero mayor almacenado en la matriz. Suponga que los
datos introducidos son diferentes.
//mayorbidimensional.c
#include<stdio.h>
#define MAXF 50
#define MAXC 50
void main()
{
int matriz[MAXF][MAXC],mayor=0,f,c,posif,posic, nfil,ncol;
printf("Introduzca el numero de filas: ");
scanf("%d",&nfil);
printf("Introduzca el numero de columnas: ");
scanf("%d",&ncol);
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("Elemento[%d][%d]: ",f,c);
scanf("%d",&matriz[f][c]);
}
}
26
27
ENCUENTRA
EN LA
POSICION
28
//Observa que el ndice del array correspondiente a las columnas solo se mueve a la mitad
for(c=0;c<(ncol/2);c++)
{
for(f=0;f<nfil;f++)
{
aux = intercambia[f][c];
intercambia[f][c] = intercambia[f][ncol-c-1];
intercambia[f][ncol-c-1]=aux;
}
}
printf("\n***INTERCAMBIO DE COLUMNAS***\n");
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%f ",intercambia[f][c]);
}
printf("\n");
}
}
Ejemplo de Salida:
29
Ejemplo #17: Crear un programa que cree un array de N X M indicando que una empresa
tiene N vendedores cada uno de los cuales vende 5 productos. El array almacena los
ingresos obtenidos por cada vendedor en cada producto, imprimir el total de cada
vendedor y obtener los ingresos totales de la tienda.
//tienda.c
#include<stdio.h>
#define NV 100
#define NP 5
void main()
{
int tienda[NV][NP],suma_vta,v,p,nv;
int total_vta=0;
printf("Introduzca el numero de vendedores:");
scanf("%d",&nv);
//Lectura de los datos de la matriz
for(v=0;v<nv;v++)
{
printf("\n***VENDEDOR %d***\n",v+1);
for(p=0;p<NP;p++)
{
printf("Venta[%d][%d]: ",v+1,p+1);
scanf("%d",&tienda[v][p]);
}
}
//Escribir la suma de las M ventas realizadas por cada vendedor
for(v=0;v<nv;v++)
{
suma_vta=0;
for(p=0;p<NP;p++)
{
suma_vta += tienda[v][p];
}
printf("El vendedor[%d] vendio C$: %d\n",v+1,suma_vta);
total_vta += suma_vta;
}
printf("\n\tEL TOTAL DE VENTAS ES C$ %d\n",total_vta);
}
30
Ejemplo de Salida:
A partir de esta lnea de cdigo, C crea una matriz unidimensional m con los elementos, m[0],
m[1], , m[F-1], que a su vez son matrices unidimensionales de C elementos de tipo char.
Grficamente podemos representarlo as:
31
Para acceder a los elementos de la matriz m, puesto que se trata de una matriz de cadenas de
caracteres, se utiliza slo el primer subndice, el que indica la fila. Slo se utiliza dos
subndices cuando sea necesario acceder a un carcter individual.
Es importante remarcar que m[0], m[1], etc, son cadenas de caracteres y que, por ejemplo,
m[3][1] es un carcter; el que est en la fila 1, columna 3.
Ejemplo #18: Programa para leer una lista de nombres y los almacene en una matriz.
Una vez construida, visualiza su contenido.
//cadenas.c
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define FIL 100
#define COL 80
void main()
{
char nombre[FIL][COL];
int nf=0,f;
char *fin,resp;
do
{
printf("Cuantas cadenas desea leer: ");
scanf("%d",&nf);
}while(nf<1 || nf>FIL);
fflush(stdin);
printf("Escriba las cadenas que desea introducir:\n");
for(f=0;f<nf;f++)
{
printf("Nombre[%d]: ",f);
fin=gets(nombre[f]);
}
nf= f;
do
{
printf("Desea visualizar el contenido de la matriz? (s/n)");
resp= tolower(getchar());
32
if(resp == 's')
{
//Visualizar la lista de nombres
printf("\n");
for(f=0;f<nf;f++)
printf("%s\n",nombre[f]);
}
}
Ejemplo de Salida:
En C todos los arrays se pasan por referencia (direccin). Esto significa que cuando se llama a
una funcin y se utiliza un array como parmetro, se debe tener cuidado de no modificar los
arrays en una funcin llamada. C trata automticamente la llamada a la funcin como si hubiera
situado el operador de direccin & delante del nombre del array.
Dadas las siguientes declaraciones:
#define MAX 100
double datos[MAXl;
Se puede declarar una funcin que acepte un array de valores double como parmetro. La
funcin SumaDeDatos() puede tener el siguiente prototipo:
double SumaDeDatos(double datos[MAXl);
33
Incluso mejor si se dejan los corchetes en blanco y se aade un segundo parmetro que indica
el tamao del array:
double SumaDeDatos(double datos[], int n);
A la funcin SumaDeDatos se pueden entonces pasar argumentos de tipo array junto con un
entero n, que informa a la funcin sobre cuantos valores contiene el array. Por ejemplo, esta
sentencia visualiza la suma de valores de los datos del array:
printf ("\nSuma = %lf",SumaDeDatos(datos,MAX)) ;
double SumaDeDatos(double datos[ ], int n)
{
double suma = 0;
while (n > 0)
suma += datos[--nl;
return suma;
}
Cuando se utiliza una variable array como argumento, la funcin receptora puede no conocer
cuntos elementos existen en el array. Sin su conocimiento una funcin no puede utilizar el
array. Aunque la variable array puede apuntar al comienzo de l, no proporciona ninguna
indicacin de donde termina el array.
Se pueden utilizar dos mtodos alternativos para permitir que una funcin conozca el
nmero de argumentos asociados con un array que se pasa como argumento de una
funcin:
Situar un valor de seal al final del array, que indique a la funcin que se ha de detener
el proceso en ese momento;
Pasar un segundo argumento que indica el nmero de elementos del array.
Ejemplo #19: Programa en C que intercambia las columnas de un arreglo bidimensional.
Los elementos de la primera fila se intercambian con los de la ltima, los de la segunda
con los de la penltima, y as sucesivamente, implementando funciones.
//intercambiafns.c
#include<stdio.h>
#define MAX 50
//Prototipos de Funciones
void LeerArray(float [ ][MAX],int,int);
void ImprimirArray(float [ ][MAX],int,int);
void IntercambiaCol(float [ ][MAX],int,int);
34
void main()
{
float intercambia[MAX][MAX];
int nfil,ncol;
do
{
printf("Introduzca el numero de filas: ");
scanf("%d",&nfil);
}while(nfil>MAX || nfil <1);// Se verifica que el numero de filas sea correcto
do
{
printf("Introduzca el numero de columnas: ");
scanf("%d",&ncol);
}while(ncol>MAX || ncol <1); // Se verifica que el numero de columnas sea correcto
//Llamadas a funciones
LeerArray(intercambia,nfil,ncol);
printf("\nElementos del array antes del intercambio\n");
ImprimirArray(intercambia,nfil,ncol);
IntercambiaCol(intercambia,nfil,ncol);
printf("\n***INTERCAMBIO DE COLUMNAS***\n");
ImprimirArray(intercambia,nfil,ncol);
}
35
//Observa que el ndice del array correspondiente a las columnas solo se mueve a la mitad
for(c=0;c<(ncol/2);c++)
{
for(f=0;f<nfil;f++)
{
aux = intercambia[f][c];
intercambia[f][c] = intercambia[f][ncol-c-1];
intercambia[f][ncol-c-1]=aux;
}
}
}
//Esta funcin imprime un array bidimensional de tipo float de nfilas y ncolumnas
void ImprimirArray(float intercambia[ ][MAX],int nfil,int ncol)
{
int f,c;
for(f=0;f<nfil;f++)
{
for(c=0;c<ncol;c++)
{
printf("%f ",intercambia[f][c]);
}
printf("\n");
}
}
36
EJERCICIOS PROPUESTOS:
1. Realice un programa en C que lea N elementos enteros y que imprima el nmero de
veces que se repite un nmero X en dicho array.
2. Realice un programa en C que lea en un array la calificacin de 50 estudiantes. Calcule e
imprima el porcentaje de aprobados y reprobados tomando en cuenta que la calificacin
mnima para aprobar es 70 pts.
3. Realice un programa en C que permita leer dos arrays de 10 elementos cada uno e
imprimir la palabra IGUALES si ambos arrays son iguales y DIFERENTES si no los son.
Tomar en cuenta que sern iguales si en la misma posicin de ambos arrays se encuentra
el mismo elemento.
4. Realice un programa en C que permita al Director del Consejo Supremo Electoral
encontrar el nmero y porcentaje de votos obtenidos por cada uno de los 3 candidatos
de la contienda electoral en relacin a los 3000 votantes que asistieron a las urnas a
depositar su voto. Lea en un array la intencin de voto de cada una de las personas.
5. Escribe un programa en C que lea del teclado una cadena y muestre en la pantalla la
cantidad de consonantes y de vocales que contiene dicha cadena.
6. Realice un programa en C que permita calcular la suma de los elementos de la diagonal
principal de una matriz (N*N), el producto de los elementos de la diagonal secundaria.
7. Las calificaciones de los estudiantes del Departamento de Computacin se tienen en una
matriz de N x M elementos (N, nmero de alumnos; M, nmero de asignaturas). Realizar
un programa en C que imprima el promedio de notas de cada alumno y el promedio
general.
8. Escribir un programa que rellene automticamente una 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.
9. Realice un programa que cuente el nmero de veces que se repite una palabra en una
frase.
10.
Realice un programa en C que permita introducir una lista con las edades de los N
estudiantes de la asignatura de Programacin Estructurada que imprima el array de las
edades en formato descendente, cul es la edad menor, edad promedio. Defina las
siguientes funciones:
37
BIBLIOGRAFA BSICA:
Ceballos, Francisco Javier: C/C++ Curso de Programacin, 2da Edicin. Editorial RA-MA,
2002.
Joyanes Aguilar, Luis; Zahonero Martnez Ignacio: Programacin en C. McGraw Hill, 2001.
Gottfried, Byron S: Programacin en C. McGraw Hill, 1991.
38