C Primer Plus(第六版)第十五章 编程练习答案

这次也是隔了好久,不过这本书一定要在十一月内搞完。--10.16

CH15 Code answer 1:

#include <stdio.h>
#include <string.h>

int Bin2Int(char *);
int Pow(int, int);

int main(void)
{
	char * pbin = "01001001";
	
	printf("The point num is %d.", Bin2Int(pbin));
	
	return 0;	 
} 

int Bin2Int(char * pbin)
{
	int n = strlen(pbin);
	int i;
	int sum = 0;
	
	for ( i = n - 1; i >= 0; i--)
	{
		sum += (pbin[n - i -1] - 48) * Pow(2, i);		//从头开始是最高位 倒序来就是对的 
//		printf("%d ", sum);
	}
		
	return sum; 
}

int Pow(int x, int n)
{
	int i;
	int pow = 1;

	for ( i = 0; i < n; i++)
		pow *= x;	
	
	return pow;
}

CH15 Code answer 2:

#include <stdio.h>
#include <string.h>
#include <limits.h> 

void Print_Bin(char *, char *, char);
int Bin2Int(char *);
int Pow(int, int);
char * ItoBs(int, char *);
void Show_Bstr(const char *);

int main(int argc, char * argv[])
{
	if ( argc != 3 )
		printf("Enter the two bin string.");
	else
	{
//		Print_Bin(argv[1], argv[2], '~');
		Print_Bin(argv[1], argv[2], '&');
		Print_Bin(argv[1], argv[2], '|');
		Print_Bin(argv[1], argv[2], '^');
	} 
	
	return 0;
}

void Print_Bin(char * ar1, char * ar2, char ch)
{
	int i;
	int ans;
	char bin_str[CHAR_BIT * sizeof(int) + 1];
	
	switch (ch)
	{
//		case '~':
//			ans = Bin2Int(ar1) ~ Bin2Int(ar2);
//			break;
		case '&':
			ans = Bin2Int(ar1) & Bin2Int(ar2);
			break;
		case '|':
			ans = Bin2Int(ar1) | Bin2Int(ar2);
			break;
		case '^':
			ans = Bin2Int(ar1) ^ Bin2Int(ar2);
			break;
	}
	
	for ( i = 0; i < strlen(ar1); i++)
		printf("%c", ar1[i]);
	printf(" %c ", ch);
	for ( i = 0; i < strlen(ar2); i++)
		printf("%c", ar2[i]);
	
	ItoBs(ans, bin_str);
	Show_Bstr(bin_str);
}

int Bin2Int(char * pbin)
{
	int n = strlen(pbin);
	int i;
	int sum = 0;
	
	for ( i = n - 1; i >= 0; i--)
	{
		sum += (pbin[n - i -1] - 48) * Pow(2, i);		//从头开始是最高位 倒序来就是对的 
//		printf("%d ", sum);
	}
		
	return sum;
}

int Pow(int x, int n)
{
	int i;
	int pow = 1;

	for ( i = 0; i < n; i++)
		pow *= x;	
	
	return pow;
}

char * ItoBs(int n, char * ps)
{
	int i;
	const static int size = CHAR_BIT * sizeof(int);
	
	for ( i = size - 1; i >= 0; i--, n >>= 1)		//注意是 >>=  
		ps[i] = (01 & n) + '0';
	ps[size] = '\0';
	
	return ps;
}

void Show_Bstr(const char * str)
{
	int i = 0;
	
	printf(" = ");
	while (str[i])
	{
		putchar(str[i]);
		if (++i % 4 == 0 && str[i])
			putchar(' ');
	}
	printf("\n");
}

CH15 Code answer 3:

#include <stdio.h>

int Find_Bits(int);

int main(void)
{
	int sum;
	
	printf("Enter a number:");
	while (scanf("%d", &sum) == 1)
	{
		printf("Have been %d bit\n", Find_Bits(sum));
		printf("Enter a number(other to quit):");
	}
	printf("Bye.");
	
	return 0;	
}

int Find_Bits(int sum)
{
	int count = 0;
	
	while( sum )
	{
		if (sum % 2 == 1)
		{
			count++;
			sum -= 1;
		}
		sum /= 2;	
	}
	
	return count;
}

CH15 Code answer 4:

#include <stdio.h>

