Algoritmos y estructuras de datos

Documentos relacionados
Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

Cadenas de Caracteres

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

CALENDARIO AÑO 2016 PICO Y PLACA AUTOMOVILES SERVICIO ESPECIAL PICO Y PLACA TAXIS

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C

PROGRAMACION / Clave: 11214

Tema 13: Apuntadores en C

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

CALENDARIO AÑO 2016 PICO Y PLACA AUTOMOVILES SERVICIO ESPECIAL PICO Y PLACA TAXIS

Informática Ingeniería en Electrónica y Automática Industrial

Se guardan en archivos con extencion c y los cabezales con extension h

Punteros, Arreglos y Cadenas en C

Lenguaje C [Apuntadores y arreglos]

EXAMEN PARCIAL TRABAJO INTEGRADOR (TI) EVALUACIÓN CONTINUA PESO PORCENTUAL PESO PORCENTUAL 1 30% 06-MAY-14 30% 03-MAY-14 20% 20%

Apuntadores (Punteros)

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Entrada y salida de datos en C y C++

Fundamentos de programación

1 Estructura básica de un programa C++

Curso de Programación Avanzada en C

Programación En Lenguaje C

Lenguaje C Entrada y Salida de Datos. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Elementos de un programa en C

Lenguaje de programación C. Introducción

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Instituto Tecnológico de Celaya

Tema 14: Arreglos estáticos en C

Uso avanzado de punteros

Vectores. 27/05/05 Programación Digital I 1

ESTRUCTURAS CONDICIONALES SIMPLES: ESTRUCTURAS CONDICIONALES DOBLES: ESTRUCTURAS CONDICIONALES ANIDADAS:

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

Lección 2 Introducción al lenguaje C

TEMA 4. ELEMENTOS BÁSICOS DE PROGRAMACIÓN

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Punteros, Arreglos y Cadenas en C

2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 SUMA

Introducción al lenguaje C

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Programación. Test Autoevaluación Tema 3

Hoja de ejercicios del Tema 3

TEMA 4. ESTRUCTURAS DE CONTROL

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

El lenguaje C. 1. Identificadores, constantes y variables

Algoritmos y Programación I

PROGRAMACIÓN UNIDADES

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Fundamentos de Programación Visual Basic

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Tema 2: La clase string

Por ejemplo, para declarar un arreglo de enteros llamado a con diez elementos se hace de la siguiente forma:

Tema 07: Tipos de datos en C & entrada y salida estándar

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Lenguajes de programación

Fecha Segundo Cuarto Sexto Octavo

Principios de Computadoras II

Datos y tipos de datos

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Introducción a Lenguaje C. Jornadas de Octubre 2009 Grupo de Usuarios de Linux Universidad Carlos III Tania Pérez

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación Avanzada en C

Tema 8 Vectores y Matrices

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Universidad Don Bosco (UDB) Facultad de Ingeniería / Escuela de Computación

Estructura Selectiva Múltiple

Representación de la información


PHP: Lenguaje de programación

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

Programación en C++/Funciones

Tema 7 Vectores y cadenas de caracteres. Fundamentos de Informática

Formatos para prácticas de laboratorio

Estatutos de Control C# Estatutos de Decisión (Selección)

Contenido. Capítulo 1. Introducción a lenguaje C 1

Preliminares. Tipos de variables y Expresiones

Tema 2. El lenguaje JAVA

Fundamentos de programación JAVA

INTRODUCCIÓN AL LENGUAJE C

Técnico Superior en Producción y Administración Rural - 1er Año

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

REFERENCIA DEL LENGUAJE

Tipos de Datos Estructurados

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

ANEXO XVII DE LA RESOLUCION N

Programación orientada a objetos. Resumen de Temas Unidad 4: Sobrecarga

Estructuras de Datos Declaraciones Tipos de Datos

MIA RICARDO GONZALEZ LOZANO APLICACIONES EN LENGUAJE C

12 símbolos (13 si se incluye el espacio en blanco)

Examen Principios de Programación Febrero 2012

ARCHIVOS. 1. Introducción. 2. Definición de archivo. 3. Archivos de acceso secuencial. 4. Gestión de un archivo secuencial de estructuras

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Matemática de redes Representación binaria de datos Bits y bytes

Introducción a variables de tipo Puntero (Apuntadores) Contenidos. 1. Introducción a las variables puntero 2. Repaso:

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );

