沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析

前言:临近期末,接下来给大家分享一些经典的编程题,方便大家复习。不一定难,但都是入门的好题,尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。

对于一些语言我是用c++来写的,不妨碍理解,大家把cin,getline看作是c语言中的scanf,把cout, 看作是c语言中的printf ,把#include<bits/stdc++.h>看作是c的头文件。

循环:

第一题:求满足条件的斐波拉契数:

2dae3c6e949b45a08fb33b114f3ce0dc.png

分析:为什么上这道题,不是因为难而是因为,有一年考到过斐波拉契函数,所以记下来就好,没什么好说的

#include<stdio.h>
int fib(int n);
int main() {int i, n;scanf("%d", &n);//输入数for (i = 1;; i++) //让i来自增遍历所有斐波拉契数{if (fib(i) > n) {printf("%d", fib(i));break;//一旦大于就跳出循环}}return 0;
}
int fib(int n) //斐波拉契函数
{if (n <= 2) {return 1;}else {return fib(n - 1) + fib(n - 2);}
}

第二题:求n以内最大k个素数以及他们的和

 

77401e6470fd42988499df9c7bd9c64b.png

思路:首先要输出不超过n的最大的k个素数,我们就先从n-1开始遍历,然后看输出的格式,肯定要定义一个数组arr来存放这些数字,但数目又是有限的,所以每得到一个素数,k就要减一,当k为0的时候跳出循环,这样思路打开了,然后最后输出的时候注意一下格式,最后一个数字不用输出+,就OK了。

 

410bb516b686402c8198020155a33174.png

 

第三题:英文字母替换加密

c0606f0450504aad8ac80c1ced18f91a.png

 

思路:

按步就班,这里我用c++实现,大家用c语言也是一个原理,大家可以定一个字符数组然后用scanf

读取,和

string str;
getline(cin, str);

本质是一样,然后呢,求字符串长度len可以用strlen库函数来实现,cout大家就换成printf输出,在判断是否是字母的语句可以换成用逻辑符号判断,即在首字母和末尾字母的区间里面,然后变成大写的可以换成str[i]-32来实现,变成大写也是同理。总体的思路就是先遍历,然后判断每一个字符是不是字母,如果是那么是大写还是小写,如果不是那么就不动自动输出。