int Find_Open(int, int);

int main(void)
{
	int bit, num;
	
	printf("Enter a number:");
	while ( scanf("%d", &num) == 1 )
	{
		printf("Enter the bit:");
		while ( getchar() != '\n' )
			continue;
		scanf("%d", &bit);
		
		printf("The bit status is %d.\n", Find_Open(num, bit));
		printf("Enter a number(other to quit):");
	}
	printf("Bye.");
	
	return 0; 
}

int Find_Open(int num, int bit)
{
	int status = 0;
	
	while (bit--)
		num /= 2;
	if ( num % 2 == 1 )
		status = 1;
		
	return status;
}

CH15 Code answer 5:

#include <stdio.h>
#include <limits.h>
#include <string.h>

char * ItoBs(int, char *);
void Show_Bstr(const char *);
void Rotate_le(char *, int);

int main(void)
{
	unsigned int num;
	int move;
	char bin_str[CHAR_BIT * sizeof(int) + 1];
	
	printf("Enter a number:");
	while ( scanf("%d", &num) == 1 )
	{
		printf("Enter the number of digits you want to move:");
		scanf("%d", &move);
		
		printf("Bef:");
		ItoBs(num, bin_str);
		Show_Bstr(bin_str);
		
		printf("Now:");
		Rotate_le(bin_str, move);
		Show_Bstr(bin_str); 
		
		printf("Enter a number(other to quit):");
	}
	printf("Bye.");
	
	return 0;
}

void Rotate_le(char * ps, int n)
{
	char tmp;
	int i, j;
	
	for ( i = 0; i < n; i++)
	{
		tmp = ps[0];
		for ( j = 1; j < strlen(ps); j++)
			ps[j - 1] = ps[j];
		ps[j - 1] = tmp; 	//这边也就是最后一位 
	}
}

char * ItoBs(int n, char * ps)
{
	int i;
	const static int size = CHAR_BIT * sizeof(int);
	
	for ( i = size - 1; i >= 0; i--, n >>= 1)		//注意是 >>=  
		ps[i] = (01 & n) + '0';
	ps[size] = '\0';
	
	return ps;
}

void Show_Bstr(const char * str)
{
	int i = 0;
	
	while (str[i])
	{
		putchar(str[i]);
		if (++i % 4 == 0 && str[i])
			putchar(' ');
	}
	printf("\n");
}

CH15 Code answer 6:

#include <stdio.h>
#include <stdbool.h>

#define LEFT 0
#define CENTER 1
#define RIGHT 2

const char * align[3] = { "left", "center", "right" };

struct Font_Para{
	unsigned int id			: 8;
	unsigned int size		: 7;
	unsigned int			: 1;
	unsigned int alignment	: 2;
	bool bold				: 1;
	bool italic				: 1;
	unsigned int 			: 2;
	bool underline			: 1;
	unsigned int 			: 1;
}; 

void Print(struct Font_Para * pb);

int main(void)
{
	struct Font_Para Font = { 2, 19, CENTER, true, true, true };
	char choose;
	char chtmp;
	int itmp;
	
	Print(&Font);
	while ( 1 )
	{
		scanf("%c", &choose);
		while ( getchar() != '\n' )
			continue;
		
		if ( choose == 'f' || choose == 's' || choose == 'a' ||
		 	choose == 'b' || choose == 'i' || choose == 'u' )
		{
			switch (choose)
			{
				case 'f':
					printf("Enter font id (0~255):");
					scanf("%d", &itmp);
					Font.id = itmp & 255;
					
					while ( getchar() != '\n' )
						continue;
					break;
				case 's':
					printf("Enter font size (0~127):");
					scanf("%d", &itmp);
					Font.size = itmp & 127;
					
					while ( getchar() != '\n' )
						continue;
					break;
				case 'a':
					printf("Select alignment:\n");
					printf("l)left   c)center   r)right\n");
					scanf("%c", &chtmp);
					switch (chtmp)
					{
						case 'l':
							Font.alignment = LEFT;
							break;
						case 'c':
							Font.alignment = CENTER;
							break;
						case 'r':
							Font.alignment = RIGHT;
							break;
					}
					
					while ( getchar() != '\n' )
						continue;
					break;
				case 'b':
					if (Font.bold) 
						Font.bold = false; 
					else
					 	Font.bold = true;
					break;
				case 'i':
					if (Font.italic)
						Font.italic = false; 
					else
						Font.italic = true;
					break;
				case 'u':
					if (Font.underline)
						Font.underline = false;
					else
						Font.underline = true;						
					break;
			} 	
		}
		else if ( choose == 'q' )
			break;
		else
			printf("\nEnter valid options.");		
		
		Print(&Font);
	}
	
	printf("\nBye.");
	
	return 0;
}

