今日话题:你的c++期末作业怎么救急 doge(
作者是个菜鸟,欢迎读者指正赐教
##高级语言程序设计2-1 作业##
A。字符串旋转
大致思路:1.分成左和右两种情况;2.分成旋转部分和移动部分(记得旋转长度要对总长度取模)3.输出
#include <iostream>
#include<string>
using namespace std;
struct st {
string s;
char a;
int n;
};
int main(void) {
int N;
cin >> N;
st str[20];
for (int i = 0; i < N; i++) {
cin >> str[i].s >> str[i].a >> str[i].n;
str[i].n%= str[i].s.size();
}
for (int i = 0; i < N; i++) {
if (str[i].a == 'L') {
string temp0 = "";//spin
string temp1 = "";//move
int a = str[i].n;
int len = str[i].s.size();
for (int j = 0; j < str[i].n; j++) {
temp0 += str[i].s[j];
}
for (int k = a; k < len; k++) {
temp1 += str[i].s[k];
}
str[i].s = temp1 + temp0;
}
else if (str[i].a == 'R') {
string temp0 = "";//spin
string temp1 = "";//move
int a = str[i].n;
int len = str[i].s.size();
for (int j = len - str[i].n; j < len; j++) {
temp0 += str[i].s[j];
}
for (int k = 0; k < len - str[i].n; k++) {
temp1 += str[i].s[k];
}
str[i].s = temp0 + temp1;
}
for (int j = 0; j<str[i].s.size(); j+=2) {
cout << str[i].s[j]; } cout<< endl;
}
return 0;
}
B。学生结构体
大致思路:对学号的比大小也是一种排序
1.结构体定义
2.冒泡排序
3.不要忘了“error”情况
#include<iostream>
using namespace std;
struct student {
int ID;
char name[50];
double grade[4];//输入123可以直接访问
};
void sort114514(int type, int size,student sum[]) {
for (int i = 0; i < size - 1; ++i) {
for (int j = i+1; j < size; ++j) {
if (sum[j].grade[type] > sum[i].grade[type]) {
student temp = sum[j];
sum[j] = sum[i];
sum[i] = temp;
}
else if (sum[j].grade[type] == sum[i].grade[type]) {
if (sum[i].ID > sum[j].ID) {
student temp = sum[j];
sum[j] = sum[i];
sum[i] = temp;
}
}
}
}
}
int main() {
int n;
cin >> n;
student sum[100];
for (int i = 0; i < n; ++i) {
cin>>sum[i].ID>>sum[i].name>>sum[i].grade[1]>>sum[i].grade[2]>>sum[i].grade[3];
}
int type;
cin >> type;
if ( type != 1 &&type != 2&&type != 3) {
cout << "ERROR";
return 0;
}
sort114514(type, n, sum);
for (int i = 0; i < n; ++i) {
cout << sum[i].ID <<" " << sum[i].name << endl;
}
return 0;
}
C。数组合并
大致思路:这里图个简便,使用了红黑树的特性快速解决。
#include<iostream>
#include<set>
using namespace std;
int main() {
set<int>MYset;
int n,m;
cin >> n >> m;
for (int i = 0; i < n + m; ++i) {
int temp;
cin >> temp;
MYset.insert(temp);
}
for (auto it = MYset.begin(); it != MYset.end(); ++it) {
cout << *it << " ";
}
return 0;
}
D。矩阵运算
大致思路:一个是根据行数确定输出方向
一个是蛇形输出 ,这里使用circle来记录圈数,并将访问过的元素赋值为零来记录是否访问过该元素,在编程时要注意结束循环后需要更新行数和列数。
#include <iostream>
#include<string>
using namespace std;
int main(void) {
int n, m;
cin >> n >> m;
int** N = new int* [n];
for (int i = 0; i < n; ++i) {
N[i] = new int[m];
}
for (int i = 0; i < n; ++i){
for (int j = 0; j < m; ++j){
cin >>N[i][j];
}
}
for (int i = 0; i < n; ++i) {
if (i % 2==1) {
for(int j = m - 1; j > -1; --j) {
cout << N[i][j] << ' ';
}
}
else {
for (int j = 0; j < m; ++j) {
cout << N[i][j] << ' ';
}
}
}
cout << endl;
int circle = 0;
int row = 0, column = 0;
for (int i = 0; i < m * n;) {
switch (circle%4) {
case 0:
for (;column< m && N[row][column] != 0; column++) {
cout << N[row][column] << " ";
N[row][column] = 0;
++i;
}
row++;
column--;//更新
break;
case 1:
for (; row<n && N[row][column] != 0; ++row) {
cout << N[row][column] << " ";
N[row][column] = 0;
++i;
}
row--;
column--;//更新
break;
case 2:
for (; column >-1 && N[row][column] != 0;--column) {
cout << N[row][column] << " ";
N[row][column] = 0;
++i;
}
row--;
column++;//更新
break;
case 3:
for (; row > -1 && N[row][column] != 0;--row) {
cout << N[row][column] << " ";
N[row][column] = 0;
++i;
}
row++;
column++;//更新
break;
}
++circle;
}
return 0;
}
E。距离最近的素数
大致思路:做一个判断素数的函数
左边很特殊,不要忘了不能为负数。
#include<iostream>
#include<vector>
using namespace std;
bool is_prime(int n) {
if (n == 2)return true;
if (n == 1 || n == 0)return 0;
for (int i = 2; i < n; ++i) {
if (n % i == 0)return false;
}
return true;
}
int main() {
int n;
cin >> n;
if (n > 0 && n <= 10000) {
int* k = new int[n];
for (int i = 0; i < n; ++i) {
cin >> k[i];
}
for (int j = 0; j < n; ++j) {
if (0 < k[j] && k[j] < 1000000) {
int lnum = -1, ldis = -1;
for (int i = k[j]; i > 1; i--) {
if (is_prime(i)) {
lnum = i;
ldis = k[j] - i;
break;
}
}
int rnum = 0, rdis = 0;
for (int i = k[j];; i++) {
if (is_prime(i)) {
rnum = i;
rdis = i - k[j];
break;
}
}
if (ldis <= rdis && ldis > 0) {
cout << lnum << " " << ldis << endl;
}
else {
cout << rnum << " " << rdis << endl;
}
}
else {
cout << "INCORRECT INPUT!" << endl;
}
}
delete[]k;
}
else {
cout << "INCORRECT INPUT!" << endl;
}
return 0;
}
F。重载函数
大致思路:能跑就行,我写的很臃肿
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
void OddFliter(int a[], int size) {
vector<int>odd;
for (int i = 0; i < size; ++i) {
if ((a[i] % 2) == 1)odd.push_back(a[i]);
}
if (odd.size() == 0) {
cout << "No Odd!\n";
return;
}
sort(odd.begin(), odd.end());
for (int i = 0; i < odd.size(); ++i) {
cout << odd[i] << " ";
}
cout << endl;
}
void OddFliter(double a[], int size) {
vector<long long> odd;
for (int i = 0; i < size; ++i) {
long long s = round(a[i]);
if (s % 2)odd.push_back(s);
}
if (odd.size() == 0) {
cout << "No Odd!\n";
return;
}
sort(odd.begin(), odd.end());
for (int i = 0; i < odd.size(); ++i) {
cout << odd[i] << " ";
}
cout << endl;
}
void OddFliter(char a[], int size) {
int odd[128] = {};
for (int i = 0; i < size; ++i)odd[a[i]]++;
int temp=0;
for (int i = 0; i < 128; ++i) {
if (odd[i] % 2) {
cout << (char)i << " ";
++temp;
}
}
if (temp == 0) {
cout << "No Odd!\n";
return;
}
cout << endl;
}
int main() {
int n, m;
cin >> n >> m;
int* N = new int[n];
double* M = new double[m];
char Q[1000];
for (int i = 0; i < n; ++i)cin >> N[i];
for (int i = 0; i < m; ++i)cin >> M[i];
cin >> Q;
OddFliter(N, n);
OddFliter(M, m);
OddFliter(Q, strlen(Q));
delete[]N;
delete[]M;
return 0;
}