Transcripción:

Algoritmos y estructuras de datos Aritmética de direcciones y cadenas Francisco Javier Zaragoza Martínez Universidad Autónoma Metropolitana Unidad Azcapotzalco Departamento de Sistemas 8 de mayo de 2015 Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 1 / 32

Resumen Apuntadores y memoria 1 Si tipo v es una variable, entonces &v es su referencia. 2 Además tipo *p declara a p como un apuntador a tipo. 3 Si hacemos p = &v, entonces *p es v. Apuntadores y arreglos 1 Si tipo v[n] es un arreglo, entonces v es su referencia. 2 Si hacemos p = v, entonces p+i vale &v[i] y *(p+i) es v[i]. 3 Los apuntadores a elementos de un arreglo se pueden incrementar p++, decrementar p-- y comparar para moverse en un arreglo. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 2 / 32

Cadenas Cadenas en la memoria En C las cadenas se implementan como arreglos de caracteres (char) que terminan en el carácter nulo \0 (que vale 0). La memoria 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 69 74 69 77 80 76 79 83 32 68 69 32 85 65 77 0 se interpreta como la cadena "EJEMPLOS DE UAM" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 E J E M P L O S D E U A M \0 Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 3 / 32

Inicialización de cadenas Declaración de cadenas Una cadena se declara como un arreglo de char que tenga espacio suficiente para todos los caracteres y el carácter nulo. char s [ 10]; /* cadena de hasta 9 caracteres */ char t [ 11]; /* cadena de hasta 10 caracteres */ Inicialización de cadenas Una cadena se puede inicializar desde la declaración: char s [10] = " ejemplo "; /* 7+ nulo y sobran 2 */ char t[] = " ejemplo "; /* arreglo de 8 char */ También se puede inicializar posteriormente, pero se debe recordar colocar el carácter nulo (y que antes de eso contiene basura). Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 4 / 32

Lectura de cadenas Palabras Si s es una cadena suficientemente larga, entonces scanf(" %s", s) lee en s una palabra sin blancos de la entrada estándar. Líneas A diferencia de esto gets(s) lee en s una ĺınea de la entrada estándar, remplazando el carácter \n por un nulo. Entrada limitada Finalmente fgets(s, n, stdin) lee en s hasta n-1 caracteres de la entrada estándar. Esta es la forma correcta de leer una cadena en un arreglo. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 5 / 32

Escritura de cadenas Escritura normal Si s es una cadena, entonces printf(" %s", s) escribe el contenido de la cadena s en la salida estándar. Lo mismo hace fputs(s, stdout). Escritura con fin de ĺınea Por otro lado puts(s) escribe el contenido de la cadena s en la salida estándar y agrega el carácter \n al final. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 6 / 32

Cosas que tal vez no sabías printf y compañía printf regresa la cantidad de caracteres que imprimió (o un número negativo si algo falló). Además, sprintf sirve para generar una cadena con formato (en lugar de imprimir a la salida estándar). scanf y compañía scanf regresa la cantidad de variables que leyó (o EOF si algo falló). Además, sscanf lee de una cadena (en lugar de la entrada estándar). getchar y putchar Para leer o escribir caracteres individuales se usa getchar y putchar. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 7 / 32

Operaciones de cadenas Biblioteca El lenguaje C no tiene operaciones de cadenas. Sin embargo, tiene una biblioteca a la que se tiene acceso usando #include <string.h> con decenas de funciones que operan sobre cadenas. Operaciones de cadenas Nosotros implementaremos algunas funciones de cadenas para practicar el uso de arreglos, apuntadores y aritmética de direcciones: 1 Longitud de una cadena (int strlen(char *s)). 2 Copia de cadenas (char* strcpy(char *s, char *t)). 3 Concatenación de cadenas (char* strcat(char *s, char *t)). 4 Comparación de cadenas (char* strcmp(char *s, char *t)). Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 8 / 32

Longitud de una cadena Con arreglos int longitud ( char s []) /* arreglo */ { int i = 0; /* al principio */ } while (s[i]!= \0 ) /* si no es nulo */ i ++; /* cuenta */ return i; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 9 / 32

Longitud de una cadena Con apuntadores int longitud ( char *s) /* apuntador */ { char *p = s; /* al principio */ } while (*p!= \0 ) /* si no es nulo */ p ++; /* cuenta */ return p-s; /* resta */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 10 / 32