void Print(struct Font_Para * pb)
{
	printf("\n  ID SIZE ALIGNMENT   B   I   U\n");
	printf("%4d%5d%10s%4s%4s%4s\n\n", pb->id, pb->size, align[pb->alignment],
													pb->bold == true ? "on" : "off",
													pb->italic == true ? "on" : "off",
													pb->underline == true ? "on" : "off");
	printf("f)change font    s)change size    a)change alignment\n");
	printf("b)toggle bold    i)toggle italic  u)toggle underline\n");
	printf("q)quit\n");
}

CH15 Code answer 7:

#include <stdio.h>
#include <stdbool.h>
#include <limits.h>

#define LEFT 0
#define CENTER 1
#define RIGHT 2

#define ID			0xFF
#define SIZE	 	0x7F00 
#define B_LEFT 		0
#define B_CENTER 	0x10000
#define B_RIGHT 	0x20000
#define STYLE_MASK 	0x30000
#define BOLD		0x100000
#define ITALIC		0x1000000
#define UNDERLINE	0x10000000

const char * align[3] = { "left", "center", "right" };

struct Font_Para{
	unsigned int id			: 8;	//00 
	unsigned int size		: 7;
	unsigned int			: 1;	//00
	unsigned int alignment	: 2;
	unsigned int 			: 2;	//0
	bool bold				: 1;
	unsigned int 			: 3;	//0
	bool italic				: 1;
	unsigned int 			: 3;	//0
	bool underline			: 1;
	unsigned int 			: 3;	//0
}; 

union Views
{
	struct Font_Para m_view;
	unsigned long b_view;	
};

void Print_m(struct Font_Para * pb);
void Print_b(unsigned long);
char * ItoBs(unsigned long, char *);
void Show_Bstr(const char *);

