有趣的代码——有故事背景的程序设计5

接着上篇文章再和大家分享一下有趣的代码!

目录

1.求母串中子串的个数

 2.行走机器人

3.荷兰国旗问题

4.统计考研成绩


1.求母串中子串的个数

给定一个母串s和一个子串t,在主串s中寻找子串t的过程为字符串匹配。每匹配成功一次,即母串中含有一个子串,求母串中子串的个数。

其实,这个题目的关键有两点:①如何在母串中查找子串并计数 ?②查找后怎么进行下一次查找?具体方法在这里也不详细讲了,大家可以看下面这篇文章中第四题,那段代码能方便大家了解,而这题的代码也是在那段基础之上改进的。

有趣的代码——有故事背景的程序设计4-CSDN博客文章浏览阅读340次,点赞13次,收藏6次。前面讲过不少有故事背景的程序设计,但就知识点涉及层面还有所不足,所有,这个系列到目前为止还需更新,希望有兴趣的朋友们可以和我一起敲一敲,看看这些有背景的程序设计的实质到底是什么。目录1.鞍点2.凯撒加密3.字数统计4.字符串匹配https://blog.csdn.net/m0_74950144/article/details/134819294?spm=1001.2014.3001.550

算法实现如下:

设函数CmpNum实现在母串s中查找子串t,设变量count表示母串中含子串的个数。

1.初始化母串s的起始位置下标i=0;初始化子串t的起始下标j=0;

2.初始化比较的起始位置start=0;

3.重复下述操作,直到s的所有字符比较完毕:

3.1如果s[i]=t[i]

3.1.1继续比较母串s和子串t的下一对字符;

3.1.2如果t[i]='\0',则j=0,start=i,count++;

3.2将start后移一位,将i和j回溯,准备比较下一轮;

4.如果s中所有字符都比较完毕,则返回count;
 

代码实现如下:

#include<stdio.h>int CmpNum(char*arrs,char*arrt)
{int i=0,j=0,start=0,count=0;while(arrs[i]!='\0')//直接循环到arrs数组结束,这样才能查找母串中所有子串{if(arrs[i]==arrt[j]){i++;j++;if(arrt[j]=='\0'){j=0;count++;//arrt结束一次,则代表含有一个子串start=i;//一个子串结束,那么start也应该调整到其后面,从而减少程序的无用功}}else{start++;i=start;j=0;//这里是很好的一点,让j=0,就能有效避免第一个字符相同,后面不相同时,调整使模式再次从头开始。 }}return count;
}int main()
{char s[100],t[20];int index;printf("请输入母串:");gets(s);printf("请输入子串:");gets(t);index=CmpNum(s,t);printf("母串中含子串个数:%d",index);return 0;
}

 2.行走机器人

假设在平面直角坐标系内,机器人每次可以前进或后退一步、向左或向右行走一步。请模拟机器人控制系统中指令的翻译和执行过程,并给出机器人的行走路线。

在平面直角坐标系中想描述机器人的行走路线,我们肯定是要用(x,y)坐标来表示机器人的行进位置。我们可以定前进一步,位置坐标为(x+1,y),后退一步为(x-1,y),向左一步(x,y-1),向右一步到达(x,y-1)。

算法实现如下:

设变量command表示一条行走指令,函数Move模拟指令的翻译和执行系统。

1.获取机器人当前位置(x,y);

2.指令command可能存在以下四种情况:

①前进:到达位置(x+1,y);

②后退:到达位置(x-1,y);

③向左:到达位置(x,y-1);

④向右:到达位置(x,y-1);

代码实现如下:

#include<stdio.h>int x = 0 , y = 0 ;//全局变量哦 
enum Direction
{forward = 1,back,left,right
};void Move(enum Direction command)
{switch(command){case forward:x++;break;case back:--x;break;case left:++y;break;case right:--y;break;default:break;}
}int main()
{enum Direction command;int i , temp ;printf("请输入机器人的动作,用空格分隔\n");printf("以下为指令:\n1.前进 2.后退 3.向左 4.向右\n");printf("当前位置为(%d , %d)\n", x , y );while(scanf("%d",&temp)!=0){command = (enum Direction)temp;Move(command);printf("-->(%d , %d)\n", x , y );}return 0;
}

这道题其实单从代码的复杂度来说并不难做,只是题目背景是在有点新颖,不过,涉及的枚举类型的创建和枚举变量的定义倒是值得大家研究研究。另外,这里定义全局变量x,y有偷懒的意思,不过,这样使函数内x,y都能联系起来,方便我们处理。

3.荷兰国旗问题

重新排列一个由红,黄和蓝(这三种即是荷兰国旗的颜色)构成的数组,使得所有的红色都在最前面,白色在其次,蓝色在最后。

首先,这种红黄蓝作为数组元素的题目,我们当然可以很自然地和枚举类型或者字符型联系起来,在这里我们定义一个枚举类型。设数组arr[N]存储Red、White和Blue,设置三个参数i、j、k,其中i之前的元素全为(不包括arr[i])全部为红色;k之后的元素(不包括arr[k])全部为蓝色;i和j之间的元素全部为白色;j表示从前向后扫描。首先,将i初始化为0,k初始化为n-1;j初始化为0。j从前向后扫描,在扫描过程中根据arr[j]的颜色,将其交换到序列的前面或后面,当j=k时,算法结束。

