6.设计一个位字段结构用来存储以下信息:
Font ID:0到255之间的一个数
Font Size:0到127之间的一个数
Bold: Off (0)或on (1)
Italic: Off (0)或on (l)
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信息被转换到指定的范围内。
使用一个unsigned long来保存字体信息,使用位运算符而不是位成员来管理这些信息。
#include
unsigned long font;
char f = 0; //id
unsigned long fm = 0xff<<f; //id_mask
char s = 8;
unsigned long sm = 0x7f<<s;
char a = 15;
unsigned long am = 0x3<<a;
char b = 17;
unsigned long bm = 0x1<<b;
char i = 18;
unsigned long im = 0x1<<i;
char u = 19;
unsigned long um = 0x1<<u;
char align[3][7]={"left", "center", "right"};
char on_off[2][4]={"off", "on"};
int main(void)
{
int n;
char command[5];
while(1)
{
printf("%-14s%-14s%-14s%-14s%-14s%-14s\n", "ID", "SIZE", "ALIGNMENT", "B", "I", "U");
printf("%-14d%-14d%-14s%-14s%-14s%-14s\n", (font&fm)>>f, (font&sm)>>s, align[(font&am)>>a], on_off[(font&bm)>>b], on_off[(font&im)>>i], on_off[(font&um)>>u] );
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");
gets(command);
switch(command[0])
{
case 'f' : printf("Enter font ID (0-255): ");
scanf("%d", &n);
getchar();
font = font & ~fm | n<<f;
break;
case 's' : printf("Enter font size (0-127): ");
scanf("%d", &n);
getchar();
font = font & ~sm | n<<s;
break;
case 'a' : printf("Select alignment:\nl)left c)center r)right\n");
gets(command);
switch(command[0])
{
case 'l' : font = font & ~am | 0<<a; break;
case 'c' : font = font & ~am | 1<<a; break;
case 'r' : font = font & ~am | 2<<a; break;
default : puts("error!"); break;
}
break;
case 'b': font ^= 1<<b;
break;
case 'i': font ^= 1<<i;
break;
case 'u': font ^= 1<<u;
break;
default : puts(command);
return 0;
}
}
}
这是我网上找的答案,不过编译通不过,说是6、9、12、18、21行的初始程序元素不是常量什么的,还有希望能大致讲解一下这个程序。
编译能通过。你的项目建得有问题。
unsigned long font; 是32位保存字体信息
最低8位保存ID;接着前7位保存SIZE;再接着前2位保存对齐方式ALIGNMENT;再前1位粗体B;再前一位斜体I;再前一位下划线U。
一共用了20位,其余高位没有使用。
unsigned long font; 是32位保存字体信息
最低8位保存ID;接着前7位保存SIZE;再接着前2位保存对齐方式ALIGNMENT;再前1位粗体B;再前一位斜体I;再前一位下划线U。
一共用了20位,其余高位没有使用。
同楼上,编译是没有问题的...
同楼上,编译是没有问题的...