• PTA程序辅助设计平台—2023年软件设计综合实践_4(数组及字符串)


    6-1 找最小元素/选择排序 - C/C++ 数组及字符串

    (找最小元素)对于给定的包含10个元素的整数数组,设计一个函数,从数组给定的下标范围[i,j]里找到值最小的元素,返回其下标。该函数的原型可以是int findMin(int a[], int i, int j),参数int a[]代表被搜索的数组。

    以这个函数为基础,可以演化出一种称之为选择排序的算法。该算法从a[0..N]中找出最小元素并与a[0]交换,然后再从a[1..N]中找出最小元素并与a[1]交换,然后再从a[2..n]中找出最小元素并与a[2]交换,... 最终得到一个递增有序的数组。

    下述程序从键盘读入10个整数,然后使用选择排序算法进行排序并输出。请设计findMin()函数,使得该程序可以正确运行。

    输入样例:

    78 1 7 2 24 35 77 89 10 567
    

    输出样例:

    1,2,7,10,24,35,77,78,89,567
    

    注意:本题只需要提交findMin()函数的定义代码,不要将整个程序提交。

    1. int findMin(int a[], int i, int j) {
    2. int t=i;
    3. for (i; i < j; i++) {
    4. if (a[t] <= a[i + 1]) {
    5. continue;
    6. }
    7. else {
    8. t = i + 1;
    9. }
    10. }
    11. return t;
    12. };

    6-2 字符串匹配 - C/C++ 数组及字符串

    函数findSubStr()用于从以0结尾的字符数组s中查找其子串s1的位置,如果找到,返回起始下标,否则返回-1。

    举例:字符串'tri'在字符串'string'中的起始下标为1;在字符串'tom&jerry'中找不到子串'jack',函数应返回-1。

    请定义上述findSubStr()函数,使得下述程序可以运行并产生正确的执行结果。

    1. int findSubStr(char s[], char s1[]) {
    2. int len_s=strlen(s);
    3. int len_s1=strlen(s1);
    4. for(int i=0;i<len_s-len_s1;i++){
    5. int j;
    6. for(j=0;j<len_s1;j++){
    7. if(s[i+j]!=s1[j]){
    8. break;
    9. }
    10. }
    11. if(j==len_s1) return i;
    12. }
    13. return -1;
    14. };

    7-1 大月与小月 - C/C++ 数组及字符串

    (大月与小月)定义一个长度为12的整数数组days,其中days[i]表示i+1月的天数(平年)。编写一个程序,从键盘读入月份,然后从days数组查得该月天数并打印。

    输入格式:

    月份(1-12)

    输出格式:

    参考输出样例

    输入样例:

    11
    

    输出样例:

    There are 30 days in 11th month.
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. int main()
    4. { int n,i;
    5. int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    6. cin>>i;
    7. n=a[i-1];
    8. cout<<"There are "<<n<<" days in "<< i <<"th month.";
    9. return 0;
    10. }

    7-2 数组累积和 - C/C++ 数组及字符串 

    (数组累积和)对于给定的包含5个元素的浮点数数组a,请编写程序求数组a的累积和数组b,数组b也应包含5个元素,其中b[i]等于sum(a[0..i])。

    输入格式:

    以空格为分隔的5个浮点数

    输出格式:

    对应的累积和数组的值,保留2位小数以逗号分隔,请参考输出样例

    输入样例:

    0.01 0.04 0.20 0.45 0.15
    

    输出样例:

    0.01,0.05,0.25,0.70,0.85
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int main() {
    4. double a[5];
    5. double b[5];
    6. for (int i = 0; i < 5; i++) {
    7. cin >> a[i];
    8. }
    9. b[0] = a[0];
    10. for (int i = 1; i < 5; i++) {
    11. b[i] = a[i] + b[i - 1];
    12. }
    13. printf("%.2f,%.2f,%.2f,%.2f,%.2f", b[0], b[1], b[2], b[3], b[4]);
    14. return 0;
    15. }

     7-3 回文数 - C/C++ 数组及字符串

    数字121从左往右读与从右往左读是一样的,这种数称为回文数。请使用for循环设计一个程序,
    找出>=0并且<=n的全部回文数。

    注意:单个的数字0,数字1,... 数字9也认为是回文数。

    提示:将一个整数转换成一个C风格字符串可以通过sprintf()函数完成。

    输入格式:

    n

    输出格式:

    多行输出,一行一个数

    输入样例:

    13
    

    输出样例:

    1. 0
    2. 1
    3. 2
    4. 3
    5. 4
    6. 5
    7. 6
    8. 7
    9. 8
    10. 9
    11. 11
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int ishuiwen(int a) {
    4. int reserved = 0;
    5. int num = a;
    6. while (num > 0) {
    7. reserved = reserved * 10 + num % 10;
    8. num /= 10;
    9. }
    10. return reserved == a;
    11. }
    12. void print_all(int n) {
    13. for (int i = 0; i <= n; i++) {
    14. if (ishuiwen(i)) {
    15. printf("%d\n", i);
    16. }
    17. }
    18. }
    19. int main() {
    20. int n;
    21. scanf("%d",&n);
    22. print_all(n);
    23. return 0;
    24. }

     7-4 进制转换 - C/C++ 数组及字符串

    (进制转换)从键盘读入一个表示16进制整数的字符串,逐一将全部16进制位乘以其位权并求和,将该字符串转换成整数并按10进制输出其值。

    输入格式:

    符合十六进制格式要求的字符串

    输出格式:

    对应的十进制整数值

    输入样例:

    7Ba1
    

    输出样例:

    31649

     

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int trans(char a[]) {
    4. int len_a = strlen(a);
    5. int t=0;
    6. int wei=0;
    7. int base = 1;
    8. for (int i = len_a-1; i >=0; i--) {
    9. if (a[i] >= '0' && a[i] <= '9') {
    10. wei = a[i] - '0';
    11. }
    12. else if (a[i] >= 'A' && a[i] <= 'F') {
    13. wei = a[i] - 'A' + 10;
    14. }
    15. else if (a[i] >= 'a' && a[i] <= 'f') {
    16. wei = a[i] - 'a' + 10;
    17. }
    18. t += wei * base;
    19. base *= 16;
    20. }
    21. return t;
    22. }
    23. int main() {
    24. char a[100];
    25. cin >> a;
    26. cout << trans(a);
    27. return 0;
    28. }

     7-5 凯撒密码 - C/C++ 数组及字符串

     

    (凯撒密码)是一个简单的替换加密技术,它简单地将明文字符串中的全部字母在字母表上偏移n项。当n大于0时,表示向后偏移,小于0则表示向前偏移。当n为2时,字母A变C,c变e,y变a, Z变B;当n为-2时,字母A变Y,c变a,y变w,Z变X。请编写程序,依次读入明文字符串及整数偏移量n,然后输出加密后的密文字符串。提示:C语言可用gets()函数,C++语言可用getline()函数读入整行字符串。

    输入样例:

    1. No One Can Stop Us
    2. 2

    输出样例:

    Encrypted message:Pq Qpg Ecp Uvqr Wu
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. void trans(char line[],int n) {
    4. int len = strlen(line);
    5. char linetrans[100];
    6. n %= 26;
    7. for (int i = 0; i < len; i++) {
    8. if (line[i] >= 'A' && line[i] <= 'Z') {
    9. if (line[i] - 'A' + n>=0&&line[i] - 'A' + n < 26)
    10. linetrans[i] = line[i] + n ;
    11. else
    12. linetrans[i] = line[i] + n - 26;
    13. }
    14. else if (line[i] >= 'a' && line[i] <= 'z') {
    15. if (line[i] - 'a' + n >= 0 && line[i] - 'a' + n < 26)
    16. linetrans[i] = line[i] + n ;
    17. else
    18. linetrans[i] = line[i] + n - 26;
    19. }
    20. else {
    21. linetrans[i] = line[i];
    22. }
    23. cout<<linetrans[i];
    24. }
    25. return ;
    26. }
    27. int main() {
    28. char line[100];
    29. int n;
    30. cin.getline(line,100);
    31. cin >> n;
    32. cout << "Encrypted message:";
    33. trans(line, n);
    34. return 0;
    35. }

     7-6 矩阵运算 - C/C++ 数组及字符串

    读入一个正整数n(1≤n≤20),再读入n行n列共n²个整数并存入由二维数组表示的方阵m;计算并输出每一行的元素和;计算并输出每一列的元素和;计算并输出对角线上的元素和(即所有m[i][i]的和, i取0~n-1)。

    输入样例:

    1. 3
    2. 1 2 3
    3. 4 5 6
    4. 7 8 10

    输出样例:

    1. sum of row 1 = 6.
    2. sum of row 2 = 15.
    3. sum of row 3 = 25.
    4. sum of column 1 = 12.
    5. sum of column 2 = 15.
    6. sum of column 3 = 19.
    7. sum of elements on the diagonal = 16.
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int n;
    4. int firm[20][20];
    5. void acum(int n, int firm[][20]) {
    6. int sum = 0;
    7. for (int i = 0; i < n; i++) {
    8. sum = 0;
    9. for (int j = 0; j < n; j++) {
    10. sum += firm[i][j];
    11. }
    12. cout << "sum of row " << i + 1 << " = " << sum << "." << endl;
    13. }
    14. for (int i = 0; i < n; i++) {
    15. sum = 0;
    16. for (int j = 0; j < n; j++) {
    17. sum += firm[j][i];
    18. }
    19. cout << "sum of column " << i + 1 << " = " << sum << "." << endl;
    20. }
    21. sum = 0;
    22. for (int i = 0; i < n; i++) {
    23. sum += firm[i][i];
    24. }
    25. cout << "sum of elements on the diagonal = " << sum << ".";
    26. return;
    27. }
    28. int main() {
    29. cin >> n;
    30. for (int i = 0; i < n; i++) {
    31. for (int j = 0; j < n; j++) {
    32. cin >> firm[i][j];
    33. }
    34. }
    35. acum(n, firm);
    36. return 0;
    37. }

     7-7 百钱买百鸡 - C/C++ 数组及字符串

    我国古代数学家张丘建在《算经》一书中提出了下述数学问题:
    鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

    请使用三重或者二重循环求解N块钱买N只鸡的问题:计算并输出所有可行的解(须按公鸡,母鸡,小鸡递增排序),以及全部可行解的数量。

    输入格式:

    整数N

    输出格式:

    公鸡数,母鸡数,小鸡数 (第1个可行解)
    公鸡数,母鸡数,小鸡数 (第2个可行解)
    ...
    公鸡数,母鸡数,小鸡数 (最后1个可行解)
    Solution count: 可行解个数.

    输入样例:

    100
    

    输出样例:

    1. 0,25,75
    2. 4,18,78
    3. 8,11,81
    4. 12,4,84
    5. Solution count: 4.
    1. #include <iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int n;
    6. cin>>n;
    7. int sum=0;
    8. for(int i=0;i<n/5;i++)
    9. {
    10. for(int j=0;j<n/3;j++)
    11. {
    12. for(int r=0;r<n*3;r+=3)
    13. {
    14. (i+j+r==n&&5*i+3*j+r/3==n)?(sum++):1;
    15. (i+j+r==n&&5*i+3*j+r/3==n)?(printf("%d,%d,%d\n",i,j,r)):1;
    16. }
    17. }
    18. }
    19. cout<<"Solution count: "<<sum<<"."<<endl;
    20. return 0;
    21. }

     7-8 最长对称子串

    对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

    输入格式:

    输入在一行中给出长度不超过1000的非空字符串。

    输出格式:

    在一行中输出最长对称子串的长度。

    输入样例:

    Is PAT&TAP symmetric?
    

    输出样例:

    11
    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. int longestPalindrome(string s) {
    5. int n = s.length();
    6. int maxLength = 1;
    7. int start = 0;
    8. bool dp[n][n] = {false};
    9. // 所有长度为1的子串都是对称的
    10. for(int i = 0; i < n; i++)
    11. dp[i][i] = true;
    12. // 判断长度为2的子串是否对称
    13. for(int i = 0; i < n - 1; i++) {
    14. if(s[i] == s[i + 1]) {
    15. dp[i][i + 1] = true;
    16. maxLength = 2;
    17. start = i;
    18. }
    19. }
    20. // 判断长度大于2的子串是否对称
    21. for(int k = 3; k <= n; k++) {
    22. for(int i = 0; i < n - k + 1; i++) {
    23. int j = i + k - 1;
    24. if(dp[i + 1][j - 1] && s[i] == s[j]) {
    25. dp[i][j] = true;
    26. if(k > maxLength) {
    27. maxLength = k;
    28. start = i;
    29. }
    30. }
    31. }
    32. }
    33. return maxLength;
    34. }
    35. int main() {
    36. string str;
    37. getline(cin, str);
    38. int result = longestPalindrome(str);
    39. cout << result << endl;
    40. return 0;
    41. }

     

     

     

     

  • 相关阅读:
    全国大学生电子设计竞赛参赛分享
    Java 第三阶段增强分析需求,代码实现能力【多用户即时通信系统】
    Cilium 系列-2-Cilium 快速安装
    华为云云耀云服务器L实例评测|docker私有仓库部署手册
    segment方案解决VXLAN分布式网关DCI间互联
    mysql面试题7:MySQL事务原理是什么?MySQL事务的隔离级别有哪些?
    直方图均衡化算法
    【CVPR2022】VizWiz-VQA Grounding Challenge冠军算法介绍--Aurora
    蓝桥杯python考级整理
    商业化广告--体系学习-- 7 -- 行业蓝图篇 --广告产品发展路径
  • 原文地址:https://blog.csdn.net/qq_65628600/article/details/133828906