某名校考研自命题C++程序设计——近10年真题汇总(上)

news/2024/12/15 11:16:21/

本帖更新一些某校的编程真题,总体来说不难,考察的都是基本功,92高校大一期末的难度,不过有些细节颇为繁琐,各位还是需要一定程度上注意的~


目录

一.分数求和

二.大小写字母转换

三.判断当年天序

四.交替合并字符串

五.指针形态的冒泡排序

六.递归方式的倒序输出

七.黑色星期五

八.卡布列克运算

九.只出现一次的字符

十.产生0-1的随机数

一.分数求和

#include <iostream>
using namespace std; 
int main(int argc, char** argv) {int n=0;cin>>n;double answer=0.000;for(int i=1;i<=n;i++){if(i%2!=0)answer+=(1.0/i);elseanswer-=(1.0/i);}cout<<answer<<endl;return 0;
}

过于简单,唯一需要注意的地方是需要用1.0除以第n项的值,如果用1除永远是1,因为整数除不尽!

二.大小写字母转换

复习两个知识点:

1.ASCII码你好意思还没背会? 小写字母反而大,大小相差32,大写A为65,小写a为97——一定要记清楚!

2.在初试考文件已经过时了,要是觉得不保险把这篇帖子的内容掌握即可:一篇入门C语言【文件】-CSDN博客文章浏览阅读609次,点赞3次,收藏6次。本科期间C语言的课本无论哪个版本都会有【文件】这一章节,不过好多学校基本上不讲或者就出一道选择题,讲得很浅,今天这篇详细总结一下这部分的知识~https://blog.csdn.net/jsl123x/article/details/141827614?spm=1001.2014.3001.5501

#include <iostream>
#include <string>
using namespace std; 
int main(int argc, char** argv) {string s;cin>>s;for(int i=0;i<=s.size()-1;i++)if(s[i]>=97&&s[i]<=122)s[i]-=32;cout<<"大写形态为:"<<s<<endl;FILE* p;p=fopen("./text.txt","r+");for(int i=0;i<=s.size()-1;i++)fputc(s[i],p);fclose(p);}

结果没什么问题:

这里博主用的是r+,也即十进制的读写,实际上也可以用a+也即二进制的读写,大家看题目要求~ 

三.判断当年天序

输入格式为2024 12 09,然后判断这是今年的第几天,很简单,只需要用一个类似哈希表的数组存储每个月的天数即可,如果是闰年可能会要多一天。

#include <iostream>
#include <string>
using namespace std; struct Date{int year;int month;int day;
};int main(int argc, char** argv) {int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};int answer=0;Date date;cin>>date.year>>date.month>>date.day;if((date.year%400==0)||(date.year%100!=0&&date.year%4==0))  //闰年!days[1]++;//二月要多一天,别搞混数组下标for(int i=0;i<=date.month-2;i++)answer+=days[i];answer+=date.day;cout<<"这是"<<date.year<<"的第"<<answer<<"天~"<<endl; }

几点说明:

  • 博主用的结构体,其实写完以后觉得有点多余。。。直接定义变量就行了,大家没必要学我
  • days存放每个月不是闰年的天数
  • 然后单独判断是否为闰年——可以整除400亦或整除4的同时不能整除100——如果是闰年2月要加一天
  • 注意数组的下表,你要是晕,就直接把0位空出来从一开始赋值
  • 最后加上当月天数即可~

测试后没什么问题~

四.交替合并字符串

 唉,写得我都觉得乏味,但是做事一定要有头有尾哈哈~

#include <iostream>
#include <string>
using namespace std; int main(int argc, char** argv) {string A,B;cin>>A;cin>>B;int i=0,j=0; string target;while(i<=A.size()-1&&j<=B.size()-1){target+=A[i++];target+=B[j++];}while(i<=A.size())  target+=A[i++];while(j<=B.size())  target+=B[j++];cout<<target<<endl; FILE* p;p=fopen("./text.txt","r+");for(int i=0;i<=target.size()-1;i++)fputc(target[i],p);fclose(p);}
  • 本质上就是用两个指针分别扫描两个字符串——各位一定要注意这种操作:在双指针类的题目,亦或什么n复杂度内实现字符串的逆转,经常会这么写。
  • 此外就是扫描长度——这里是直到扫描完一个才单独扫描另一个,其实就是归并排序经典的写法。里面的【i++】各位一定要理清楚,这是先操作,再自增~ 

