Está en la página 1de 23

ALGORITMOS Y PROGRAMACIÓN

CADENAS, ESTRUCTURAS Y
ARCHIVOS
CADENAS
CARACTERIZACIÓN EN C
❑ Las cadenas (strings) son arreglos que contienen valores de tipo char.
❑ Tienen la particularidad de incluir el carácter '\0' como marca de fin y
de permitir expresarlas como texto entre comillas dobles.
❑ Ejemplos:
char cadena1[]="Hola";
char cadena2[]={'H','o','l','a','\0'}; /* Igual a cadena1 */
char *cadena3="Hola"; /* Igual a cadena1 */
char arreglo1[]={'H','o','l','a'}; /* Vector de 4 elementos */
char arreglo2[]="";

Algoritmos y Programación 2
CADENAS
CARACTERIZACIÓN EN C
Declaración y representación de una cadena:
char frase[15]="Cadena en C";

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

'C' 'a' 'd' 'e' 'n' ' a' ' ' 'e' 'n' '' 'C' '\0'

Aquí, la longitud de la cadena frase es 11.

Algoritmos y Programación 3
CADENAS
CARACTERIZACIÓN EN C
Definición, declaración y opciones de lectura de una cadena:
typedef char nombre[30];
nombre name;
printf("Escribe tu nombre: ");
scanf("%s", name); /* lee caracteres hasta que aparezca un
espacio o el fin de línea y agrega '\0'*/
gets(name); /* lee caracteres hasta que aparezca el fin de
línea y agrega '\0'*/
fgets(name, 30, stdin); /* lee un máximo de 29 caracteres
desde la entrada estándar y agrega '\0'*/

Algoritmos y Programación 4
CADENAS
FUNCIONES SOBRE CADENAS
❑ strlen(<cadena>)
Retorna la longitud de la cadena sin considerar el carácter '\0’.
❑ strcpy(<cadena_destino>, <cadena_origen>)
Copia <cadena_origen> en <cadena_destino>.
❑ strcat(<cadena_destino>, <cadena_origen>)
Concatena <cadena_origen> al final de <cadena_destino>.
❑ strcmp(<cadena1>, <cadena2>)
Compara las dos cadenas y devuelve 0 si las dos cadenas son iguales,
un número negativo si <cadena1> es menor (alfabéticamente) que
<cadena2> y un número positivo si <cadena1> es mayor que
<cadena2>.

Algoritmos y Programación 5
EJERCICIOS
Considerar las definiciones
typedef char palabra[10];
typedef palabra texto[20];
para implementar una función que cree un arreglo de tipo texto con k
cadenas de tipo palabra.
void crearTexto(texto t, int k){
int i;
for(i=0; i<k; i++){
printf("Escriba una palabra de largo < 10: ");
scanf("%s", t[i]);
}
}

Algoritmos y Programación 6
EJERCICIOS
Implementar una función que retorne el índice de la palabra de mayor
longitud que existe entre las k cadenas de tipo palabra contenidas en un
arreglo de tipo texto .
int mayor(texto t, int k) {
int i, m=0;
for (i=1; i<k; i++)
if(strlen(t[i]) > strlen(t[m]))
m = i;
return m;
}

Algoritmos y Programación 7
EJERCICIOS
Implementar una función que intercambie las cadenas, de tipo palabra,
situadas en posición par con aquellos de la respectiva posición impar que
le sucede, contenidas en un arreglo de tipo texto de longitud k. Si k es
impar, el último elemento no cambia de posición.
void intercambiar(texto t, int k) {
int i=0;
palabra aux;
while(i < k-1) {
strcpy(aux, t[i]);
strcpy(t[i], t[i+1]);
strcpy(t[i+1], aux);
i = i + 2;
}
}

Algoritmos y Programación 8
EJERCICIOS
Implementar una función que concatene las k cadenas de tipo palabra
contenidas en un arreglo de tipo texto con las k cadenas contenidas en
otro arreglo de tipo texto dejando el resultado en este último.
void concatenar(texto t1, texto t2, int k) {
int i;
for (i=0; i<k; i++)
strcat(t2[i], t1[i]);
}

