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;
}