









Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
En este documento se presentan diferentes algoritmos para convertir un número entero decimal a binario, utilizando while, do-while y for. El profesor Jesus Bravo Martín explica paso a paso cómo funcionan estos algoritmos y proporciona ejemplos en C. Además, se discute cómo modificar el algoritmo utilizando el hecho de que la variable de control es el cociente entero de la división de n por 2.
Tipo: Ejercicios
1 / 17
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!










“CENTRO DE ESTUDIOS CIENTIFICOS Y TECNOLOGICOS NO 8“NARCISOS BASSOLS GARCIA”
ACADEMIA DE COMPUTACIÓN
PARTE 10 DE LOS APUNTES DE ALGORITMIA Y PROGRAAMACIÓN
b) Ciclos controlados por condición
Cuando no se conoce el número de repeticiones, se dice que los ciclos están controlados por condición, y solo se
puede usar los ciclos while y do-while. Hay 3 tipos de casos:
Ciclos controlados por condiciones generales
Ciclos controlados por Centinela: Centinela - 1 y centinela n (no)
Ciclos controlados por bandera (no lo veremos).
EJEMPLO 31.- Hacer un programa que convierta un número entero positivo del sistema decimal a sistema binario,
usando el ciclo while.
ANALISIS.- Como siempre, iniciaremos con un ejemplo para recordar cómo se realiza la conversión; aunque se
supone que ustedes ya saben hacerla, porque la vieron en Arquitectura de Computadoras, pero hay un detalle
que es necesario ver; porque para hacer la conversión como la vieron, es necesario usar arreglos, que los verán
hasta cuarto semestre.
Supongamos que necesitamos convertir el número 2 3 a binario:
Se termina de dividir cuando el cociente es cero, lo que significa que el
cociente q es la variable de control, porque establece cuando termina
el ciclo., y el número binario se obtiene escribiendo los residuos en
orden inverso al que salieron: 10111
n/q r
1
2
3
4
5
x 10000
0
Resultado: (25) 10
Que se acostumbra escribir en la forma siguiente: 11 5 2 1 0
1
2
3
4
5
Como ya se mencionó, usando arreglos, simplemente se guardan los residuos en orden inverso en un arreglo;
pero como no podemos usar arreglos, tenemos que usarla tabla de la derecha para ver cómo se
acomodan los residuos: Observamos que el resultado se obtiene sumando los residuos multiplicados por una
potencia de 10 en la
forma siguiente:
r1 1 11= 1
r2*10 1 *10= 10
r3*100 1 *100= 100
r4*1000 0 *1000= 0
r510000 110000= 10000
Como el número de divisiones depende del número que se va a convertir, por ejemplo, en este caso n=23 se
realizan 5 divisiones, igual que para n=25, pero para n=12 o n=13, se realizan solo 4 divisiones, y para n=37 o n=
se realizan 6 divisiones. Esto significa que no sabemos cuántas divisiones vamos a realizar para convertir un
número a binario; es decir, que no se sabe cuántas veces se va a repetir el ciclo.
Para generalizar el proceso, tenemos que dividir el número n entre 2 antes del ciclo calculando el cociente q1 y el
residuo r 1. Para hacer la segunda división dividimos el cociente q1 entre 2, obteniendo el cociente q2 y el residuo
r2, para eso hay que convertir el cociente en dividendo (n) n=q1,
para hacer la tercera división n q2,
y así sucesivamente hasta que el
cociente sea cero.
VARIABLES:
De entrada: El número a convertir: n: int (positivo)
De proceso: El cociente: q: int
El residuo: r: int
El factor potencia de 10: p: int
El número binario que es la ma: b: int o float
El respaldo de n: x: int
q1 q2 q3 qn 0
EJEMPLO 32.- Este algoritmo se puede modificar o mejorar, utilizando el hecho de que la variable de control es el
cociente entero de la división de n entre 2, es decir, que depende de n; entonces podemos cambiar la variable de
control a n, que ya se conoce; pero la condición del ciclo while cambia de q!=0 a n>=1. Y con esto ya no
calculamos el cociente q=n/2 ni el residuo r=n%2 afuera del ciclo, solo adentro, pero al principio. Y tampoco
calculamos b al final del ciclo.
NOTA: la variable x se usa para hacer un respaldo, del número n debido a que se pierde el valor de
n, y ya no se podría mostrar con el printf, y el resultado se tendría que expresar así:
printf(“\n El numero binario es: %ld”, b);.
V
F
n >= 1
FIN
/* Ejemplo 32 Conversion de un numero entero decimal a binario con while */
#include<stdio.h>
int main()
{
int n, x, q, r, p;
long b;
printf("\nEscribe un numero entero positivo n: ");
scanf("%d", &n);
x=n;
b=0;
p=1;
while(n >= 1) {
q=n/2;
r=n%2;
b += r*p;
p *= 10;
n=q;
}
printf("\nEl numero %d decimal equivale a %ld binario", x, b);
printf("\n");
system p(“pause”);
return 0;
}
INICIO
b ← 0
x ← n
n ← q
EL PROGRAMA ES:
‘ ESCRIBE EL NUMERO
ENTERO POSITIVO n ’
n
p ← 1
r← n Mod 2
n ← n/2 b ← b + rp p ← p 10
‘ El NUMERO ‘, X, ‘
DECIMAL EQUIVALE
A: ’, b , ‘ EN BINARIO. ‘
EJEMPLO 33.- Se puede modificar el programa anterior para ya no usar la variable q (cociente), calculando el
cociente q=n/2 directamente como n=n/2; pero calcular el residuo tanto antes de iniciar el ciclo como en la última
instrucción del ciclo y volviendo a calcular b después del ciclo.
EJEMPLO 34.- Hacer el programa que convierta un número entero positivo del sistema decimal a sistema binario,
usando el ciclo do-while.
V
F
n >= 0
FIN
/*Ejemplo33 Conversion de un numero entero decimal a binario con while */
#include<stdio.h>
int main()
{
int n, x, r, p;
long b;
printf("\nEscribe un numero entero positivo n: ");
scanf("%d", &n);
x=n;
b=0;
p=1;
r=n%2;
while(n >= 1) {
n=n/2;
b += r*p;
p *= 10;
r=n%2;
}
b += r*p;
printf("\nEl numero %d decimal equivale a %ld binario", x, b);
printf("\n");
return 0;
}
INICIO
b ← 0
x ← n
EL PROGRAMA ES:
‘ ESCRIBE EL NUMERO
ENTERO POSITIVO n ’
n
p ← 1
b ← b + rp r← n Mod 2 p ← p 10
n ← n/
‘ El NUMERO ‘, X, ‘
DECIMAL EQUIVALE
A: ’, b , ‘ EN BINARIO. ‘
r ← n Mod 2
b ← b + r*p
INICIO
EJEMPLO 3 5 .- El programa anterior se pude modificar tomando en cuenta que el ciclo do-while primero ejecuta el cuerpo
del ciclo después checa la condición y que como dijimos en el ejemplo 32, la variable de control del ciclo es el cociente
q=n/2 depende de n, que ya se conoce; para no calcular el cociente ni el residuo r=n%2 antes del ciclo, los pasamos
adentro del ciclo iniciando con ellos, y ya no los calculamos para terminar el ciclo, solo hacemos el cambio n=q para que
si se vuelve a ejecutar el ciclo, se modifique la variable ce control del ciclo q. Con esto ya no calculamos otra vez b
al terminar el ciclo.
EL PROGRAMA ES:
V
F
q >= 1
FIN
/Ejemplo 35 Conversion de un numero entero decimal a binario con do-while/
#include<stdio.h>
int main()
{
int n, x, q, r, p;
long b;
printf("\nEscribe un numero entero positivo n: ");
scanf("%d", &n);
x=n;
b=0;
p=1;
do {
q=n/2;
r=n%2;
b += r*p;
p *= 10;
n=q;
} while(q >= 1);
printf("\nEl numero %d decimal equivale a %ld binario", x, b);
printf("\n");
system("pause");
return 0;
}
b ← 0
q ← n/
x ← n
n ← q
‘ ESCRIBE EL NUMERO
ENTERO POSITIVO n ’
n
p ← 1
r ← n/
b ← b + r*p
p ← p*
‘ El NUMERO ‘, X, ‘
DECIMAL EQUIVALE
A: ’, b , ‘ EN BINARIO. ‘
NOTA: En este programa, la condición
también puede ser q > 0 o bien, q != 0
INICIO
EJEMPLO 36.- El programa anterior se pude modificar para no usar la variable q porque depende de n y entonces
calculamos el cociente con la misma n n=n/2, como la modificación de la variable de control, y naturalmente,
cambia la condición a n>=1; aunque calculamos otra vez b al terminar el ciclo.
EL PROGRAMA ES:
V
F
n >= 1
FIN
/Ejemplo 3 6 Conversion de un numero entero decimal a binario con do-while/
#include<stdio.h>
int main()
{
int n, x, r, p;
long b;
printf("\nEscribe un numero entero positivo n: ");
scanf("%d", &n);
x=n;
b=0;
p=1;
do {
r=n%2;
b += r*p;
p *= 10;
n=n/2;
} while(n >= 1);
printf("\nEl numero %d decimal equivale a %ld binario", x, b);
printf("\n");
system("pause");
return 0;
}
b ← 0
n ← n/
x ← n
‘ ESCRIBE EL NUMERO
ENTERO POSITIVO n ’
n
p ← 1
r ← n/
b ← b + r*p
p ← p*
‘ El NUMERO ‘, X, ‘
DECIMAL EQUIVALE
A: ’, b , ‘ EN BINARIO. ‘
Ejemplo 37 - Programa que calcula de promedio de un con junto de datos que no se sabe cuántos son,
usando centinela - 1
Cuando no se conoce el número de repeticiones de un ciclo (detener la captura de datos), este se puede detener
el centinela - 1, es un valor leído desde el teclado, que se utiliza cuando los datos son positivos. En general, un
valor centinela es cualquier valor que no pueden tener los datos que se están trabajando, por ejemplo, si se
necesita calcular el promedio de edades de un grupo de personas, un valor centinela puede ser cualquier número
negativo o bien cualquier valor mayor que 150 (nadie vive más de 150 años); o si se va a calcular el promedio de
estaturas de un grupo de personas, puede ser valor centinela cualquier valor negativo, o bien cualquier valor
mayor que 2.5 (nadie mide más de 2.5 metros.
Si conociéramos el número de datos, usaríamos
un ciclo controlado por contador para calcular la
suma de los datos, y usaríamos un contador para
la condición de terminación de la captura de datos.
Se trata de calcular la suma de los datos Sd = d1 + d2 + d3 + ⋯ + dn El número de datos n debe ser solicitado
y leído desde el teclado. Para lo que se necesita un acumulador s inicializado a cero: S 0
= 0 porque se obtiene mediante
sumas y un contador c = 1, 2, 3, … , n. Y hay contar el dato, solicitarlo y leerlo, y sumarlo, e incrementar el contador.
Suponiendo que vamos a hacer el programa con el ciclo for o con el ciclo while:
Para c=1, checar condición (¿c<=n?), Si, Solicitar y leer el dato d1: Hacer S 1 = d1 = 0 +d1 = s 0 + d 1
Para c=2, checar condición (¿c<=n?), Si, Solicitar y leer el dato d2: Sumarlo S 2 = d1 + d2 = s 1 + d 2
Para c=3, checar condición (¿c<=n?), Si, Solicitar y leer el dato d3: Sumarlo S 3
=d1+d2+d3 = s 2
+d 3
s 2
Para c=4, checar condición (¿c<=n?), Si, Solicitar y leer el dato d4: Sumarlo S 4 =d1+d2+d3+d4=s3+d 4
En general s 3
Para c=n, checar condición (¿c<=n?), Solicitar y leer el dato d2: Sumarlo
Sn=d 1 +d 2 +d 3 +…+dn- 1 +dn=sn- 1 + dn
Para c=n+1, checar condición (¿c<=n?), No, termina ciclo
De tal manera que el promedio será:
Es importante hacer notar que el ciclo es para obtener la suma, para calcular el promedio dividiendo entre el
número de datos sumados.
Pero si no sabemos cuántos datos son, y usamos centinela - 1, se trata de terminar la captura o lectura de datos
escribiendo - 1 para detener el ciclo. Como el último dato leído fue para detener el ciclo
s 99
Es la ecuación
iterativa y /o
recursiva
En resumen:
Quitando lo
subíndices:
La ecuación iterativa y/o recursiva se puede escribir en forma resumida: s += d
c
= s c- 1
s = s + d
1
2
3
𝑛
𝑑
/*Ejemplo 37 que calcula el promedio de un conjunto de datos, que no sabemos cuántos, usando centinela - 1 */
#include<stdio.h>
#include<stdlib.h>
int main()
int n, c;
float d, s, prom;
s=0;
printf("\nEscribe los datos conforme se pidan, pulsando - 1 para terminar la captura: ");
c=1;
printf("\nEscribe el dato %d: ", c);
scanf("%f", &d);
while (d != - 1) {
s += d;
++c;
printf("\nEscribe el dato %d: ", c);
scanf("%f", &d);
n = c - 1;
prom =s/n;
printf("\nEl promedio es: %5.2f", prom);
printf ("\n");
system("pause");
return 0;
NOTA: Si los datos fueran declarados de tipo int y también la suma, aunque el promedio se declare de tipo float,
el resultado seria con 6 ceros después del punto decimal. Para corregir eso, la formula se escribiría así:
prom=(float)s/n; (usando conversión explícita de datos: cast o castig). La otra forma de corregir es declarar los
datos, la suma y promedio de tipo float.
Se acostumbra inicializar el contador a cero (c=0), para escribir directamente la fórmula prom=s/d; y no escribir
n=c-1.
EJEMPLO 39.- Promedio con centinela s/n, usando ciclo while.
#include<stdio.h>
#include<stdlib.h>
int main()
int n, c;
float d, sd, prom;
char otro;
sd=0;
printf("\nEscribe los datos conforme se pidan, pulsando s a la pregunta ¿otro dato? para terminar la captura, pulsar n: ");
c=1;
otro='s';
while (otro == 's' || otro == 'S') {
printf("\nEscribe el dato %d: ", c);
scanf("%f", &d);
sd += d;
++c;
fflush(stdin);
printf("\n¿Otro dato (s/n) ?");
otro = getchar();
n = c - 1;
prom =sd/n;
printf("\nEl promedio es: %5.2f", prom);
printf ("\n");
system("pause");
return 0;
Aquí, se puede inicializar el contador a cero para escribir directamente la fórmula del promedio prom=sd/c
sin calcular n=c-1; pero, ahora se solicitará el dato d 0 , el dato d1, el dato d2 … y para que sigan pidiendo los
datos a partir de d1, hay que cambiar c por c+1 en el printf() que solicita los datos.
EJEMPLO 40 .- Promedio con centinela s/n, usando ciclo while.
#include<stdio.h>
#include<stdlib.h>
int main()
int n, c;
float d, sd, prom;
char otro;
sd=0;
printf("\nEscribe los datos conforme se pidan, pulsando s a la pregunta ¿otro dato? para terminar la captura, pulsar n: ");
/*c=0; 0, 1, 2, 3, 4 */
c=1; /* 1, 2, 3, 4, 5 */
do {
printf("\nEscribe el dato %d: ", c);
scanf("%f", &d);
sd += d;
++c;
fflush(stdin);
printf("\n¿Otro dato (s/n) ?");
otro = getchar();
} while (otro == 's' || otro == 'S');
/*prom =sd/c; */
n = c - 1;
prom =sd/n;
printf("\nEl promedio es: %5.2f", prom);
printf ("\n");
system("pause");
return 0;
Repetición o reciclado de programas:
Un uso interesante del anidamiento de ciclos y del centinela s/n, aunque en realidad el centinela es n porque con
n deja de repetirse el ciclo; podemos invertir la pregunta para detener el ciclo con s; es usarlo para repetir la
ejecución de un programa, se dice reciclarlo. Por ejemplo el caso de la tabla de multiplicar, se necesita otra tabla,
y si se contesta s, nos vuelve a pedir el número de tabla y al darlo, la despliega también, y naturalmente, el ciclo
externo debe ser un ciclo while o un ciclo do-while; pero como el ciclo while se checa primero la condición y
después se ejecuta el cuerpo del ciclo, se necesita inicializar antes la variable de control otra, otro, o resp en
general a (otra=‘s’; , otro=’s´; o resp=’s’;), se usa más el do-while porque en este no se tiene que inicializar la
variable de control porque la condición se checa al final.
El siguiente ejemplo ilustra como funciona:
EJEMPLO 42 .- Repetición o reciclaje de programas con centinela s/n, usando ciclo while.
*Ejemplo 4 2 */
#include<stdio.h>
#include<stdlib.h>
int main ()
int nt, c, r;
char otra;
otra='s';
while(otra=='s' || otra=='S') {
printf ("\n ESCRIBE LA TABLA QUE NECESITAS: ");
scanf("%d", &nt);
printf("\n LA TABLA DEL %d ES: \n", nt);
for(c=1; c<=10; c++) {
r = nt * c;
printf("\n%2d x %2d = %3d", nt, c, r);
printf("\n?Necesitas otra tabla? s/n: ");
fflush(stdin);
/ *otra = getchar(); */
scanf("%c", &otra);
printf ("\n");
system ("Pause");
return 0;
El comentario antes de scanf significa que se puede usar cualquiera de las 2.
Se puede reciclar cualquier programa, por ejemplo, el de la ecuación cuadrática, que nos pregunte si queremos
resolver otra ecuación cuadrática.
EJEMPLO 43 .- Repetición o reciclaje de programas con centinela s/n, usando ciclo do-while.
/*Ejemplo 4 1 */
#include<stdio.h>
#include<stdlib.h>
int main ()
int nt, c, r;
char otra;
do {
printf ("\n ESCRIBE LA TABLA QUE NECESITAS: ");
scanf("%d", &nt);
printf("\n LA TABLA DEL %d ES: \n", nt);
for(c=1; c<=10; c++) {
r = nt * c;
printf("\n%2d x %2d = %3d", nt, c, r);
printf("\n?Necesitas otra tabla? s/n: ");
fflush(stdin);
/*otra = getchar(); */
scanf("%c", &otra);
} while(otra=='s' || otra=='S');
printf ("\n");
system ("Pause");
return 0;
NOTA: El caso del uso de do-while se puede usar para repetir un menú que usa switch; pero incluso se puede
manejar el menú sin switch, solo con do-while. Estos menús son más dinámicos.