Algoritmos y Programación 9
EJERCICIOS
Implementar una función que ordene ascendentemente las k cadenas de
tipo palabra contenidas en un arreglo de tipo texto.
void ordenarTexto(texto t, int k) {
int i, j, menor; palabra aux;
for (i=0; i<k-1; i++) {
menor = i;
for(j=i+1; j<k; j++)
if(strcmp(t[menor], t[j]) > 0)
menor = j;
if(i != menor) {
strcpy(aux, t[menor]);
strcpy(t[menor], t[i]);
strcpy(t[i], aux);
}
}
}
Algoritmos y Programación 10
ESTRUCTURAS
ESPECIFICACIÓN
❑ Una estructura, también conocida como registro, es una agregación de
datos heterogéneos (de variados tipos) los cuales se conocen como
campos.

IMPLEMENTACIÓN EN C
❑ A partir de la definición
struct registro {
int k;
float x;
};
es posible declarar
struct registro r1, r2;

Algoritmos y Programación 11
ESTRUCTURAS
IMPLEMENTACIÓN EN C
❑ Sin embargo, es más recomendable definir
typedef struct {
int k;
float x;
} registro;
y luego declarar
registro r1, r2;

❑ El acceso a un campo de una variable struct se expresa mediante


<nombre de la variable>.<nombre del campo>. Por ejemplo
r1.k = 58;
r1.x = 32.7;

Algoritmos y Programación 12
EJERCICIOS
Considerar typedef char cadena[10];
typedef struct {
cadena codigo;
int stock;
float precio;
} producto;
typedef producto bodega[10];
para implementar una función que calcule el valor invertido en un stock de
n productos almacenados en una variable bodega b.
float inversion(bodega b, int n) {
int i;
float v=0;
for(i=0; i<n; i++)
v = v + b[i].stock*b[i].precio;
return v;
}
Algoritmos y Programación 13
EJERCICIOS
Considerar typedef struct {
int edad;
float peso;
float estatura;
} persona;
typedef persona tabla[10];
para implementar una función que retorne el número de personas cuyo
índice de masa corporal (imc) es inferior a 20.5, entre las n registradas en
una variable tabla t, sabiendo que imc = peso/estatura2.
int imcBajo(tabla t, int n) {
int i, p=0;
for(i=0; i<n; i++)
if(t[i].peso/(t[i].estatura*t[i].estatura) < 20.5)
p++;
return p;
}
Algoritmos y Programación 14
EJERCICIOS
Para cada una de las n categorías de automóviles que comercializa, una
distribuidora de vehículos motorizados registra la marca (texto), el modelo
(texto), el año (número), el rendimiento (número) en km/litro y la
capacidad (número) del estanque en litros.
Considerando que estos datos ocupan n posiciones de un arreglo, se pide:
a) Declarar los tipos de datos adecuados.
b) Implementar una función que, a partir del arreglo, imprima una lista de
tríos marca, modelo, distancia (a recorrer con la capacidad del
estanque).

Algoritmos y Programación 15
EJERCICIOS
a) typedef char cadena[10];
typedef struct {
cadena marca;
cadena modelo;
int año;
int capacidad;
int rendimiento;
} automovil;
typedef automovil automotora[20];
b) void distancias(automotora a, int n) {
int i;
for(i=0; i<n; i++)
printf("%s %s recorre %d Kms. con el estanque lleno\n",
a[i].marca, a[i].modelo, a[i].rendimiento*a[i].capacidad);
}

