You are on page 1of 26

UNIVERSIDAD NACIONAL DE SAN

AGUSTN
FACULTAD DE INGENIERA DE PRODUCCIN Y
SERVICIOS

ESCUELA PROFESIONAL DE INGENIERA DE


SISTEMAS

TRABAJO
Ejercicios Capitulo 1 y 2

DOCENTE:
Paz Valderrama, Alfredo

INTEGRANTES:
Luna Calderon, Angel
Valdivia Berrio, Freddy
Yanque Churo, Luis

ABRIL, 2015

Ejercicios del Captulo 1

Ejercicio 1.

Ejecute el programa Hola, Mundo en su sistema.


Experimente con la omisin de partes del programa, para ver que mensajes
de error se obtiene.
#include <stdio.h>
main(){
printf("%s\n", "Hola Mundo");
}
/* faltando una comilla
ejercicio11.c:4:2: error: missing terminating " character
ejercicio11.c:5:1: error: expected expression before } token
ejercicio11.c:5:1: error: expected ; before } token*/
/*faltando punyto y coma
ejercicio11.c: In function main:
ejercicio11.c:5:1: error: expected ; before } token*/

Ejercicio 2. Experimente el descubrir que pasa cuando la cadena del


argumento de printf contiene \c, en donde c es algn carcter no puesto en
lista anteriormente
#include <stdio.h>
main(){
printf("hola, mundo\c");
}
/* genera error
ejercicio12.c: In function main:
ejercicio12.c:4:9: warning: unknown escape sequence: '\c' [enabled by default] */

Ejercicio 3.

Modifique el programa de conversin de temperaturas de


