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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章