第一题:编写一个将二进制字符串转化为数字值的函数。也就是说,如果您有以下语句:
char * pbin = "01001001";
那么您可以将pbin作为一个参数传送给该函数,使该函数返回一个int值25。
解:
代码如下:
#include
#include
#include
int btois(char *);
int main(void)
{
char bin_str[8 * sizeof(int) + 1];
int i,number;
puts("Enter binary and see them in integers.");
while(scanf("%s",bin_str))
{
for(i = 0;i < strlen(bin_str);i++)
if(!strchr("10",bin_str[i]))
{
puts("wrong input");
exit(1);
}
number = btois(bin_str);
printf("%s is %d\n",bin_str,number);
}
puts("Bye!");
return 0;
}
int btois(char * ps)
{
int i;
int n = 0;
size_t size = strlen(ps);
for(i = size -1;i >= 0;i--)
n += (ps[i] - 48) * (1 << (size - 1 - i));
return n;
}
———————————————分割线—————————————————
第二题:编写一个程序,该程序用命令行参数读取两个二进制字符串,并打印对每个数使用~运算符的结果,以及对这两个数使用&、|和^运算符的结果。使用二进制字符串形式显示结果。
解:就是进行二进制和十进制之间的转换。
代码如下:
#include
#include
#include
int btois(char * ps);
char * itobs(int n,char * ps);
void show_bstr(const char * str);
int main(int argc,char * argv[])
{
int n1,n2,result,i;
char bin_str[8 * sizeof(int) + 1];
if(argc != 3)
{
puts("Usage:command binary1 binary2");
exit(1);
}
for(i = 0;i < strlen(argv[1]);i++)
if(!strchr("10",argv[1][i]))
{
puts("wrong input:binary1");
exit(2);
}
for(i = 0;i < strlen(argv[2]);i++)
if(!strchr("10",argv[2][i]))
{
puts("wrong input:binary2");
exit(2);
}
n1 = btois(argv[1]);
n2 = btois(argv[2]);
result = ~n1;
itobs(result,bin_str);
printf("~binary1:");
show_bstr(bin_str);
result = ~n2;
itobs(result,bin_str);
printf("~binary2:");
show_bstr(bin_str);
result = n1 & n2;
itobs(result,bin_str);
printf("binary1 & binary2:");
show_bstr(bin_str);
result = n1 | n2;
itobs(result,bin_str);
printf("binary1 | binary2:");
show_bstr(bin_str);
result = n1 ^ n2;
itobs(result,bin_str);
printf("binary1 ^ binary2:");
show_bstr(bin_str);
return 0;
}
int btois(char * ps)
{
int i;
int n = 0;
size_t size = strlen(ps);
for(i = size -1;i >= 0;i--)
n += (ps[i] - 48) * (1 << (size - 1 - i));
return n;
}
char * itobs(int n,char * ps)
{
int i;
static int size = 8 * 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(' ');
}
putchar('\n');
}
———————————————分割线—————————————————
第三题:编写一个函数,该函数接受一个int参数,并返回这个参数中打开的位的数量。在程序中测试该函数。
解:
代码如下:
#include
int count(int n);
int main(void)
{
int n;
puts("Input a number:");
while(scanf("%d",&n))
{
printf("%d open %d bits\n",n,count(n));
}
puts("Bye");
return 0;
}
int count(int n)
{
int i,j;
static int size = 8 * sizeof(int);
char ps[size + 1];
for(i = size -1;i >= 0;i--,n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
for(i = 0,j = 0;i < size;i++)
if(ps[i] == '1')
j++;
return j;
}
———————————————分割线—————————————————
第四题:编写一个函数,该函数接受两个int参数:一个值和一个位的位置。如果指定的位上的值是1,则该函数返回1,否则返回0。在程序中测试该函数。
解:
代码如下:
#include
int confirm(int n,int m);
int main(void)
{
int n,m;
puts("Input a number and its localtion(q to quit) :");
while(scanf("%d %d",&n,&m) == 2 && m >= 0)
{
if(confirm(n,m))
puts("it is opened.");
else
puts("it is closed.");
}
puts("Bye");
return 0;
}
int confirm(int n,int m)
{
int i,j;
static int size = 8 * sizeof(int);
char ps[size + 1];
for(i = size -1;i >= 0;i--,n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
j = ps[size - 1 - m] - 48;
return j;
}
———————————————分割线—————————————————
第五题:编写一个函数,该函数将一个unsigned int 中的所有位向左旋转指定数量的位。例如,ratate_1(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端。也就是说,把从高位移出的位放入低位。在程序中测试该函数。
解:
代码如下:
#include
int ratate(int n,int m);
int main(void)
{
int n,m;
puts("Input a positive number and how many bit it move left shift (q to quit) :");
while(scanf("%d %d",&n,&m) == 2 && m >= 0)
{
printf("%d left shift %d bits is %d\n",n,m,rarate(n,m));
}
puts("Bye");
return 0;
}
int rarate(int n,int m)
{
int i,j,temp;
int result = 0;
static int size = 8 * sizeof(int);
char ps[size];
for(i = size -1;i >= 0;i--,n >>= 1)
ps[i] = (01 & n) + '0';
for(i = 0;i < m;i++)
{
temp = ps[0];
for(j = 0;j < size - 1;j++)
ps[j] = ps[j + 1];
ps[size - 1] = temp;
}
for(i = size -1;i >= 0;i--)
result += (ps[i] - '0') * (1 << (size - 1 - i));
return result;
}
———————————————分割线—————————————————
第六题:设计一个位字段结构用来存储以下信息:
Font ID:0到255之间的一个数
Font Size:0到127之间的一个数
Bold:off(0)或on(1)
Italic:off(0)或on(1)
Underline:off(0)或on(1)
在程序中使用这个结构来显示字体参数,并使用循环的菜单来让用户改变参数。例如,程序的一个运行示例如下:
ID SIZE ALIGNMENT B I U
1 12 left off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
s
Enter font size (0-127):36
ID SIZE ALIGNMENT B I U
1 36 left off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
a
select alignment:
l)left c)center r)right
r
ID SIZE ALIGNMENT B I U
1 36 right off off off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
i
ID SIZE ALIGNMENT B I U
1 36 right off on off
f)change font s)change size a)change alignment
b)toggle bold i)toggle italic u)toggle underline
q)quit
q
Bye!
这个程序应该使用&操作符和合适的掩码来保证Font ID 和Font size 信息被转换到指定的范围内。
解:
代码如下:
#include
#include
#define LEFT 1
#define CENTER 2
#define RIGHT 3
#define ON 1
#define OFF 0
struct control {
unsigned int font_id:8;
unsigned int font_size:7;
unsigned int alignment:2;
unsigned int bold:1;
unsigned int italic:1;
unsigned int underline:1;
};
char getchoice(void);
int show(struct control c);
int main(void)
{
struct control config = {1,12,1,0,0,0};
char ch;
int n;
char alignment;
while(show(config) && (ch = getchoice()) != 'q')
{
switch(ch)
{
case 'f':printf("Enter font id (0-255):");
if(scanf("%d",&n))
config.font_id = n & 255;
else
puts("wrong input");
while(getchar() != '\n');
break;
case 's':printf("Enter font size (0-127):");
if(scanf("%d",&n))
config.font_size = n & 127;
else
puts("wrong input");
while(getchar() != '\n');
break;
case 'a':printf("Select alignment:\n");
printf("l)left c)center r)right\n");
scanf("%c",&alignment);
while(getchar() != '\n');
if(alignment == 'l')
config.alignment = LEFT;
else if(alignment == 'c')
config.alignment = CENTER;
else if(alignment == 'r')
config.alignment = RIGHT;
else
puts("wrong input");
break;
case 'b':config.bold ^= 1;
break;
case 'i':config.italic ^= 1;
break;
case 'u':config.underline ^= 1;
}
}
puts("Bye!");
return 0;
}
char getchoice(void)
{
char ch;
do
{
puts("f)change font s)change size a)change alignment");
puts("b)toggle bold i)toggle italic u)toggle underline");
puts("q)quit");
scanf("%c",&ch);
while(getchar() != '\n');
}while(!strchr("fsabiuq",ch) && puts("wrong choice,try again"));
return ch;
}
int show(struct control c)
{
printf("ID SIZE ALIGNMENT B I U\n");
printf(" %d %d",c.font_id,c.font_size);
if(c.alignment == 1)
printf(" left");
else if(c.alignment == 2)
printf(" center");
else
printf(" right");
printf(" %s",c.bold?"on":"off");
printf(" %s",c.italic?"on":"off");
printf(" %s\n",c.underline?"on":"off");
puts("");
return 1;
}
———————————————分割线—————————————————
第七题:编写一个与第六题所面熟的功能相同的程序。使用一个unsigned long来保存字体信息,使用位运算符而不是位成员来管理这些信息。
解:所有信息需要20位来保存,本人使用64位操作系统,int类型是32位,故在此使用unsigned int类型。
代码如下:
#include
#include
#define ID_MASK 0xff
#define SIZE_MASK 0x7f00
#define ALIGNMENT_MASK 0x18000
#define BOLD_MASK 0x20000
#define ITALIC_MASK 0x40000
#define UNDERLINE_MASK 0x80000
char getchoice(void);
int show(unsigned int config);
int main(void)
{
unsigned int config = 0x8c01;
char ch;
unsigned int n;
char alignment;
while(show(config) && (ch = getchoice()) != 'q')
{
switch(ch)
{
case 'f':printf("Enter font id (0-255):");
if(scanf("%d",&n))
config = (config & ~ID_MASK) + n;
else
puts("wrong input");
while(getchar() != '\n');
break;
case 's':printf("Enter font size (0-127):");
if(scanf("%d",&n))
config = (config & ~SIZE_MASK) + (n << 8);
else
puts("wrong input");
while(getchar() != '\n');
break;
case 'a':printf("Select alignment:\n");
printf("l)left c)center r)right\n");
scanf("%c",&alignment);
while(getchar() != '\n');
if(alignment == 'l')
config = (config & ~ALIGNMENT_MASK) + (1 << 15);
else if(alignment == 'c')
config = (config & ~ALIGNMENT_MASK) + (1 << 16);
else if(alignment == 'r')
config = (config & ~ALIGNMENT_MASK) + ALIGNMENT_MASK;
else
puts("wrong input");
break;
case 'b':config ^= BOLD_MASK;
break;
case 'i':config ^= ITALIC_MASK;
break;
case 'u':config ^= UNDERLINE_MASK;
}
}
puts("Bye!");
return 0;
}
char getchoice(void)
{
char ch;
do
{
puts("f)change font s)change size a)change alignment");
puts("b)toggle bold i)toggle italic u)toggle underline");
puts("q)quit");
scanf("%c",&ch);
while(getchar() != '\n');
}while(!strchr("fsabiuq",ch) && puts("wrong choice,try again"));
return ch;
}
int show(unsigned int config)
{
printf("ID SIZE ALIGNMENT B I U\n");
printf(" %d %d",config & ID_MASK,(config & SIZE_MASK) >> 8);
if(((config & ALIGNMENT_MASK) >> 15) == 1)
printf(" left");
else if(((config & ALIGNMENT_MASK) >> 15) == 2)
printf(" center");
else
printf(" right");
printf(" %s",((config & BOLD_MASK) >> 17)?"on":"off");
printf(" %s",((config & ITALIC_MASK) >> 18)?"on":"off");
printf(" %s\n",((config & UNDERLINE_MASK) >> 19)?"on":"off");
puts("");
return 1;
}