算法实现如下:

设数组arr[N]有Red、White和Blue三种元素,函数Sort实现荷兰国旗问题。

1.初始化i=0,k=n-1,j=0;

2.当j<=k时,依次考查元素arr[j],有以下三种情况:

2.1如果arr[j]是Red,则交换arr[i]和arr[j];i++;j++;

2.2如果arr[j]是Blue,则交换arr[j]和arr[k];j++;k--;

2.3如果arr[j]是White,则j++;

代码实现如下:

#include<stdio.h>#define N 8enum Color{Red,White,Blue
};void Sort (enum Color*a, int n);
/*留心观察的会发现我一般函数直接定义,很少先声明后定义,因为比较懒,
这里之所以先声明把定义放在后面,是因为两个函数的定义会比较长,那样
主函数的部分就太靠后,不便于观察,大家谨记!*/void Print(enum Color*a, int n);int main()
{enum Color a[N]={White,Red,Blue,Red,Blue,White,Red};Sort(a,N);printf("排序后的序列为:");Print(a,N);return 0;
}void Sort (enum Color*a, int n)
{int i=0,k=n-1,j=0;enum Color temp;while(j<k){switch(a[j]){case Red:temp = a[i];a[i] = a[j];a[j] = temp;i++;j++;break;case Blue:temp = a[j];a[j] = a[k];a[k] = temp;k--;break;case White:j++;break;}}
}void Print(enum Color*a, int n)
{int i = 0;for(i=0;i<n;i++)switch(a[i]){case Red:  printf("Red ");break;case Blue: printf("Blue ");break;case White:printf("While ");break;} 
}

 这题的设计实在是有些妙的,因为这题定义两个变量i,k作为两端,某种意义上来说,这属于双指针在数组中查找,极大地提高了代码的效率。

4.统计考研成绩

在计算机专业考研中,专业课考试科目包括数据结构、计算机组成原理、操作系统和计算机网络。对于一个考生,输入各科成绩,并计算总分。

因为这里一个考生的四门专业课成绩以及总分都与他有内在联系,所以我们在这里为了解决这种较为复杂的数据元素,理应构造结构体类型。

算法实现如下:

设变量totalScore存储考生的总分,变量spec1、spect2、spect3和spect4分别存储四科专业课的成绩。

1.输入一个考生的各项信息;

2.totalScore=spec1+spec2+spec3+spec4;

3.输出totalScore;

代码实现如下:

#include<stdio.h>struct Student
{char no[10],name[10];double spec1,spec2,spec3,spec4;
};int main()
{struct Student stu;double totalScore;printf("请输入考生的考号和姓名:\n");scanf("%s%s",stu.no,stu.name);printf("请输入四门专业课成绩,用空格分隔:\n");scanf("%lf%lf%lf%lf",&stu.spec1,&stu.spec2,&stu.spec3,&stu.spec4);totalScore=stu.spec1+stu.spec2+stu.spec3+stu.spec4;printf("%s的总分是%5.1f\n",stu.name,totalScore);return 0;
}

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

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

相关文章

移动app测试要不要做第三方软件测试?

移动app测试是指通过对移动应用进行全面的评估和验证&#xff0c;以确保其功能和性能符合设计要求&#xff0c;以提供给用户最好的体验。通常包括功能测试、界面测试、性能测试、兼容性测试等多个环节。由于现在越来越多的软件企业会选择将测试工作交由第三方软件测试进行&…

【Git】本地代码如何托管到远程仓库(保姆级教程)

注意前提是你本地已经安装了Git 1. 新建远程仓库 选一个git服务器&#xff0c;新建一个远程仓库&#xff0c;这里我选用的是gitee 点击确定后&#xff0c;显示如下界面表示仓库已经新建完成 2.建立本地仓库 本地新建一个空文件夹&#xff0c;在里面写一些你的初始代码文件。…

夜莺专业版网络设备功能介绍

网络设备采集简介 网络设备的问题通常会产生较大范围的影响&#xff0c;因此采集监控网络设备是一项常见的任务。不同公司在实施网络设备采集时可能采用不同的方案&#xff0c;主要有三类&#xff1a; SNMP&#xff08;Simple Network Management Protocol&#xff09;&#x…

2个月拿下信息系统项目管理师攻略(攻略超级全)

信息系统项目管理师&#xff08;高项&#xff09;一次性过啦&#xff01;结合这次备考经验&#xff0c;给大家总结一下复习方法。 先上图&#xff0c;开心一下&#xff01; 一、我为什么选择了高项 为什么我会选信息系统项目管理师&#xff0c;也就是我们常说的高项。 原因1…

深入浅出分析kafka客户端程序设计 ----- 生产者篇----万字总结

