2019计算所网络数据科学与技术重点实验室上机考试试题

1.给定一个具有n个元素的数组N,以及指定数字m,输出m个不同元素的全排列。

#include <stdio.h>
const int INF=100;
int arr[INF];

int swapp(int a[],int i,int j){
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    return 0;
}

int perm(int a[],int k,int n,int m){
    if(k==m){
        for(int i=0;i<m;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
        return 0;
    }
    for(int i=k;i<n;i++){
        swapp(a,i,k);
        perm(a,k+1,n,m);
        swapp(a,i,k);
    }
    return 0;
}

int main(){
    int n=3,m=2;
    for(int i=0;i<INF;i++){
        arr[i]=i;
    }
    perm(arr,0,n,m);
    return 0;
}

2.请编程实现对于DAG (有向无环图)的管理,要求能够新建,添加节点,删除节点,查找节点。并且使用你设计实现的程序,完成对于给定两个节点输出节点间的所有通路。

#include <stdio.h>
#include <string.h>
#include <set>
#include <vector>
using namespace std;
const int INF=100;

set<int> sett;
vector<int> vec;
int tabb[INF][INF];
int npath=8;
int input[8][2]={1,2,
                1,3,
                1,4,
                3,2,
                3,5,
                4,5,
                6,5,
                6,4};

int addd(int a,int b){
    tabb[a][b]++;
    return 0;
}
int dell(int a){
    for(int i=0;i<INF;i++){
        tabb[i][a]=0;
        tabb[a][i]=0;
    }
    return 0;
}
int findd(int a){
    for(int i=0;i<INF;i++){
        if(tabb[i][a]){
            printf("path %d to %d\n",i,a);
        }if(tabb[a][i]){
            printf("path %d to %d\n",a,i);
        }
    }
    return 0;
}
int walkk(int a,int b){
    if(tabb[a][b]){
        for(int i=0;i<vec.size();i++){
            printf("%d ",vec[i]);
        }
        printf("%d\n",b);
    }
    for(int i=0;i<INF;i++){
        if(tabb[a][i]&&sett.count(i)==0){
            vec.push_back(i);
            walkk(i,b);
            vec.pop_back();
        }
    }
    return 0;
}
int main(){
    memset(tabb,0,sizeof(tabb));
    for(int i=0;i<npath;i++){
        addd(input[i][0],input[i][1]);
    }
    findd(4);

    vec.push_back(1);
    walkk(1,6);
    vec.pop_back();

    return 0;
}

3.给出算法,以最小代价判断一个单向链表是否存在环路。

#include <stdio.h>
const int INF=5;

struct Node{
    int value;
    Node* next=NULL;
};
Node chain[10];

int main(){
    int con=0;
    for(int i=0;i<INF;i++){
        chain[i].value=i;
        chain[i].next=&chain[i+1];
    }
    chain[INF-1].next=&chain[con];

    Node* slow=&chain[0];
    Node* fast=&chain[0];

    for(int i=0;i<INF;i++){
        printf("now:slow->%d,fast->%d\n",slow->value,fast->value);
        slow=slow->next;
        fast=fast->next;
        fast=fast->next;
        if(fast==NULL){
            printf("No loop\n");
            break;
        }
        if(fast==slow){
            printf("Loop\n");
            return 0;
        }
    }
    return 0;
}

4.请设计一个二又树数据姑构(每个节点存储一个整数),实现向二又树内插入一个整数的操作,要求保证树中任意一个节点A的左子树中的所有节点存储的整数都小于等于A存储的整数,右子树中的所有节点存储的整数都大于等于A存储的整数。

#include <stdio.h>
using namespace std;
const int INF=5;
int a[INF]={3,4,0,1,2};

struct Node{
    int value=0;
    Node* left=nullptr;
    Node* right=nullptr;
};

int Insertt(Node* &root,int val){
    if(root==nullptr){
        root=new Node;
        root->value=val;
    }
    else if(val<=root->value){
        if(root->left==nullptr){
            Node *temp=new Node;
            temp->value=val;
            root->left=temp;
        }else{
            Insertt(root->left,val);
        }
    }else if(val>root->value){
        if(root->right==nullptr){
            Node *temp=new Node;
            temp->value=val;
            root->right=temp;
        }else{
            Insertt(root->right,val);
        }
    }
    return 0;
}

int Printt(Node* root){
    if(root->left!=nullptr){
        Printt(root->left);
    }
    printf("%d ",root->value);
    if(root->right!=nullptr){
        Printt(root->right);
    }
    return 0;
}

int main(){
    Node* root=nullptr;
    for(int i=0;i<INF;i++){
        Insertt(root,a[i]);
    }
    Printt(root);
    return 0;
}

4.小明刚到最近入职一个新的互联网公司,从网管部门那里领取了电脑之后忘记索要IP地址,然而网管部门人员比较繁忙,无法详细的告诉小明详细的信息,只是匆匆茫茫写了几个数字,如"12325523135", 告诉小明这个是IPv4地址,因为不是正常的 IPv4地址写法,小明无法确认正确的ip地址是什么,马上就是周末了,小明先赶在这周末之前
把个人信息录入系统:因此,小明需要写一个程序,解析这个字符串为有效的ip地址,以保证可以正常上网。现在你要帮小明设计一个算法,从一个字符串中解析出有效的ip地址

#include <stdio.h>
#include <string.h>
using namespace std;

int fit(int i){
    if(i<=255&&i>=0){
        return 1;
    }
    return 0;
}

int main(){
    char a[100]="12325523135";
    //scanf("%s",&str);
    int len=strlen(a);
    int iv=0,jv,kv,lv;
    for(int i=1;i<=3;i++){
        iv=(a[i-1]-'0')+iv*10;
        jv=0;
        for(int j=1;j<=3;j++){
            jv=(a[i+j-1]-'0')+jv*10;
            kv=0;
            for(int k=1;k<=3;k++){
                kv=(a[i+j+k-1]-'0')+kv*10;
                lv=0;
                for(int l=1;l<=3;l++){
                    lv=(a[i+j+k+l-1]-'0')+lv*10;
                    if(fit(iv)&&fit(jv)&&fit(kv)&&fit(lv)&&len==(i+j+k+l)){
                        printf("%d:%d:%d:%d\n",iv,jv,kv,lv);
                    }
                }
            }
        }
    }
    return 0;
}

5.设计并实现一个xml解析器,要求,输入一个xml文件/字符串,能够将该输入解析成
树(dom树)并存储在内存中,节点要求至少保留原输入中的: 1.标签,2.至少两个属性,3.标签内容;如果能够处理不标准的/非法的xml文件如丢失结尾标签,标签丢失符号如:开始标签丢失了“>”变成“<XXX”;结尾标签丢失"<"变成"ZZZ>"等多种情况,每多处理一种异常视异常难度加分。

6.现在有一个xml文件,要求利用第6题刚刚实现的解析器完整dom树的构建,并对其实现先序遍历|先根遍历,在遍历过程中选择出标签内容符合如下规则的“+数字(三个数字)-八个数字”标签,标签按照规则中括号内的三个数字进行升序排列并输出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重庆邮电大学【实验】python程序设计实验8- python科学计算和数据可视化是计算机科学与技术专业的一门实验课程,旨在让学生掌握使用python进行科学计算和数据可视化的基本方法和技巧。 在本实验中,学生将学习使用python中的一些科学计算库,如NumPy、SciPy和Pandas来处理和分析数据。通过学习这些库的使用,学生将能够实现一些常见的科学计算任务,例如数据的统计分析、插值和拟合、优化和数值积分等。 此外,学生还将学习使用Matplotlib和Seaborn等库进行数据可视化。通过这些库,学生可以将数据以图形的形式呈现出来,从而更直观地理解数据的内在规律和趋势。学生将学习如何绘制各种类型的图形,如折线图、柱状图、散点图、饼图等,并学会如何对图形进行修改和美化,使其更具艺术性和信息传达效果。 在实验过程中,学生将通过一系列的练习和实例来巩固所学的知识和技能。通过实际操作,学生将进一步理解和掌握python程序设计中的一些概念和技巧,并通过完成实验报告来展示自己的工作成果。这样的实践过程旨在帮助学生熟悉和掌握科学计算与数据可视化在实际工作中的应用,培养他们的问题解决能力和实践能力。 通过本实验,学生将进一步提高自己在python程序设计方面的能力,拓宽对科学计算和数据可视化的理解,为将来的研究和工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值