Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación (E1201)
email: pagarcia@ing.unlp.edu.ar
Programación (E1201) - FI - UNLP
Arreglos - Clase I
• Arreglos unidimensionales
– Definición de arreglo
– Declaración/inicialización
– Acceso a los elementos
• Cadenas de caracteres
– Definición de cadena
– Entrada/salida
– Operaciones con cadenas
• Arreglos multidimensionales
2
Programación (E1201) - FI - UNLP
Arreglos (unidimensionales)
• Son colecciones de
variables del mismo tipo
a
56 b
5
c
89
d
2
e
9
3
Programación (E1201) - FI - UNLP
Arreglos (unidimensionales)
• Son colecciones de a
variables del mismo tipo
• Referenciados por el 56
mismo nombre 5
89
4
Programación (E1201) - FI - UNLP
Arreglos (unidimensionales)
• Son colecciones de a
variables del mismo tipo a[0]
• Referenciados por el 56 a[1]
mismo nombre 5
a[2]
• Cada variable se identifica 89
mediante el nombre del a[3]
arreglo y un índice 2
a[4]
• El índice del primer 9
elemento es cero
5
Programación (E1201) - FI - UNLP
Arreglos (unidimensionales)
• Las variables de un arreglo
están almacenadas en …
posiciones contiguas de a
memoria a[0] 56
a[1] 5
a[2] 89
a[3] 2
a[4] 9
6
Programación (E1201) - FI - UNLP
Arreglos (unidimensionales)
• Las variables de un arreglo
están almacenadas en …
posiciones contiguas de a dirección
memoria a[0] 56 1358
7
Programación (E1201) - FI - UNLP
Declaración de arreglos
• El lenguaje C requiere que antes de utilizar cualquier variable, la
misma esté declarada.
• Los arreglos no son la excepción…. Y se declaran de la siguiente
manera:
Ejemplos:
char letras[80];
unsigned int valores[5];
8
float temperatura[24];
Programación (E1201) - FI - UNLP
Declaración de arreglos
• El lenguaje C requiere que antes de utilizar cualquier variable, la
misma esté declarada.
• Los arreglos no son la excepción…. Y se declaran de la siguiente
manera:
donde:
<valores iniciales>: es la lista de valores, separados por coma, a asignar a los
respectivos elementos del arreglo.
Ejemplos:
10
Programación (E1201) - FI - UNLP
11
Programación (E1201) - FI - UNLP
En los ejemplos anteriores el tamaño del arreglo coincide con el tamaño de elementos
entre llaves:
unsigned int a[5] = {56,5,89,2,9};
char saludo[10] = {‘h’,’o’,’l’,’a’,’ ’,’m’,’u’,’n’,’d’,’o’};
Si se dejan los corchetes vacíos el tamaño del arreglo queda definido por la cantidad
de valores de inicialización:
unsigned int b[] = {56,5,89,2,9}; // b tendrá 5 elementos
O los arreglos inicializados con más valores que los que pueden guardar 12
double temperaturas[3] = {12.3, 15.8, 16, 21, 100}; // 3 < 5
Programación (E1201) - FI - UNLP
<Nombre_Arreglo>[<índice>]
Donde <índice> debe ser cualquier expresión entera entre el índice del
primer elemento (0) y el del último elemento (tamaño – 1) inclusive
Ejemplos:
int a[3],b=2,c=1;
a[0] = 20;
a[c] = b*a[0]; //a[1]=2*a[0]
scanf(“%d”, &a[c+1]);
printf(“a[%d]=%d”, c, a[c]); // imprime: a[1]=40
13
Programación (E1201) - FI - UNLP
<Nombre_Arreglo>[<índice>]
Donde <índice> debe ser cualquier expresión entera entre el índice del
primer elemento (0) y el del último elemento (tamaño – 1) inclusive
<Nombre_Arreglo>[<índice>]
Donde <índice> debe ser cualquier expresión entera entre el índice del
primer elemento (0) y el del último elemento (tamaño – 1) inclusive
Ejemplos:
A la función scanf hay que aclararle en que elemento se
int a[3],b=2,c=1; desea guadar el valor ingresado por teclado.
a[0] = 20; En este caso se guarda en a[2]
a[c] = b*a[0]; //a[1]=2*a[0]
scanf(“%d”, &a[c+1]);
printf(“a[%d]=%d”, c, a[c]); // imprime: a[1]=40
15
Programación (E1201) - FI - UNLP
Ejemplo:
3 1 2 4 8 16 32 64 128
i A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
16
Programación (E1201) - FI - UNLP
Ejemplo:
256
3 1 2 4 8 16 32 64 128
i A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
17
Programación (E1201) - FI - UNLP
Ejemplo:
256 6
3 1 2 4 8 16 32 64 128
i A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
18
Programación (E1201) - FI - UNLP
Ejemplo:
4 256 6
3 1 2 4 8 16 32 64 128
i A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
19
Programación (E1201) - FI - UNLP
Ejemplo:
4 256 6 10
3 1 2 4 8 16 32 64 128
i A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
20
Programación (E1201) - FI - UNLP
Ejemplo 1
Escriba el código de un programa que:
a) Declare un arreglo de 3 elementos reales.
b) Pida al usuario que ingrese los valores del
arreglo por teclado
c) Muestre en pantalla el arreglo completo, en el
orden ingresado por el usuario
21
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
Ejemplo 1
2 #include <stdlib.h>
3
4 int main()
5 {
6 //a. Declare un arreglo de 3 elementos reales.
7 double valores[3];
8
9 //b. Pida al usuario que ingrese los valores del arreglo por teclado
10 printf("Ingrese el primer valor-> ");
11 scanf("%lf",&valores[0]);
12 printf("Ingrese el segundo valor-> ");
13 scanf("%lf",&valores[1]);
14 printf("Ingrese el tercer valor-> ");
15 scanf("%lf",&valores[2]);
16
17 //c. Muestre en pantalla los valores en el orden ingresado por el usuario
18 printf("valores[0]: %lf\n",valores[0]);
19 printf("valores[1]: %lf\n",valores[1]);
20 printf("valores[2]: %lf\n",valores[2]);
21
22 return 0;
23 }
22
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
Ejemplo 1
2 #include <stdlib.h>
3
4 int main()
5 {
6 //a. Declare un arreglo de 3 elementos reales.
7 double valores[3];
8
9 ¿Qué cambiaría en el programa si en lugar
//b. Pida al usuario que ingrese los valores del arreglo por teclado
10
11 de 3 elementos en el arreglo fuesen 5?
printf("Ingrese el primer valor-> ");
scanf("%lf",&valores[0]);
12 printf("Ingrese el segundo valor-> ");
13 scanf("%lf",&valores[1]);
14
15
¿Y si fuesen 100? (ver video)
printf("Ingrese el tercer valor-> ");
scanf("%lf",&valores[2]);
16
17 //c. Muestre en pantalla los valores en el orden ingresado por el usuario
18 printf("valores[0]: %lf\n",valores[0]);
19 printf("valores[1]: %lf\n",valores[1]);
20 printf("valores[2]: %lf\n",valores[2]);
21
22 return 0;
23 }
23
Programación (E1201) - FI - UNLP
24
Programación (E1201) - FI - UNLP
Ejemplo 2
Realice un programa que
a) Pida el ingreso de 5 números reales y los
almacene en un arreglo de nombre x.
b) En un segundo arreglo real con nombre y
almacene los elementos del arreglo x elevados al
cubo, de manera que coincidan los índices: y[n]
<- x[n] al cubo
A[1]:
A[2]:24
c) Imprima una tabla con los valores de ambos A[0]:
A[3]:18
arreglos
25
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
2
3
#include <stdlib.h>
Ejemplo integrador I
4 #define N 5
Realice
5
6
un programa que
int main()
7 {
a) Pida
8 floatel ingreso de 20 números reales y los almacene en un
x[N],y[N];
9 int i;
10 arreglo de nombre x.
11 //a. Pida el ingreso de 20 números reales y los almacene en un arreglo de nombre x.
18 //b. En un segundo arreglo real con nombre y almacene los elementos del arreglo x
c) Imprima una tabla con los valores de ambos arreglos
19 // elevados al cubo, de manera que coincidan los índices: y[n] <- x[n] al cubo
20 for(i=0;i<N;i++)
21 {
22 y[i]=x[i]*x[i]*x[i];
23 }
24
25 //c. Imprima una tabla con los valores de ambos arreglos
A[1]:
A[2]:24
26 printf("\nx[]\ty[]\n"); A[0]:
A[3]:18
27 for(i=0;i<N;i++)
28 {
29 printf("%.2f\t%.2f\n",x[i],y[i]);
30 }
26
31 return 0;
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
2
3
#include <stdlib.h>
Ejemplo integrador
Definición de I N que representa el
la constante simbólica
4 #define N 5 tamaño de los arreglos
Realice
5
6
un programa que
int main() Se utiliza en la declaración de los arreglos (línea 8)
7 { Y en la condición de los bucles (líneas 12, 20 y 27)
a) Pida
8 floatel ingreso de 20 números reales y los almacene en un
x[N],y[N];
9 int i;
10 arreglo de nombre x.
11 //a. Pida el ingreso de 20 números reales y los almacene en un arreglo de nombre x.
18 //b. En un segundo arreglo real con nombre y almacene los elementos del arreglo x
c) Imprima una tabla con los valores de ambos arreglos
19 // elevados al cubo, de manera que coincidan los índices: y[n] <- x[n] al cubo
20 for(i=0;i<N;i++)
21 {
22 y[i]=x[i]*x[i]*x[i];
23 }
24
25 //c. Imprima una tabla con los valores de ambos arreglos
A[1]:
A[2]:24
26 printf("\nx[]\ty[]\n"); A[0]:
A[3]:18
27 for(i=0;i<N;i++)
28 {
29 printf("%.2f\t%.2f\n",x[i],y[i]);
30 }
27
31 return 0;
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
2
3
#include <stdlib.h>
Ejemplo integrador I
Permite modificar de manera segura, en un único lugar del
4 #define N 5
código el tamaño de los arreglos sin tocar el resto del
Realice
5
6
un
int main()
programa que programa
7 {
a) Pida
8 floatel ingreso de 20 números reales y los almacene en un
x[N],y[N];
9 int i;
10 arreglo de nombre x.
11 //a. Pida el ingreso de 20 números reales y los almacene en un arreglo de nombre x.
18 //b. En un segundo arreglo real con nombre y almacene los elementos del arreglo x
c) Imprima una tabla con los valores de ambos arreglos
19 // elevados al cubo, de manera que coincidan los índices: y[n] <- x[n] al cubo
20 for(i=0;i<N;i++)
21 {
22 y[i]=x[i]*x[i]*x[i];
23 }
24
25 //c. Imprima una tabla con los valores de ambos arreglos
A[1]:
A[2]:24
26 printf("\nx[]\ty[]\n"); A[0]:
A[3]:18
27 for(i=0;i<N;i++)
28 {
29 printf("%.2f\t%.2f\n",x[i],y[i]);
30 }
28
31 return 0;
Programación (E1201) - FI - UNLP
1 #include <stdio.h>
2
3
#include <stdlib.h>
Ejemplo integrador I
4 #define N 5
Realice
5
6
un programa que
int main()
7 {
a) Pida
8 floatel ingreso de 20 números reales y los almacene en un
x[N],y[N];
9 int i;
10 arreglo de nombre x.
11 //a. Pida el ingreso de 20 números reales y los almacene en un arreglo de nombre x.
1 #include <stdio.h>
2
3
#include <stdlib.h>
Ejemplo integrador I
4 #define N 5
Realice
5
6
un programa que
int main()
7 {
a) Pida
8 floatel ingreso de 20 números reales y los almacene en un
x[N],y[N];
9 int i;
10 arreglo de nombre x.
11 //a. Pida el ingreso de 20 números reales y los almacene en un arreglo de nombre x.
18 //b. En un segundo arreglo real con nombre y almacene los elementos del arreglo x
c) Imprima una tabla con los valores de ambos arreglos
19 // elevados al cubo, de manera que coincidan los índices: y[n] <- x[n] al cubo
20 for(i=0;i<N;i++)
21 {
22 y[i]=x[i]*x[i]*x[i];
23 }
24
25 //c. Imprima una tabla con los valores de ambos arreglos
A[1]:
A[2]:24
26 printf("\nx[]\ty[]\n"); A[0]:
A[3]:18
27 for(i=0;i<N;i++)
28 {
29 printf("%.2f\t%.2f\n",x[i],y[i]);
30 }
30
31 return 0;
Programación (E1201) - FI - UNLP
Ejemplo 3
a) Realice un programa que permita el ingreso por teclado del número
de alumno y las notas obtenidas en ambos módulos de una materia
para un total de 100 alumnos.
Para cada alumno el programa deberá determinar el estado de
aprobación:
• Desaprobado: alguno de los dos módulos menor que 4
• Aprobado: ambos módulos mayor o igual a 4 y promedio
menor a 6
• Promocionado: ambos módulos mayor o igual a 4 y
promedio mayor o igual a 6
b) Al finalizar el programa deberá mostrarse una lista con el número
de alumno y el promedio de los alumnos promocionados
A[1]:
A[2]:24
c) En realidad, 100 es el máximo de alumnos queA[0]:
puede
A[3]:18 tener la
materia y la cantidad efectiva de alumnos varía cada año. Modifique
el programa para que el usuario pueda ingresar solo la cantidad
necesaria de alumnos. 31
Programación (E1201) - FI - UNLP
Ejemplo 3
a) Realice un programa que permita el ingreso por teclado del número
de alumno y las notas obtenidas en ambos módulos de una materia
para un total de 100 alumnos.
Para cada alumno el programa deberá determinar el estado de
aprobación:
• Desaprobado: alguno de los dos módulos menor que 4
Ver video
• Aprobado: ambos módulos mayor o igual a 4 y promedio
menor a 6
• Promocionado: ambos módulos mayor o igual a 4 y
promedio mayor o igual a 6
b) Al finalizar el programa deberá mostrarse una lista con el número
de alumno y el promedio de los alumnos promocionados
A[1]:
A[2]:24
c) En realidad, 100 es el máximo de alumnos queA[0]:
puede
A[3]:18 tener la
materia y la cantidad efectiva de alumnos varía cada año. Modifique
el programa para que el usuario pueda ingresar solo la cantidad
necesaria de alumnos. 32
Programación (E1201) - FI - UNLP
Cadenas de caracteres
Las cadenas de caracteres (o simplemente cadenas) son
secuencias de caracteres almacenados uno a continuación
del otro en memoria, finalizada con el carácter nulo: ‘\0’,
cuyo valor numérico equivalente en la tabla ASCII es 0.
…
Programación (E1201) - FI - UNLP
Cadenas de caracteres
Ejemplos:
Cadenas de caracteres
Uso de comillas dobles:
• Sintaxis compacta para enunciar cadenas constantes
• Agrega automáticamente el carácter nulo al final
• Se utiliza en las declaraciones como valor de
inicialización
• Como parámetro de funciones (Ej: cadena de control
del printf/scanf)
Cadenas de caracteres
Ejemplos:
Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:
printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);
puts
• puts(arreglo1); printf usa el especificador de formato %s
• puts(“cadena constante”); en su cadena de control para indicar la
impresión de una cadena de caracteres
37
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:
printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);
38
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:
printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);
Si únicamente se desea imprimir
puts una cadena constante o
• puts(arreglo1); almacenada en un arreglo, no es
• puts(“cadena constante”); necesario el uso del %s.
39
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:
printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);
40
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:
puts
• puts(arreglo1);
• puts(“cadena constante”);
41
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1); La lectura de cadenas usando scanf
• scanf(“%[^\n]”, arreglo1); tiene distintas variantes. El
funcionamiento ya es conocido, la
• scanf(“%79s”, arreglo1); función espera hasta que el usuario
• scanf(“%79[^\n]”, arreglo1); presione enter y luego de eso
procesa los caracteres presionados
antes del enter según el formato
indicado en la cadena de control
gets
• gets(arreglo1);
42
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1); Lo típico es usar %s como en printf,
• scanf(“%[^\n]”, arreglo1); con la salvedad de que los caracteres
son procesados hasta encontrar el
• scanf(“%79s”, arreglo1); primer espacio (‘ ‘) o el último
• scanf(“%79[^\n]”, arreglo1); carácter ingresado. Por lo tanto si el
usuario ingresa una frase con
espacios solo se guardará la primera
palabra.
gets
• gets(arreglo1);
43
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
• Lo típico con cadenas de
caracteres es usar %s como en
scanf printf
• scanf(“%s”, arreglo1); • Con la salvedad de que los
• scanf(“%[^\n]”, arreglo1); caracteres son guardados en el
arreglo hasta encontrar el
• scanf(“%79s”, arreglo1); primer carácter espacio (‘ ‘) o el
• scanf(“%79[^\n]”, arreglo1); último carácter ingresado en
caso de no haber espacios. Por
lo tanto si el usuario ingresa una
frase con espacios solo se
gets
guardará la primera palabra.
• gets(arreglo1); • El scanf se encarga de guardar el
carácter nulo a continuación de
los caracteres leídos
44
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1); • El especificador %[^\n] funciona
• scanf(“%[^\n]”, arreglo1); similar al %s con la excepción de
que incluye los espacios (guarda
• scanf(“%79s”, arreglo1); en el arreglo todos los caracteres
• scanf(“%79[^\n]”, arreglo1); previos al enter)
gets
• gets(arreglo1);
45
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
• En ambos casos, si el usuario
scanf ingresa más de 79 caracteres, se
• scanf(“%s”, arreglo1); desbordaría la capacidad del
• scanf(“%[^\n]”, arreglo1); arreglo (que tiene lugar para 80
caracteres de los cuales uno es
el nulo)
• scanf(“%79s”, arreglo1); • Si esto ocurre pueden
• scanf(“%79[^\n]”, arreglo1); sobreescribirse zonas de
memoria con información de
interés, lo cual puede ser
gets catastrófico para la ejecución de
• gets(arreglo1); un algoritmo
• Por eso esta manera de utilizar
el scanf se considera “insegura”
46
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1);
• scanf(“%[^\n]”, arreglo1); • La manera segura de utilizar el
scanf, con cualquiera de los dos
• scanf(“%79s”, arreglo1); especificadores de formato, es
• scanf(“%79[^\n]”, arreglo1); indicar la cantidad máxima de
caracteres a procesar, la cual
debe ser como máximo el
tamaño del arreglo menos uno.
gets
• gets(arreglo1);
47
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1);
• scanf(“%[^\n]”, arreglo1);
• Nótese que el caso de las cadenas
• scanf(“%79s”, arreglo1); de caracteres es una excepción en
el uso de scanf, ya que los
• scanf(“%79[^\n]”, arreglo1);
arreglos donde se guardarán no
llevan antepuesto el operador &
gets
• gets(arreglo1);
48
Programación (E1201) - FI - UNLP
Entrada/Salida de cadenas
Para la lectura de cadenas desde el teclado tenemos dos opciones:
char arreglo1[80];
scanf
• scanf(“%s”, arreglo1);
• scanf(“%[^\n]”, arreglo1);
Ejemplo 4
Haga un programa que:
a)pida al usuario que ingrese una
cadena, la misma debe almacenarse en
un arreglo de 50 caracteres.
b)calcule la longitud de la cadena
ingresada.
c)cuente la cantidad de vocales
50
Programación (E1201) - FI - UNLP
Ejemplo 4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <locale.h>
4
5
6 int main()
7 {
8 int i,voc;
9 char cad[50];
10
11 setlocale(LC_ALL,"spanish"); //para usar eñe y acentos
12
13 //a. pida al usuario que ingrese una cadena,
14 //la misma debe almacenarse en un arreglo de 50 caracteres.
15 printf("Ingrese una cadena >");
16 scanf("%49[^\n]",cad);//leo en forma segura
17 printf("La cadena leida es: %s\n",cad);
18
19 //b. calcule la longitud de la cadena ingresada.
20 i=0;
21 while(cad[i] != '\0')//mientras no llegue al final de la cadena
22 i++;
23 printf("La cadena tiene %d caracteres\n",i); 51
24
Programación (E1201) - FI - UNLP
Ejemplo 4
24
25 //c.cuente la cantidad de vocales
26 i=0;
27 voc=0;
28 while(cad[i] != '\0')//mientras no llegue al final de la cadena
29 {
30 if(cad[i]=='a'||cad[i]=='e'||cad[i]=='i'||cad[i]=='o'||cad[i]=='u' ||
31 cad[i]=='A'||cad[i]=='E'||cad[i]=='I'||cad[i]=='O'||cad[i]=='U')
32 voc++;
33 i++;
34 }
35 printf("La cadena tiene %d vocales\n",voc);
36
37 return 0;
38 }
52
Programación (E1201) - FI - UNLP
Ejemplo 4
24
25 //c.cuente la cantidad de vocales
26 i=0;
27 voc=0;
28 while(cad[i] != '\0')//mientras no llegue al final de la cadena
29 {
30 if(cad[i]=='a'||cad[i]=='e'||cad[i]=='i'||cad[i]=='o'||cad[i]=='u' ||
31 cad[i]=='A'||cad[i]=='E'||cad[i]=='I'||cad[i]=='O'||cad[i]=='U')
32 voc++;
33 i++;
34 }
35 printf("La cadena tiene %d vocales\n",voc);
36
37 return 0;
38 }
53