BeautifulMan

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            16 隨筆 :: 0 文章 :: 0 評(píng)論 :: 0 Trackbacks
          復(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中,可以做以下替換,把:
          while(bits-- > 0)
          {
              mask |= bitval;
              bitval <<= 1;
          }
          用:
          while(bits-- > 0)
          {
              mask |= bitval;
              bitval *= 2;
          }
          替換,而程序仍將工作。這是否意味著*= 2等同于<<= 1?|=和+=又怎樣?
          答:
          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到11.4MB軟盤驅(qū)動(dòng)器數(shù)量
          2 未使用
          3到4CD-ROM驅(qū)動(dòng)器數(shù)量
          5未使用
          6到7硬盤驅(qū)動(dòng)器數(shù)量
          Tinkerbell和IBM PC一樣從右到左填充結(jié)構(gòu)位字段。創(chuàng)建一個(gè)適于存放該信息的位字段模板。
          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.
          struct klinkerbell {
              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)
          即優(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;
          }

          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é)果圖:


          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;
          }

          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;
          }

          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)
          }

          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;
          }

          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");
              }
          }



          posted on 2016-01-06 09:27 李阿昀 閱讀(487) 評(píng)論(0)  編輯  收藏 所屬分類: C Primer Plus 復(fù)習(xí)題與編程練習(xí)
          主站蜘蛛池模板: 彭水| 黑龙江省| 东山县| 集安市| 松溪县| 恩平市| 三都| 靖西县| 曲麻莱县| 乐清市| 涪陵区| 宣汉县| 连南| 平山县| 宁津县| 鄄城县| 鄱阳县| 西乌珠穆沁旗| 麻江县| 长治县| 长武县| 慈利县| 凤阳县| 肃南| 新宁县| 云霄县| 岑巩县| 顺平县| 大邑县| 社会| 漳州市| 六枝特区| 安庆市| 临夏县| 科技| 望都县| 博兴县| 松滋市| 栾川县| 曲阜市| 长沙市|