Está en la página 1de 53

Programación (E1201) - FI - UNLP

Programación (E1201)

Profesor Titular: Dr. Pablo A. GARCIA


Profesor Adjunto: Dr. Marcelo HABERMAN
Jefe de Trabajos prácticos: Dr. Federico N. GUERRERO

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

• Al primer elemento del a[1] 5 1362


a[2] 89 1366
arreglo (índice cero) le
a[3] 2 1370
corresponde la dirección a[4] 9 1374
de memoria más baja

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:

<Modificador> <Tipo> <Nombre_Arreglo>[<tamaño>];


donde:
<tamaño>: indica la cantidad de elementos (variables) que contendrá el arreglo
<Nombre_Arreglo>: debe ser un identificador válido.
<Tipo>: cualquier tipo de dato de C
<Modificador>: unsigned, signed, long, short.

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:

<Modificador> <Tipo> <Nombre_Arreglo>[<tamaño>];


donde:
<tamaño>: indica la cantidad de elementos (variables) que contendrá el arreglo
<Nombre_Arreglo>: debe ser un identificador válido.
<Tipo>: cualquier tipo de dato de C letras es un arreglo de 80
<Modificador>: unsigned, signed, long, short. caracteres, valores un arreglo
de 5 enteros sin signo y
Ejemplos: temperaturas un arreglo de
char letras[80]; 24 reales
unsigned int valores[5];
9
float temperatura[24];
Programación (E1201) - FI - UNLP

Declaración de arreglos con inicialización


• De la misma manera en que podíamos darle un valor inicial a una
variable escalar, podemos hacer lo mismo con los arreglos:

<Modificador> <Tipo> <Nombre_Arreglo>[<tamaño>] = {<valores iniciales>};

donde:
<valores iniciales>: es la lista de valores, separados por coma, a asignar a los
respectivos elementos del arreglo.

Ejemplos:

unsigned int a[5] = {56,5,89,2,9};


char saludo[10] = {‘h’,’o’,’l’,’a’,’ ’,’m’,’u’,’n’,’d’,’o’};

10
Programación (E1201) - FI - UNLP

Declaración de arreglos con inicialización


• De la misma manera en que podíamos darle un valor inicial a una
variable escalar, podemos hacer lo mismo con los arreglos:
Esta es la declaración e inicialización
del arreglo a utilizado como
<Modificador> <Tipo>
ejemplo<Nombre_Arreglo>[<tamaño>]
al principio de la clase = {<valores iniciales>};

donde: Saludo es un arreglo de 10


<valores iniciales>: es la lista de valores,caracteres,
separados inicializado
por coma, acon
asignar a los
las letras
respectivos elementos del arreglo. de la frase “hola mundo”.
YA VEREMOS QUE HAY OTRAS
Ejemplos: MANERAS MÁS CONVENIENTES
PARA ALMACENAR TEXTO

unsigned int a[5] = {56,5,89,2,9};


char saludo[10] = {‘h’,’o’,’l’,’a’,’ ’,’m’,’u’,’n’,’d’,’o’};

11
Programación (E1201) - FI - UNLP

Declaración de arreglos con inicialización

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

También pueden inicializarse menos elementos que el total. Los restantes se


inicializarán en cero:
char despedida[100] = {‘c’,’h’,’a’,’u’};

Pero darán error de compilación declaraciones sin tamaño y sin inicializar


float saldos[]; // tamaño indefinido

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

Acceso a los elementos del arreglos

Cada variable del arreglo puede referenciarse individualmente mediante


el nombre y un índice válido entre corchetes.

<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

Acceso a los elementos del arreglos

Cada variable del arreglo puede referenciarse individualmente mediante


el nombre y un índice válido entre corchetes.

<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: Nótese que en la declaración no se


int a[3],b=2,c=1; están usando los corchetes para
a[0] = 20; acceder a un miembro, sino para
establecer el tamaño del arreglo
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
14
Programación (E1201) - FI - UNLP

Acceso a los elementos del arreglos

Cada variable del arreglo puede referenciarse individualmente mediante


el nombre y un índice válido entre corchetes.

<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

Acceso a los elementos del arreglos

Ejemplo:

int i=3, A[8] = {1,2,4,8,16,32,64,128};