测试一下也没什么问题~

五.指针形态的冒泡排序

该说不说,有点“装神弄鬼”,姑且理解为他想考察指针数组吧。。。代码如下:

#include <iostream>
#include <string>
using namespace std; void BubbleSort(char* arr[],int length)
{for(int i=0;i<=length-1;i++)//忽略最后一位for(int j=i+1;j<=length;j++)if((*arr[i])>(*arr[j])){char* temp=arr[i];arr[i]=arr[j];arr[j]=temp;}
} 

注意,上面传进来的是一个存储了元素地址的指针数组,而并非元素的值,因此:

  • 我们在比较大小时,应该对指针进行解引用,不然比较的是地址的大小
  • 但在交换的时候,只需要交换元素的地址即可~ 
  • 此外,最外层循环可以少对比一位,这时冒泡的基本功了,别糊涂
int main(int argc, char** argv) {string target;cin>>target;char* arr[target.size()-1];for(int i=0;i<=target.size()-1;i++)arr[i]=&target[i];cout<<"排序前:";	for(int i=0;i<=target.size()-1;i++)cout<<(*arr[i])<<" "; cout<<endl;	BubbleSort(arr,target.size()-1);cout<<"排序后:";for(int i=0;i<=target.size()-1;i++)cout<<(*arr[i])<<" "; return 0;
}

主函数测试一下。

没什么毛病~

六.递归方式的倒序输出

虽然递归的时间复杂度很高,实践中肯定不这样写,但是作为思维的练习值得关注~ 

#include<iostream>
using namespace std;void MyReverse(char* string)
{if (*string != '\0')MyReverse(string + 1);	printf("%c", *string);
}int main()
{char arr[1000];cin>>arr;MyReverse(arr);return 0;
}

如果当前不为【\0】,就一直向后递归,直到为\0后再递归输出前面的字母,以此实现逆序~ 

这里就不输出到文件中了,和前面同理~ 

七.黑色星期五

没什么技术含量,就是编起来细节比较多,这种题只要能读懂题干,考出来不怕他~~

#include <iostream> 
using namespace std;
int main(){int n=0,num=1;            //1900.1.1是星期一因此,这个一般在题干会给出~ cin>>n;          int year=1900,month,day=0;//从1900年开始向后遍历 int count[7]={0};int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i=0;i<n;i++,year++){if((year%4==0&&year%100!=0)||year%400==0)mon[2]=29;for(month=1;month<13;month++)for(day=1;day<=mon[month];day++){if(day==13)count[num]+=1;num=(num+1)%7;}mon[2]=28;}cout<<count[6]<<endl;for(int i=0;i<5;i++)cout<<count[i]<<" ";cout<<count[5]<<endl;return 0;
}

八.卡布列克运算

还是和黑色星期五一样,没有任何思维上的难度,只是操作的技巧问题:

#include <iostream> 
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;int main(){int n=0;cin>>n;vector<int>V;int max=0,min=0;int temp=0;while(n){temp=n%10;n/=10;V.push_back(temp);}sort(V.begin(),V.end());  //排序后为从小到大 for(int i=3;i>=0;i--){min+=V[3-i]*pow(10,i);max+=V[i]*pow(10,i);	}cout<<max-min<<endl;
}

博主还是用了大量的STL标准库,各位想自己写一些底层操作也可以,博主就浅浅偷懒一下了~

测试如下,没问题:

九.只出现一次的字符

简单,博主的思维是可以使用结构体类型的哈希表,这样只需要遍历一次即可出结果——因为这里限制为英文字母,哈希表长度为26,遍历哈希表在N很大的情况下可以看为常数级别。还有一点要复习,字符串的0和大小字母A的差值为65,大家一定要记清楚,这一点可以有效帮助我们构造散列函数,也即如下这一段:

	for(int i=0;i<=target.size()-1;i++){int temp=0;	temp=target[i]-65;hash[temp].count++;if(hash[temp].first==-2)hash[temp].first=i;}