modo que escriba un encabezado sobre la tabla.
#include <stdio.h>
main(){
int fahr, celsius;
int lower, upper, step;
lower = 0; // limite superior de la tabla de temperaturas
upper = 300; //limite superior de la temperatura
step = 20; //tamaao del incremento
printf( "%s\t%s\n", "fahr", "celsius" );
fahr = lower;
while( fahr <= upper ){
celsius = 5 * (fahr-32) / 9;
printf( "%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
}

Ejercicio 4. Escriba un programa que imprima la tabla correspondiente


Celsius a Fahrenheit.
#include <stdio.h>
main(){
int fahr, celsius;
int lower, upper, step;
lower = 0;
upper = 180;
step = 20;
printf( "%s\t%s\n","celsius","fahr" );
celsius = lower;
while( celsius <= upper ){
fahr = 9 * (celsius + 32) / 5;
printf("%d\t%d\n", celsius, fahr);
celsius = celsius + step;
}
}

Ejercicio 5. Modifique el programa de conversin de temperaturas de


manera que escriba la tabla en orden inverso, esto es, desde 300 grados
hasta 0.
#include <stdio.h>
main(){
int fahr;
for( fahr = 300; fahr >= 0; fahr = fahr - 20 ){
printf( "%3d %6.1f\n", fahr, ( 5.0 / 9.0 ) * ( fahr - 32 ) );
}
}

Ejercicio 6. Verifique que la expresin getchar() = EOF es 0 o 1.

#include <stdio.h>
main(){
printf( "La expresion da: %d\n", getchar() != EOF );
}

/* La expresion da: 1 */

Ejercicio 7. Escriba un programa que imprima el valor de EOF.

#include <stdio.h>
main(){
printf( "Valor de EOF: %d\n", EOF );
}
/* Valor de EOF: -1 */

Ejercicio 8. Escriba un programa que cuente espacios en blanco,


tabuladores y nuevas lneas.
#include <stdio.h>
main(){
int c, nl, ns, nt;
nl = 0; //Contador de salto de linea
ns = 0; //Contador de espacios
nt = 0; //Contador de tabulaciones
while( ( c = getchar() ) != EOF ){
if( c == '\n' ) ++nl;
if( c == ' ' ) ++ns;
if( c == '\t' ) ++nt;
}
printf( "%s\t%d\n", "numero de lineas =", nl );
printf( "%s\t%d\n", "numero de espacios =", ns );
printf( "%s\t%d\n", "numero de tabs =", nt );
}

Ejercicio 9. Escriba un programa que copie su entrada a la salida,


reemplazando cada cadena de uno o ms blancos por un solo blanco.
#include <stdio.h>
main(){
int c, n;
n = 0;
while( ( c = getchar() ) != EOF ){
if( c != ' ' && n != 0 ){
printf( " %c" , c );
n = 0;
}
else {
if( c == ' ' ) n++;
else
printf( "%c", c );
}
}
}

Ejercicio 10. Escriba un programa que copie su entrada a la salida,


reemplazando cada tabulacin por \t, cada retroceso por \b y cada diagonal
invertida por //. Esto hace que las tabulaciones y los espacios sean visibles
sin confusiones.

#include <stdio.h>
main(){
int c, n, d;
n = 0;
d = 0;
while( ( c = getchar() ) != EOF ){
if( c != '\t' && n != 0){
printf( "\\t%c", c );
n = 0;
}
else if( c != '/' && d != 0 ){
printf( "\\\\%c", c );
d = 0;
}
else if( c == '\t' ){
n++;
}
else if( c == '/' ){
d++;
}
else{
printf( "%c", c);
}
}
}

Ejercicio 11. Cmo probara el programa para contar palabras? Qu


clase de entrada es la ms conveniente para descubrir errores si estos
existen?
#include<stdio.h>
#define IN 1
#define OUT 0
main(){
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while( ( c = getchar() ) != EOF ){
++nc;
if(c == '\n') ++nl;
if(c == ' ' || c == '\n' || c == '\t') state = OUT;
else if(state == OUT){
state = IN;
++nw;
}
}
printf( "%d %d %d\n", nl, nw, nc );
}

/* 1. Los caracteres como % ( *, entre otros, solitarios son considerados


como palabras
2. La concatenacin de estos mismo caracteres son considerados palabras
*/

Ejercicio 12. Escriba un programa que imprima su entrada una palabra


por lnea.

#include<stdio.h>
#define IN 1 /* en una palabra*/
#define OUT 0 /*fuera de una palabra*/
main(){
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while( ( c = getchar() ) != EOF ){
if( c == ' ' || c == '\n' || c == '\t') state = OUT;
else if( state == OUT){
state = IN;
++nw;
printf( "\n%c", c );
}
else{
printf( "%c", c );
}
}
}

Ejercicio 13. Escriba un programa que imprima el histograma de las


longitudes de las palabras de su entrada. Es fcil dibujar el histograma con
las barras horizontales; la orientacin vertical es un reto ms interesante.

#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXTAM 255
main(){
int i, j, c, estado, longitud, histo[ MAXTAM ];
longitud = 0;
estado = OUT;

for ( i = 0; i < MAXTAM; ++i )


histo[ i ] = 0;
while( ( c = getchar() ) != EOF ){
if( c != ' ' && c != '\n' && c != '\t' ){
if( estado == IN ){
++longitud;
} else{
estado = IN;
longitud = 1;
}
} else {
if( estado == IN )
histo[ longitud ]++;
estado = OUT;
}
}
for ( i = 1; i < MAXTAM; ++i ){
if( histo[ i ] > 0 ){
printf( "%3d:\t" ,i );
for ( j = 0; j < histo[ i ]; ++j )
putchar( '*' );
putchar( '\n' );
}
}
}

Ejercicio 14. Escriba un programa que imprima el histograma de las


frecuencias con que se presentan diferentes caracteres ledos a la entrada.

#include <stdio.h>
#define LIM 255
main(){
int c, i, j;
int f[ LIM ] = { 0 }; //frecuencia
while( ( c = getchar() ) != EOF)
f[ c ]++;
for ( i = 0; i < LIM; ++i )
if ( f[i] > 0 ) {
if ( i == '\t' )

printf( "\\t: " );

else if ( i == '\n' )

printf( "\\n: " );

else if ( i == '\b' )

printf( "\\b: " );

else
printf( " %c: ", i);
for ( j = 0; j < f[ i ]; ++j )
putchar( '*' );
putchar( '\n' );
}
}

Ejercicio 15. Escriba de nuevo el programa de conversin de temperatura


de la seccin 1.2, de modo que utilice una funcin para la conversin.

#include <stdio.h>
#define LOWER 0 //lmite inferior de la tabla
#define UPPER 300 // lmite superior
#define STEP 20 //tamao del incremento
float convercion( float );
main(){
float fahr;
printf( "%s\t%s\n", "Fahrenheit", "Celsius" );
for ( fahr = LOWER; fahr <= UPPER; fahr += STEP)

printf( "%f\t%f\n", fahr, convercion( fahr ) );


return 0;
}
float convercion( float fahr ){
return ( fahr + 32 ) * ( 5.0 / 9.0 );
}

Ejercicio 16. Corrija la rutina principal del programa de la lnea ms larga


de modo que imprima correctamente la longitud de lneas de entrada
arbitrariamente largas, y tanto texto como sea posible.

#include <stdio.h>
#define MAXLINE 1000
int getlines( char s[ ], int lim );
void copy( char to[ ], char from[ ] );
int main(){
int len, max;
char line [MAXLINE];
char longest [MAXLINE];
max = 0;
while( ( len = getlines( line, MAXLINE) ) > 0 ){
if( len > max ){
max = len;
copy ( longest, line );
}
}
if( max > 0 )
//para que imprima la longitud correcta le restamos uno por el 0
printf( "%s\n %d caracteres\n", longest, max - 1 );
return 0;
}
int getlines( char s[], int lim ){
int c, i, j;
j= 0;

for( i = 0; ( c = getchar() ) != EOF && c != '\n'; i++)


if(i < lim - 2){
s[j] = c;
++j;
}
if ( c == '\n' ){
s [j] = c;
++j;
++i;
}
s [j] = '\0';
return i;
}
void copy( char to[], char from[] ){
int i;
i = 0;
while( (to[ i ] = from[ i ]) != '\0')
++i;
}

Ejercicio 17. Escriba un programa que imprima todas las lneas de


entrada que sean mayores de 80 caracteres.

#include <stdio.h>
#define MAXLINE 1000
#define LOG 10
int getlines( char s[], int lim );
void copy( char to[], char from[] );
int main(){
int len;
char line [MAXLINE];
char longest [MAXLINE];
while( ( len = getlines( line, MAXLINE ) ) > 0 ){
if( len > LOG ){
copy( longest, line );

printf( "%s", longest );


}
}
return 0;
}
int getlines( char s[], int lim ){
int c, i, j;
j= 0;
for( i = 0; ( c = getchar() ) != EOF && c != '\n'; i++ )
if( i < lim - 2 ){
s[ j ] = c;
++j;
}

if ( c == '\n' ){
s[ j ] = c;
++j;
++i;
}
s[ j ] = '\0';
return i;
}
void copy( char to[], char from[] ){
int i;
i = 0;
while( ( to[ i ] = from[ i ] ) != '\0')
++i;
}

Ejercicio 18. Escriba un programa que elimine los blancos y los


tabuladores que estn al final de cada lnea de entrada, y que borre
completamente las lneas en blanco.

#include<stdio.h>

#define MAXLINE 1000


int getlines( char s[], int lim );
main(){
int i, len, max;
char line[ MAXLINE ];
while( ( len = getlines( line, MAXLINE ) ) > 0 ){
for( i = len - 2; i > 0; i--){
if( ( line[ i ] != '\t' && line[ i ] != ' '&& line[ i ] != '\n' ) ){
break;
}
else {
line[ i ] = '\n';
line[ i + 1 ] = '\0';
}
}
if( len > 1 )
printf( "%s", line );
}
return 0;
}
int getlines( char s[], int lim ){
int c, i, j;
j= 0;
for( i = 0; ( c = getchar() ) != EOF && c != '\n'; i++ )
if( i < lim - 2 ){
s[ j ] = c;
++j;
}
if( c == '\n' ){
s[ j ] = c;
++j;
++i;
}
s[ j ] = '\0';
return i;

Ejercicio 19. Escriba una funcin reverse(s) que invierta la cadena de


caracteres s. sela para escribir un programa que invierta su entrada, lnea
a lnea.

#include <stdio.h>
#define MAXLINE 1000
int getlines( char s[], int lim );
void copy( char to[], char from[],int t );
int main(){
int len;
char line[ MAXLINE ];
char longest[ MAXLINE ];
while( ( len = getlines( line, MAXLINE ) ) > 0 ){
copy( longest, line, len );
printf( "%s", longest );
}
return 0;
}
int getlines( char s[], int lim ){
int c, i, j;
j= 0;
for( i = 0; ( c = getchar() ) != EOF && c != '\n'; i++ )
if( i < lim - 2 ){
s[ j ] = c;
++j;
}
if ( c == '\n' ){
s[ j ] = c;
++j;
++i;
}
s[ j ] = '\0';
return i;

}
void copy( char to[], char from[],int l ){
int ta = l-1;
int i;
i = 0;
while( ( to[ i ] = from[ ta ]) != '\0' ){
++i;
--ta;
}
}

Ejercicio 20. Escriba un programa de tab que reemplace tabuladores de


la entrada con el nmero apropiado de blancos para espaciar hasta el
siguiente paro de tabulaciones. Considere un conjunto fijo de paros de
tabulaciones, digamos cada n columnas. Debe ser n una variable o un
parmetro simblico?
#include <stdio.h>
#define N 5
main(){
int c;
int i;
while( ( c = getchar() ) != EOF ){
if( c == '\t' ){
for( i = 0; i < N; i++ )
printf( "%c", ' ' );
}
else{
printf( "%c", c );
}
}
}

Ejercicio 21. Escriba un programa que reemplace cadenas de blancos por


el mnimo nmero de tabuladores y blancos para obtener el mismo
espaciado. Considere los paros de tabulaciones de igual manera que para
tab. Cuando un tabulador o un simple espacio en blanco fuese suficiente
para alcanzar un paro de tabulaciones, A cul se le debe dar preferencia?
#include <stdio.h>
#define N 5

main(){
int c;
int i;
int nu;
while( ( c = getchar() ) != EOF ){
if( c == ' ' ) nu++;
if( c != ' ' ){
if( nu >= N ){
for( i = 0; i < nu / N; i++ ){
printf( "%c", '\t' );
}
for( i = 0; i < nu % N; i++ ){
printf( "%c", ' ' );
}
nu = 0;
}
else if( nu < N ){
for( i = 0; i < nu % N; i++ ){
printf( "%c", ' ' );
}
nu = 0;
printf( "%c", c );
}
else{
nu = 0;
printf( "%c", c );
}
}
}
}

Ejercicio 22. Escriba un programa para doblar lneas grandes de

entrada en 2 o ms lneas cortas despus del ltimo carcter no blanco que


ocurra antes de la rt-esima columna de entrada. Asegrese de que su
programa se comporte apropiadamente con lneas muy largas, y de que no
hay blancos o tabuladores antes de la columna especificada.

#include <stdio.h>
#define N 8
main(){
int c;
int i;
int nu;
while( ( c = getchar() ) != EOF ){
if( c == '\t' || c == ' ' ){
nu ++;
if( nu >= N ){
c = '\n';

nu = 0;
}
}
putchar( c );
}
}

Ejercicio 23. Escriba un programa para eliminar todos los comentarios de


un programa en C. No olvide manejar apropiadamente las cadenas entre
comillas y las constantes de carcter. Los comentarios de C no se anidan.

#include<stdio.h>
#define MAXLINE 1000
int getlines(char s[], int lim );
main(){
int i, len, max;
char line[ MAXLINE ];
int fl = 0;
while( ( len = getlines( line, MAXLINE ) ) > 0 ){//recorre lineas
for( i = 0; i < len - 1; i++ ){//recorre caracteres de la linea
if( line[ i ] == '/' ){
if( line[ i + 1 ] == '/' ){
line[ i ] = '\n';
line[ i + 1 ] = '\0';
}
if( line[ i + 1 ] == '*' ){
fl = 1;
}
}
if( line[ i ] == '*' ){
if( line[ i + 1 ] == '/' ){
line[ i ] = ' ';
line[ i + 1 ] = ' ';
fl = 0;
}
}

if( fl == 1 ){
line[ i ] = ' ';
}
}
printf( "%s", line );
}
return 0;
}
int getlines( char s[], int lim ){
int c, i;
for( i = 0; i < lim - 1 && ( c = getchar() ) != EOF && c != '\n'; i++ )
s[ i ] = c;
if ( c == '\n' ){
s[ i ] = c;
++i;
}
s[ i ] = '\0';
return i;
}

Ejercicio 24. Escriba un programa para revisar los errores de sintaxis


rudimentarios de un programa en C, como parntesis, llaves y corchetes no
alineados. No olvide las comillas ni los apostrofes, las secuencias de escape
y los comentarios.

#include<stdio.h>
main(){
int c;
int fp = 0;
int fl = 0;
while( ( c = getchar() ) != EOF ){
if( c == '{' ){
fl++;
}
if( c == '}' ){
fl--;

}
if( c == '(' ){
fp++;
}
if( c == ')' ){
fp--;
}
putchar( c );
}
if( fl != 0 || fp != 0 ){
printf( "%s", "ERROR " );
}
}

Ejercicios del Captulo 2


Ejercicio 1. Escriba un programa para determinar los rangos de variables
char, short, int y long, tanto signed como unsigned, imprimiendo los valores
apropiados de los headers estndar y por clculo directo. Es ms difcil si los
calcula: determine los rangos de los varios tipos de punto flotante .
#include <stdio.h>
#include <limits.h>
#include <float.h>
void main(){
printf("Rango de variables con signed\n");

printf("CHAR maximo %d\n", SCHAR_MAX);


printf("CHAR minimo %d\n", SCHAR_MIN);
printf("SHORT maximo %d\n", SHRT_MAX);
printf("SHORT minimo %d\n", SHRT_MIN);
printf("ENTERO maximo %d\n", INT_MAX);
printf("ENTERO minimo %d\n", INT_MIN);
printf("LONG maximo %lu\n", LONG_MAX);
printf("LONG minimo %lu\n", LONG_MIN);
printf("Rango de variables con unsigned\n");
printf("CHAR maximo %d\n", UCHAR_MAX);
printf("SHORT maximo %d\n", USHRT_MAX);
printf("ENTERO maximo %u\n", UINT_MAX);
printf("LONG maximo %lu\n", ULONG_MAX);
}

Ejercicio 2. Escriba un ciclo equivalente a la iteracin for anterior sin usar


&& o ||

for (i = 0; i < lim - 1; ++i)


if((c = getchar()) != '\n')
if(c != EOF)
s[i] = c;
/*siclo equivalente*/
for (i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;

Ejercicio 3. Escriba la funcion htoi(s), que convierte una cadena de dgitos


hexadecimales (incluyendo Ox o OX en forma optativa) en su valor entero
equivalente. Los digitos permitidos son del 0 al 9, de la a a la f, y de la A a la
F.
#include <stdio.h>
int htoi(char nu[]);
main(){
int numDecimal = 0;
char num[] = "e5";
printf("numero heexadecimal = %s\n", num);
numDecimal = htoi(num);
printf("numero decimal = %d\n", numDecimal);
}
int htoi(char num[]){
int i, j, n;
int can = 0; //el numero del digito
int arr[100];
//almacena el numero

n =
int
int
int

-1; // exponente a que elevar


exp = n;
mul = 1; //almacena la multiplicacion de cada digito
total = 0;

for(i = 0; num[i] != '\0'; ++i){ //transforma en numero


if('0' <= num[i] && num[i] <= '9'){
can = (int)(num[i] - '0');
n = n + 1;
arr[i] = can;
}
if('a' <= num[i] && num[i] <= 'f'){
can = (int)(num[i] - 'a') + 10;
arr[i] = can;
n = n + 1;
}
}
exp = n;

for(j = 0; j <= n; ++j){ //genera el umero 15*(16)^n+..


mul = 1;
for(i = 0; i < exp; ++i){
mul = 16 * mul;
}
total = total + arr[j]*mul;
exp = exp-1;
}
return total;

Ejercicio 4. Escriba una versin alterna de squeeze(sl,s2) que borre cada


carcter de si que coincida con cualquier carcter de la cadena s2.
#include <stdio.h>
void squeeze(char s[], char c[]);
void imprimir(char nom[]);
main(){
int p;
char n[] = "oau";
char nom[] = "holaMundo";
squeeze(nom, n);
imprimir(nom);
}
void squeeze(char s[], char n[]){
int p;
int i, j;
for(p = 0; n[p] != '\0'; p++){
for(i = j = 0; s[i] != '\0'; i++)
if(s[i] != n[p])
s[j++] = s[i];
s[j] = '\0'; //colocara \0 en el ultimo caracter
}
// de la nueva cadena

}
void imprimir(char nom[]){
int i;
for(i = 0; nom[i] != '\0'; i++){
printf("%c", nom[i]);
}
printf("\n");
}

Ejercicio 5. Escriba la funcin any(sl,s2), que regresa la primera posicin


de la cadena si en donde se encuentre cualquier carcter de la cadena s 2,
o -1 sino contiene caracteres de s2. (La funcin de biblioteca estndar
strpbrk hace el mismo trabajo pero regresa un apuntador a la posicin
encontrada.)
#include <stdio.h>
int any(char s[], char c[]);
void imprimir(char nom[]);
main(){
int r = 0;
int p;
char n[] = "on";
char nom[] = "holaMundo";
r = any(nom, n);
printf("%d\n", r);
imprimir(nom);
//imprimir(nom);
}
//retorna la posicion del primer caracter encontrado
int any(char s[], char n[]){
int p;
int i, j;
int re = -1;
for(p = 0; n[p] != '\0'; p++){
for(i = j = 0; s[i] != '\0'; i++){
if(s[i] == n[p]){
re = i;
return re;
}
}
}
return re;
}
void imprimir(char nom[]){
int i;
for(i = 0; nom[i] != '\0'; i++){
printf("%c", nom[i]);
}
printf("\n");
}

Ejercicio 6. Escriba una funcin setbits(x,p,n,y) que regresa x con los n


bits que principian en la posicin p iguales a los n bits ms a la derecha de
y, dejando los otros bits sin cambio.
#include <stdio.h>
unsigned setbits( unsigned x, int p, int n, unsigned y)
{
unsigned a=(~((~0 << p) & ~(~0 <<(p+n))) & x );// Hacer 0
los bits entre p y p+n en el primer nmero
unsigned corr=(y << p);// Correr los bits del segundo nmero
hasta la posicin p
unsigned b=(~(~0 << (p+n)) & corr);//Hacer 0 los bits del
segundo nmero, salvo en los intervalos 0-p y p+n hasta el ltimo.
unsigned r=a|b;// Usar el operador | para lograr la unin de
los bits distintos de 0 en de ambos nmeros.
return r;
}
main()
{
unsigned x; //cadena original
unsigned y; //cadena cambiada
int p,n;
x=51;
y=42;
n=3;
p=1;
unsigned resp=setbits(x,p,n,y);
printf("Los valores son : %d %d %d %d\n", x, p, n, y);
printf("%d ",resp);
}

Ejercicio 7. Escriba una funcin invert(x,p,n) que regresa x con los n bits
que principian en la posicin p invertidos (esto es, 1 cambiado a 0 y
viceversa), dejando los otros sin cambio.
#include<stdio.h>
unsigned invert(unsigned x, int p, int n);
main(){
int n, p;
n = 2; //numero a invertir
p = 2; //posicion
unsigned x; //cadena original

x = 5;
unsigned y; //cadena cambiada
y = getbits(x, p, n);
printf("%x %d %d %x\n", x, p, n, y);
}
unsigned invert(unsigned x, int p, int n){
return x ^ (~(~0 << n) << p);
}

Ejercicio 8. Escriba una funcin rightrot(x,n) que regresa el valor del


entero x rotado a la derecha n posiciones de bits.
#include<stdio.h>
unsigned rightrot(unsigned x, int n);
main(){
int n, p;
n = 1; //numero a rotar
unsigned x; //cadena original
x = 5;
unsigned y; //cadena cambiada
y = rightrot(x, n);
printf("%d %d %d %d\n", x, p, n, y);
}
unsigned rightrot(unsigned x, int n){
//32 bits
int i;
unsigned y;
unsigned t; //temporal
for(i = 0; i < n; i++){ //rota n veces
t = x & (~(~0 << 1)); //mascara del primer bits
derecha
y = (x >> 1) | (t << 31); //
x = y;
}
return y;
Ejercicio 2-9. En un sistema de numeros de complemento a dos, x & = (x1) borra el bit 1 de mas a la derecha en x. Explique el porque. Utilice esta
observacin para escribir una version mas rapida de bitcount.
#include<stdio.h>
main(){
unsigned x, y;
x = 53;
y = bitcount(x);
printf("%d\n", y);
}

int bitcount(unsigned x){


int b;
for(b = 0; x != 0; x = x & (x-1))
b++;
return b;
}
/*
ejemp:x=5//00000101
x=x&(x-1)
(x-1)=4//00000100
4&5//00000100
con esto se demuestra que se elimina el ultimo bit mas ala
derecha
*/

Ejercicio 10. Reescriba la funcin [lower|, que convierte letras


maysculas e minsculas, con una expresin condicional en vez de un ifelse.
int lower(int c)
{
return (c >= 'A' && c <= 'Z')? (c + 'a' - 'A'):c;
}

You might also like