沈阳师范大学期末考试复习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.mzph.cn/news/182276.shtml

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

相关文章

Linux下文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 &#xff1a;打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符&#xff08;整形值 索引到磁盘文件&#xff09;…

AI4S Cup学习赛-中枢神经系统药物研发:药物筛选与优化

赛题介绍 链接&#xff1a;Bohrium 案例广场 (dp.tech) 中枢神经系统类疾病长期以来存在着重要的临床未满足需求。据统计&#xff0c;在当前人口老龄化趋势下&#xff0c;阿兹海默&#xff08;AD&#xff09;、帕金森病&#xff08;PD&#xff09;等神经退行性疾病和脑癌、中…

echarts图表显示不全

图表显示是显示了&#xff0c;但是没有展示全部&#xff0c;一看控制台div的高度只有1px了&#xff0c;手动修改高度也只是拉伸图表&#xff0c;并没有按规定的尺寸展示 随之开始思考为什么呢 ? ? ? 因为 Echarts 的依赖是惰性的&#xff0c;需要手动设置resize&#xff0…

《软件工程原理与实践》复习总结与习题——软件工程

软件生命周期 软件生命周期分为三个时期、八个阶段 软件定义时期&#xff1a; 1&#xff09;问题定义阶段&#xff1a;要解决什么问题 2&#xff09;可行性研究阶段&#xff1a;确定软件开发可行 3&#xff09;需求分析阶段&#xff1a;系统做什么 软件开发时期&#xff1a;…

单片机霍尔测速系统设计+源程序

一、系统方案 1、本设计采用52单片机作为主控器。 2、霍尔测速送到液晶1602。 3、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void lcd_init()//液晶初始化函数* { write_1602com(0x38);//设置液晶工作模式&#xff0c;意思…

嵌入式八股 | 校招秋招 | 笔试面试 | 精选题目

欢迎关注微信公众号【赛博二哈】获取八股PDF 并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公司岗位、笔面难题、offer选择、薪资爆料等 嵌入式…

利用数据库的表,生成word文档的表结构注释说明

文章目录 1.场景说明2.解决办法3.生成文档3.1.实现思路3.2.引入Apache POI依赖3.3.获取表及表字段说明Mapper3.4.POI创建文档表格&#xff0c;并填充数据3.5.完整的接口下载代码3.6.效果展示 1.场景说明 在项目中表已经建立好了&#xff0c;但是现在想对外提供一个表的字段的描…

物联网开发(一)新版Onenet 基础配置

onenet新创建的账号&#xff0c;没有了多协议接入&#xff0c;只有新的物联网开放平台 第一讲&#xff0c;先给大家讲一下&#xff1a;新版Onenet 基础配置 创建产品 产品开发-->创建产品 产品的品类选择个&#xff1a;大致符合你项目的即可&#xff0c;没有影响 选择智…

watch函数与watchEffect函数

watach函数&#xff1a; 与vue2.x的配置功能一致 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次 通过配置deep为true, 来指定深度监视 watchEffect函数&#xff1a;…

企业人力资源公司抖音直播招聘断播怎么处理?

企业人力资源公司抖音直播招聘断播怎么处理&#xff1f; 最直接的处理方式就是进行抖音直播招聘报白&#xff0c;报白后在直播和视频中发布招聘和企业信息&#xff0c;不用担心被封禁和限制流量。 可以通过抖音直播进行招聘&#xff0c;也可以在视频中添加小程序&#xff0c;…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

ChatGPT成了背锅侠:利用AI做蹭热点视频

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在抖音\视频号上已经有很多人利用ChatGPT做热点视频的案例了&#xff0c;视频都是点赞大几千、几万。看完本文&#xff0c;你会略知一二&#xff0c;如下图所示&#xff1a; 这个视频&#xff0c…

Windows安装Docker、自定义安装目录

目录 前言一、Docker安装包下载二、自定义Docker安装路径、设置到其他盘三、安装Docker四、安装后配置1.修改镜像保存路径2.自定义镜像源&#xff08;可选&#xff09; 五、Docker运行验证1.docker/welcome-to-docker2.MySQL服务 总结 前言 Docker是一种开源的容器化平台&…

预付费远传水表好用还是后付费远传水表好用?

在远传水表市场中&#xff0c;预付费远传水表和后付费远传水表各自具有一定的优势和劣势。接下来&#xff0c;小编就来为大家讲下两者的优劣势&#xff0c;以此来判断到底是预付费远传水表好用还是后付费远传水表好用。 一、预付费远传水表 1.优点 (1)先付费后用水&#xff1a;…

Proteus的网络标号与总线

Proteus为了减少过多、复杂的连线&#xff0c;可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号&#xff0c;意味着在Proteus上相同的网络标号是连在一起的&#xff0c;所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…

Echarts的引入使用

ECharts文档 1.下载并引入Echarts 2.准备一个具备大小的DOM容器 3.初始化echarts实例对象 4.指定配置项和数据(option) 5.将配置项设置给echarts实例对象 最后是一个js文件 echarts的引入 1.引入echarts - js 文件 <script src"js/echarts.min.js"></scri…

Git和Git小乌龟安装

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。它最初是由Linux Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git具有速度、…

国密加密工业路由器 数据安全升级

国密加密工业路由器&#xff0c;简称国密加密路由器&#xff0c;是指遵循“商用密码管理规范”中规定的国家商用密码算法&#xff0c;采用国密加密芯片和密码算法的专业路由器。相比-般路由器&#xff0c;国密加密路由器具有更高级别的加密保护&#xff0c;可以有效提高数据传输…

Python---练习:求某同学成绩的总分及平均分

需求&#xff1a; 已知某同学的语文(70)、数学(90) 、英语(80)、历史(75)、地理(85)五门课的成绩,编程求该同学的总分以及平均分。 思考&#xff1a; 要求是算总分和平均分&#xff0c;先看总分&#xff0c;已经知道了各科成绩&#xff0c;那么可以用把成绩赋值给每个学科的…

PAT-10道题

PAT算法刷题 1002 1002 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; l…