Download Nota: el código relacionado a los temas de este resumen
Document related concepts
no text concepts found
Transcript
Funciones (continuación). Ordenamiento mediante una función Nota: el código relacionado a los temas de este resumen, implementado en 17I se encuentra en http://newton.uam.mx/xgeorge/uea/Intro_Pro/17I/13_ordenamioento_mediante_funcion_13.cpp Algoritmos: Programa de la tarea 'exponencial': int main() { /*tarea de exponencial*/ /*adquisicion de x y n*/ double x, exp, sumando; int n, k; puts("dame x\n"); scanf("%lf", &x); puts("dame n\n"); scanf("%d", &n); /*for(k=1, exp=1., sumando=1.; k<n; k++){ sumando*= (x/k); exp+=sumando; }*/ /*las siguientes dos líneas hacen lo mismo que el fragmento comentado arriba */ for(k=1, exp=1., sumando=1.; k<n; sumando*= (x/k), exp+=sumando, k++); printf("para x=%g n=%d exp=%g\n", x, n, exp); return 0; } Oredenamiento burbuja mediante función: o Ordenamiento de un arreglo de flotantes: Una implementación equivalente al ordenamiento en Resumen 10: #include "stdafx.h" #define DIMa 15 void orden(float a[], int dim){ bool desorden; int i; do{ desorden = false; //antes de entrar al siguiente ciclo, supongamos // que el arreglo ya es ordenado for (i = 0; i<dim - 1; i++){ //un recorrido de pares sucesivos if (a[i]>a[i + 1]){ // si se detectó el hecho de datos desordenados… desorden = true; // a través de ese estamos mandando una //señal al 'while' que hay que seguir ordenando //aplicar intercambio de a[i] con a[i+1] float aux; aux = a[i]; a[i] = a[i + 1]; a[i + 1] = aux; } } } while (desorden/*repetir mientras hay desorden*/); } int main() { //bool desorden;//para tipo booleano los valores permitidos son true o false float a[DIMa]; int i; for (i = 0; i<DIMa; i++) //generar a[] a[i] = rand() % 50; for (i = 0; i<DIMa; i++) printf("%g ", a[i]); orden(a, DIMa); printf("\n Ordenado: \n"); for (i = 0; i<DIMa; i++) printf("%g ", a[i]); printf("\n"); return 0; } o Otra implementación: Cambiamos solo el tipo de datos en arreglo: de flotantes a char: #include "stdafx.h" #define DIMa 15 void orden(char a[], int dim){ bool desorden; int i; do{ desorden=false; //antes de entrar al siguiente ciclo, supongamos // que el arreglo ya es ordenado for(i=0;i<dim-1;i++){ //un recorrido de pares sucesivos if(a[i]>a[i+1]){ // si se detectó el hecho de datos desordenados… /* !!! ojo: en línea anterior '>' se aplica a letras*/ desorden=true; // a través de ese estamos mandando una //señal al 'while' que hay que seguir ordenando //aplicar intercambio de a[i] con a[i+1] char aux; aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; } } } while(desorden/*repetir mientras hay desorden*/); } char letra(){ char alfabeto[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}; return alfabeto[rand()%9]; } int main() { char a[DIMa]; int i; /* generar letras en arreglo 'a' y ordenarlo*/ for(i=0;i<DIMa;i++) //generar a[] a[i]=letra();//a[i]=rand()%50; for(i=0;i<DIMa;i++) printf("%c ", a[i]); orden( a, DIMa); printf("\n Ordenado: \n"); for(i=0;i<DIMa;i++) printf("%c ", a[i]); printf("\n"); return 0; } o Otra modificación: En lugar de arreglo de char, vamos a ordenar una cadena de literales: Versión 1(usar para ordenamiento la función de longitud de cadena): #include "stdafx.h" #define DIMa 15 /*función recibe cadena de literales 'nombre' y devuelve su longitud */ int long_cad(char nombre[]){ /*no debe tener problema la implementación a continuacion, bajo suposicion que la cadena se hizo correctamente, es decir con '\0'*/ int cont=0; while(nombre[cont]!='\0') cont++; return cont; } /*función recibe cadena de literales 'a' y hace su ordenamiento */ void orden(char a[]){ bool desorden; int i, dim=long_cad(a); //se calcula longitud de cadena para ciclo 'for' do{ desorden=false; //antes de entrar al siguiente ciclo, supongamos // que el arreglo ya es ordenado for(i=0;i<dim-1;i++) //un recorrido de pares sucesivos if(a[i]>a[i+1]){ // si se detectó el hecho de datos desordenados… desorden=true; // a través de ese estamos mandando una //señal al 'while' que hay que seguir ordenando //aplicar intercambio de a[i] con a[i+1] char aux; aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; } } while(desorden/*repetir mientras hay desorden*/); } char letra(){ char alfabeto[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}; return alfabeto[rand()%9]; } void gen_cad_lit(char c[], int dim){ int fin=rand()%(dim-1); int i; for(i=0;i<fin;i++) c[i]=letra(); c[fin]='\0'; } int main() { char b[DIMa]; /* generar 10 veces cadena 'b' y ordenarla*/ for(i=0; i<10;i++){ puts("\n b desordenado:\n"); gen_cad_lit(b, DIMa); puts(b); orden(b); puts("\n b ordenado:\n"); puts(b); } return 0; } Versión 2(NO usar para ordenamiento la función de longitud de cadena): #include "stdafx.h" #define DIMa 15 /*función recibe cadena de literales 'a' y hace su ordenamiento */ void orden(char a[]){ bool desorden; int i; do{ desorden=false; //antes de entrar al siguiente ciclo, supongamos // que el arreglo ya es ordenado i=0; while(a[i]!='\0' && a[i+1]!='\0'){ //un recorrido de pares sucesivos { if(a[i]>a[i+1]){ // si se detectó el hecho de datos desordenados… desorden=true; // a través de ese estamos mandando una //señal al 'while' que hay que seguir ordenando //aplicar intercambio de a[i] con a[i+1] char aux; aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; } i++; } } while(desorden/*repetir mientras hay desorden*/); } char letra(){ char alfabeto[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}; return alfabeto[rand()%9]; } void gen_cad_lit(char c[], int dim){ int fin=rand()%(dim-1); int i; for(i=0;i<fin;i++) c[i]=letra(); c[fin]='\0'; } int main() { char b[DIMa]; /* generar 10 veces cadena 'b' y ordenarla*/ for(i=0; i<10;i++){ puts("\n b desordenado:\n"); gen_cad_lit(b, DIMa); puts(b); orden(b); puts("\n b ordenado:\n"); puts(b); } return 0; }