#include<bits/stdc++.h>
using namespace std;
string newstr(string str);
int main()
{string str;getline(cin, str);str = newstr(str);cout << str;return 0;
}
string newstr(string str)
{int len = str.size();for (int i = 0; i < len; i++){if (isalpha(str[i]))//是字母{if (islower(str[i]))//shi xiao xie {str[i] = toupper(str[i]);if (str[i] == 'Z'){str[i] = 'A';}elsestr[i]++;}else{str[i] = tolower(str[i]);if (str[i] == 'z'){str[i] = 'a';}elsestr[i]++;}}}return str;
}

 

第四题:查验身份证

8965e881f0e14349a8e6bc05d9a64997.png

 

思路:这道题相对来说还是比较难,一般人写不出除非你是二班的人。

写法还是一个,那就是读懂题意见招拆招。首先身份证不合格有两种一种是前十七个字符有字母另外一种就是第十八位字符为错误。并且要理解加权的意思,最终我们要和验证码来比较,我们可以验证码弄一个数组,把验证码数组的下标当成我们加权求和然后%11的结果来比较是否相同。细节的地方就是在求和的时候,因为sfz是字符数组要减去'0'才是我们计算的数字。

#include<bits/stdc++.h>
using namespace std;
int main()
{char str[11] = { '1','0','X','9','8','7','6','5','4','3','2' };//验证吗char sfz[18];int jq[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };int n, sum = 0;cin >> n;int n1 = n;int flag = 0;while (n--){//cin.getline(sfz, 18);//输入身份证cin >> sfz;sum = 0;for (int i = 0; i < strlen(sfz)-2; i++)//{if (!(isdigit(sfz[i])))//说明存在字母{cout << sfz << endl;break;}else//不存在字母,则计算加权和{sum += jq[i] * (sfz[i] - '0');}}if (sfz[17] != str[sum % 11]){cout << sfz << endl;;}elseflag++;}if (n1 == flag){cout << "All passed";}return 0;
}

 

数组:

第一题:

a1b52a6f80794575ad2f4b184717b004.jpeg

 

思路:里面的sort你可以换成冒泡排序也是一样的做法,cin你换成scanf,cout换成printf。整体的思路你应该看的明白,注意每一次算一个人的成绩时,要把sum归0,不然就会多算,然后就是要输出,单科平均成绩最大及序号,没必要多开数组,总成绩最大,单科平均就最大,人数都是一样的,然后定义个变量记录下来就ok了

 

f876aed611c341218f5a349d93e460a3.png

 

8bfa556eb10c446d8159df2c2c4521ed.png

第二题:字符串字母大小写转换668fd12c0e9a408d8bbae754b8f381c3.png

思路:明白大小写转化之间的关系,这里c实现和c++实现都给大家呈现,

 

#include<stdio.h>
#include<string.h>
int main() {char s[100];scanf("%s",s);for(int i = 0; s[i] != '#'; i++) {if (s[i] >= 'A' && s[i] <= 'Z') {s[i] += 32;}else if (s[i] >= 'a' && s[i] <= 'z') {s[i] -= 32;}}for (int i = 0; s[i] != '#'; i++) {printf("%c",s[i]);}return 0;
}

c++:

#include<bits/stdc++.h>
using namespace std;
int main()
{string s;for (int i = 0; s[i] != '#'; i++){if (islower(s[i]))s[i] = toupper(s[i]);else if (isupper(s[i]))s[i] = tolower(s[i]);}for (int i = 0; s[i] != '#'; i++) {printf("%c", s[i]);}return 0;
}

第三题:统计一行文本的单词个数

31000277b4e24b76bb203da6d9607f10.png

这个题要考虑的情况也不少,可能开头就有空格,这里给大家介绍一种简洁的方式istringstream 在这段代码中的作用是将输入的字符串 line 转换为字符串流对象 iss,然后我们可以使用 iss 从中逐个读取单词并进行处理。并且不会将空格读入

#include<bits/stdc++.h>
using namespace std;
int main()
{string line;getline(cin, line);istringstream iss(line);int count = 0;string word;while (iss >> word){count++;}cout << count << endl;return 0;
}

 

第四题:求整数序列中出现次数最多的数

6e8ce8841e664806840f07dbf2864c87.png

思路:这题没什么说的,按部就班。用一个计数器,出现一次加一次,两次遍历,如果比最大的次数大就更新。

#include<stdio.h>
int main()
{int n,i,j;scanf("%d",&n);int a[10000];int count=0;int max=0,maxcount=0;for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++){for(j=0;j<n;j++){if(a[i]==a[j])count++;}if(count>maxcount){maxcount=count;max=a[i];}count=0;}printf("%d %d",max,maxcount);return 0;
}

第五题:交换最小值和最大值

e86b8c5971d04c73962cec17dda717ed.png

思路:一步步实现,代码大家应该看得懂,看不懂的留言。这是最朴实无华的写法了

#include<stdio.h>
int main()
{int n=0;int a[10]={0};int max=0;int min=0;int t=0;scanf("%d",&n);//将所有数字存入数组a中 for (int i=0;i<n;i++){scanf("%d",&a[i]);}//找出数组a中最小的元素:元素大小比较,找到小的哪个,将下标值赋给min。循环之后a[min]就是数组a中最小的 for(int i=1;i<n;i++){if(a[i]<a[min]){min=i;}}//将数组a中最小的元素与a[0]交换位置 t=a[min];a[min]=a[0];a[0]=t;//重复上述操作,找到最大值 for(int i=1;i<n;i++){if(a[i]>a[max]){max=i;}}//将最大值与元素数组最后一个交换位置 t=a[max];a[max]=a[n-1];a[n-1]=t;//遍历并打印数组a的元素 for(int j=0;j<n;j++){printf("%d ",a[j]);}return 0;} 

第六题:求矩阵各行元素之和

a323e60dd85047beadc65a1910bb2a3b.png

 

#include <stdio.h>int main(){int m, n;do{scanf("%d %d", &m, &n);}while( m<1 || n>6  );    // 确保m,n的范围int mat[m][n];  // 定义矩阵for( int i=0; i<m; i++ ){int sum = 0;for( int j=0; j<n; j++ ){scanf(" %d", &mat[i][j]);    // 输入数据sum += mat[i][j];    // 输入数据的同时累计一行的和}printf("%d\n", sum);}return 0;
}

函数:

第一题:杨辉三角形

a7132365e2fd420f938a62747d44228f.png

 

fff8dd9d33284ad0b5cd2827940378d7.png思路:要写这个还是要知道这个杨辉三角怎么构成,第一行第一个和每行最后一个都是1,然后中间的项存在a[i][j]=a[i-1][j]+a[i-1][j-1]的规律