不过非常遗憾,可能是电脑的问题,博主写的代码出现了找不到的bug——即遍历哈希表会出现意想不到的情况,只能把哈希表冒泡排序了一遍。。。其实大家可以试试找出哈希表中first最小的值即可,复杂度为n。这段加了冒泡的是n方,也还行吧。。。

#include <iostream> 
#include <string>
using namespace std;struct Hash{int count;int first;char tag;
};int main(){string target;cin>>target;Hash hash[26];for(int i=0;i<=25;i++){hash[i].count=0;hash[i].first=-2;hash[i].tag='A'+i;}for(int i=0;i<=target.size()-1;i++){int temp=0;	temp=target[i]-65;hash[temp].count++;if(hash[temp].first==-2)hash[temp].first=i;}	for(int i=0;i<=24;i++)for(int j=i+1;j<=25;j++)if(hash[i].first>=hash[j].first){Hash temp;temp=hash[i];hash[i]=hash[j];hash[j]=temp;}for(int i=0;i<=25;i++)if(hash[i].count==1){cout<<"第一个只出现一次的字母是:"<<hash[i].tag<<endl;break;}return 0;
}

测试一下,没什么bug:

十.产生0-1的随机数

非常冷门,了解一下即可:

#include <iostream>
#include <cstdlib> 
using namespace std;
int main(int argc, char** argv) {for(int i=1;i<=10;i++) {double num=0;num=(double)rand()/100000;cout<<num<<endl; }return 0;
}


http://www.ppmy.cn/news/1555273.html

相关文章

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

Leetcode二叉树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Leetcode二叉树部分笔记 1.二叉树的最大深度2.同样的树3.翻转二叉树4.对称二叉树**5. **填充每个节点的下一个右侧节点指针 II**6. 二叉树展开为链表7. 路经总和8.完全二叉树…

.NET平台使用C#设置Excel单元格数值格式

设置Excel单元格的数字格式是创建、修改和格式化Excel文档的关键步骤之一&#xff0c;它不仅确保了数据的正确表示&#xff0c;还能够增强数据的可读性和专业性。正确的数字格式可以帮助用户更直观地理解数值的意义&#xff0c;减少误解&#xff0c;并且对于自动化报告生成、财…

yolov8 转华为昇腾om脚本

目录 yolov8 转华为昇腾 om脚本 测试ok 推理demo: yolov8 转华为昇腾 om脚本 测试ok import sys import osos.chdir(os.path.dirname(os.path.abspath(__file__)))import torchcurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(__file__)…

基于 SSM 的校园一卡通密钥加密传输机制与安全性能提升

第4章 系统设计 市面上设计比较好的系统都有一个共同特征&#xff0c;就是主题鲜明突出。通过对页面简洁清晰的布局&#xff0c;让页面的内容&#xff0c;包括文字语言&#xff0c;或者视频图片等元素可以清晰表达出系统的主题。让来访用户无需花费过多精力和时间找寻需要的内容…

IDEA 可视化使用 git rebase 合并分支步骤 使git分支树保持整洁

模拟环境 dev 分支开发完一个功能&#xff0c;需要合并到 master 分支&#xff0c;如果现在直接 merge 合并的话 git分支树会出现杂乱分叉&#xff0c;先把 master 分支 rebase 到 dev git分支树就会是整洁的一条直线 git rebase介绍 rebase:翻译成中文是重新设定&#xff0c;…

Linux(网络协议和管理)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

hutool一些典型的方法使用笔记

hutool一些典型的方法使用笔记 1 克隆1.1 深克隆 2类型转换2.1其他类型转换为字符串2.2 转换为日期对象2.3 数组转集合2.4 Unicode和字符串转换2.5 数字转中文 文档地址&#xff1a;https://blog.csdn.net/dxjren/article/details/144468399 1 克隆 1.1 深克隆 定义一个实体类…