int main(void)
{
//	union Views Font = { { 2, 19, CENTER, true, true, true }  };
	union Views Font = { { 0 } };		//还是有点没理解为什么是两个花括号  还有如果设大数会有什么隐式截断的问题 
	char choose;
	char chtmp;
	int itmp;
	char bin_str[8 * sizeof(unsigned long) + 1];
	
//	Font.b_view |= ITALIC;			//这种方式可以修改	
//	ItoBs(Font.b_view, bin_str); 
//	Show_Bstr(bin_str);
	
	Print_b(Font.b_view);
	while ( 1 )
	{
		scanf("%c", &choose);
		while ( getchar() != '\n')
			continue;
		
		if ( choose == 'f' || choose == 's' || choose == 'a' ||
		 	choose == 'b' || choose == 'i' || choose == 'u' )
		{
			switch (choose)
			{
				case 'f':
					printf("Enter font id (0~255):");
					scanf("%d", &itmp);
					Font.b_view &= ~ID;			//清空 
					Font.b_view |= itmp & 0xFF; 
					
					while ( getchar() != '\n' )
						continue;
					break;
					
				case 's':
					printf("Enter font size (0~127):");
					scanf("%d", &itmp);
					Font.b_view &= ~SIZE;		//清空 
					Font.b_view |= (itmp & 0x7F) << 8;
					
					while ( getchar() != '\n' )
						continue;
					break;
					
				case 'a':
					printf("Select alignment:\n");
					printf("l)left   c)center   r)right\n");
					scanf("%c", &chtmp);
					switch (chtmp)
					{
						case 'l':
							Font.b_view &= ~STYLE_MASK;
							Font.b_view += B_LEFT; 
							break;
						case 'c':
							Font.b_view &= ~STYLE_MASK;
							Font.b_view += B_CENTER;
							break;
						case 'r':
							Font.b_view &= ~STYLE_MASK;
							Font.b_view += B_RIGHT;
							break;
					}
					
					while ( getchar() != '\n' )
						continue;
					break;
					
				case 'b':
					Font.b_view ^= BOLD;
					break;
					
				case 'i':
					Font.b_view ^= ITALIC;
					break;
					
				case 'u':
					Font.b_view ^= UNDERLINE;						
					break;
			} 
		}
		else if( choose == 'q' )
			break;
		else
			printf("\nEnter valid options.");
			
		Print_b(Font.b_view);
	}
	printf("\nBye.");
	
	
//	Print_m(&Font.m_view);
//	while ( 1 )
//	{
//		scanf("%c", &choose);
//		while ( getchar() != '\n' )
//			continue;
//		
//		if ( choose == 'f' || choose == 's' || choose == 'a' ||
//		 	choose == 'b' || choose == 'i' || choose == 'u' )
//		{
//			switch (choose)
//			{
//				case 'f':
//					printf("Enter font id (0~255):");
//					scanf("%d", &itmp);
//					Font.m_view.id = itmp & 255;
//					
//					while ( getchar() != '\n' )
//						continue;
//					break;
//				case 's':
//					printf("Enter font size (0~127):");
//					scanf("%d", &itmp);
//					Font.m_view.size = itmp & 127;
//					
//					while ( getchar() != '\n' )
//						continue;
//					break;
//				case 'a':
//					printf("Select alignment:\n");
//					printf("l)left   c)center   r)right\n");
//					scanf("%c", &chtmp);
//					switch (chtmp)
//					{
//						case 'l':
//							Font.m_view.alignment = LEFT;
//							break;
//						case 'c':
//							Font.m_view.alignment = CENTER;
//							break;
//						case 'r':
//							Font.m_view.alignment = RIGHT;
//							break;
//					}
//					
//					while ( getchar() != '\n' )
//						continue;
//					break;
//				case 'b':
//					if (Font.m_view.bold) 
//						Font.m_view.bold = false; 
//					else
//					 	Font.m_view.bold = true;
//					break;
//				case 'i':
//					if (Font.m_view.italic)
//						Font.m_view.italic = false; 
//					else
//						Font.m_view.italic = true;
//					break;
//				case 'u':
//					if (Font.m_view.underline)
//						Font.m_view.underline = false;
//					else
//						Font.m_view.underline = true;						
//					break;
//			} 	
//		}
//		else if ( choose == 'q' )
//			break;
//		else
//			printf("\nEnter valid options.");		
//		
//		Print_m(&Font.m_view);
//	}
//	
//	printf("\nBye.");
	
	return 0;
}

void Print_b(unsigned long bz)
{
	printf("\n  ID SIZE ALIGNMENT   B   I   U\n");
	printf("%4d%5d%10s%4s%4s%4s\n\n", bz & ID, (bz & SIZE) >> 8, align[(bz >> 16) & 03],
													(bz & BOLD) == BOLD ? "on" : "off",
													(bz & ITALIC) == ITALIC ? "on" : "off",
													(bz & UNDERLINE) == UNDERLINE ? "on" : "off");
	printf("f)change font    s)change size    a)change alignment\n");
	printf("b)toggle bold    i)toggle italic  u)toggle underline\n");
	printf("q)quit\n");
}

void Print_m(struct Font_Para * pb)
{
	printf("\n  ID SIZE ALIGNMENT   B   I   U\n");
	printf("%4d%5d%10s%4s%4s%4s\n\n", pb->id, pb->size, align[pb->alignment],
													pb->bold == true ? "on" : "off",
													pb->italic == true ? "on" : "off",
													pb->underline == true ? "on" : "off");
	printf("f)change font    s)change size    a)change alignment\n");
	printf("b)toggle bold    i)toggle italic  u)toggle underline\n");
	printf("q)quit\n");
}

void Show_Bstr(const char * str)
{
	int i = 0;
	
	while (str[i])
	{
		putchar(str[i]);
		if (++i % 4 == 0 && str[i])
			putchar(' ');
	}
	printf("\n");
}

char * ItoBs(unsigned long n, char * ps)
{
	int i;
	const static int size = CHAR_BIT * sizeof(unsigned long);
	
	for ( i = size - 1; i >= 0; i--, n >>= 1)		//注意是 >>=  
		ps[i] = (01 & n) + '0';
	ps[size] = '\0';
	
	return ps;
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值