void fun(int a[N][N], int n)
{for (int i = 0; i < n; i++){a[i][0] = 1;a[i][i] = 1;for (int j = 1; j < i; j++){a[i][j] = a[i - 1][j] + a[i - 1][j - 1];}}
}

第二题:歌词比赛打分

c4f714b79f8841d9b04135a34e545e65.png思路:还是要知道指针的一些知识,p+i表示指针所指向的对象,看不明白的可以看我指针的博客,复习一下再来整

思路:先找最高然后找最低,用总的减去,然后除总个数减2,
double getScore(int* score, int total)
{double max = -1, min = 101, sum = 0;for (int i = 0; i < total; i++){sum += *(score + i);if (*(score + i) > max){max = *(score + i);}if (*(score + i) < min){min = *(score + i);}}return (sum - max - min) / (total - 2);
}

第三题:数据排序

33966c28129344d7b9d5692b7e300a25.png思路:

排序算是一个重点,这里给大家介绍两种简单的排序。

一个冒泡排序一个选择排序,有点迷的可以去学一下

冒泡排序:

void fun(int a[], int  n)
{for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - 1 - i; j++){if (a[j] > a[j + 1]){int temp=a[j+1];a[j+1]=a[j];a[j]=temp;}}}
}

选择排序:

void  fun(int a[], int  n)
{int i, j, k;for (i = 0; i < n; i++){for (j = 0; j < n; j++){if (a[j] > a[i]){k = a[j];a[j] = a[i];a[i] = k;}}}
}

第四题:近似求PI

340ce99feefc48b4bddda359d00b9b83.png思路:题目看似抽象,其实仔细分析还是好整。观察出通项,然后记得每一项都是在前一项的基础上再乘,接着求和即可。

找通项规律,i/(2*i+1);每一项是在前一项的基础上乘
#include<bits/stdc++.h>
using namespace std;
int main()
{double i = 1;double eps, sum = 1;cin >> eps;double item = 1;while (item >= eps){item = item*1.0 * (i / (2 * i + 1));i++;sum += item;}printf("PI = %.5lf", sum * 2);return 0;
}

第五题:哥德巴赫猜想

87005193aaee4adda129f038c1e45e4c.png思路:这个题之前讲过,再次搬出来说明它的重要性。这个题其实就是素数的那道题的变式,关键是分解成最小的素数,所以你从2开始遍历,找到最小的就用n-最小的,得到另外一个数,如果这个数也是素数则符合条件跳出

4cdfd6a6531740b7aff62ead6d033f91.png

第六题:Jack cheng的烦恼3

2fadbcd3ea2649f1ab057684c079f8e7.png

 

思路:道题也是素数的一个变式,你只需要把n的每一位数提取出来,求和,然后判断是否为素数即可

35f9213fe6064388987c21c898330350.png指针:

第一题:字符串的连接

06db103ef53f4a489307bb954b2638c2.png思路:

先让指针s自增,直到他指向\0,然后开始赋值,最后别忘了把\0填上去

//连接两个字符串,思路就是s接受的是str1的地址,t接受的是str2的地址,那么要把t赋值到s的末端,只需
//指向str1的指针s自增到/0的位置,然后把str2赋给str1,同时两种指针向后移动
//char* str_cat(char* s, char* t)
//{
//	char* p = s;
//	while (*s != '\0')
//	{
//		s++;
//	}
//	//出循环的时候s指向的是/0位置
//	//开始把str2赋给str1;
//	int i = 0;
//	while (*(t+i) != '\0')
//	{
//		*(s+i) = *(t+i);
//		i++;
//	}
//	*(s + i) = '\0';
//	return p;
//}

第二题:删除字符串中数字字符

ff9103d0056e471481433131ea9df83a.png

思路:

首先要求得字符串的长度,然后开始遍历,判断是否是数字字符,如果是,就记录当前的位置,将后续的字符往前移动,最后要把i--,原因就是当移动完之后如果不减的话回到循环体i++之后会指向下一个位置,这个时候如果有连续的数字字符,就跳过了这个情况。