Longitud de una cadena Con apuntadores, sin comparación int longitud ( char *s) /* apuntador */ { char *p = s; /* al principio */ } while (*p) /* si no es nulo */ p ++; /* cuenta */ return p-s; /* resta */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 11 / 32

Copia de cadenas Con arreglos void copia ( char s[], char t []) /* arreglos */ { int i = 0; /* al principio */ } while ((s[i] = t[i])!= \0 ) /* si no es nulo */ i ++; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 12 / 32

Copia de cadenas Con apuntadores void copia ( char *s, char *t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } while ((* s = *t)!= \0 ) { /* si no es nulo */ s ++; t ++;} Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 13 / 32

Copia de cadenas Con apuntadores, incremento inmediato void copia ( char *s, char *t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } while ((* s++ = *t ++)!= \0 ) /* si no es nulo */ ; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 14 / 32

Copia de cadenas Con apuntadores, sin comparación void copia ( char *s, char *t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } while (*s++ = *t ++) /* si no es nulo */ ; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 15 / 32

Concatenación de cadenas Con arreglos void concatena ( char s[], char t []) /* arreglos */ { int i = 0, j = 0; /* al principio de s y t */ } while (s[i]!= \0 ) /* busca el final de s */ i ++; while ((s[i ++] = t[j ++])!= \0 ) /* copia t */ ; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 16 / 32

Concatenación de cadenas Con apuntadores void concatena ( char * s, char * t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } while (*s) /* busca el final de s */ s ++; while (*s++ = *t ++) /* copia t */ ; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 17 / 32

Concatenación de cadenas Con llamadas a funciones void concatena ( char * s, char * t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } s += longitud (s); /* busca el final de s */ copia (s, t); /* copia t */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 18 / 32

Comparación de cadenas Con arreglos void compara ( char s[], char t []) /* arreglos */ { int i = 0; /* al principio de s y t */ } while (s[i] == t[i]) /* si s y t son iguales */ if (s[i]!= \0 ) /* si no es nulo */ i ++; /* avanza */ else /* de otra manera */ return 0; /* s y t son iguales */ return s[i]-t[i]; /* s y t son diferentes */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 19 / 32

Comparación de cadenas Con apuntadores void compara ( char * s, char * t) /* apuntadores */ { /* los apuntadores apuntan al lugar correcto */ } while (*s == *t) /* si s y t son iguales */ if (*s) { /* si no es nulo */ s ++; t ++; /* avanza */ } else /* de otra manera */ return 0; /* s y t son iguales */ return *s - *t; /* s y t son diferentes */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 20 / 32

Ejercicios Búsqueda de caracteres Escribe la función int busca(char s[], int c) que regresa la posición de la primera aparición de c en la cadena s (es decir, s[i] == c) o -1 si no está. Ahora escribe la función char* busca(char *s, int c) que regresa un apuntador a la primera aparición de c en la cadena s o NULL si no está. Borrado de caracteres (catarata -> ctrt) Escribe la función void borra(char s[], int c) que borra todas las apariciones de c en la cadena s. Ahora escribe una versión con apuntadores void borra(char *s, int c). Inversión de cadenas (roma -> amor) Escribe la función void invierte(char s[]) que invierte la cadena s. Ahora escribe una versión con apuntadores void invierte(char *s). Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 21 / 32

Arreglos de cadenas Arreglos de arreglos de caracteres Imagine que se quiere declarar un arreglo de cadenas que contenga los nombres de los siete días de la semana. Como "miercoles" tiene nueve caracteres, entonces debemos pedir diez caracteres para cada cadena: char dias [7][10] = {" lunes ", " martes ", " miercoles ", " jueves ", " viernes ", " sabado ", " domingo "}; Esto se vería así como arreglo: dias [0] = " lunes "; dias [1] = " martes "; dias [2] = " miercoles ";... ; dias [6] = " domingo "; Y así en la memoria: " lunes0... martes0... miercoles0jueves0... viernes0.. sabado0... domingo0.." Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 22 / 32

