华南师大19级软件学院专硕上机题

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

#include <iostream>
using namespace std;

//方法一:for循环
int method1(int n) {
	int k = 1;
	int answer = 1;
	for (; k <= n; k++) {
		answer *= k;
	}
	return answer;
}

//方法二:递归
int method2(int n) {
	if (n == 1) {
		return 1;
	}
	else {
		return n * method1(n - 1);
	}
}



int main() {
	int n;
	cout << "请输入n:";
	cin >> n;
	int answer1 = method1(n);
	cout << "for循环得到的结果:" << answer1 << endl;
	int answer2 = method2(n);
	cout << "递归得到的结果:" << answer2 << endl;
	return 0;
}

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

#include <iostream>
using namespace std;

int main() {
	int num[3][3];
	for (int i = 0; i < 3; i++) {
		cout << "请输入第" << i + 1 << "行元素:";
		for (int j = 0; j < 3; j++) {
			cin >> num[i][j];
		}
	}

	int sum1 = 0, sum2 = 0, sum3 = 0;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			sum1 += num[i][j];			//sum1计算所有元素之和
			if (i == j) {
				sum2 += num[i][j];		//sum2计算主对角线元素之和
			}
			if ((i + j) == 2) {
				sum3 += num[i][j];		//sum3计算逆对角线元素之和
			}
		}
	}

	cout << "所有元素之和:" << sum1 << endl;
	cout << "主对角线元素之和:" << sum2 << endl;
	cout << "逆对角线元素之和:" << sum3 << endl;
}

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

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
	int num[20];
	srand((int)time(NULL));			//生成随机种子 
	for (int i = 0; i < 20; i++) {
		num[i] = rand() % 100 + 1;	//生成1~100的随机数
	}

	cout << "交换前的序列:";
	for (int i = 0; i < 20; i++) {
		cout << num[i] << " ";		//打印交换前的序列
	}
	cout << endl;
	
	
	int minIndex = 0, maxIndex = 0;
	for (int i = 0; i < 20; i++) {
		if (num[i] < num[minIndex]) {		//遍历寻找最大值和最小值
			minIndex = i;
		}
		if (num[i] > num[maxIndex]) {
			maxIndex = i;
		}
	}

	int temp = num[0];
	num[0] = num[minIndex];					//交换最小值
	num[minIndex] = temp;

	temp = num[19];
	num[19] = num[maxIndex];				//交换最大值
	num[maxIndex] = temp;

	cout << "交换后的序列:";
	for (int i = 0; i < 20; i++) {
		cout << num[i] << " ";				//打印交换后的序列
	}
}

四、字符串匹配(KMP算法)

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

//kmp算法
int kmp(string str, string pattern, int next[]) {
	int i = 0, j = 0;
	int n = str.length();
	int m = pattern.length();
	while (i < n && j < m) {
		if (j == -1 || str[i] == pattern[j]) {
			i++;
			j++;
		}
		else {
			j = next[j];
		}
	}
	if (j == m) {
		return i - m;
	}
	else {
		return -1;
	}
}

//获得next数组
void getnext(string pattern, int next[]) {
	int m = pattern.length();
	int j = 0, k = -1;
	next[0] = -1;
	while (j < m) {
		if (k == -1 || pattern[j] == pattern[m]) {
			j++;
			k++;
			next[j] = k;
		}
		else {
			k = next[k];
		}
	}
}

int main() {
	string str = "I love you";
	string pattern = "love";
	int next[100];
	getnext(pattern, next);
	int answer = kmp(str, pattern, next);
	if (answer != -1) {
		cout << "第一次出现的位置:" << answer;
	}
	else {
		cout<<"匹配失败";
	}
}

五、身份证15位变18位