void delnum(char* s) {if (s == NULL) {return;}char digit[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };int i = 0;int len = 0;while (*(s + len) != '\0') {len++;  // 获取字符串长度}for (i = 0; i < len; i++) {if (*(s + i) >= '0' && *(s + i) <= '9') {  // 判断是否为数字字符int j = i;while (*(s + j) != '\0') {*(s + j) = *(s + j + 1);  // 将后续字符往前移动j++;}i--;// 需要回退一步,原因就是当是连续字符的时候你回到for循环的时候,你的i又会加1,那么它就不会处理当前的字符,万一当前的字符是数字呢?}}
}

第三题:输出学生成绩

863e116b85e2405686d6d4f15fc7c72f.png

思路:按步就班,注意数据类型,

#include<bits/stdc++.h>
using namespace std;
int main()
{double n, max = -1, min = 101;cin >> n;double sum = 0, avg = 0;int n1 = n;while (n--){int score;cin >> score;sum += score;if (score > max)max = score;if (score < min)min = score;}avg = sum * 1.0 / n1;printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,max,min);return 0;}

第四题:删除字符串中指定字母

225de8cf6f474f89ac52357480d24a9a.png思路:这道题和前面的删除数字字符类似,唯一要注意的就是要将i--,防止指定的字母是连续的状态,

