Clasificación de los datos Programación I Unidad 3 FACEyT - DEEC - Programación I - 2008 1 Arreglos: Definición FACEyT - DEEC - Programación I - 2008 Arreglos: Características en C El Dato 2 estructurado nombre del arreglo es una constante puntero que contiene la dirección de memoria del primer elemento. Estático El Homogéneo a que es la ubicación de la dirección base en donde se subíndice del primer elemento es siempre 0, debido aloja el primer elemento del arreglo. Ordenado El FACEyT - DEEC - Programación I - 2008 3 lenguaje C no realiza comprobación de límites. FACEyT - DEEC - Programación I - 2008 4 1 Arreglos Unidimensionales, Vectores o Listas(1) Arreglos Declaración tipo_dato nombre[tamaño]; Unidimensionales o vectores Ejemplo int vec[10]; Bidimensionales o matrices Declaración e inicialización int vec[] = {10,5,6,3}; FACEyT - DEEC - Programación I - 2008 5 Arreglos Unidimensionales, Vectores o Listas (2) FACEyT - DEEC - Programación I - 2008 6 Funciones útiles Inicialización Asignación de valores a cada elemento de forma explícita Cargar int arreglo[3]; arreglo[0]=5; arreglo[1]=2; arreglo[2]=4; un arreglo Presentar por pantalla un arreglo Asignación de valores mediante el uso de un ciclo repetitivo int i, V[10]; for(i=0; i<10; i ++) { printf("Ingrese un elemento para el arreglo"); scanf("%d", &V[i]); } FACEyT - DEEC - Programación I - 2008 7 FACEyT - DEEC - Programación I - 2008 8 2 Funciones útiles: ejemplo Ejemplo Asignación #include "stdio.h" #include “vectores.h" usuario: 1 2 3 4 5 6 7 8 9 1 2 3 5 6 7 8 9 de valor a los elementos de un arreglo unidimensional con datos ingresados por el void cargar (int ORDEN, int V[]) //ORDENorden de arreglo y V arreglo a cargar { int i; for(i=0;i<ORDEN;i++) { printf(“Ingrese el siguiente elemento”); scanf(“%d”, &V[i]); } } int main(int argc, char *argv[]) { // inicio de main int i, M, V[20], P[20], N[20], j, k; j=0, k=0; printf("Ingrese el orden del arreglo: "); scanf("%d",&M); cargar_i(M,V); Presentación por pantalla de los elementos de un arreglo unidimensional: void mostrar (int ORDEN, int V[]) { int i; for(i=0;i<ORDEN;i++) { printf(“Elemento %d: %d”, i, V[i]); } } FACEyT - DEEC - Programación I - 2008 Práctico 4 - Ejercicio 27. Lea un arreglo de orden M. Coloque los elementos negativos en un arreglo N y los positivos en otro arreglo P. Imprima los resultados. El archivo vectores.h contiene las funciones para cargar y mostrar un arreglo. printf("\n\nEl arreglo ingresado es:\n\n"); mostrar_i(M,V); printf("\n"); //CONTINUA EN DIAPOSITIVA 11 9 FACEyT - DEEC - Programación I - 2008 Ejemplo Ejemplo // CONTINUACION DE DIAPOSITIVA 10 // CONTINUACION DE DIAPOSITIVA 11 10 if (j >0) for(i=0; i <M; i++) { if (V[i] >0) { P[j]= V[i]; j++; } else { N[k]= V[i]; k++; } } { printf("\n\nEl arreglo de positivos es:\n"); mostrar_i(j,P); } else printf("\n\nEl arreglo no contiene elementos positivos\n\n"); if (k==0) printf("\n\nEl arreglo no contiene elementos negativos\n\n"); else { printf("\n\nEl arreglo de negativos es:\n"); mostrar_i(k,N); } printf("\n\n"); return 0; } // fin de main // CONTINUA EN DIAPOSITIVA 12 FACEyT - DEEC - Programación I - 2008 11 FACEyT - DEEC - Programación I - 2008 12 3 Ordenamiento (1) Ordenamiento (2) Es el proceso de organización de un conjunto de elementos similares de información en orden creciente o decreciente. Método: Uno contra el resto Para el método de uno contra el resto es necesario emplear dos bucles anidados, y por lo tanto dos subíndices. Es Consiste en tomar cada elemento del arreglo y compararlo con los demás elementos, de acuerdo al resultado de la comparación con cada uno de los elementos se realiza o no un intercambio. FACEyT - DEEC - Programación I - 2008 decir: for(i=0; i < orden – 1; i++) { for(j=i+1; j < orden; j++) { if (V[i]>V[j]) { aux = V[i]; V[i]=V[j]; V[j]=aux; } } } 13 Búsqueda (1) Un subíndice hace referencia al elemento que se compara con el resto, el otro subíndice se utiliza para recorrer todo el arreglo. FACEyT - DEEC - Programación I - 2008 14 Búsqueda (2) Búsqueda secuencial o lineal: Puede aplicarse a conjuntos no ordenados de valores y a conjuntos ordenados de valores. Consiste en: Para realizar la búsqueda se utilizan ciclos repetitivos. Ejemplo: for(i=0; i < TAM – 1; i++) if (V[i]==CB) obtener el elemento a buscar o clave de búsqueda (CB) recorrer secuencialmente el conjunto de datos el recorrido se detiene cuando se encuentra el elemento buscado. //TAM es la orden del arreglo break; FACEyT - DEEC - Programación I - 2008 if (i == TAM) printf(“El elemento no está); else printf(“El elemento está en la posición %d”, i); 15 FACEyT - DEEC - Programación I - 2008 16 4 Arreglos Bidimensionales, Matrices o Tablas (1) Arreglos Bidimensionales, Matrices o Tablas (2) Inicialización Declaración int mat[3][5]; Declaración e inicialización Es decir M[0][0]=10, M[0][1]=5, M[0][2]= 6, M[1][0]=2, M[1][1]=5 y M[1][2]=9 17 Funciones útiles: ejemplo 1 2 3 4 5 6 7 8 de valor a los elementos de un arreglo bidimensional con datos ingresados por el usuario: void cargarmatriz (int FILA, int COL, int V[][TAM]) { int i,j; for(i=0;i<FILA;i++) for(j=0;j<COL;j++) { printf(“Ingrese el siguiente elemento”); scanf(“%d”, &V[i][j]); } } Presentación por pantalla de los elementos de un arreglo bidimensional: void mostrarmatriz (int FILA, int COL, int V[][TAM]) { int i,j; printf(“Los elementos del arreglo son:\n\n”); for(i=0;i<FILA;i++) for(j=0;j<COL;j++) printf(“Elemento de la fila %d columna %d es: %d”, i, j, V[i][j]); } FACEyT - DEEC - Programación I - 2008 FACEyT - DEEC - Programación I - 2008 18 Datos de tipo carácter (char) (1) Asignación 1 2 3 4 5 6 7 8 9 10 Asignación de valores mediante el uso de un ciclo de repetición int i,j, V[3][5]; for(i=0; i<3; i ++) { for(j=0; j<5; j ++) { printf("Ingrese un elemento para el arreglo"); scanf("%d", &V[i][j]); } } int M[2][3] = {{10,5,6}, {2,5,9}}; FACEyT - DEEC - Programación I - 2008 Asignación de valor a cada elemento de forma explícita int Arreglo[3][2]; Arreglo[0][0]=5; Arreglo[0][1]=2; Arreglo[1][0]=4; Arreglo[1][1]=9; Arreglo[2][0]=1; Arreglo[2][1]=4; tipo_dato nombre[tamaño1][tamaño2]; Ejemplo Declaración: Para los caracteres en C utilizamos el tipo de dato char. char letra; char r; Inicialización en la declaración char letra='t'; Declaración e inicialización char letra; letra='t'; 19 FACEyT - DEEC - Programación I - 2008 20 5 Datos de tipo carácter (char) (2) Datos de tipo carácter (char) (3) Funciones Funciones para manejo de caracteres para manejo de caracteres Incluidas en ctype.h Incluidas en stdio.h Lectura desde teclado isdigit() scanf("%c",&letra); letra = fgetc(stdin); isalpha() isalnum() islower() Presentación por pantalla Verificación isupper() printf("%c",letra); fputc(letra, stdout); isascii() Incluidas en stdlib.h tolower() toupper() atoi() Conversión atol() atof() FACEyT - DEEC - Programación I - 2008 21 FACEyT - DEEC - Programación I - 2008 Datos de tipo carácter (char)(4): ejemplo Ejemplo /*Cargar una matriz de caracteres de orden MxN, imprimirla por pantalla, luego indicar la cantidad de vocales encontradas en la matriz. Si no contiene vocales presentar un mensaje.*/ 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. #include "stdio.h" #include"matrices.h" // int contarvocales (int , int , char A[20][20]); // int main(int argc, char *argv[]) { // inicio de main int M,N, cantidad; char A[20][20]; printf("Ingresar la cantidad de filas de la matriz: "); scanf("%d",&M); printf("Ingresar la cantidad de columnas de la matriz: "); scanf("%d",&N); fgetc(stdin); cargarmatriz_c(M,N,A); printf("\n\nLa matriz ingresada es:\n\n"); imprimirmatriz_c(M,N,A); cantidad= contarvocales(M,N,A); Nombre del archivo ejemplo_matrices.c // CONTINUA EN DIAPOSITIVA 24 FACEyT - DEEC - Programación I - 2008 23 22 Continuación de ejemplo_matrices.c if (cantidad) printf("\n\n La cantidad de vocales en la matriz es: %d", cantidad); else printf("\n\n La matriz no contiene vocales \n"); printf("\n\n La matriz ordenada en forma descendente es :\n\n"); imprimirmatriz_c(M,N,A); return 0; } // fin de main int contarvocales (int fila, int col, char A[20][20]) { int i,j, c=0; for(i=0;i<fila;i++) { for(j=0;j<col;j++) { if (toupper(A[i][j])==‘A' || toupper(A[i][j])==‘E' || toupper(A[i][j])==‘I' || toupper(A[i][j])==‘O' || toupper[i][j])==‘U‘) c++; } } return c; } FACEyT - DEEC - Programación I - 2008 24 6 Ejemplo Ejemplo //******************************************************************** // FUNCIONES PARA MATRICES DE CARACTERES //******************************************************************** 1. void cargarmatriz_c (int fila, int col, char A[20][20]) 2. { 3. int i,j; 4. for(i=0;i<fila;i++) 5. { 6. for(j=0;j<col;j++) 7. { 8. printf("Ingresar el elemento (%d,%d): ",i,j); 9. scanf("%c",&A[i][j]); 10. fgetc(stdin); 11. } 12. } 13. return; 14. } Nombre del archivo cabecera en donde se encuentra la función: matrices.h FACEyT - DEEC - Programación I - 2008 Nombre del archivo cabecera en donde se encuentra la función: matrices.h FACEyT - DEEC - Programación I - 2008 26 Cadenas de caracteres(2): funciones Definición Arreglo unidimensional de caracteres, es decir sus elementos son de tipo char y el último elemento se denomina terminador nulo (‘\0’) el indica el final de la cadena. Incluidas en string.h strcpy(cadenadestino, cadenaorigen); strcmp(cad1,cad2); strlen(cad); strcat(cad1,cad2); Declaración tipo_dato nombre[tamaño]; Ejemplo char cadenita[10]; Declaración void imprimirmatriz_c (int fila, int col, char A[20][20]) { int i,j; for(i=0;i<fila;i++) { for(j=0;j<col;j++) { printf("%c ",A[i][j]); } printf("\n"); } return; } 25 Cadenas de caracteres (1) 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. e inicialización char cadena[50] ="Esto es un ejemplo"; char prueba[]="programación I"; Inicialización char cadena[50]; cadena = “ABC”; //No es posible realizar esta asignación. Para inicializar la variable luego de su declaración debemos utilizar funciones para el manejo de cadenas de caracteres. FACEyT - DEEC - Programación I - 2008 27 FACEyT - DEEC - Programación I - 2008 28 7 Cadenas de caracteres (3): funciones Incluidas Cadenas de caracteres (4): ejemplo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 en stdio.h Lectura desde teclado scanf(“%s”, cadenita); ]s”, cadenita); fgets(cadenita, 4, stdin); scanf(“%[0-9a-zA-z Presentación por pantalla printf(“%s”, cadenita); stdout); fputs(cadenita, FACEyT - DEEC - Programación I - 2008 29 Cadenas de caracteres (5) Longitud Física Longitud Lógica int main(int argc, char *argv[]) { char cadena[10], cadena2[10]; int i; printf("Ingresar una cadena de caracteres en minúsculas: "); scanf("%s",cadena); strcpy(cadena2,cadena); for(i=0;cadena2[i]!='\0';i++) { cadena[i]= toupper(cadena2[i]); } printf("La cadena minuscula es: %s\n",cadena2); printf("La cadena mayúscula es: %s\n",cadena); return 0; } FACEyT - DEEC - Programación I - 2008 30 Cadenas de caracteres(6): ejemplo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 FACEyT - DEEC - Programación I - 2008 #include <stdio.h> #include <ctype.h> #include <string.h> 31 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char *C1="mita"; char cad[20]="palo"; char *C2="calesitas"; char *C3="carta"; int i; printf("\n%5d%5d ",strlen(C1),sizeof(C1)); fputs(C1,stdout); printf("\n%5d%5d ",strlen(C2),sizeof(C2)); fputs(C2,stdout); strcat(cad,C1); printf("\n%5d%5d %-20s",strlen(C1),sizeof(C1),cad); C3="carita"; printf("\n%5d%5d %-20s",strlen(C3),sizeof(C3),C3); printf("\n%5d%5d %-20s",strlen(C1),sizeof(C1),C1); printf("\n\n"); return 0; } FACEyT - DEEC - Programación I - 2008 32 8 Ejemplo: funciones de cadena y de caracter 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. #include <stdio.h> #include <ctype.h> #include <string.h> // int entero(); int main(int argc, char *argv[]) { int b=0, i; char cad[10]; printf("Ingresar la cadena: "); scanf("%s",cad); for(i=0; i<(strlen(cad)); i++) { if (isdigit(cad[i])) b++; } 17. 18. 19. 20. 21. 22. if (b) printf("\n\n La cadena contiene: %d digitos", b); else printf("\n\n La cadena no contiene digitos \n"); return 0; } Arreglo de cadenas de caracteres (1) char nombre [cantidad_cadenas] [longitud_física_de_cada_cadena]; Ejemplo, si el arreglo se declara como: char cad[5][10]; y contiene: • Si colocamos: printf("%c", cad[1][3]); Por pantalla veremos el carácter E (sombreado en el ejemplo). • Si colocamos printf("%s", cad[2]); Por pantalla veremos la cadena "tio". FACEyT - DEEC - Programación I - 2008 33 Arreglo de cadenas de caracteres (2) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Declaración: #include <stdio.h> int main(int argc, char *argv[]) { char v[10][10]; int n,i; printf("Ingrese la cantidad de cadenas:"); scanf("%d", &n); fgetc(stdin); printf("\nCarga de un arreglo de cadenas\n"); for (i=0; i<n; i++) { printf("Ingresa cadena %i", i); fgets(v[i], 9, stdin); } for(i=0; i<n; i++) { printf("\nLa cadena %i: ", i); fputs(v[i], stdout); } return 0; } FACEyT - DEEC - Programación I - 2008 34 Función principal La función main posee dos argumentos que pueden enviarse a la misma y contienen: argc parámetro de tipo entero que contiene la cantidad de argumentos de línea de ordenes. Contiene al menos el valor 1, ya que el nombre del programa invocado también se cuenta como parámetro. Carga y presentación de un arreglo de cadenas de caracteres FACEyT - DEEC - Programación I - 2008 argv es un arreglo de punteros a cadenas de caracteres. Cada elemento de este arreglo apunta a un argumento de la línea de comandos. Todos los argumentos de la línea de órdenes son cadenas, cualquier número que se emplee debe ser convertido al tipo de dato deseado en el programa que lo emplee. 35 FACEyT - DEEC - Programación I - 2008 36 9 Función principal Por ejemplo, si invocamos al programa prueba de la siguiente forma: ./prueba argumentoA argumentoB argumento C Gráficamente los valores de los argumentos de main() serían: FACEyT - DEEC - Programación I - 2008 37 10