復(fù)習(xí)題
1、將下列十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制形式:
a. 3
b. 13
c. 59
d. 119
答:
a. 11
b. 1101
c. 111011
d. 1110111
2、將下列二進(jìn)制值轉(zhuǎn)換為十進(jìn)制、八進(jìn)制和十六進(jìn)制形式:
a. 00010101
b. 01010101
c. 01001100
d. 10011101
答:
a. 21, 025, 0x15
b. 85, 0125, 0x55
c. 76, 0114, 0x4C
d. 157, 0235, 0x9D
3、計(jì)算下列表達(dá)式;假設(shè)每個(gè)值為8位:
a. ~ 3
b. 3 & 6
c. 3 | 6
d. 1 | 6
e. 3 ^ 6
f. 7 >> 1
g. 7 << 2
答:
a. 252
d. 2
c. 7
d. 7
e. 5
f. 3
g. 28
4、計(jì)算下列表達(dá)式;假設(shè)每個(gè)值為8位:
a. ~ 0
b. !0
c. 2 & 4
d. 2 && 4
e. 2 | 4
f.2 || 4
g. 5 << 3
答:
a. 255
b. 1
c. 0
d. 1
e. 6
f. 1
g. 40
5、因?yàn)锳SCII碼僅使用最后的7位,所以有時(shí)需要屏蔽掉其他位。相應(yīng)的二進(jìn)制掩碼是什么?分別以十進(jìn)制、八進(jìn)制和十六進(jìn)制形式如何表示這個(gè)掩碼?
答:掩碼在二進(jìn)制中為1111111。它的十進(jìn)制表示為127,八進(jìn)制表示為0177,十六進(jìn)制表示為0x7F。
6、在程序清單15.2中,可以做以下替換,把:
答:
bitval *= 2和bitval << 1都把bitval的當(dāng)前值加倍,所以他們是等效的。但是mask += bitval和mask |= bitval只有在bitval和mask沒(méi)有同時(shí)設(shè)置為打開的位時(shí)才具有相同的效果。例如,2 | 4 = 6,但是3 | 6 = 7。
7、
a. Tinkerbell計(jì)算機(jī)有一個(gè)硬件字節(jié),可以將該字節(jié)讀入程序。該字節(jié)包括下列信息:
Tinkerbell和IBM PC一樣從右到左填充結(jié)構(gòu)位字段。創(chuàng)建一個(gè)適于存放該信息的位字段模板。
b. Klinkerbell與Tinkerbell類似,但它從左到右填充結(jié)構(gòu)。請(qǐng)為Klinkerbell創(chuàng)建相應(yīng)的位字段模板。
答:
a.
編程練習(xí)
1、
即優(yōu)美又考慮周全,要學(xué)習(xí)!!!
2、