Algoritmos y Programación 16
ARCHIVOS
CARACTERIZACIÓN
❑ Un archivo es un conjunto de bytes insertos en un dispositivo de
almacenamiento externo.
❑ Se identifica mediante un nombre y la descripción del directorio
(carpeta) que lo contiene.
❑ Archivo binario es aquel en el cual la secuencia de bytes no representa
caracteres sino octetos de bits al igual que la representación interna del
computador; el formato binario puede corresponder a programas
compilados, imágenes, sonido, versiones comprimidas de otros
archivos, etc.
❑ Archivo de texto es aquel en el cual la secuencia de bytes representa
caracteres, es decir, elementos del sistema de codificación ASCII; se
organizan en líneas terminadas con el carácter end of line.

Algoritmos y Programación 17
ARCHIVOS
OPERACIONES
❑ Declaración: es necesario declarar un archivo mediante un puntero de
tipo FILE para establecer su existencia y permitir su posterior uso.
FILE *archivo;
❑ Apertura: antes de usar un archivo debe ser abierto indicando el "modo
de apertura", es decir, indicando la o las operaciones de lectura y/o
escritura a realizar; para ello se usa la función fopen( ) cuya sintaxis es:
puntero = fopen( nombre, "modo de apertura" );
Modos de apertura:
"r" : para lectura (el archivo debe existir).
"w" : para escritura (se crea si ∄ o se sobrescribe si ∃)
"a" : para escritura al final (se crea si ∄).
"r+" : para lectura y escritura (el archivo debe existir).
"w+": para lectura y escritura (se crea si ∄ o se sobrescribe si ∃).
Algoritmos y Programación 18
ARCHIVOS
OPERACIONES
❑ Escritura: las funciones de escritura dependen tipo del dato usado en la
operación sobre el archivo.
Funciones de escritura:
fputc(c, f) : escribe en *f un carácter c.
fputs(s, f) : escribe en *f una cadena s.
fprintf(f, "formatos", datos) : escribe en *f igual de printf.
❑ Lectura: las funciones de lectura también dependen tipo del dato
usado en la operación sobre el archivo.
Funciones de lectura:
fgetc(f) : lee en *f un carácter.
fgets(s, l, f) : lee en *f una cadena s de longitud l.
fscanf(f, "formatos", datos) : lee en *f igual que scanf.

Algoritmos y Programación 19
ARCHIVOS
OPERACIONES
❑ Control de fin: durante la lectura de un archivo siempre es necesario
controlar si se ha llegado al final para evitar la ocurrencia de errores no
deseados; la función feof(f) retorna 0 si detecta el final de *f o un valor
distinto de 0 en caso contrario.
❑ Cierre: terminado el uso del archivo es recomendable cerrarlo, aunque
de no hacerlo igual se cerrará al finalizar la ejecución del programa; la
función fclose(f) intenta cerrar el archivo *f y si se cierra con éxito
retorna 0.

Algoritmos y Programación 20
EJEMPLOS
Implementar una función que cree un archivo de texto con n palabras de
longitud máxima 20 letras.
typedef char cadena[20];
void writeFile(int n) {
int i; cadena palabra; FILE *arch;
arch = fopen("datos.txt","w");
if(arch==NULL) printf("ERROR al crear archivo\n");
else for(i=1; i<=n; i++) {
printf("Ingrese una palabra: ");
/* fflush(stdin); */
scanf("%s",&palabra);
fprintf(arch,"%s\n", palabra);
}
fclose(arch);
}
Algoritmos y Programación 21
EJEMPLOS
Implementar una función main que lea un número n y llame a la función
anterior para crear un archivo con n palabras.
int main(void) {
int n;
printf("Ingrese cantidad de datos: ");
scanf("%d", &n);
writeFile(n);
return 0;
}

Algoritmos y Programación 22
EJEMPLOS
Implementar una función que lea e imprima las n palabras contenidas en
el archivo creado anteriormente, y la función main que la llame.
typedef char cadena[20];
void readFile() {
cadena palabra;
FILE *arch;
arch = fopen("datos.txt", "r");
while (fgets(palabra, 20, arch) != NULL)
printf("%s", palabra);
fclose(arch);
}
int main(void) {
readFile();
return 0;
}
Algoritmos y Programación 23

También podría gustarte