前面在深入理解kafka中提到的只是理论上的设计原理&#xff0c; 本篇讲得是基于c语言的kafka库的程序编写&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 首先要编写生产者的代码&#xff0c;得先知道生产者的逻辑在代码上是怎么体现的 1.kafka生产者的逻辑 …

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源&#xff0c;分布式的架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构 存储和管理数据&#xff0c;分布式节点上的服务接受观察者的注册&#xff0c…

ubuntu18.04 vscode 安装 vue.volar Vue Language Features (Volar) , vue3 必备插件

直接在vscode 里面下载老是失败&#xff0c;不是网络问题&#xff0c;而是vue.volar插件配置的vscode版本与vscode版本不一致导致出现安装失败 官网下载最新的 vue.volar插件 https://marketplace.visualstudio.com/ 官网搜索 vue.volar 然后打开 Vue Language Features (Vol…

类和对象,this指针

一、类的引入&#xff1a; 如下&#xff0c;在C中&#xff0c;我们可以在结构体中定义函数&#xff0c;如下&#xff0c;之前我们学习C中中一直是在结构体中定义变量。 struct student{void studentinfo(const char* name,const char* gener,int age){ strcpy(_name,name);st…

一个类似connectedpapers的文献知识图谱神器:Libraries S2

在阅读文献、写综述、写论文的related works的时候&#xff0c;总会苦恼如何查阅该领域的论文呢&#xff1f;怎么才能尽可能的查找齐全&#xff1f; 以前在看论文的时候&#xff0c;我都是先用谷歌学术搜索&#xff0c;然后看到优秀的相关文文献后&#xff0c;再去查看它的参考…

java应用在Windows服务器运行时控制台输出日志中文乱码终极解决办法

修改注册表&#xff0c;适用于cmd&#xff0c;在各种开发工具终端中均生效 第一步、按winr&#xff0c;输入regedit运行&#xff0c;进入注册表界面 第二步、找到【HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor】 第三步、新建一个表项&#xff0c;命名为autor…

世微 AP3266 大功率同步降压恒流芯片 过EMC 车灯驱动

产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出最大功率可达 40W&#xff0c;最大电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空载上…

深入探索Python delattr函数的威力与灵活性

引言&#xff1a; 在Python中&#xff0c;delattr函数是一个非常强大且灵活的工具&#xff0c;它允许我们删除对象的属性。使用delattr函数&#xff0c;我们可以动态地删除对象的属性&#xff0c;从而在编程中实现更灵活的操作。本文将详细介绍delattr函数的用法&#xff0c;帮…

Python Struct 模块:二进制数据的强大解析与打包工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中的struct模块是一个强大而灵活的工具&#xff0c;用于解析和打包二进制数据。本文将深入介绍struct模块的各个方面&#xff0c;通过丰富的示例代码&#xff0c;帮助读者更全面地理解和运用这一模块&…

98基于matlab的在MIMO通信系统中功率优化算法的仿真

基于matlab的在MIMO通信系统中&#xff0c;功率优化算法的仿真&#xff0c;重点研究了注水功率分配算法。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 98matlab功率优化功率分配 (xiaohongshu.com)

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

前端项目中CDN的一些问题【性能优化篇】

1. CDN的概念 CDN&#xff08;Content Delivery NetWork&#xff0c;内容分发网络&#xff09;&#xff0c;是指利用最靠近每位用户的服务区&#xff0c;更快的将资源发送给用户。 提高用户的访问速度减轻服务器压力提高网站的稳定性和安全性 2. CDN的作用 CDN一般用来托管…

【从零认识ECS云服务器 | 快速上线个人网站】阿里云手动搭建WordPress网站

第一步&#xff1a;部署 LAMP/LNMP 环境&#xff0c;需要在ECS实例中安装操作系统&#xff08;Linux&#xff0c;本例中使用的操作系统版本为CentOS 7.9 64位&#xff09;、Web服务器软件&#xff08;Apache/Nginx&#xff09;、数据库软件&#xff08;MySQL&#xff09;、网站…

GIT GUI使用

文章目录 一、新建本地仓库二、推送&#xff08;push&#xff09; 一、新建本地仓库 在空白处右键&#xff0c;找到GIT GUI here&#xff0c; 如果没有仓库&#xff0c;出现的是这样的&#xff1a; 如果有仓库&#xff0c;在本地仓库里打开就是这样的&#xff1a; 新建本地…

探索低代码的潜力、挑战与未来展望

低代码开发作为一种新兴的开发方式&#xff0c;正在逐渐改变着传统的编程模式&#xff0c;低代码使得开发者无需编写大量的代码即可快速构建各种应用程序。然而&#xff0c;低代码也引发了一系列争议&#xff0c;有人称赞其为提升效率的利器&#xff0c;也有人担忧其可能带来的…

代码随想录算法训练营 ---第五十八天

今天开启单调栈的征程。 第一题&#xff1a; 简介&#xff1a; 本题有两种解法&#xff0c;第一种&#xff1a;暴力破解 两层for循环 时间复杂度为O(n^2) 超时了 第二种&#xff1a;单调栈解法也是今天的主角。 单调栈是什么&#xff1f; 单调递增栈&#xff1a;单调递增栈…