前言:
之前把近三年计算机学院机试的真题刷了,刷王道论坛的时候发现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