Algoritmos y Programación I

Documentos relacionados
Tema 14: Arreglos estáticos en C

Instituto Tecnológico de Celaya

Tema 8 Vectores y Matrices

Cadenas y Caracteres. Universidad Católica de Honduras Nuestra Señora Reina de la Paz. Asignatura. Programación Científica. Tema de Exposición

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

Escuela Politécnica Superior de Elche

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Tema 10: Tipos de datos definidos por el usuario

Tipos de Datos Estructurados

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

TEMA 8: Gestión dinámica de memoria

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

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

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

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

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

TUTORIAL PSEINT. Ing. Ronald Rentería Ayquipa. Fundamentos de Programación

Elementos de un programa en C

Arrays y Cadenas en C

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Tema 13: Apuntadores en C

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

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

Tema 9. Vectores y Matrices

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

6.1.- Introducción a las estructuras de datos Tipos de datos Arrays unidimensionales: los vectores Operaciones con vectores.

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

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

PROGRAMACION / Clave: 11214

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

2.2 Nombres, Ligado y Ámbito

Lenguaje C [Apuntadores y arreglos]

Programación. Test Autoevaluación Tema 3

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

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

INICIACIÓN A LA PROGRAMACIÓN EN C

Programación En Lenguaje C

Lección 2 Introducción al lenguaje C

Apuntadores (Punteros)

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

Cadenas de Caracteres

Prof. Dr. Paul Bustamante

Programación Java - Ingeniería de Sistemas - UATF 12 Ing. Limber Ruíz Molina

Programación I. Arreglos. Prof. Lisbeth Pérez Rivas

Introducción al Lenguaje de Programación C

UNIDAD V: ARR R EGL G OS O BIDI D MENS N IONALE L S

Apuntadores en C y C++

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

Programcaión Básica. Arreglos y Estructuras de Datos (2)

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Definición de Memoria

5. Sentencias selectivas o condicionales

FUNDAMENTOS DE INFORMÁTICA 1º Ingeniería Industrial

Al concluir está práctica el estudiante será capaz de elaborar programas utilizando apuntadores y arreglos.

El lenguaje C. 1. Identificadores, constantes y variables

Programación Estructurada

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

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

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

Programación estructurada (Introducción a lenguaje C)

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Estructura de Datos. Arreglos. Experiencia Educativa de Algorítmica ESTRUCTURA DE DATOS - ARREGLOS 1

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

OPERADORES Y EXPRESIONES

Tema 2. El lenguaje JAVA

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

Java para programadores

funciones printf scanf

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.

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

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Introducción al tipo de dato ARRAY

TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013

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

Tema 2: La clase string

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

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

Programación. Ejercicios Tema 3. Elementos Básicos del Lenguaje C

Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

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

Ficha de Aprendizaje N 13

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

INTRODUCCIÓN AL LENGUAJE C

2. EXPRESIONES 3. OPERADORES Y OPERANDOS 4. INDENTIFICADORES COMO LOCALIDADES DE MEMORIA

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

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

INDICE Capitulo 1. El Turbo C++ y el Lenguaje C Capitulo 2. Declaración e inicialización de variables Capitulo 3. Funciones de entrada y salida

LENGUAJE. Tema 2 Elementos de un programa

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Transcripción:

Algoritmos y Programación I ARREGLOS Y ESTRUCTURAS EN C Arreglos Un arreglo o vector es un conjunto de datos del mismo tipo, almacenados de forma contigua (es decir uno al lado del otro) en memoria principal. Cada elemento se puede manipular usando el nombre del arreglo y la posición del elemento. Se puede trabajar con arreglos de enteros, de reales, de caracteres, con arreglos de arreglos, etc. Las estructuras pueden 'anidarse' y aumentar su complejidad tanto como sea necesario. Para declarar un vector se indica el tipo de dato que almacena, el nombre del vector y el tamaño del mismo, es decir, la cantidad máxima de elementos que puede contener. Ejemplo: Declaración de un vector de 5 enteros: int v [5]; La cantidad de elementos del vector se indica entre corchetes. El primer elemento del array se indica como v[0], el segundo es v [1], el tercero es v [2] el cuarto es v [3], y así sucesivamente. El elemento que determina una posición en el vector se llama subíndice. Los subíndices en C son enteros, y el primer subíndice siempre es 0. Para asignar valores a los elementos del vector se puede hacer: v [0]=2; v [1]=3; También valen sentencias como v [2]=v [0]+v [1]; O podemos ingresar valores desde teclado: scanf ("%d", &v[3]); Es frecuente manipular los arrays con ciclos: for (i = 0; i < 5; i++) printf ("Ingrese valor para v[%d]: ", i); scanf ("%d", &v[i]); printf("\n"); for (i = 0; i < 5; i++) printf ("El valor del elemento v[%d] es %d\n", i, v[i]); Arreglos y Punteros En C hay una relación intrínseca que vincula a un arreglo de la zona de memoria estática (segmento de datos) con la dirección en donde éste se encuentre. Página 1 de 6

