• 第 1 章 第 7 题 位向量中的异常处理问题


    问题分析

      本题考察的是异常处理。优质的程序必须具备良好的异常处理机制,切不可马虎了事,这将直接决定程序的质量

    问题解答

      先贴出分析目标代码:

     1 #include <iostream>
     2 #include <fstream>
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 // 每个整数的位数
     8 #define BITSPERWORD 32
     9 // 每次位移量
    10 #define SHIFT 5
    11 // 取模掩码
    12 #define MASK 0x1F
    13 // 位向量的元素个数
    14 #define N 10000000
    15 
    16 // 模拟数组
    17 int a[1 + N/BITSPERWORD];
    18 
    19 /*
    20  * 函数功能:置位向量第i位为1
    21  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    22             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    23             " 1<<(i & MASK) " 表示一个除了要设置的那位其他位都是0的整数
    24 */
    25 void set (int i) {
    26     a[i>>SHIFT] |= (1<<(i & MASK));
    27 }
    28 
    29 /*
    30  * 函数功能:置位向量第i位为0
    31  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    32             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    33             " 1<<(i & MASK) " 表示一个除了要清空的那位其他位都是0的整数
    34 */
    35 void clr (int i) {
    36     a[i>>SHIFT] &= ~(1<<(i & MASK));
    37 }
    38 
    39 /*
    40  * 函数功能:获取位向量的第i位
    41  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    42             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    43             " 1<<(i & MASK) " 表示一个除了要获取的那位其他位都是0的整数
    44 */
    45 int tst (int i) {
    46     return a[i>>SHIFT] & (1<<(i & MASK));
    47 }
    48 
    49 
    50 int main()
    51 {
    52     /*
    53      * 清空位向量
    54     */
    55     for (int i=0; i < N; i++) {
    56         clr(i);
    57     }
    58 
    59     string filename;
    60     cout << "输入数据文件名( 当前目录下 ):";
    61     cin >> filename;
    62     
    63     fstream io;
    64     io.open(filename.c_str());
    65     if (!io) {
    66         cout << "打开文件失败" << endl;
    67     return 1;
    68     }
    69 
    70     /*
    71      * 根据数据文件记录给位向量赋值
    72      * 赋值完了以后其实已经" 完成排序了 "
    73     */
    74     int data;
    75     while (io >> data) {
    76         set(data);
    77     }
    78 
    79     io.close();
    80     io.clear();
    81     io.open(filename.c_str(), fstream::out | fstream::trunc);
    82 
    83     /*
    84      * 从位向量获取数据并写回数据文件
    85     */
    86     for (int i=0; i <N; i++) {
    87         if ( tst(i) ) {
    88             io << i << " ";
    89         }
    90     }
    91 
    92     io.close();
    93 
    94     return 0;
    95 }

      1. 重复的数据将被丢失

      2. 可以在set函数中加入判断,如果待set位已经为1了则弹出错误并退出。

      3. 如果数据大于等于N,位向量函数将会产生访问数组越界的错误;如果数据小于0,也会导致访问数组失败

      4. 如果不是数字,则位向量函数将会错误地控制非数据对应的位,从而使程序发生异常

      5. 对于 1-4 这类的输入异常,一方面可以在生成数据文件的时候加强检查,严禁非法数据写入数据文件;另一方面,具体排序时读取到非法数据应该弹出友好的错误提示并退出程序

      6. 我们应当在测试数据中加入重复数据,字符串数据,负数,大于N的数等各种能预料得到的异常数据进行测试,并编写异常处理代码。

  • 相关阅读:
    SpringBoot集成springfox-swagger2访问swagger-ui.html页面弹窗提示问题
    Java数据结构与算法之队列(Queue)实现
    华为S9300交换机热补丁安装
    ubnt EdgeSwitch 24-Port 250W DHCP_CLI[osapiTimer]: dhcp_prot.c(812) 1285780 %% Failed to acquire an IP address on Network Port; DHCP Server did not respond.
    windows server 2012 r2查看远程用户登录IP
    iptables && firewall 的简单应用
    deepin如何自定义启动器图标,如firefox
    deepin如何访问samba共享文件夹
    vsftpd服务搭建
    华为服务器RH 2288H v2 or v3安装系统
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3250754.html
Copyright © 2020-2023  润新知