2018西工大软件工程机试代码参考

一、基础编程题:

1.实现插入排序或选择排序算法
插入排序:

#include<iostream>
#include<cstdlib>
using namespace std;
//交换数组元素位置位置
void swap(int &a, int &b)
{
    
    
	int temp = a;
	a = b;
	b = temp;
}

void print(int arr[], int n){
    
    //打印数组
    for(int j= 0; j<n; j++){
    
    
           cout<<arr[j] <<" ";
        }
    cout<<endl;
}

/*
插入排序。
注意,若后面一个元素比其前面一个元素小,
则将这两个元素交换位置,然后再来比较这个插入元素与前面一个元素的大小,
若小,则还需要交换这两个元素位置,一直到这个插入元素在正确的位置为止

*/

void insertSort(int a[],  int length)
{
    
    
	for (int i = 1; i < length; i++)
	{
    
    
		for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
		{
    
    
			swap(a[j], a[j + 1]);
		}
	}
}

int main()
{
    
    
	int n;
	cout<<"数字总个数n:"<<endl;
	cin>>n;
	int A[n];
	cout<<"要排序数字:"<<endl;
	for(int i=0;i<n;i++){
    
    
		cin>>A[i];
	}
	cout<<"原始序列:"<<endl;
	print(A,n);
	insertSort(A, n);
	cout<<"排序后结果:"<<endl;
	print(A,n);
	system("pause");
	return 0;

}

选择排序:

#include<iostream>
using namespace std;
void print(int a[], int n)//打印数组
{
    
    

    for(int j= 0; j<n; j++)
	{
    
    
        cout<<a[j] <<"  ";

    }
    cout<<endl;
}
/*
第一次从待排序的数据元素中选出最小(或最大)的一个元素,
存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,
然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零
*/
void selectSort(int a[], int len)//选择排序
{
    
    
	int minindex, temp;
	for(int i = 0; i<len-1;i++)
	{
    
    
	    minindex = i;//记录最小
	    for(int j = i+1; j<len; j++)
		{
    
    
		    if(a[j]<a[minindex])
				minindex = j;//遍历 i+1~len 的值,找到其中最小值的位置
		}
		// 交换当前索引 i 和最小值索引 minIndex 两处的值
		temp = a[i];
		a[i] = a[minindex];
		a[minindex] = temp;
		 // 执行完一次循环,当前索引 i 处的值为最小值,直到循环结束即可完成排序
	}
}

int main(){
    
    
    int a[10] = {
    
    8,1,9,7,2,4,5,6,10,3};
    cout<<"初始序列:";
    print(a,10);
    selectSort(a,10);
    cout<<"排序结果:";
    print(a,10);
}

2.键盘输入一组正整数,检查是否存在任意的三个数满足因数关系,即a*b=c;

#include <stdio.h>
#include <string.h>
int n;
bool Func_1(int arr[]);
bool Func_2(int num, int arr[]);
int main(void)
{
    
    
	scanf("%d", &n);
	int arr[n];
	for(int i = 0; i < n; i++)
	{
    
    
		scanf("%d", &arr[i]);
	}
	Func_1(arr);
	return 0;
}

bool Func_1(int arr[])
{
    
    
	int ans;
	for(int i = 0; i < n; i++)
	{
    
    
		for(int j = i + 1; j < n; j++)
		{
    
    
			ans = arr[i] * arr[j];
			if(Func_2(ans, arr))
			{
    
    
				printf("%d * %d = %d\n", arr[i], arr[j], ans);
			}
		}
	}
}

bool Func_2(int num, int arr[])
{
    
    
	for(int i = 0; i < n; i++)
	{
    
    
		if(arr[i] == num)
		{
    
    
			return true;
		}
	}
	return false;
}

3.从键盘输入一个长字符串,找出并输出其中所有的三个连续字符串,例如abc或efg等;

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

bool Judge(char str[], int i)
{
    
    
	if(str[i] + 1 == str[i + 1] && str[i + 1] + 1 == str[i + 2])
	{
    
    
		return true;
	}
	else
	{
    
    
		return false;
	}
}

int main(void)
{
    
    
	char str[10001];
	cin.get(str,1000);
	int len = strlen(str);
	for(int i = 0; i <= len - 3; i++)
	{
    
    
		if(Judge(str, i))
		{
    
    
			cout<<str[i]<<str[i + 1]<<str[i + 2]<<endl;
		}
		else{
    
    
			cout<<"No"<<endl;
		}
	}
	return 0;
}

4.统计文本的段落数量,总单词数量,以及文本的最长最短平均单词数量:

5.判断某数字是否是回文数字:

#include<iostream>

using namespace std;

int main(){
    
    

    char c[1001];

    //此处为C++输入字符串的处理

    while(cin.get(c,1000)){
    
    

        int i=0;

        int flag=0;

        //此处为字符串字符个数的计算,通过计算\0位置

        for(i=0;c[i]!=0;i++);

        for(int j=0;j<i;j++){
    
    

            if(c[j]!=c[i-1-j]){
    
    //首尾判断是否相等

                flag=1;

                cout<<"No!"<<endl;

                break;

            }

        }

        if(!flag)

            cout<<"Yes!"<<endl;

    }

}

6.输入一个字符串,把所有的大写子母变成小写,小写变成大写并输出:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    
    
	string a;
	getline(cin, a);//输入字符串
	for (int i = 0; i < a.size(); i++)
	{
    
    
		if (a[i] >= 'a'&&a[i <= 'z'])//小写变大写
		{
    
    
			a[i] = a[i] - 32;
		}

		else if (a[i] >= 'A'&&a[i <= 'Z'])//大写变小写
		     {
    
    
			a[i] = a[i] + 32;
		      }
	}
	cout << a;
}

二、高级编程题:

7.在有向图中,任意指定两个节点分别为起点和终点,编程查找输出两个节点之间的最小距离;

8.编程查找某个字符组成的二叉树中,是否存在两个相同的节点
例如:存在两个节点值都是“c”

9.某个图像通过一个整数组成的n*n矩阵表示,其中每个整数表示一个像素值。写出一种方法, 根据flag变量的值将图像向右或者向左旋转90°。如果flag值为0,则向左旋转,如果flag为1,则向右旋转。函数rotatePictureMethod的输入分别由矩阵matrix、矩阵的维度n以及flag的值组成。函数应返回一个指向二维矩阵指针,该矩阵是按照flag值旋转后的结果矩阵而动态分配的。
示例:
如果标志flag=1且m=3,n=3,
输入矩阵
1 2 3
4 5 6
7 8 9
输出矩阵
7 4 1
8 5 2
9 6 3

#include<stdio.h>
#include<stdlib.h>

void BuildArray(int n,int ***p)
{
    
    
	int i;
	*p=(int **)malloc(n*sizeof(int));
	for(i=0;i<n;++i)
	{
    
    
		(*p)[i]=(int *)malloc(n*sizeof(int));
	}//for
}//BuildArray,为矩阵分配空间

int **rotatePictureMethod(int **matrix,int n,int flag)
{
    
    
	int **rotatedMatrix;
	int i,j;//临时变量
	
	BuildArray(n,&rotatedMatrix);//为rotatedMatrix矩阵分配空间

	if(flag==0)
	{
    
    
		for(i=0;i<n;++i)
		{
    
    
			for(j=0;j<n;++j)
			{
    
    
				rotatedMatrix[i][j]=matrix[j][n-i-1];
			}//for
		}//for
	}//if,左旋
	else if(flag==1)
	{
    
    
		for(i=0;i<n;++i)
		{
    
    
			for(j=0;j<n;++j)
			{
    
    
				rotatedMatrix[i][j]=matrix[n-j-1][i];
			}//for
		}//for
	}//if,右旋

	return rotatedMatrix;
}//rotatePictureMethod,旋转

int main()
{
    
    
	int n=0;//矩阵阶数
	int **matrix,**rotatedMatrix;//rotatedMatrix用来接收返回的数组指针
	int i,j;//临时变量
	int flag;//旋转控制

	printf("输入阶数n:");
	scanf("%d",&n);	//输入阶数

	BuildArray(n,&matrix);//为matrix矩阵分配空间

	printf("输入矩阵matrix:\n");
	for(i=0;i<n;++i)
	{
    
    
		for(j=0;j<n;++j)
		{
    
    
			scanf("%d",&matrix[i][j]);
		}//for
	}//for,为matrix矩阵赋值
	printf("输入旋转控制量flag:");
	scanf("%d",&flag);//输入旋转控制量

	rotatedMatrix=rotatePictureMethod(matrix,n,flag);

	for(i=0;i<n;++i)
	{
    
    
		for(j=0;j<n;++j)
		{
    
    
			printf("%d\t",rotatedMatrix[i][j]);
		}//for
		printf("\n");
	}//for,输出旋转后矩阵

	system("pause");//暂停

	return 0;
}//main

猜你喜欢

转载自blog.csdn.net/lixiaohulife/article/details/104887526