Considérese el siguiente arreglo: int v[5] = [0 4] = 0 ; En C, el nombre de un arreglo representa la dirección de comienzo del mismo; es decir, v equivale a &v[0]. Por lo tanto, v es un puntero constante (es decir, no podemos cambiar su valor porque eso equivale a cambiar su dirección de comienzo). En función de la equivalencia anterior, el lenguaje C permite referenciar a los elementos de un arreglo operando con punteros en lugar de subíndices: si v es &v[o], entonces v+1 es &v[1], v+2 es &v[2] y así sucesivamente. Esto implica, por la notación de punteros que ya se conoce, que v[0] es *v, v[1] es *(v+1), v[2] es *(v+2), etc. Si se quiere emitir el contenido del arreglo v usando la notación de punteros, se puede hacer: for ( i = 0; i < 5; i++) printf ("v[%d]=%d\n", i, *(v+i)) ; Arreglos y Cadenas de Caracteres Un string o cadena de caracteres nos permite, por ejemplo, representar una palabra. En C los strings se manejan como arreglos de caracteres con un carácter con código ASCII 0 (simbolizado como carácter por ˈ\0ˈ) al final, indicando su finalización. Por ejemplo, si se desea usar un arreglo palabra para almacenar la cadena HOLA, se puede inicializar el arreglo directamente: char palabra[10] = "HOLA"; Pero C no permite asignaciones directas a strings, por lo que, si no se inicializan directamente, para asignarle un valor conocido se debería hacer: char palabra[10]; palabra[0] = 'H'; palabra[1] = 'O'; palabra[2] = 'L'; palabra[3] = 'A'; palabra[4] = '\0'; Las posiciones no usadas del arreglo no interesan; sólo debe quedar el carácter de terminación a continuación de la última letra de la palabra. Pero como esta forma de asignar resulta en extremo forzada y tediosa, la biblioteca string.h provee la función void strcpy (char *to, const char *from) Copia la cadena from en la cadena to. Entonces la asignación quedaría: char palabra[10]; strcpy (palabra, "HOLA"); Obsérvese que, al proveer el nombre de la cadena, se está especificando la dirección de comienzo de la misma como sucede con los nombres de los arreglos en general. Para mostrar la palabra, se puede usar el especificador de formato %s, para entrada y salida de cadenas de caracteres: printf ("%s\n", palabra); Para leer cadenas se usa scanf y el especificador %s: Página 2 de 6

printf ("\n ingrese una palabra y pulse enter al finalizar: "); scanf ("%s", palabra); El arreglo de caracteres usado para almacenar la cadena denominada palabra, en el scanf no lleva & porque por ser un arreglo, por lo cual palabra (el identificador del arreglo) es a la dirección de comienzo del mismo; palabra es un puntero al comienzo de la palabra. Entonces scanf ya tiene la dirección en donde debe almacenar la secuencia de caracteres. Cuando scanf detecta el carácter correspondiente al enter, almacena 0 en esa posición y en las siguientes (si sobrara espacio en el array). La biblioteca string.h de C provee muchas funciones útiles para realizar las operaciones básicas con strings, tales como: unsigned int strlen (const char *s) Devuelve la longitud en bytes del string s (la posición del carácter nulo de terminación). void strcat (char *to, const char *from) Concatena las cadenas to y from devolviendo el resultado en to (el primer carácter de from sobreescribe el carácter nulo o de terminación de to). int strcmp (const char *s1, const char *s2) Compara los strings s1 y s2 y devuelve la diferencia entre el primer par de bytes que difieran en valor, o 0, si las cadenas son iguales. En esta biblioteca también hay funciones que pueden utilizarse para arreglos de cualquier tipo: void memcpy (void *to, const void *from, unsigned int size) Copia size bytes desde el comienzo del arreglo from a partir del comienzo del arreglo to. Por ejemplo: const unsigned char tam = 50; // Tamaño de arreglos int a1[tam], a2[tam]; unsigned char l1, l2; // Longitudes de arreglos cargar (a1, &l1); // Carga a1 y devuelve en l1<=tam la cantidad de elementos cargados memcpy (a2, a1, l1*sizeof (int)); // Copia a1 en a2 l2 = l1; Arreglos Multidemensionales Es posible tratar un conjunto de datos del mismo tipo como si estuvieran dispuestos en una grilla (dos dimensiones) o apilados por capas en tres dimensiones, o en más. Un arreglo bidimensional, que también podría denominarse matriz o tabla, es una abstracción que permite tratar a sus datos referenciándolos por fila y columna. El arreglo tiene un nombre, y para ubicar un dato en particular es necesario indicar la fila y la columna correspondiente. Tanto las filas como las columnas se numeran comenzando por 0. Ejemplo: 3 5-8 9 0 2 34-8 -1 4 0 5 Página 3 de 6

