C Primer Plus(第六版)第十五章 编程练习答案
Posted 水番正文
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于C Primer Plus(第六版)第十五章 编程练习答案的主要内容,如果未能解决你的问题,请参考以下文章