#include <iostream>
#include <cstring>
using namespace std;
int main() {char a[101] = { 0 };char* p = a;scanf("%s", a);int len = strlen(a);int i, j;for (i = 0; i < len; i++) {if (a[i] == 'a') {j = i;while (*(p + j) != '\0') {*(p + j) = *(p + j + 1);j++;}i--;  // 由于删除一个字符,需要将 i 回退一个位置len--;  // 更新字符串长度}}cout << a << std::endl;return 0;
}

第五题:用指针方法求10个数最大和最小值之差

3b5b9a758dd44548a0f3fa0289a21dc7.png思路:很基础的指针题,大家看代码即可

#include<bits/stdc++.h>
using namespace std;
int main()
{int arr[10];int* p = arr;int min = arr[0], max = arr[0];for (int i = 0; i < 10; i++){cin >> *(p + i);if (*(p + i) > max)max = *(p + i);if (*(p + i) < min)min = *(p + i);}cout << "difference value = " << max - min;return 0;
}

然后给大家扩展一下用指针实现冒泡排序

eacc94a13c954dfb813b7556853c31ad.png

 

博主对大家说的话:

最后的最后还是想给大家说,相信在初学的过程中定然会有些吃力与不理解,但可以适当地取舍,先跳过,把在能力范围内的题目先整懂,相信自己一定能整明白,只是时间问题,就像翁恺老师在视频里说我们大家都是一个脑子,你能搞懂的我也能搞懂。其实我开始在做一些题的时候也很吃力,但当你能力慢慢提高之后再回过头来看这个题,以及之前迷糊的题,你会有新的感悟。相信通过以上题目,大家对c语言基础有了新的理解,感谢大家的阅读,期待下次与你见面。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码】考虑区域多能源系统集群协同优化的联合需求侧响应模型(完美复现)

程序名称&#xff1a;考虑区域多能源系统集群协同优化的联合需求侧响应模型 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;风电、光伏发电等波动电源接入比例不断提高&#xff0c;使得区域多能源系统中能量转化和协调能力减弱。基于此&#xff0c;该…

RabbitMQ消息模型之发布订阅Publish-Subscribe

发布订阅模型 Publish/Subscribe 发布订阅模型也称为广播模型&#xff0c;交换机类型需要指定为Fanout&#xff0c;正如从名称中猜到的那样&#xff0c;它是将接收到的所有消息广播到它知道的所有队列中。每个消费者都监听自己的队列&#xff0c;所以同一个消息&#xff0c;会…

GEE 23:基于GEE实现物种分布模型之随机森林法

基于GEE实现物种分布模型之随机森林法 1.物种分布数据2.研究区绘制3.预测因子选择 1.物种分布数据 根据研究目的和需要导入物种数据&#xff1a; // Load presence data var Data ee.FeatureCollection("users/************736/Distribution"); print(Original da…

c语言十进制转二进制

以下是一个将十进制数转换为二进制数的C语言代码示例&#xff1a; #include <stdio.h>void decimal_to_binary(int decimal) { int binary[32]; int i 0; while (decimal > 0) { binary[i] decimal % 2; decimal / 2; i; } pr…

【C++】string类的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

vue+springboot读取git的markdown文件并展示

前言 最近&#xff0c;在研究一个如何将我们git项目的MARKDOWN文档获取到&#xff0c;并且可以展示到界面通过检索查到&#xff0c;于是经过几天的摸索&#xff0c;成功的研究了出来 本次前端vue使用的是Markdown-it Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 …

EZDML基本介绍

一、表结构设计器(EZDML) 这是一个数据库建表的小软件&#xff0c;可快速的进行数据库表结构设计&#xff0c;建立数据模型。类似大家常用的数据库建模工具如PowerDesigner、ERWIN、ER-Studio和Rational-Rose等的超级精简版。 官方下载地址&#xff1a;http://www.ezdml.com/d…

archery修改为不能自提自审核上线SQL

目录 背景修改代码效果参考 背景 我和同事都可以提交上线SQL&#xff0c;但是不能自己提交的SQL自己去审核通过。目前的情况是可以自提自审。 修改代码 找到/opt/archery/sql/utils/workflow_audit.py文件 ...省略...# 判断用户当前是否是可审核staticmethoddef can_revie…

【测试开发】web自动化测试框架需求设计 !

1、实现目的 基于BS架构&#xff0c;模拟用户&#xff08;鼠标、键盘&#xff09;操作&#xff0c;达到快速、重复执行测试用例&#xff1b; 便于回归测试&#xff0c;快速覆盖主线用例或功能&#xff1b; 线上或线下巡检测试&#xff0c;结合持续集成&#xff0c;及时发现运…

对二分搜索的理解 Go语言版

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快&#xff1f;&#xff08;应届&#xff09; ①redis是纯内存结构&#xff0c;避免磁盘I/O的耗时 ②redis核心模块是一个单进程&#xff0c;减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制&#xff08;每一个执行线路可以同时完…

ESP32-Web-Server编程- JS 基础 3

ESP32-Web-Server编程- JS 基础 3 概述 本示例演示通过 button 控件的 onclick 内联属性&#xff0c;实现在网页上点击按钮&#xff0c;切换 LED 灯图标的转变。 示例解析 前端设计 前端代码建立了一个 id 为 “imageLamp” 的图片对象。并建立两个按钮&#xff0c;设计两…

Python逻辑运算符及其用法

逻辑运算符用于操作 bool 类型的变量、常量或表达式&#xff0c;逻辑运算的返回值也是 bool 值。 Python 的逻辑运算符有如下三个&#xff1a; and&#xff1a;与&#xff0c;前后两个操作数必须都是 True 才返回 True&#xff1b;否则返回 False。 or&#xff1a;或&#x…

SpringBoot 2 系列停止维护,Java8 党何去何从?

SpringBoot 2.x 版本正式停止更新维护&#xff0c;官方将不再提供对 JDK8 版本的支持 SpringBoot Logo 版本的新特性 3.2 版本正式发布&#xff0c;亮点包括&#xff1a; 支持 JDK17、JDK21 版本 对虚拟线程的完整支持 JVM Checkpoint Restore&#xff08;Project CRaC&…

0005Java程序设计-ssm基于微信小程序的校园求职系统

文章目录 摘 要目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据…

工艺系统所管理数字化实践

摘要 本文介绍了上海核工程设计研究院在数字化转型方面的实践&#xff0c;包括业务数字化和管理数字化两个方面。业务数字化方面&#xff0c;该院通过开发小工具改进工作流程。管理数字化方面&#xff0c;该院采用零代码平台集中管理管道力学信息相关模型和数据&#xff0c;并…

visionOS空间计算实战开发教程Day 2 使用RealityKit显示3D素材

我们在​​Day1​​中学习了如何创建一个visionOS应用&#xff0c;但在第一个Demo应用中我们的界面内容还是2D的&#xff0c;看起来和其它应用并没有什么区别。接下来我们先学习如何展示3D素材&#xff0c;苹果为方便开发人员&#xff0c;推出了RealityKit&#xff0c;接下来看…

【活动回顾】sCrypt在2023伦敦区块链大会上的精彩表现

2023伦敦区块链大会&#xff0c;是本年度最盛大的比特币及区块链行业活动。大会于2023年5月31日至6月2日&#xff0c;在伦敦女王伊丽莎白二世中心举行&#xff0c;旨在展示BSV区块链的真正潜力。 sCrypt Inc 的创始人兼 CEO 刘晓晖&#xff0c; 作为演讲嘉宾出席了会议。他向大…

前端开发_HTML

简介 CSS用于美化内容 HTML用于摆放内容 可以理解为HTML是基础&#xff0c;CSS是工具 HTML定义 HTML 超文本标记语言——HyperText Markup Language 超文本——链接 标记——标签&#xff0c;即带尖括号的文本 标签语法 双标签 开始标签&#xff1a; <xxx> 即尖…

vue el-table表格中每行上传文件(上传简历)操作

1、HTML中 <el-table :data"formInfo.userListDto" border stripe max-height"400"><el-table-column type"index" label"序号" width"50"> </el-table-column><el-table-column prop"realName&q…