Este arreglo tiene 4 filas y 3 columnas. Si lo llamamos D: D[0][0] vale 3 D[0][2] vale -8 D[1][1] vale 0 D[3][4] vale 5 etc... La definición de este arreglo puede ser: int D[4][3]; Mediante dos pares de corchetes indicamos que se requieren dos subíndices para referirnos a un dato contenido en el arreglo. Análogamente, la definición: int H [2][4][3]; corresponde a un array tridimensional, que se podría imaginar así: La relación entre nombre de arreglos y direcciones de comienzo que se vio al tratar arreglos unidimensionales, en el caso de los bidimensionales, indica que, dada una matriz denominada mat, por ejemplo: int mat[4][3]; se verifica que mat corresponde a la dirección de comienzo de la misma. Es decir: mat es &mat[0][0] En C, una matriz se maneja como un arreglo de arreglos. Eso hace que sea válido usar el nombre de la matriz con un solo subíndice para indicar la dirección de comienzo de cada fila. Así, mat identifica el arreglo de direcciones de filas. mat es mat[0], y mat[0] es &mat[0][0] mat + 1 es mat[1], y mat[1] es &mat[1][0] La dirección de cada fila i es mat[i], con un solo subíndice y la dirección de un elemento se puede obtener como siempre, con &mat[i][j]. Se puede interpretar lo que el C ofrece para trabajar con la matriz mat del siguiente modo: mat = mat[0]=&mat[0][0] El almacenamiento de los datos de una matriz bidimensional se hace internamente fila a fila. Observar que, si mat[2] es la dirección de la fila 3, entonces, considerando el operador de desreferencia *, se observa que mat[2][0] es * mat[2] mat[2][1] es * (mat[2]+1) mat[2][2] es * (mat[2]+2)... Página 4 de 6

Estructuras o Registros Un struct, como se los llama en C, puede definirse como un arreglo de elemento heterogéneos (de distinto tipo). Cada elemento de la struct se referencia mediante su nombre o identificador de campo. Por ejemplo: struct alumno char legajo[7]; unsigned int codasign; float nota; ; De forma equivalente: typedef struct char legajo[7]; unsigned int codasign; float nota; alumno; Tener en cuenta que, si se usa typedef, el identificador que se coloca después del cierre de las llaves corresponde al nombre de un tipo, no al de una variable. Lo que se está declarando es un tipo de dato, una estructura general. La declaración no reserva por sí misma espacio de memoria para almacenar contenidos de variables. Para reservar el espacio correspondiente a variables, se debe declarar variables con este tipo: alumno a, b; Cada campo de la struct se referencia mediante el nombre de la variable, seguido de un punto (operador selector de campo) y el nombre del campo correspondiente. Entonces, para la variable a: a.legajo es el campo legajo de a a.codasign es el campo codasign de a Estructuras, Funciones y Punteros A diferencia de lo que ocurre con los arreglos, no hay relación alguna entre el nombre de una struct y su dirección. Para pasar como parámetro una variable de tipo struct, si se pasa el nombre de la variable, al invocarse la función se generaría una copia de su valor para que utilice la función; por ello siempre conviene pasar la dirección de la variable, aún cuando la función no modifique su estado, usando el operador &. Leer ( alumno *a ) printf ( "Ingrese legajo, codigo de asignatura y calificación de alumno, separados por un espacio: " ); scanf ( "%s %i %g", &((*a).legajo), &((*a).codasign), &((*a).nota) ); Escribir ( alumno *a ) printf ( "Legajo: %8s, codigo asign.: %6i, nota: %5.3g\n", (*a).legajo, (*a).codasign, (*a).nota ); Para simplificar la referenciación de campos de estructuras cuando se usan punteros, C ofrece el operador ->, que permitiría simplificar el código de la siguiente manera: Leer ( alumno *a ) Página 5 de 6

printf ( "Ingrese legajo, codigo de asignatura y calificación de alumno, separados por un espacio: " ); scanf ( "%s %i %g", &(a->legajo), &(a->codasign), &(a->nota) ); Escribir ( alumno *a ) printf ( "Legajo: %8s, codigo asign.: %6i, nota: %5.3g\n", a->legajo, a->codasign, a->nota ); La invocación de estas funciones sería: Leer ( &a1 ); Escribir ( &a1 ); Combinación de Arreglos y Estructuras Como los arreglos se suelen definir con tamaños suficientemente grandes como para poder cargar una cantidad indeterminada de datos que el usuario desee cargar, deben manipularse conjuntamente con variables que indiquen cuántos elementos contienen. Como para manipular los arreglos (cargarlos, ordenarlos, grabarlos en archivos de texto, etc.) se utilizan funciones, a efectos de minimizar la cantidad de parámetros de éstas, conviene agrupar los arreglos con las variables que representan su carga efectiva usando estructuras. Así, por ejemplo, para manipular arreglos de alumnos, convendría definir los siguientes tipos: const unsigned char TAM = 50; typedef struct char legajo[7]; unsigned int codasign; float nota; alumno; typedef struct unsigned char cant; alumno a[tam]; alumnos; De esta forma, para definir funciones de manipulación de arreglos de alumnos, bastaría con especificar un único parámetro que apunte a una variable de tipo alumnos, en lugar de definir dos parámetros (uno para el arreglo, y otro para conocer su carga). Página 6 de 6