CCF-CSP认证考试准备第十二天 201903-3 损坏的RAID5(大模拟)


今天开始第3题大模拟,加油!
### Day12: 1.201903-3

#### 1.201903-3:损坏的RAID5(大模拟)
(1)本题的难点为理解题意(**比较难**)然后找规律和异或运算
题目可以这样理解:
1.先介绍**RAID5基本算法**,基本原理是异或运算,即在 p 与 a1…an 这 (n+1)个数中,由任意 n个可以推知其余的一个
2.介绍硬盘的基本单位为**块**
3.介绍条带:**条带**是指连续、等大的数据块,是 RAID5 进行数据布局的基本单元。条带就是多个块的抽象集合,一个存储单元。**规律1:如果将条带也从 0开始编号,且条带大小为 s个块,则编号为 b 的块所在的条带编号是[b / s]**
4.介绍效验盘和存储盘的选择规则(**按行来**)(所以代码先计算行数)
5.目标题目该型号硬盘的块大小是 4字节(**基础知识:16进制位2个字符为1个字节(因为1个字符为1个16进制位,为4个二进制位,而一个字节为8个二进制位),所以最后输出8个字符**)
6.介绍输入格式(其中长度相等且为 8的整数倍的字符串,就可能要计算是8的几倍)和输出格式(如果该读操作由于下列情形之一无法进行,则输出一个减号(`-`):
- 阵列不完整,且被读取的块所在的硬盘缺失,且该数据无法由现存的硬盘数据推算出来;
- 指定的块超出阵列总长度。
特殊情况要提前和单独讨论)
7.**理解样例**:
样例1好理解;
样例2的图着重理解:
![[201903-3.png]]
图中,用虚线隔开的长方形表示一个块,连续的两个长方形组成的正方形表示一个条带。
(2)代码(100):
```
#include <bits/stdc++.h>

using namespace std;

int char2digit(char c){
    if(isdigit(c))    return c-'0';
    else    return c-'A'+10;
}

char digit2char(int x){
    if(x>=0 && x<10)    return x+'0';
    else    return x-10+'A';
}

void yihuo(string &s1,string s2){
    for(int i=0;i<8;i++){
        s1[i]=digit2char(char2digit(s1[i]) ^ char2digit(s2[i]));
    }
}

int main(){
    ios::sync_with_stdio(false);
    int n,s,l;
    cin>>n>>s>>l;
    vector<string> vs(n);//初始化为空字符串 
    int len=0;
    for(int i=0;i<l;i++){
        int x;
        string str;
        cin>>x>>str;
        vs[x]=str;
        len=str.size();
    }
    int m;
    cin>>m;
    while(m--){
        int b;
        cin>>b;
        if(b>=(n-1)*len/8){
            cout<<"-"<<endl;
            continue;
        }
        int row=b/(s*(n-1));//b号块所在行数
        int xiaoyanDiskIndex=n-1-row%n;//计算b号块这一行的效验盘索引
        int diskIndex=(xiaoyanDiskIndex+(b-s*(n-1)*row)/s+1)%n;//b号块所在的盘索引
        int blockIndex=row*s+b%s;//b号块在当前盘的索引
        string res;
        if(!vs[diskIndex].empty()){
            res=vs[diskIndex].substr(blockIndex*8,8);//substr用法
        }
        else{
            if(n-l>=2){
                cout<<"-"<<endl;
                continue;
            }
            string tmp;
            for(int i=0;i<n;i++){
                if(i==diskIndex)    continue;
                tmp=vs[i].substr(blockIndex*8,8);
                if(res.empty()){
                    res=tmp;
                }
                else{
                    yihuo(res,tmp);
                }
            }
            
        }
        cout<<res<<endl;
    }
    return 0;
}
```
(3)代码重点部分:
1.以函数的形式实现字符和整数的转化(因为异或运算`^`只能是数字),以及单个字符逐个异或(可以改善的部分,不过我这个比较好理解,简单)
2.通过找规律来理解本题的核心部分
```
int row=b/(s*(n-1));//b号块所在行数
int xiaoyanDiskIndex=n-1-row%n;//计算b号块这一行的效验盘索引
int diskIndex=(xiaoyanDiskIndex+(b-s*(n-1)*row)/s+1)%n;//b号块所在的盘索引
int blockIndex=row*s+b%s;//b号块在当前盘的索引
```
**抽象拓展**:
##### Step 1: **理解问题的结构**
需要明确每个块(或数据单元)是如何分配到不同的磁盘(或存储单元)的(**即数据的分布规律**),然后写出能够根据块编号定位磁盘和偏移量的公式(本题的行数是关键,不同行的效验盘索引不一样(题目告知),通过效验盘索引可以推出b号块所在的盘索引(因为题目是跳过效验盘来分布块),再获取b号块在当前盘的索引)。
##### Step 2: **找到动态变化的规则**
- 本题的关键在于校验盘的动态轮换,因此需要找出每一行数据中哪个磁盘存储校验块,其余存储数据块。
- 如果有类似的轮换机制,可以通过观察找到一个模式,像 `xiaoyanDiskIndex` 的计算公式就是通过观察校验盘随行号变化的规律得出的。
##### Step 3: **将动态变化与静态数据结合**
- 在找到校验盘后,你需要考虑剩余的盘如何存储数据。这里需要跳过校验盘,并根据条带大小、数据分块等静态数据计算出具体的存储位置。
- 在公式中,`diskIndex` 的计算需要结合校验盘的索引来跳过校验盘,同时保持对剩余盘的数据存储进行定位。
##### Step 4: **逐步调试公式**