A[0] = 256;
A[i] = A[i-1] + A[i-2]; /* A[3]=A[2]+A[1]=6 */
i++; /* i=4 */
A[i] = A[i-1] + A[i-2]; /* A[4]=A[3]+A[2]=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]
16
Programación (E1201) - FI - UNLP

Acceso a los elementos del arreglos

Ejemplo:

int i=3, A[8] = {1,2,4,8,16,32,64,128};


A[0] = 256;
A[i] = A[i-1] + A[i-2]; /* A[3]=A[2]+A[1]=6 */
i++; /* i=4 */
A[i] = A[i-1] + A[i-2]; /* A[4]=A[3]+A[2]=10 */

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

Acceso a los elementos del arreglos

Ejemplo:

int i=3, A[8] = {1,2,4,8,16,32,64,128};


A[0] = 256;
A[i] = A[i-1] + A[i-2]; /* A[3]=A[2]+A[1]=6 */
i++; /* i=4 */
A[i] = A[i-1] + A[i-2]; /* A[4]=A[3]+A[2]=10 */

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

Acceso a los elementos del arreglos

Ejemplo:

int i=3, A[8] = {1,2,4,8,16,32,64,128};


A[0] = 256;
A[i] = A[i-1] + A[i-2]; /* A[3]=A[2]+A[1]=6 */
i++; /* i=4 */
A[i] = A[i-1] + A[i-2]; /* A[4]=A[3]+A[2]=10 */

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

Acceso a los elementos del arreglos

Ejemplo:

int i=3, A[8] = {1,2,4,8,16,32,64,128};


A[0] = 256;
A[i] = A[i-1] + A[i-2]; /* A[3]=A[2]+A[1]=6 */
i++; /* i=4 */
A[i] = A[i-1] + A[i-2]; /* A[4]=A[3]+A[2]=10 */

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

Recorrido de los elementos del arreglos


Para expresar el índice de un elemento en un arreglo vimos que es
válida cualquier expresión entera entre los corchetes.
Esto permite “recorrer” los elementos de un arreglo mediante bucles.
A[0]: 1
int i, A[4] = {1,2,4,8}; A[1]: 2
A[2]: 4
for(i=0; i<4; i++) A[3]: 8
printf("A[%d]: %d\n", i, A[i]);

int i, A[4] = {1,2,4,8}; A[3]:


A[0]:81
A[2]:
A[1]:42
for(i=3; i>=0; i--) A[1]:
A[2]:24
printf("A[%d]: %d\n", i, A[i]); A[0]:
A[3]:18

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.

b) En un segundo arreglo real con nombre y almacene los elementos


12
13
for(i=0;i<N;i++)
{
14
15
del arreglo x elevados al cubo, de manera que coincidan los
printf("Ingrese x[%d]>",i);
scanf("%f",&x[i]);
16
17
índices: y[n] <- x[n] al cubo
}

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.

b) En un segundo arreglo real con nombre y almacene los elementos


12
13
for(i=0;i<N;i++)
{
14
15
del arreglo x elevados al cubo, de manera que coincidan los
printf("Ingrese x[%d]>",i);
scanf("%f",&x[i]);
16
17
índices: y[n] <- x[n] al cubo
}

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.

b) En un segundo arreglo real con nombre y almacene los elementos


12
13
for(i=0;i<N;i++)
{
14
15
del arreglo x elevados al cubo, de manera que coincidan los
printf("Ingrese x[%d]>",i);
scanf("%f",&x[i]);
16
17
índices: y[n] <- x[n] al cubo
}

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.

b) En un segundo arreglo real con nombre y almacene los elementos


12
13
for(i=0;i<N;i++)
{
14
15
del arreglo x elevados al cubo, de manera que coincidan los
printf("Ingrese x[%d]>",i);
scanf("%f",&x[i]);
Cuando los elementos de igual índice de dos o más arreglos
16
17
índices: y[n] <- x[n] al están
}
cuborelacionados se los denomina “Arreglos paralelos”
18 //b. En un segundo arreglo real con nombre y almacene los elementos del arreglo x
En este ejemplo x[] e y[] son paralelos
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 }
29
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.

b) En un segundo arreglo real con nombre y almacene los elementos


12
13
for(i=0;i<N;i++)
{
14
15
del arreglo x elevados al cubo, de manera que coincidan los
printf("Ingrese x[%d]>",i);
scanf("%f",&x[i]);
16
17
índices: y[n] <- x[n] al cubo
}

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.

NO ES LO MISMO UNA CADENA QUE UN


ARREGLO DE CARACTERES. ‘h’
‘o’
…pero las cadenas suelen almacenarse ‘l’
dentro de arreglos. ’a’
‘\0’


Programación (E1201) - FI - UNLP

