没有合适的资源?快使用搜索试试~ 我知道了~
首页C语言位操作解决设备寄存器修改问题与凯撒密码破解
C语言位操作解决设备寄存器修改问题与凯撒密码破解
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 135 浏览量
更新于2024-07-01
1
收藏 648KB DOC 举报
C语言竞赛题目大全包含了针对C语言编程技能的实战练习,其中一道题目涉及到了位操作技巧。题目背景是处理一个32位外设寄存器,具体任务是根据给定的寄存器值R(十六进制表示),以及要改变的位数X和Y,将X位清零,Y位及其后两位置为110。这要求参赛者理解如何使用位掩码(如`CLR`和`SET`宏定义)来精确地进行位运算,确保不会意外地改变其他位。 在提供的代码示例中,使用了`#define CLR(r, x)`宏定义来实现按位与非(AND NOT),即清零R的第x位,而`#define SET(r, y)`则用于按位或(OR),设置R的第y位。函数`main()`首先读取输入的寄存器值R、要清除的位X和要置位的范围Y。通过连续调用`CLR`和`SET`宏,实现了目标位的设置和清除,最后输出处理后的16进制寄存器值。 另一个题目是关于凯撒密码的破解,这是密码学的一个基础概念,源自古罗马时期的军事通信。问题要求设计一个程序,接收一段用凯撒密码加密的消息(仅包含大写字母,且加密规则是每个字母向后移动5个位置),然后解密并输出原始消息。参赛者需要编写代码,遍历输入的加密消息,根据给定的规则将每个字母恢复到原始状态。 这个题目考察了字符串处理、字符数组操作以及循环结构的应用,特别是对字母表的理解和处理。参赛者需要确保程序能够正确处理所有可能的输入,包括多个数据集和边界情况。 这两个题目都是C语言编程的经典实践,旨在检验选手对于基础语法、逻辑控制和算法设计的理解,同时也能提升他们在实际问题解决中的动手能力和调试能力。解答这类题目时,不仅需要扎实的编程基础,还需要灵活运用位操作和字符处理技术。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86032603/bge.jpg)
第 14 页
result+=p[k];
result/=count-2;
return result;
void main()
printf("请输入 10 组评分:\n");
int p[10];
int i;
for(i=0;i<10;i++) //输入评分
printf("输入评委%d 打分:",i+1);
scanf("%d",&p[i]);
double result=Aver(p,10); //计算平均分
printf("\n 平均分为%5.2f\n",result);
第17题 100 个经典 C 语言程序
1.绘制余弦曲线
在屏幕上用“*”显示 0~360 度的余弦函数 cos(x)曲线
*问题分析及算法设计
如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。
关键在于余弦曲线在 0~360 度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息
后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*”。
为了同时得到余弦函数 cos(x)图形在一行上的两个点,考虑利用 cos(x)的左右对称性。将屏幕的行方向定义为 x,列方向定义
为 y,则 0~180 度的图形及 180~360 度的图形是左右对称的,若定义图形的总宽度为 62 列,计算出 x 行 0~180 度时 y 点的坐标 m,
那么在同一行及之对称的 180~360 度的 y 点的坐标就 应为 62-m。程序中利用反余弦函数 acos 计算坐标(x,y)的对应关系。
使用这种方法编出的程序短小精炼,体现了一定的技巧。
*程序说明及注释
#include<stdio.h>
#include<math.h>
void main()
double y;
int x,m;
for(y=1;y>=-1;y-=0.1) /*y 为列方向,值从 1 到-1,步长为 0.1*/
m=acos(y)*10; /*计算出 y 对应的弧度 m,乘以 10 为图形放大倍数*/
for(x=1;x<m;x++) printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<62-m;x++)printf(" ");
printf("*\\n"); /*控制打印同一行中对称的右侧*号*/
2.2.绘制余弦曲线和直线
在屏幕上显示 0~360 度的 cos(x)曲线及直线 f(x)=45*(y-1)+31 的迭加图形。其中 cos(x)图形用“*”表示,f(x)用“+”表示,
在两个图形相交的点上则用 f(x)图形的符号。
*问题分析及算法设计
本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的
位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图形。
*程序注释及说明
#include<stdio.h>
#include<math.h>
void main()
double y;
int x,m,n,yy;
for(yy=0;yy<=20;yy++) /*对于第一个 y 坐标进行计算并在一行中打印图形*/
y=0.1*yy; /*y:屏幕行方向坐标*/
m=acos(1-y)*10; /*m: cos(x)曲线上 y 点对应的屏幕列坐标*/
n=45*(y-1)+31; /*n: 直线上 y 点对应的列坐标*/
for(x=0;x<=62;x++) /*x: 屏幕列方向坐标*/
if(x==m&&x==n) printf("+"); /*直线及 cos(x)相交时打印“+”*/
![](https://csdnimg.cn/release/download_crawler_static/86032603/bgf.jpg)
第 15 页
else if(x==n) printf("+"); /*打印不相交时的直线图形*/
else if(x==m||x==62-m) printf("*"); /*打印不相交时的 cos(x)图形*/
else printf(" "); /*其它情况打印空格*/
printf("\\n");
3.绘制圆
在屏幕上用“*”画一个空心的圆
*问题分析及算法设计
打印圆可利用图形的左右对称性。根据圆的方程:
R*R=X*X+Y*Y
可以算出圆上每一点行和列的对应关系。
*程序说明及注释
#include<stdio.h>
#include<math.h>
void main()
double y;
int x,m;
for(y=10;y>=-10;y--)
m=2.5*sqrt(100-y*y); /*计算行 y 对应的列坐标 m,2.5 是屏幕纵横比调节系数因为屏幕的
行距大于列距,不进行调节显示出来的将是椭圆*/
for(x=1;x<30-m;x++) printf(" "); /*图形左侧空白控制*/
printf("*"); /*圆的左侧*/
for(;x<30+m;x++) printf(" "); /*图形的空心部分控制*/
printf("*\\n"); /*圆的右侧*/
4.歌星大奖赛
在歌星大奖赛中,有 10 个评委为参赛的选手打分,分数为 1~100 分。选手最后得分为:去掉一个最高分和一个最低分后其余 8
个分数的平均值。请编写一个程序实现。
*问题分析及算法实现
这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
*程序说明及注释
#include<stdio.h>
void main()
int integer,i,max,min,sum;
max=-32768; /*先假设当前的最大值 max 为 C 语言整型数的最小值*/
min=32767; /*先假设当前的最小值 min 为 C 语言整型数的最大值*/
sum=0; /*将求累加和变量的初值置为 0*/
for(i=1;i<=10;i++)
printf("Input number %d=",i);
scanf("%d",&integer); /*输入评委的评分*/
sum+=integer; /*计算总分*/
if(integer>max)max=integer; /*通过比较筛选出其中的最高分*/
if(integer<min)min=integer; /*通过比较筛选出其中的最低分*/
printf("Canceled max score:%d\\nCanceled min score:%d\\n",max,min);
printf("Average score:%d\\n",(sum-max-min)/8); /*输出结果*/
*运行结果
Input number1=90
Input number2=91
Input number3=93
Input number4=94
Input number5=90
Input number6=99
Input number7=97
Input number8=92
Input number9=91
Input number10=95
![](https://csdnimg.cn/release/download_crawler_static/86032603/bg10.jpg)
第 16 页
Canceled max score:99
Canceled min score:90
Average score:92
*思考题
题目条件不变,但考虑同时对评委评分进行裁判,即在 10 个评委中找出最公平(即评分最接返平均分)和最不公平(即及平均分
的差距最大)的评委,程序应该怎样实现?
5.求最大数
问 555555 的约数中最大的三位数是多少?
*问题分析及算法设计
根据约数的定义,对于一个整数 N,除去 1 和它自身外,凡能整除 N 的数即为 N 的约数。因此,最简单的方法是用 2 到 N-1 之
间的所有数去除 N,即可求出 N 的全部约数。本题只要求取约数中最大的三位数,则其取值范围可限制在 100 到 999 之间。
*程序说明及注释
#include<stdio.h>
void main()
long i;
int j;
printf("Please input number:");
scanf("%ld",&i);
for(j=999;j>=100;j--)
if(i%j==0)
printf("The max factor with 3 digits in %ld is:%d,\\n",i,j);
break;
*运行结果
输入:555555
输出:The max factor with 3 digits in 555555 is:777
6.6.高次方数的尾数
求 13 的 13 次方的最后三位数
*问题分析及算法设计
解本题最直接的方法是:将 13 累乘 13 次方截取最后三位即可。
但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,
完全没有必要求 13 的 13 次方的完整结果。
研究乘法的规律发现:乘积的最后三位的值只及乘数和被乘数的后三位有关,及乘数和被乘数的高位无关。利用这一规律,可
以大大简化程序。
*程序说明及注释
#include<stdio.h>
void main()
int i,x,y,last=1; /*变量 last 保存求 X 的 Y 次方过程中的部分乘积的后三位*/
printf("Input X and Y(X**Y):");
scanf("%d**%d",&x,&y);
for(i=1;i<=y;i++) /*X 自乘 Y 次*/
last=last*x%1000; /*将 last 乘 X 后对 1000 取模,即求积的后三位*/
printf("The last 3 digits of %d**%d is:%d\\n",x,y,last%1000); /*打印结果*/
*运行结果
Input X and Y(X**Y):13**13
The last 3 digits of 13**13 is:253
Input X and Y(X**Y):13**20
The last 3 digits of 13**20 is:801
-- 作者:huang01
-- 发布时间:2004-10-21 17:00:24
7.8.借书方案知多少
小明有五本新书,要借给 A,B,C 三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
*问题分析及算法设计
![](https://csdnimg.cn/release/download_crawler_static/86032603/bg11.jpg)
第 17 页
本问题实际上是一个排列问题,即求从 5 个中取 3 个进行排列的方法的总数。首先对五本书从 1 至 5 进行编号,然后使用穷举
的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
*程序说明及注释
void main()
int a,b,c,count=0;
printf("There are diffrent methods for XM to distribute books to 3 readers:\\n");
for(a=1;a<=5;a++) /*穷举第一个人借 5 本书中的 1 本的全部情况*/
for(b=1;b<=5;b++) /*穷举第二个人借 5 本书中的一本的全部情况*/
for(c=1;a!=b&&c<=5;c++) /*当前两个人借不同的书时,穷举第三个人借 5 本书
中的 1 本的全部情况*/
if(c!=a&&c!=b) /*判断第三人及前两个人借的书是否不同*/
printf(count%8?"%2d:%d,%d,%d ":"%2d:%d,%d,%d\\n ",++count,a,b,c);
/*打印可能的借阅方法*/
*运行结果
There are diffrent methods for XM to distribute books to 3 readers:
1: 1,2,3 2: 1,2,4 3: 1,2,5 4: 1,3,2 5: 1,3,4
6: 1,3,5 7: 1,4,2 8: 1,4,3 9: 1,4,5 10:1,5,2
11:1,5,3 12:1,5,4 13:2,1,3 14:2,1,4 15:2,1,5
16:2,3,1 17:2,3,4 18:2,3,5 19:2,4,1 20:2,4,3
21:2,4,5 22:2,5,1 23:2,5,3 24:2,5,4 25:3,1,2
26:3,1,4 27:3,1,5 28:3,2,1 29:3,2,4 30:3,2,5
31:3,4,1 32:3,4,2 33:3,4,5 34:3,5,1 35:3,5,2
36:3,5,4 37:4,1,2 38:4,1,3 39:4,1,5 40:4,2,1
41:4,2,3 42:4,2,5 43:4,3,1 44:4,3,2 45:4,3,5
46:4,5,1 47:4,5,2 48:4,5,3 49:5,1,2 50:5,1,3
51:5,1,4 52:5,2,1 53:5,2,3 54:5,2,4 55:5,3,1
56:5,3,2 57:5,3,4 58:5,4,1 59:5,4,2 60:5,4,3
8.9.杨辉三角形
在屏幕上显示杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
*问题分析及算法设计
杨辉三角形中的数,正是(x+y)的 N 次方幂展开式各项的系数。本题作为程序设计中具有代表性的题目,求解的方法很多,这
里仅给出一种。
从杨辉三角形的特点出发,可以总结出:
1)第 N 行有 N+1 个值(设起始行为第 0 行)
2)对于第 N 行的第 J 个值:(N>=2)
当 J=1 或 J=N+1 时:其值为 1
J!=1 且 J!=N+1 时:其值为第 N-1 行的第 J-1 个值及第 N-1 行第 J 个值之和
将这些特点提炼成数学公式可表示为:
1 x=1 或 x=N+1
c(x,y)=
c(x-1,y-1)+c(x-1,y) 其它
本程序应是根据以上递归的数学表达式编制的。
*程序说明及注释
#include<stdio.h>
void main()
int i,j,n=13;
printf("N=");
while(n>12)
scanf("%d",&n); /*控制输入正确的值以保证屏幕显示的图形正确*/
剩余80页未读,继续阅读
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
kfcel5889
- 粉丝: 3
- 资源: 5万+
![](https://csdnimg.cn/release/wenkucmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![](https://csdnimg.cn/release/wenkucmsfe/public/img/vip-rights-2.8b825a4e.png)
电子书特权
![](https://csdnimg.cn/release/wenkucmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![](https://csdnimg.cn/release/wenkucmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![](https://csdnimg.cn/release/wenkucmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)