- 在写完公式后,通过实例化几个具体的块编号,验证计算出来的盘号、行号和块偏移量是否正确。通过调试,逐步完善规律公式。
3.**注意**:
3.1:字符串的初始化和空字符串的判断:
不需要手动赋值" "和判断是不是为" ",下面更好用
```
vector<string> vs(n);//初始化为空字符串
if(!vs[diskIndex].empty())
```
3.2:string的substr函数写法:
```
res=vs[diskIndex].substr(blockIndex*8,8);//没有迭代器,为索引加上长度,且前面加上是哪个字符串的substr
```

### 回答1: CCF-CSP(中国计算机学会认证系统程序员)认证考试是由中国计算机学会主办的,旨在选拔高水平的系统程序员和开发人员。该认证考试包括两个级别:初级和高级。初级考试主要测试候选人的基础知识和编程能力,高级考试则主要测试候选人的系统设计和开发能力。CCF-CSP认证考试的评分标准严格,要求考生表现出扎实的计算机理论基础和熟练的编程技巧。 为了顺利通过CCF-CSP认证考试,考生需要掌握扎实的计算机基础知识和熟练的编程技巧,并且需要在考试前进行充分的准备。以下是一些复习技巧指导: 1. 确认考试大纲 考生需要仔细阅读考试大纲,了解考试范围和题型。要特别注意考试大纲中的重点内容,重点复习。 2. 提前规划复习进度 准备CCF-CSP认证考试需要时间,而时间是很宝贵的,考生需要提前规划好复习进度和复习内容,尽可能利用零散时间进行复习。 3. 多做题 要想掌握CCF-CSP认证考试所需的知识和技能,考生需要多做题,并针对性地练习一些经典的考题。在练习中,考生需要注重练习思路和解题方法,该方法可以加深对知识点的理解。 4. 关注考试动态 考试动态指的是考试历年来的趋势和变化,考生需要不断关注考试动态,了解考试趋势,及时更新复习内容和方法,以便更好地应对考试。 总之,要想通过CCF-CSP认证考试,考生需要理论基础和开发经验充足,并且需要在复习时切实遵循学科规范,灵活应用知识点,较好地掌握考试技巧,这是顺利通过CCF-CSP认证考试的关键。 ### 回答2: ccf-csp认证考试是中国计算机学会(CCF认证的一个计算机软件专业技能等级考试,也是中国IT行业里非常重要的证书之一。该考试分为初级、中级和高级三个等级,其中初级考试包含了基础的程序设计和算法等内容,中级考试中主要考察了软件工程、数据结构、算法设计和网络安全等领域的知识,而高级考试则更注重的是对软件工程和软件项目管理的理解和应用,以及对复杂系统的设计和实现方法的掌握。为了能够成功通过ccf-csp认证考试,首先需要在考前充分准备,并且需要有一些好的复习技巧,这里向大家推荐以下几点: 1.学好基础知识。初级、中级和高级csp认证考试所涉及到的内容都是建立在一定的基础知识上的。由于考试的难度逐级递增,所以建议在准备考试之前先花时间学好基础知识。 2.多做练习题。做练习题能够帮助我们加深对知识的理解,熟悉考试形式和规则,同时也能提高我们的答题速度和准确度。 3.注意时间管理。不同级别的csp认证考试都有时限,在考试过程中需要注意时间的分配。建议在每次做练习题的时候都设置一个时间限制,并逐步缩短时间限制,以提高答题效率。 4.了解考试规则。在考前一定要熟悉考试规则和题型,知道考试时可以携带哪些资料和工具,了解考试的答题和评分规则等。 总之,ccf-csp认证考试是一项非常重要的认证考试,通过这个认证不仅可以增加个人的职业竞争力,还能证明个人在软件开发和IT行业方面的专业能力。因此,我们需要认真地准备和复习,字斟句酌地做好每一个细节,以确保顺利通过考试。 ### 回答3: ccf-csp认证考试是由中国计算机学会主办的全国性计算机考试考试内容涵盖了计算机应用、技术、算法等多个方面,分为初级、中级和高级三个等级。参加此考试不仅有助于检测个人的计算机专业水平,更能提升自身的竞争力和职业发展前景。 为了通过ccf-csp认证考试,考生需要重点复习考试要求中的各个内容模块,如数据类型、运算符、控制结构、数组、函数、文件操作等程序设计相关方面;还包括计算机网络、操作系统、数据库等计算机技术类知识;另外,还需要掌握常见算法和数据结构,如排序、查找、树等。此外,考生还需要通过大量的编程练习和模拟题练习,熟悉考试题型和答题技巧,提升自己的完成效率和准确性。 在复习过程中,需要注重细节和实践。例如,对于程序设计相关方面,需要理解每个知识点的原理和应用场景,在编写代码时要注重细节避免出现错误。对于算法和数据结构方面,需要熟悉常见算法的实现方式和优缺点,掌握好算法的时间复杂度和空间复杂度,做到熟练掌握。 总之,通过充分准备和钻研,考生有望成功通过ccf-csp认证考试,展现自己的计算机专业能力和职业素养。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值