3、
4、
5、(借鑒http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf的做法,因?yàn)閷?shí)在沒(méi)想到)
6、(全部是自己寫的,完美實(shí)現(xiàn)!!!)
7、(有大問(wèn)題,明天再看!!!借鑒http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf但是程序也有問(wèn)題)
1、將下列十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制形式:
a. 3
b. 13
c. 59
d. 119
答:
a. 11
b. 1101
c. 111011
d. 1110111
2、將下列二進(jìn)制值轉(zhuǎn)換為十進(jìn)制、八進(jìn)制和十六進(jìn)制形式:
a. 00010101
b. 01010101
c. 01001100
d. 10011101
答:
a. 21, 025, 0x15
b. 85, 0125, 0x55
c. 76, 0114, 0x4C
d. 157, 0235, 0x9D
3、計(jì)算下列表達(dá)式;假設(shè)每個(gè)值為8位:
a. ~ 3
b. 3 & 6
c. 3 | 6
d. 1 | 6
e. 3 ^ 6
f. 7 >> 1
g. 7 << 2
答:
a. 252
d. 2
c. 7
d. 7
e. 5
f. 3
g. 28
4、計(jì)算下列表達(dá)式;假設(shè)每個(gè)值為8位:
a. ~ 0
b. !0
c. 2 & 4
d. 2 && 4
e. 2 | 4
f.2 || 4
g. 5 << 3
答:
a. 255
b. 1
c. 0
d. 1
e. 6
f. 1
g. 40
5、因?yàn)锳SCII碼僅使用最后的7位,所以有時(shí)需要屏蔽掉其他位。相應(yīng)的二進(jìn)制掩碼是什么?分別以十進(jìn)制、八進(jìn)制和十六進(jìn)制形式如何表示這個(gè)掩碼?
答:掩碼在二進(jìn)制中為1111111。它的十進(jìn)制表示為127,八進(jìn)制表示為0177,十六進(jìn)制表示為0x7F。
6、在程序清單15.2中,可以做以下替換,把:
while(bits-- > 0)
{
mask |= bitval;
bitval <<= 1;
}
用:{
mask |= bitval;
bitval <<= 1;
}
while(bits-- > 0)
{
mask |= bitval;
bitval *= 2;
}
替換,而程序仍將工作。這是否意味著*= 2等同于<<= 1?|=和+=又怎樣?{
mask |= bitval;
bitval *= 2;
}
答:
bitval *= 2和bitval << 1都把bitval的當(dāng)前值加倍,所以他們是等效的。但是mask += bitval和mask |= bitval只有在bitval和mask沒(méi)有同時(shí)設(shè)置為打開的位時(shí)才具有相同的效果。例如,2 | 4 = 6,但是3 | 6 = 7。
7、
a. Tinkerbell計(jì)算機(jī)有一個(gè)硬件字節(jié),可以將該字節(jié)讀入程序。該字節(jié)包括下列信息:
位 | 含義 |
0到1 | 1.4MB軟盤驅(qū)動(dòng)器數(shù)量 |
2 | 未使用 |
3到4 | CD-ROM驅(qū)動(dòng)器數(shù)量 |
5 | 未使用 |
6到7 | 硬盤驅(qū)動(dòng)器數(shù)量 |
b. Klinkerbell與Tinkerbell類似,但它從左到右填充結(jié)構(gòu)。請(qǐng)為Klinkerbell創(chuàng)建相應(yīng)的位字段模板。
答:
a.
struct tinkerbell {
unsigned int diskdrivers : 2;
unsigned int : 1;
unsigned int cdromdrivers: 2;
unsigned int : 1;
unsigned int harddrivers : 2;
};
b.unsigned int diskdrivers : 2;
unsigned int : 1;
unsigned int cdromdrivers: 2;
unsigned int : 1;
unsigned int harddrivers : 2;
};
struct klinkerbell {
unsigned int harddrivers : 2;
unsigned int : 1;
unsigned int cdromdrivers: 2;
unsigned int : 1;
unsigned int diskdrivers : 2;
};
unsigned int harddrivers : 2;
unsigned int : 1;
unsigned int cdromdrivers: 2;
unsigned int : 1;
unsigned int diskdrivers : 2;
};
編程練習(xí)
1、
#include <stdio.h>
#include <string.h>
#include <math.h>
int stoi(char *);
int main(void)
{
char pbin[9];
printf("請(qǐng)輸入一個(gè)(8位)二進(jìn)制字符串:\n");
puts("在一行開始處鍵入[Enter]結(jié)束循環(huán):");
while(fgets(pbin, 9, stdin) != NULL && pbin[0] != '\n')
{
printf("二進(jìn)制序列%s轉(zhuǎn)換為十進(jìn)制數(shù)為: %d\n", pbin, stoi(pbin));
while(getchar() != '\n')
continue;
printf("請(qǐng)輸入一個(gè)二進(jìn)制字符串:\n");
}
printf("Bye!\n");
return 0;
}
int stoi(char * s)
{
int len = strlen(s);
unsigned int tot = 0;
for(int i = 0; i < len; i++)
if(s[i] == '1')
tot += pow(2, len - 1 - i);
return tot;
}
看看別人寫的代碼(借鑒http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf)#include <string.h>
#include <math.h>
int stoi(char *);
int main(void)
{
char pbin[9];
printf("請(qǐng)輸入一個(gè)(8位)二進(jìn)制字符串:\n");
puts("在一行開始處鍵入[Enter]結(jié)束循環(huán):");
while(fgets(pbin, 9, stdin) != NULL && pbin[0] != '\n')
{
printf("二進(jìn)制序列%s轉(zhuǎn)換為十進(jìn)制數(shù)為: %d\n", pbin, stoi(pbin));
while(getchar() != '\n')
continue;
printf("請(qǐng)輸入一個(gè)二進(jìn)制字符串:\n");
}
printf("Bye!\n");
return 0;
}
int stoi(char * s)
{
int len = strlen(s);
unsigned int tot = 0;
for(int i = 0; i < len; i++)
if(s[i] == '1')
tot += pow(2, len - 1 - i);
return tot;
}
即優(yōu)美又考慮周全,要學(xué)習(xí)!!!
#include <stdio.h>
#include <stdbool.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
#include <string.h>
int bstr_to_dec(const char * str);
bool check_val(const char * str);
char * s_gets(char * st, int n);
int main(void)
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char value[SLEN];
printf("Enter a binary number with up to %zu digits: ", SLEN - 1);
while(s_gets(value, SLEN) != NULL && value[0] != '\0')
{
if(!check_val(value))
puts("A binary number contains just 0s and 1s.");
else
printf("%s is %d\n", value, bstr_to_dec(value));
puts("Enter next number (empty line to quit): ");
}
puts("Done");
return 0;
}
bool check_val(const char * str)
{
bool valid = true;
while(valid && *str != '\0')
{
if(*str != '0' && *str != '1')
valid = false;
str++;
}
return valid;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while(*str != '\0')
val = 2 * val + (*str++ - '0'); // 二進(jìn)制——>十進(jìn)制太神奇了
return val;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if(ret_val)
{
find = strchr(ret_val, '\n');
if(find)
*find = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
#include <stdbool.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
#include <string.h>
int bstr_to_dec(const char * str);
bool check_val(const char * str);
char * s_gets(char * st, int n);
int main(void)
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char value[SLEN];
printf("Enter a binary number with up to %zu digits: ", SLEN - 1);
while(s_gets(value, SLEN) != NULL && value[0] != '\0')
{
if(!check_val(value))
puts("A binary number contains just 0s and 1s.");
else
printf("%s is %d\n", value, bstr_to_dec(value));
puts("Enter next number (empty line to quit): ");
}
puts("Done");
return 0;
}
bool check_val(const char * str)
{
bool valid = true;
while(valid && *str != '\0')
{
if(*str != '0' && *str != '1')
valid = false;
str++;
}
return valid;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while(*str != '\0')
val = 2 * val + (*str++ - '0'); // 二進(jìn)制——>十進(jìn)制太神奇了
return val;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if(ret_val)
{
find = strchr(ret_val, '\n');
if(find)
*find = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
2、
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
#include <string.h>
int bstr_to_dec(const char * str);
char * itobs(int n, char * ps);
void show_bstr(const char * str);
int main(int argc, char *argv[])
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char bin_str[SLEN];
int value0, value1, value3;
if(argc != 3)
{
printf("輸入格式錯(cuò)誤!\n");
printf("請(qǐng)按照\(chéng)"%s 字符串 字符串\"格式輸入\n");
exit(1);
}
value0 = bstr_to_dec(argv[1]);
value1 = bstr_to_dec(argv[2]);
printf("~%s = ", argv[1]);
show_bstr(itobs(~value0, bin_str));
printf("\n~%s = ", argv[2]);
show_bstr(itobs(~value1, bin_str));
value3 = value0 & value1;
printf("\n%s & %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
value3 = value0 | value1;
printf("\n%s | %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
value3 = value0 ^ value1;
printf("\n%s ^ %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
return 0;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while(*str != '\0')
val = 2 * val + (*str++ - '0'); // 二進(jìn)制——>十進(jìn)制太神奇了
return val;
}
char * itobs(int n, char * ps)
{
int i;
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;
}
/* 4位一組顯示二進(jìn)制字符串 */
void show_bstr(const char * str)
{
int i = 0;
while(str[i])
{
putchar(str[i]);
if(++i % 4 == 0 && str[i])
putchar(' ');
}
}
運(yùn)行結(jié)果圖:#include <stdlib.h>
#include <stdbool.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
#include <string.h>
int bstr_to_dec(const char * str);
char * itobs(int n, char * ps);
void show_bstr(const char * str);
int main(int argc, char *argv[])
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char bin_str[SLEN];
int value0, value1, value3;
if(argc != 3)
{
printf("輸入格式錯(cuò)誤!\n");
printf("請(qǐng)按照\(chéng)"%s 字符串 字符串\"格式輸入\n");
exit(1);
}
value0 = bstr_to_dec(argv[1]);
value1 = bstr_to_dec(argv[2]);
printf("~%s = ", argv[1]);
show_bstr(itobs(~value0, bin_str));
printf("\n~%s = ", argv[2]);
show_bstr(itobs(~value1, bin_str));
value3 = value0 & value1;
printf("\n%s & %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
value3 = value0 | value1;
printf("\n%s | %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
value3 = value0 ^ value1;
printf("\n%s ^ %s = ", argv[1], argv[2]);
show_bstr(itobs(value3, bin_str));
return 0;
}
int bstr_to_dec(const char * str)
{
int val = 0;
while(*str != '\0')
val = 2 * val + (*str++ - '0'); // 二進(jìn)制——>十進(jìn)制太神奇了
return val;
}
char * itobs(int n, char * ps)
{
int i;
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;
}
/* 4位一組顯示二進(jìn)制字符串 */
void show_bstr(const char * str)
{
int i = 0;
while(str[i])
{
putchar(str[i]);
if(++i % 4 == 0 && str[i])
putchar(' ');
}
}

3、
#include <stdio.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
char * itobs(int n, char * ps);
int get_count(const char *);
int main(void)
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char bin_str[SLEN];
int number, count;
puts("請(qǐng)輸入一個(gè)整數(shù): ");
while(scanf("%d", &number) == 1)
{
count = get_count(itobs(number, bin_str));
printf("%d這個(gè)數(shù)中打開的位的數(shù)量: %d\n", number, count);
puts("請(qǐng)輸入一個(gè)整數(shù): ");
}
puts("Bye!");
return 0;
}
char * itobs(int n, char * ps)
{
int i;
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;
}
int get_count(const char * ps)
{
int count = 0;
while(*ps != '\0')
if(*ps++ == '1')
count++;
return count;
}
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
char * itobs(int n, char * ps);
int get_count(const char *);
int main(void)
{
const size_t SLEN = CHAR_BIT * sizeof(int) + 1;
char bin_str[SLEN];
int number, count;
puts("請(qǐng)輸入一個(gè)整數(shù): ");
while(scanf("%d", &number) == 1)
{
count = get_count(itobs(number, bin_str));
printf("%d這個(gè)數(shù)中打開的位的數(shù)量: %d\n", number, count);
puts("請(qǐng)輸入一個(gè)整數(shù): ");
}
puts("Bye!");
return 0;
}
char * itobs(int n, char * ps)
{
int i;
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;
}
int get_count(const char * ps)
{
int count = 0;
while(*ps != '\0')
if(*ps++ == '1')
count++;
return count;
}
4、
#include <stdio.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
int fun_itobs(int n, int index);
int main(void)
{
int number, count;
puts("請(qǐng)輸入一個(gè)整數(shù): ");
while(scanf("%d", &number) == 1)
{
puts("請(qǐng)輸入一個(gè)位的位置: ");
while(scanf("%d", &count) != 1 || count < 0 || count > 31)
{
printf("您輸入的不是一個(gè)數(shù)字,或者范圍不在%d到%d之間\n", 0, CHAR_BIT * sizeof(int) - 1);
printf("請(qǐng)您重新輸入: \n");
while(getchar() != '\n')
continue;
}
if(fun_itobs(number, count))
printf("%d在位%d上的值是1\n", number, count);
else
printf("%d在位%d上的值是0\n", number, count);
puts("請(qǐng)輸入一個(gè)整數(shù): ");
}
puts("Bye!");
return 0;
}
int fun_itobs(int n, int index)
{
int i, ret_val;
static int size = CHAR_BIT * sizeof(int);
char ps[size + 1];
for(i = size - 1; i >= 0; i--, n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
if(ps[size - 1 - index] == '1')
ret_val = 1;
else
ret_val = 0;
return ret_val;
}
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
int fun_itobs(int n, int index);
int main(void)
{
int number, count;
puts("請(qǐng)輸入一個(gè)整數(shù): ");
while(scanf("%d", &number) == 1)
{
puts("請(qǐng)輸入一個(gè)位的位置: ");
while(scanf("%d", &count) != 1 || count < 0 || count > 31)
{
printf("您輸入的不是一個(gè)數(shù)字,或者范圍不在%d到%d之間\n", 0, CHAR_BIT * sizeof(int) - 1);
printf("請(qǐng)您重新輸入: \n");
while(getchar() != '\n')
continue;
}
if(fun_itobs(number, count))
printf("%d在位%d上的值是1\n", number, count);
else
printf("%d在位%d上的值是0\n", number, count);
puts("請(qǐng)輸入一個(gè)整數(shù): ");
}
puts("Bye!");
return 0;
}
int fun_itobs(int n, int index)
{
int i, ret_val;
static int size = CHAR_BIT * sizeof(int);
char ps[size + 1];
for(i = size - 1; i >= 0; i--, n >>= 1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';
if(ps[size - 1 - index] == '1')
ret_val = 1;
else
ret_val = 0;
return ret_val;
}
5、(借鑒http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf的做法,因?yàn)閷?shí)在沒(méi)想到)
#include <stdio.h>
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
char * itobs(int n, char * ps);
unsigned int rotate_1(unsigned int, unsigned int);
int main(void)
{
char bin_str1[CHAR_BIT * sizeof(int) + 1];
char bin_str2[CHAR_BIT * sizeof(int) + 1];
unsigned int number, count, result;
printf("Enter an integer (q to quit): \n");
while(scanf("%d", &number))
{
printf("Enter the number of bits to be rotated: \n");
if(scanf("%d", &count) != 1)
break;
result = rotate_1(number, count);
itobs(number, bin_str1);
itobs(result, bin_str2);
printf("%u rotated is %u.\n", number, result);
printf("%s rotated is %s.\n", bin_str1, bin_str2);
printf("Enter an integer (q to quit): \n");
}
puts("Bye!");
return 0;
}
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;
}
unsigned int rotate_1(unsigned int n, unsigned int b)
{
static const int size = CHAR_BIT * sizeof(int);
unsigned int overflow;
b %= size;
overflow = n >> (size - b);
return (n << b) | overflow; // 沒(méi)想到這點(diǎn)
}
#include <limits.h> // for CHAR_BIT 一個(gè)char的位數(shù)
char * itobs(int n, char * ps);
unsigned int rotate_1(unsigned int, unsigned int);
int main(void)
{
char bin_str1[CHAR_BIT * sizeof(int) + 1];
char bin_str2[CHAR_BIT * sizeof(int) + 1];
unsigned int number, count, result;
printf("Enter an integer (q to quit): \n");
while(scanf("%d", &number))
{
printf("Enter the number of bits to be rotated: \n");
if(scanf("%d", &count) != 1)
break;
result = rotate_1(number, count);
itobs(number, bin_str1);
itobs(result, bin_str2);
printf("%u rotated is %u.\n", number, result);
printf("%s rotated is %s.\n", bin_str1, bin_str2);
printf("Enter an integer (q to quit): \n");
}
puts("Bye!");
return 0;
}
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;
}
unsigned int rotate_1(unsigned int n, unsigned int b)
{
static const int size = CHAR_BIT * sizeof(int);
unsigned int overflow;
b %= size;
overflow = n >> (size - b);
return (n << b) | overflow; // 沒(méi)想到這點(diǎn)
}
6、(全部是自己寫的,完美實(shí)現(xiàn)!!!)
#include <stdio.h>
#include <string.h>
/* 字體是否粗體 */
#define BOLD_ON 1
#define BOLD_OFF 0
/* 字體對(duì)齊方式 */
#define LEFT 0
#define RIGHT 1
#define CENTER 2
/* 字體是否斜體 */
#define ITALIC_ON 1
#define ITALIC_OFF 0
/* 字體是否有下劃線 */
#define UNDERLINE_ON 1
#define UNDERLINE_OFF 0
#define MASK 0xFFFFFF00
#define MASK1 0xFFFF80FF
struct font {
unsigned int font_id : 8;
unsigned int font_size : 7;
unsigned int : 1;
unsigned int alignment : 2;
unsigned int bold : 1;
unsigned int italic : 1;
unsigned int underline : 1;
unsigned int : 3;
};
void show(const struct font * ft);
int getlet(const char *);
int getmenu(void);
void eatline(void);
int main(void)
{
/* 初始化font結(jié)構(gòu) */
struct font ft = {1, 12, LEFT, BOLD_OFF, ITALIC_OFF, UNDERLINE_OFF};
int choice;
int id, size, align;
show(&ft);
putchar('\n');
while((choice = getmenu()) != 'q')
{
switch(choice)
{
case 'f': printf("Enter font id (0-255): ");
while(scanf("%d", &id) != 1 || id < 0 || id > 255)
{
printf("您輸入的不是一個(gè)整數(shù),或者范圍不在0到255之間\n");
while(getchar() != '\n');
continue;
printf("Enter font id (0-255): ");
}
eatline();
ft.font_id = (ft.font_id & MASK) | id;
putchar('\n');
show(&ft);
break;
case 's': printf("Enter font size (0-127): ");
while(scanf("%d", &size) != 1 || size < 0 || size > 255)
{
printf("您輸入的不是一個(gè)整數(shù),或者范圍不在0到127之間\n");
while(getchar() != '\n');
continue;
printf("Enter font size (0-127): ");
}
eatline();
ft.font_size = ((ft.font_size & MASK1) >> 8) | size;
putchar('\n');
show(&ft);
break;
case 'a': printf("Select alignment: \n");
puts("l) left c) center r)right");
align = getlet("lcr");
switch(align)
{
case 'l': ft.alignment = LEFT;
break;
case 'c': ft.alignment = CENTER;
break;
case 'r': ft.alignment = RIGHT;
break;
}
putchar('\n');
show(&ft);
break;
case 'b': ft.bold = BOLD_ON;
putchar('\n');
show(&ft);
break;
case 'i': ft.italic = ITALIC_ON;
putchar('\n');
show(&ft);
break;
case 'u': ft.underline = UNDERLINE_ON;
putchar('\n');
show(&ft);
break;
}
}
puts("Bye!");
return 0;
}
void show(const struct font * ft)
{
printf("ID\tSIZE\tALIGNMENT\tB\tI\tU\n");
printf("%d\t%d", ft->font_id, ft->font_size);
switch(ft->alignment)
{
case LEFT: printf("%10s", "left");
break;
case RIGHT: printf("%10s", "right");
break;
case CENTER: printf("%10s", "center");
break;
default: printf("unknown alignment");
}
printf("%14s%8s%8s\n", ft->bold == BOLD_OFF? "off" : "on",
ft->italic == ITALIC_OFF? "off" : "on",
ft->underline == UNDERLINE_OFF? "off" : "on");
}
int getlet(const char * s)
{
char c;
c = getchar();
while(strchr(s, c) == NULL)
{
printf("請(qǐng)您在%s這串字符串中輸入一個(gè)字符: \n", s);
while(getchar() != '\n')
continue;
c = getchar();
}
while(getchar() != '\n')
continue;
return c;
}
int getmenu(void)
{
int i;
const char * str[7] = {
"change font",
"change size",
"change alignment",
"toggle bold",
"toggle italic",
"toggle underline",
"quit"
};
const char pstr[8] = "fsabiuq";
for(i = 0; i < 7; i++)
{
printf("%c) %s ", pstr[i], str[i]);
if(i % 3 == 2)
putchar('\n');
}
if(i % 3 != 0)
putchar('\n');
return getlet(pstr);
}
void eatline(void)
{
while(getchar() != '\n')
continue;
}
#include <string.h>
/* 字體是否粗體 */
#define BOLD_ON 1
#define BOLD_OFF 0
/* 字體對(duì)齊方式 */
#define LEFT 0
#define RIGHT 1
#define CENTER 2
/* 字體是否斜體 */
#define ITALIC_ON 1
#define ITALIC_OFF 0
/* 字體是否有下劃線 */
#define UNDERLINE_ON 1
#define UNDERLINE_OFF 0
#define MASK 0xFFFFFF00
#define MASK1 0xFFFF80FF
struct font {
unsigned int font_id : 8;
unsigned int font_size : 7;
unsigned int : 1;
unsigned int alignment : 2;
unsigned int bold : 1;
unsigned int italic : 1;
unsigned int underline : 1;
unsigned int : 3;
};
void show(const struct font * ft);
int getlet(const char *);
int getmenu(void);
void eatline(void);
int main(void)
{
/* 初始化font結(jié)構(gòu) */
struct font ft = {1, 12, LEFT, BOLD_OFF, ITALIC_OFF, UNDERLINE_OFF};
int choice;
int id, size, align;
show(&ft);
putchar('\n');
while((choice = getmenu()) != 'q')
{
switch(choice)
{
case 'f': printf("Enter font id (0-255): ");
while(scanf("%d", &id) != 1 || id < 0 || id > 255)
{
printf("您輸入的不是一個(gè)整數(shù),或者范圍不在0到255之間\n");
while(getchar() != '\n');
continue;
printf("Enter font id (0-255): ");
}
eatline();
ft.font_id = (ft.font_id & MASK) | id;
putchar('\n');
show(&ft);
break;
case 's': printf("Enter font size (0-127): ");
while(scanf("%d", &size) != 1 || size < 0 || size > 255)
{
printf("您輸入的不是一個(gè)整數(shù),或者范圍不在0到127之間\n");
while(getchar() != '\n');
continue;
printf("Enter font size (0-127): ");
}
eatline();
ft.font_size = ((ft.font_size & MASK1) >> 8) | size;
putchar('\n');
show(&ft);
break;
case 'a': printf("Select alignment: \n");
puts("l) left c) center r)right");
align = getlet("lcr");
switch(align)
{
case 'l': ft.alignment = LEFT;
break;
case 'c': ft.alignment = CENTER;
break;
case 'r': ft.alignment = RIGHT;
break;
}
putchar('\n');
show(&ft);
break;
case 'b': ft.bold = BOLD_ON;
putchar('\n');
show(&ft);
break;
case 'i': ft.italic = ITALIC_ON;
putchar('\n');
show(&ft);
break;
case 'u': ft.underline = UNDERLINE_ON;
putchar('\n');
show(&ft);
break;
}
}
puts("Bye!");
return 0;
}
void show(const struct font * ft)
{
printf("ID\tSIZE\tALIGNMENT\tB\tI\tU\n");
printf("%d\t%d", ft->font_id, ft->font_size);
switch(ft->alignment)
{
case LEFT: printf("%10s", "left");
break;
case RIGHT: printf("%10s", "right");
break;
case CENTER: printf("%10s", "center");
break;
default: printf("unknown alignment");
}
printf("%14s%8s%8s\n", ft->bold == BOLD_OFF? "off" : "on",
ft->italic == ITALIC_OFF? "off" : "on",
ft->underline == UNDERLINE_OFF? "off" : "on");
}
int getlet(const char * s)
{
char c;
c = getchar();
while(strchr(s, c) == NULL)
{
printf("請(qǐng)您在%s這串字符串中輸入一個(gè)字符: \n", s);
while(getchar() != '\n')
continue;
c = getchar();
}
while(getchar() != '\n')
continue;
return c;
}
int getmenu(void)
{
int i;
const char * str[7] = {
"change font",
"change size",
"change alignment",
"toggle bold",
"toggle italic",
"toggle underline",
"quit"
};
const char pstr[8] = "fsabiuq";
for(i = 0; i < 7; i++)
{
printf("%c) %s ", pstr[i], str[i]);
if(i % 3 == 2)
putchar('\n');
}
if(i % 3 != 0)
putchar('\n');
return getlet(pstr);
}
void eatline(void)
{
while(getchar() != '\n')
continue;
}
7、(有大問(wèn)題,明天再看!!!借鑒http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf但是程序也有問(wèn)題)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LEFT 0x00000
#define CENTER 0x08000
#define RIGHT 0x10000
#define BOLD 0x20000
#define UNDERLINE 0x80000
#define ID_MASK 0xFF
#define SIZE_MASK 0x7F00
#define ALIGN_MASK 0x18000
#define ITALIC 0x40000
#define SIZE_SHIFT 8
typedef unsigned long font;
char do_menu(font * f); // f為一個(gè)指向unsigned long的指針
void show_font(font f);
char get_choice(const char *);
void show_menu(void);
void eatline(void);
void get_id(font * f);
void get_size(font * f);
void get_align(font * f);
int main(void)
{
font sample = 1 | (12 << SIZE_SHIFT) | LEFT | ITALIC; // sample = 0100 0000 1100 0000 0001(斜體,沒(méi)有預(yù)留空隙)
while(do_menu(&sample) != 'q')
continue;
puts("Bye!");
return 0;
}
char do_menu(font * f)
{
char response;
show_font(*f);
show_menu();
response = get_choice("fsabiuq");
switch(response)
{
case 'f': get_id(f); break;
case 's': get_size(f); break;
case 'a': get_align(f); break;
case 'b': *f ^= BOLD; break;
case 'i': *f ^= ITALIC; break;
case 'u': *f ^= UNDERLINE; break;
case 'q': break;
default: printf("menu problem\n");
}
return response;
}
void show_font(font f)
{
printf("\n%4s %4s %9s %3s %3s %3s\n", "ID", "SIZE", "ALIGNMENT", "B", "I", "U");
printf("%4lu %4lu", f & ID_MASK, (f & SIZE_MASK) >> SIZE_SHIFT);
switch(f & ALIGN_MASK)
{
case LEFT: printf("%7s", "left"); break;
case CENTER: printf("%7s", "center"); break;
case RIGHT: printf("%7s", "right"); break;
default: printf("%7s", "known"); break;
}
printf("%8s %3s %3s\n\n", (f & BOLD) == BOLD ? "on" : "off",
(f & ITALIC) == ITALIC ? "on" : "off",
(f & UNDERLINE) == UNDERLINE ? "on" : "off");
}
char get_choice(const char * s)
{
char ch;
ch = getchar();
ch = tolower(ch);
while(strchr(s, ch) == NULL)
{
printf("Please enter one of the following: %s\n", s);
eatline();
ch = tolower(getchar());
}
eatline();
return ch;
}
void eatline(void)
{
while(getchar() != '\n')
continue;
}
void show_menu(void)
{
puts("f) change font s) change size a) change alignment");
puts("b) toggle bold i) toggle italic u) toggle underline");
puts("q) quit");
}
void get_id(font * f)
{
int id;
printf("Enter font id (0-255): ");
scanf("%d", &id);
id = id & ID_MASK;
//*f |= id;
*f = (*f & 0xFFF00) | id; // 相應(yīng)位要先置為0之后再用|運(yùn)算符吧!!!(問(wèn)題出現(xiàn)在這)
eatline();
}
void get_size(font * f)
{
int size;
printf("Enter font size (0-127): ");
scanf("%d", &size);
*f &= (0xF8011);
*f |= (size << SIZE_SHIFT) & SIZE_MASK;
eatline();
}
void get_align(font * f)
{
printf("Select alignment: \n");
printf("l) left c) center r) right\n");
switch(get_choice("lcr"))
{
case 'l': *f &= ~ALIGN_MASK;
*f |= LEFT;
break;
case 'c': *f &= ~ALIGN_MASK;
*f |= CENTER;
break;
case 'r': *f &= ~ALIGN_MASK;
*f |= RIGHT;
break;
default: printf("alignment problem\n");
}
}
#include <string.h>
#include <ctype.h>
#define LEFT 0x00000
#define CENTER 0x08000
#define RIGHT 0x10000
#define BOLD 0x20000
#define UNDERLINE 0x80000
#define ID_MASK 0xFF
#define SIZE_MASK 0x7F00
#define ALIGN_MASK 0x18000
#define ITALIC 0x40000
#define SIZE_SHIFT 8
typedef unsigned long font;
char do_menu(font * f); // f為一個(gè)指向unsigned long的指針
void show_font(font f);
char get_choice(const char *);
void show_menu(void);
void eatline(void);
void get_id(font * f);
void get_size(font * f);
void get_align(font * f);
int main(void)
{
font sample = 1 | (12 << SIZE_SHIFT) | LEFT | ITALIC; // sample = 0100 0000 1100 0000 0001(斜體,沒(méi)有預(yù)留空隙)
while(do_menu(&sample) != 'q')
continue;
puts("Bye!");
return 0;
}
char do_menu(font * f)
{
char response;
show_font(*f);
show_menu();
response = get_choice("fsabiuq");
switch(response)
{
case 'f': get_id(f); break;
case 's': get_size(f); break;
case 'a': get_align(f); break;
case 'b': *f ^= BOLD; break;
case 'i': *f ^= ITALIC; break;
case 'u': *f ^= UNDERLINE; break;
case 'q': break;
default: printf("menu problem\n");
}
return response;
}
void show_font(font f)
{
printf("\n%4s %4s %9s %3s %3s %3s\n", "ID", "SIZE", "ALIGNMENT", "B", "I", "U");
printf("%4lu %4lu", f & ID_MASK, (f & SIZE_MASK) >> SIZE_SHIFT);
switch(f & ALIGN_MASK)
{
case LEFT: printf("%7s", "left"); break;
case CENTER: printf("%7s", "center"); break;
case RIGHT: printf("%7s", "right"); break;
default: printf("%7s", "known"); break;
}
printf("%8s %3s %3s\n\n", (f & BOLD) == BOLD ? "on" : "off",
(f & ITALIC) == ITALIC ? "on" : "off",
(f & UNDERLINE) == UNDERLINE ? "on" : "off");
}
char get_choice(const char * s)
{
char ch;
ch = getchar();
ch = tolower(ch);
while(strchr(s, ch) == NULL)
{
printf("Please enter one of the following: %s\n", s);
eatline();
ch = tolower(getchar());
}
eatline();
return ch;
}
void eatline(void)
{
while(getchar() != '\n')
continue;
}
void show_menu(void)
{
puts("f) change font s) change size a) change alignment");
puts("b) toggle bold i) toggle italic u) toggle underline");
puts("q) quit");
}
void get_id(font * f)
{
int id;
printf("Enter font id (0-255): ");
scanf("%d", &id);
id = id & ID_MASK;
//*f |= id;
*f = (*f & 0xFFF00) | id; // 相應(yīng)位要先置為0之后再用|運(yùn)算符吧!!!(問(wèn)題出現(xiàn)在這)
eatline();
}
void get_size(font * f)
{
int size;
printf("Enter font size (0-127): ");
scanf("%d", &size);
*f &= (0xF8011);
*f |= (size << SIZE_SHIFT) & SIZE_MASK;
eatline();
}
void get_align(font * f)
{
printf("Select alignment: \n");
printf("l) left c) center r) right\n");
switch(get_choice("lcr"))
{
case 'l': *f &= ~ALIGN_MASK;
*f |= LEFT;
break;
case 'c': *f &= ~ALIGN_MASK;
*f |= CENTER;
break;
case 'r': *f &= ~ALIGN_MASK;
*f |= RIGHT;
break;
default: printf("alignment problem\n");
}
}