c和指针第五章编程练习代码

1.

#include<stdio.h>

int main()
{
	char ch ;
	
	while ( ( ch = getchar() ) != '\n' )
	{
		if ( ch >= 'A' && ch <= 'Z' )
			ch += 'a' - 'A' ;
		putchar(ch) ;
	}
}

2.

#include<stdio.h>
int main()
{
	int ch ;
	while ( ( ch = getchar() ) != '\n' )
	{
		if ( ch >= 65 && ch <= 90 )	
			ch = ch < 78 ? ch + 13 : ch - 13 ;
		if ( ch >= 97 && ch <= 122 )
			ch = ch < 110 ? ch + 13 : ch - 13 ;
		putchar(ch) ;
	}
}

3.返回值有问题不知该怎么解决

主函数

#include<stdio.h>
#include<stdlib.h>

unsigned int reverse_bits ( unsigned int value ) ;

int main()
{
	unsigned int value ;
	char str[100] ;
	
	scanf ( "%d", &value ) ;
	itoa ( value, str, 2 ) ;
	printf ( "%s\n", str ) ;
	value = reverse_bits ( value ) ;
	itoa ( value, str, 2 ) ;
	printf ( "%s\n", str ) ;
	printf ( "%d\n", value ) ;
 }

自己写的

unsigned int reverse_bits ( unsigned int value )
{
	value = ~value ;
	value = value << 26 ;//32位
	return value ;

课后答案

unsigned int reverse_bits ( unsigned int value )
{
	unsigned int answer ;
	unsigned int i ;
	
	answer = 0 ;
	
	for ( i = 1; i != 0; i <<= 1 )
	{
		answer <<= 1 ;
		if ( value & 1 )
			answer |= 1 ;
		value >>= 1 ; 
	}
	return answer ;
}

4.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000 

void set_bit ( char bit_array[], unsigned bit_number ) ;
void clear_bit ( char bit_array[], unsigned bit_number ) ;
void assign_bit ( char bit_array[], unsigned bit_number, int value ) ;
int text_bit ( char bit_array[], unsigned bit_number ) ;

int main()
{
	char ch ;
	int value, num, len ;
	unsigned bit_number ;
	char bit_array[MAX] ;
	
	printf ( "请输入num和value的值(value为1或0):" ) ;
	scanf ( "%d %d", &num, &value ) ; 
	a: if ( value != 0 && value != 1 )
	{ 
		printf ( "请重新输入value的值(value为1或0):" ) ;
		scanf ( "%d", &value ) ;
		goto a ;
		
	}
	
	itoa ( num, bit_array, 2 ) ;	//用itoa函数将数转换成二进制并存到bit_array数组中 
	len = strlen ( bit_array ) ;	//数组长度 
	
	printf ( "请输入bit_number(bit_number小于%d):", len + 1 ) ;	//输入要操作的位 
	scanf ( "%d", &bit_number ) ;
	b: if ( bit_number < 0 || bit_number > len )
	{
		printf ( "请重新输入bit_number(bit_number小于%d):", len + 1 ) ;
		scanf ( "%d", &bit_number ) ;
		goto b ;
	}

	set_bit ( bit_array, bit_number ) ;
	clear_bit ( bit_array, bit_number ) ; 
	assign_bit ( bit_array, bit_number, value ) ; 
	printf ( "操作之后:%d\n", text_bit ( bit_array, bit_number ) ) ;
 
	return 0 ;
}

void set_bit ( char bit_array[], unsigned bit_number )	//置1 
{
	printf ( "操作之前:%s\n", bit_array ) ;
	bit_array[bit_number-1] = '1' ;				//数组内存储的是字符所以用'1' 
	printf ( "操作之后:%s\n", bit_array ) ;
}

void clear_bit ( char bit_array[], unsigned bit_number )//置0 
{
	printf ( "操作之前:%s\n", bit_array ) ;
	bit_array[bit_number-1] = '0' ;
	printf ( "操作之后:%s\n", bit_array ) ;
}

void assign_bit ( char bit_array[], unsigned bit_number, int value )
{
	printf ( "操作之前:%s\n", bit_array ) ;
	if ( value == 0 )
		bit_array[bit_number-1] = '0' ;
	else
		bit_array[bit_number-1] = '1' ;
	printf ( "操作之后:%s\n", bit_array ) ;
}

int text_bit ( char bit_array[], unsigned bit_number )
{
	int bour ;
	if ( bit_array[bit_number-1] != 0 )
		bour = 1 ;
	else
		bour = 0 ;
	return bour ;
}

5.自己写的,关于位的知识看到一篇文章写得很细,推荐给大家点击打开链接

#include<stdio.h>

int store_bit_field ( int orginal_value, int value_to_store, unsigned starting_bit, unsigned ending_bit ) ;

int main()
{
	unsigned num ;
	int orginal_value ; 
	int value_to_store ; 
	unsigned starting_bit ; 
	unsigned ending_bit ;
	
	printf ( "请输入:") ;
	scanf ( "%x %x %d %d", &orginal_value, &value_to_store, &starting_bit, &ending_bit ) ;
	num = store_bit_field ( orginal_value, value_to_store, starting_bit, ending_bit ) ;
	printf ( "0x%x", num ) ;
	return 0 ;
}

int store_bit_field ( int orginal_value, int value_to_store, unsigned starting_bit, unsigned ending_bit )
{
	unsigned int mask ;
	unsigned int num, unmask ;
	unsigned int i = 31 - starting_bit ;    //32位
	
	mask = ( ~0 << ending_bit) & ( ~0 >> i) ;	//创建掩码 
	unmask = ~mask ;							//掩码反码 
	unmask &= orginal_value ;					//用反码对原值执行位AND操作 
	mask = mask & (value_to_store<<ending_bit) ;//新值左移与源码执行位AND操作 
	num = mask | unmask ;						//结果值与反码进行位OR操作 
	return num ;
}

网上找的,用循环建掩码学到了哈哈

#include <stdio.h>

int store_bit_field(int original_value, int value_to_store,
                    unsigned starting_bit,unsigned ending_bit);

int main(void)
{
    printf("0x%x\n",store_bit_field(0x0,0x1,4,4));
    printf("0x%x\n",store_bit_field(0xffff,0x123,15,4));
    printf("0x%x\n",store_bit_field(0xffff,0x123,13,9));
    return 0;
}

int store_bit_field(int original_value, int value_to_store,
                    unsigned starting_bit,unsigned ending_bit)
{
    int value;
    int i = ending_bit;
    int unmask = 0;
    int mask = 0;
    int num = starting_bit - ending_bit + 1;
    while(num != 0){
        mask <<= 1;
        mask |= 1;
        num--;
    }
    while(i != 0){
        i--;
        mask <<= 1;
    }
    unmask = ~mask;
    original_value &= unmask;
    i = ending_bit;
    while(i != 0){
        i--;
        value_to_store <<= 1;
    }
    value = value_to_store & mask;
    value |= original_value;
    return value;
}

发布了12 篇原创文章 · 获赞 3 · 访问量 2329

猜你喜欢

转载自blog.csdn.net/lhg1714538808/article/details/79339567
今日推荐