Arreglos de cadenas Inconvenientes Almacenar arreglos de cadenas así tiene serios inconvenientes: 1 En un arreglo de este tipo, todas las cadenas ocupan la misma cantidad de caracteres. Esto quiere decir que cada una debe ser al menos tan larga como la cadena más larga. Por otro lado, las cadenas cortas desperdiciarán mucho espacio. 2 Con frecuencia se desea mover una cadena de un lugar a otro de un arreglo (por ejemplo, para hacer copias o mantenerlas ordenadas). En este caso se deberá procesar cada carácter de la cadena y entre más largas será más lento. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 23 / 32

Arreglos de cadenas Arreglos de apuntadores a caracteres Una alternativa es declarar un arreglo de apuntadores a caracteres. El arreglo de nuestro ejemplo anterior podría declararse así: char * dias [7] = {" lunes ", " martes ", " miercoles ", " jueves ", " viernes ", " sabado ", " domingo "}; Esto se interpretaría exactamente igual que un arreglo: dias [0] = " lunes "; dias [1] = " martes "; dias [2] = " miercoles ";... ; dias [6] = " domingo "; Pero en la memoria se vería distinto: dias[0] sería un apuntador a la cadena "lunes" que ocupa sólo seis caracteres, etc. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 24 / 32

Intercambio de cadenas Con arreglos de caracteres Si a y b son arreglos de caracteres y queremos intercambiar sus contenidos, no tenemos más remedio que copiarlos de un lado a otro: char a[] = " primero " char b[] = " segundo "; char t[] = " temporal "; copia (t, a); /* copia primero a t */ copia (a, b); /* copia segundo a a */ copia (b, t); /* copia primero a b */ En este caso, las tres cadenas deben ser suficientemente largas. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 25 / 32

Intercambio de cadenas Con apuntadores a caracteres Si a y b son apuntadores de caracteres y queremos intercambiar las cadenas a las que apuntan, podemos hacer algo mucho más rápido: char * a = " primero " char *b = " segundo "; char *t; t = a; /* t apunta a primero */ a = b; /* a apunta a segundo */ b = t; /* b apunta a primero */ En este caso, sólo se intercambian los valores de los apuntadores. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 26 / 32

Clasificación de caracteres Funciones de biblioteca Con frecuencia se necesita saber si un carácter es letra, dígito o alguna otra clasificación especial. Usando #include <ctype.h> obtenemos lo siguiente: int isdigit (c) /* c es un digito */ int isupper ( c) /* c es una mayuscula */ int islower ( c) /* c es una minuscula */ int isalpha (c) /* c es una letra */ int isalnum ( c) /* c es letra o digito */ int isspace (c) /* c es un blanco */ Además obtenemos: int tolower ( c) /* convierte c a minuscula */ int toupper ( c) /* convierte c a mayuscula */ Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 27 / 32

Conversión cadena a decimal Con arreglos int decimal ( char s []) { int i; int n = 0; } for (i = 0; 0 <= s[i] && s[i] <= 9 ; i ++) n = 10* n + (s[i] - 0 ); return n; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 28 / 32

Conversión cadena a decimal Con arreglos y funciones int decimal ( char s []) { int i; int n = 0; } for (i = 0; isdigit (s[i]); i ++) n = 10* n + (s[i] - 0 ); return n; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 29 / 32

Conversión cadena a decimal Con apuntadores y funciones int decimal ( char *s) { /* s ya apunta al lugar correcto */ int n = 0; } for (; isdigit (*s); s ++) n = 10* n + (*s - 0 ); return n; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 30 / 32

Conversión cadena a decimal Con apuntadores y funciones int decimal ( char *s) { /* s ya apunta al lugar correcto */ int n = 0; } while ( isdigit (*s)) n = 10* n + (*s++ - 0 ); return n; Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 31 / 32

Ejercicios Otras bases 1 Escribe funciones int bin(char *s) y int oct(char *s) que conviertan una cadena escrita en binario u octal a un int. 2 Escribe una función int hex(char *s) que convierta una cadena escrita en hexadecimal a un int. Los dígitos hexadecimales del 10 al 15 se pueden representar con abcdef o con ABCDEF. De regreso 1 Escribe una función void adecimal(char *s, int n) que convierta n a una cadena escrita en decimal. 2 Escribe int abin(char *s, int n) y int aoct(char *s, int n) que conviertan n a una cadena escrita en binario u octal. 3 Escribe una función void ahex(char *s, int n) que convierta n a una cadena escrita en hexadecimal. Francisco Zaragoza (UAM Azcapotzalco) Algoritmos y estructuras de datos 2015 Primavera 32 / 32