背景:1985年起我国实行居民身份证制度。当时签发的身份证号码是15位的,第7、8位为出生年份的后两位(如1980年出生的人,7、8位就是80)。由于2000年的到来,1999年起签发的身份证调整为18位。具体调整规则是:在第7-10位改为完整的出生年份,并将原15位身份证第9位之后的数字依次向后平移两位,这样,就得到一串17位的数字(例如:340524800101001变为34052419800101001)。18位身份证号中,新增最后一位校验码,校验码的具体计算规则如下图:
在这里插入图片描述
编写一个程序,输入一个15位身份证号,输出转换后的18位身份证号,要求用C++类和对象实现。PS:由于1999年后签发的身份证均为18位,所以无需考虑00后。

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

int main() {
	//权重数组
	int quan[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };

	//校验码数组
	char judge[] = { '1','0','X','9','8','7','6','5','4','3','2' };

	//定义新、旧身份证
	string  oldNum, newNum;

	//输入旧身份证
	cout << "请输入原始的15位身份证号码:";
	cin >> oldNum;

	//初始化新身份证,记得后面要加三个随机数,占满18为,后面好处理。(这里用空格当随机数)
	newNum = oldNum + "   ";

	//按照给的条件先计算出十七位身份证
	for (int i = 14; i >= 0; i--) {
		if (i >= 6) {
			newNum[i + 2] = oldNum[i];
		}
		if (i == 7) {
			newNum[i] = '9';
		}
		if (i == 6) {
			newNum[i] = '1';
		}
		if (i < 6) {
			newNum[i] = oldNum[i];
		}
	}

	//加权求和并对11取余获得校验位
	int sum = 0;
	for (int i = 0; i < 17; i++) {
		sum += (newNum[i] - '0') * quan[i];
	}
	int extra = sum % 11;

	//新身份证添上校验位
	newNum[17] = judge[extra];

	//输出结果
	cout << "新身份证号码:"<<newNum;
	
}

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

#include <iostream>
using namespace std;

int main() {
	/**
		输入第一个、第二个点的坐标,确定一条直线l1
	*/
	double x1, y1;
	double x2, y2;
	cout << "请分别输入第一个点的x,y:";
	cin >> x1 >> y1;
	cout << "请分别输入第二个点的x,y:";
	cin >> x2 >> y2;

	/**
		输入第三个、第四个点的坐标,确定一条直线l2
	*/
	double x3, y3;
	double x4, y4;
	cout << "请分别输入第三个点的x,y:";
	cin >> x3 >> y3;
	cout << "请分别输入第四个点的x,y:";
	cin >> x4 >> y4;


	/**
		计算l1的a,b
	*/
	double a1, b1;
	a1 = (y1 - y2) / (x1 - x2);
	b1 = y1 - x1 * a1;

	/**
		计算l2的a,b
	*/
	double a2, b2;
	a2 = (y3 - y4) / (x3 - x4);
	b2 = y3 - x3 * a2;

	//计算交点坐标
	double answerX = (b1 - b2) / (a2 - a1);
	double answerY = a1 * answerX + b1;

	//输出结果
	cout << "两直线交点为:(" << answerX << "," << answerY << ")";
}

七、双向冒泡排序

#include <iostream>
using namespace std;

void bubbleSort(int num[],int n) {
	for (int i = 0; i < n - 1; i++) {
		bool flag = false;
		for (int j = 0; j < n - i - 1; j++) {
			if (num[j] > num[j + 1]) {
				flag = true;
				int temp = num[j];
				num[j] = num[j + 1];
				num[j + 1] = temp;
			}
		}
		for (int j = n - i - 2; j > 0; j--) {
			if (num[j] < num[j - 1]) {
				flag = true;
				int temp = num[j];
				num[j] = num[j - 1];
				num[j - 1] = temp;
			}
		}
		if (!flag) {
			break;
		}
	}
}
static int num1[10];
int main() {
	const int n = 10;
	
	cout << "请输入排序之前的序列:";
	for (int i = 0; i < n; i++) {
		cin >> num1[i];
	}
	bubbleSort(num1, n);
	cout << "排序后的序列:";
	for (int i = 0; i < n; i++) {
		cout << num1[i] << " ";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值