华南师大软件学院软件工程专硕机试(2019年考研)

前言:

之前把近三年计算机学院机试的真题刷了,刷王道论坛的时候发现2019年软件学院的机试,当练手做一下

 

一、n的阶乘,两种方式实现,for循环或者递归

 

源码:

#include<iostream>
using namespace std;

int main(){
    int func(int);  //函数声明;
    cout<<"请输入n:";
    int n;
    cin>>n;
    while(n<=0){
        cout<<"要求n大于0!请重新输入:";
        cin>>n;
    }

    int result = 1;
    //for循环方法;
    for(int i=n;i>=1;i--){
        result*=i;
    }
    cout<<"结果(for):"<<result<<endl;

    int result_2 = func(n);
    cout<<"结果(递归):"<<result<<endl;

    return 0;
}

int func(int n){
    if(n==1)
        return 1;
    else
    {
        return n*func(n-1);
    }
    
}

 

结果:

请输入n:5
结果(for):120
结果(递归):120

 

二、一个3×3矩阵,求所有元素和,主对角线逆对角线和

源码:

#include<iostream>
using namespace std;
int main(){
    int Mar[3][3];
    int total = 0;
    int duijiao = 0;
    int niduijiao = 0;
    cout<<"请输入矩阵的值:";
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++){
            cin>>Mar[i][j];
            total+=Mar[i][j];
            if(i==j){
                duijiao+=Mar[i][j];
            }
            if((i+j)==2){
                niduijiao+=Mar[i][j];
            }
        }

    for(int i=0;i<3;i++){
        cout<<endl;
        for(int j=0;j<3;j++){
            cout<<Mar[i][j]<<" ";
        }
    }

    cout<<endl<<"所有元素和:"<<total<<endl;
    cout<<"对角线元素之和:"<<duijiao<<endl;
    cout<<"逆对角线元素之和:"<<niduijiao<<endl;



}

 

结果:

请输入矩阵的值:7 5 9 8 4 2 3 7 9

7 5 9
8 4 2
3 7 9
所有元素和:54
对角线元素之和:20
逆对角线元素之和:16

 

三、数组存20个数 然后最大的数跟最后一位换 最小的跟第一个换

源码:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
    srand(time(NULL));
    int max_index=0;
    int min_index=0;

    int num[20];
    cout<<"before change:"<<endl;
    for(int i=0;i<20;i++){
        num[i]=rand()%100+1;    //随机1~100
        cout<<num[i]<<" ";
        if((i+1)%5==0)
            cout<<endl;
    }  

    for(int i=0;i<20;i++){
        if(num[max_index]<num[i])
            max_index=i;
        if(num[min_index]>num[i])
            min_index=i;
    }
    cout<<endl<<"最大值:"<<num[max_index]<<endl;
    cout<<"最小值:"<<num[min_index]<<endl;

    int temp=num[19];
    num[19]=num[max_index];
    num[max_index]=temp;
    
    int temp_2=num[0];
    num[0]=num[min_index];
    num[min_index]=temp_2;

    cout<<endl<<"after change:"<<endl;
    for(int i=0;i<20;i++){
        cout<<num[i]<<" ";
        if((i+1)%5==0)
            cout<<endl;
    }
}

 

结果:

before change:
50 95 77 39 68
12 77 9 92 46
99 64 70 69 97
98 8 51 57 93

最大值:99
最小值:8

after change:
8 95 77 39 68
12 77 9 92 46
93 64 70 69 97
98 50 51 57 99

 

 

四、字符串匹配

emmmm啥意思? 问到具体再写

 

五、身份证15位变18位

这题我也觉得不太清晰,跟上题一样问清楚再做

 

六、给四个点坐标,求两条直线交点

个人理解:

给出一条线的两个点求出这两个点的所在的直线

在求出两条直线的交点

源码:

#include<iostream>
using namespace std;

struct Point{
    double x,y;
};

class Line{
    private:
        double a,b;
    public:
        Line(Point,Point);
        void display();
        friend void func(Line,Line);
};

Line::Line(Point A,Point B){
    a=(A.y-B.y)/(A.x-B.x);
    b=A.y-a*A.x;
}

void Line::display(){
    cout<<"y=";
    if(a!=0){
        cout<<a<<"x";
    }
    if(b!=0){
        if(b>0)
            cout<<"+";
        cout<<b;
    }
    cout<<endl;
}

void func(Line l1,Line l2){
    if(l1.a==l2.a){
        cout<<"两条直线平行!"<<endl;
        return;
    }

    Point C;
    C.x=(l1.b-l2.b)/(l2.a-l1.a);
    C.y=l2.a*C.x+l2.b;
    cout<<"交点为:("<<C.x<<","<<C.y<<")"<<endl;
}

int main(){
    Point A,B,C,D;
    A.x=A.y=0;

    B.x=4;
    B.y=9;

    C.x=5;
    C.y=8;

    D.x=7;
    D.y=2;
    Line l1(A,B);
    Line l2(C,D);

    l1.display();
    l2.display();

    func(l1,l2);
}

结果:

y=2.25x
y=-3x+23
交点为:(4.38095,9.85714)

 

七、双向冒泡排序

源码:

#include<iostream>
#include<stdlib.h>
#include<time.h>

using namespace std;

#define LEN 10
#define swap(x,y){int t=x;x=y;y=t;}

void bubble(int num[]);

int main(){
    srand(time(NULL));
    int num[LEN];
    cout<<"before sort:"<<endl;
    for(int i=0;i<LEN;i++)
    {
        num[i]=rand()%99+1;
        cout<<num[i]<<" ";
    }
    
    bubble(num);

    cout<<endl<<"after sort:"<<endl;
    for(int i=0;i<LEN;i++)
    {
        cout<<num[i]<<" ";
    }
    cout<<endl;
    return 0;
}

void bubble(int num[]){
    int left=0;
    int right=LEN-1;
    while(left<right){
        for(int i=left;i<LEN-1;i++){
            if(num[i]>num[i+1])
                swap(num[i],num[i+1]);
        }
        left++;
        for(int i=right;i>0;i--){
            if(num[i]<num[i-1])
                swap(num[i],num[i-1]);
        }
        right--;
    }
}

 

结果:

before sort:
23 78 61 41 15 7 13 44 56 61
after sort:
7 13 15 23 41 44 56 61 61 78

 

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值