Cadenas de caracteres
Ejemplos:

//declaración de arreglo de 4 caracteres, NO GUARDA UNA CADENA


char saludo1[] = {‘h’, ’o’, ’l’, ’a’}; arreglo
saludo1 ‘h’ ‘o’ ‘l’ ‘a’
[0] [1] [2] [3]
//declaración de un arreglo de 5 caracteres, GUARDA UNA CADENA DE 4
//CARACTERES + EL CARACTER NULO arreglo
char saludo2[] = {‘h’, ’o’, ’l’, ’a’, ’\0’}; cadena
saludo2 ‘h’ ‘o’ ‘l’ ‘a’ ‘\0’
[0] [1] [2] [3] [4]
//declaración de un arreglo de 100 caracteres, GUARDA UNA CADENA DE 4
//CARACTERES + EL CARACTER NULO arreglo
char saludo3[100] = {‘h’, ’o’, ’l’, ’a’, ’\0’}; cadena
saludo3 ‘h’ ‘o’ ‘l’ ‘a’ ‘\0’ ? ‘a’ ?
[0] [1] [2] [3] [4] [5] [99]
34
Programación (E1201) - FI - UNLP

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)

{‘h’, ’o’, ’l’, ’a’, ’\0’} → “hola”


Programación (E1201) - FI - UNLP

Cadenas de caracteres
Ejemplos:

//declaración de arreglo de 4 caracteres, NO GUARDA UNA CADENA


char saludo1[] = {‘h’, ’o’, ’l’, ’a’};
saludo1 ‘h’ ‘o’ ‘l’ ‘a’
[0] [1] [2] [3]
//declaración de un arreglo de 5 caracteres, GUARDA UNA CADENA DE 4
//CARACTERES + EL CARACTER NULO
char saludo2[] = “hola”;
saludo2 ‘h’ ‘o’ ‘l’ ‘a’ ‘\0’
[0] [1] [2] [3] [4]
//declaración de un arreglo de 100 caracteres, GUARDA UNA CADENA DE 4
//CARACTERES + EL CARACTER NULO
char saludo3[100] = “hola”;
saludo3 ‘h’ ‘o’ ‘l’ ‘a’ ‘\0’ ? ‘a’ ?
[0] [1] [2] [3] [4] [5] [99]
36
Programación (E1201) - FI - UNLP

Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:

char arreglo1[]=“cadena guardada en un arreglo”;


char arreglo2[]=“otra cadena guardada en un arreglo”;

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:

char arreglo1[]=“cadena guardada en un arreglo”;


char arreglo2[]=“otra cadena guardada en un arreglo”;

printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);

puts Junto con cada %s se puede pasar como


• puts(arreglo1); parámetro una cadena constante o un
• puts(“cadena constante”); arreglo donde haya almacenada una
cadena (es decir, que tenga un carácter
nulo que indique su fin)

38
Programación (E1201) - FI - UNLP

Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:

char arreglo1[]=“cadena guardada en un arreglo”;


char arreglo2[]=“otra cadena guardada en un arreglo”;

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:

char arreglo1[]=“cadena guardada en un arreglo”;


char arreglo2[]=“otra cadena guardada en un arreglo”;

printf
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• printf( “una sola cadena constante \n”);
• printf(arreglo2);

puts printf no salta de línea a menos


• puts(arreglo1); que lo explicitemos con un ‘\n’
• puts(“cadena constante”);

40
Programación (E1201) - FI - UNLP

Entrada/Salida de cadenas
Para la impresión de cadenas en pantalla tenemos dos opciones:

char arreglo1[]=“cadena guardada en un arreglo”;


char arreglo2[]=“otra cadena guardada en un arreglo”;
• Para imprimir una única cadena
(constante o almacenada en
printf arreglo) se puede utilizar puts
• printf(“%s ... %s\n”, arreglo1, “cadena constante”);
• A diferencia de printf, agrega un
• printf( “una sola cadena constante \n”);
salto de línea luego de la cadena
• printf(arreglo2);

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);

• scanf(“%79s”, arreglo1); • gets lee una cadena ingresada


• scanf(“%79[^\n]”, arreglo1); por teclado (espacios incluidos)
hasta que se presiona enter y al
igual que scanf la guarda en el
arreglo pasado como parámetro,
gets
agregando el carácter nulo al
• gets(arreglo1); final.
• Es una función insegura y su uso
debe evitarse
49
Programación (E1201) - FI - UNLP

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

También podría gustarte