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

news2024/11/27 10:26:42

这篇文章再和大家分享一些有“背景”的程序设计,希望能够让大家学到知识的同时,对编程学习更感兴趣,更能在这条路上坚定地走下去。

目录

1.幻方问题

2.用函数打印九九乘法表

 3.鸡兔同笼问题

4.字数统计

 5.简单选择排序


1.幻方问题

幻方又称魔方阵,游戏规则是在一一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如下图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。


解决幻方问题的方法很多,下面介绍一种“左上斜行法”的填数方法,该方法适用于任意奇数阶幻方,具体填数过程如下:
(1)由1开始填数,将1放在第1行的中间位置;
(2)将幻方想象成上下、左右相接,每次往左上角走一一步,会有下列情况:
①左上角超出上边界,则在最下边对应的位置填入下一个数,如图A所示;
②左上角超出左边界,则在最右边对应的位置填入下一个数,如图 B所示;
③按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数,如图 C所示:

算法实现如下:

设数组a[n][n]表示幻方,当前填数的位置为(i,j),则其左上方的位置是(i-1,j-1),将被填的数作为循环变量。

1.初始化填数的位置,i=0,j=n/2;

2.在位置(i,j)填入1;

3.数字k从2~n*n重复执行下述操作:

        3.1从位置(i,j)往左上角走到位置(i-1,j-1);

        3.2如果i超出上边界,则i=n-1;

        3.3如果j超出左边界,则j=n-1;

        3.4如果位置(i,j)已经填数,则在原位置的同一列下一行填入k;否则,在位置(i,j)填入k

        3.5k++;

代码实现如下:

#include<stdio.h>
int main()
{
	int arr[100][100]={0},num,i,j,k;//num是咱预处理的幻方阶数 
	int tempi,tempj;//这里的目的是暂存i,j的值,因为达到边界,i,j的值会发生变化
	printf("请输入1-100内的奇数:\n");  //只处理为奇数的方阵
	scanf("%d",&num);
	i=0;j=num/2;
	arr[i][j]=1;//算法中的1,2步骤 
	for(k=2;k<=num*num;k++)
	{
		tempi=i;
		tempj=j;
		if(--i<0)
		{ //判断当前位置是否超出上边界?
			i=num-1;
		}
		if(--j<0)
		{ //判断当前位置是否超出左边界?
			j=num-1;
		}
		if(arr[i][j]>0)
		{//如果该位置已经有数,则在该位置下面添加数字
			i=(tempi+1)%num;
			j=tempj;
		}
		arr[i][j]=k;
	}
	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
			printf("%d\t",arr[i][j]);
		printf("\n");
	}
	return 0;
} 

这里arr数组为100*100个元素,主要是在有较大测试范围的同时,不占用太多内存,大家自己测试时可以定义一个宏,然后用宏定义数组,这样方便大家根据需要调整数组大小,而且空间利用率更高。

简单优化一个点,使代码更简洁。

#include<stdio.h>
int main()
{
	int arr[100][100]={0},num,i,j,k;//num是咱预处理的幻方阶数 
	int tempi,tempj;//这里的目的是暂存i,j的值,因为达到边界,i,j的值会发生变化
	printf("请输入1-100内的奇数:\n");  //只处理为奇数的方阵
	scanf("%d",&num);
	i=0;j=num/2;
	arr[i][j]=1;//算法中的1,2步骤 
	for(k=2;k<=num*num;k++)
	{
		tempi=i;
		tempj=j;
		i=(i-1+n)%n;//这两步属于是把取模玩明白了,大家可以细品一下 
		j=(j-1+n)%n;
		if(arr[i][j]>0)
		{//如果该位置已经有数,则在该位置下面添加数字
			i=(tempi+1)%num;
			j=tempj;
		}
		arr[i][j]=k;
	}
	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
			printf("%d\t",arr[i][j]);
		printf("\n");
	}
	return 0;
} 
2.用函数打印九九乘法表

打印九九乘法表,要求用函数实现。

相信大家对于打印九九乘法表已经很熟悉了吧,我们在这里简单和函数结合一下,就满足这个故事背景了。

算法实现如下:

设函数Table99实现打印九九乘法表的功能

1.循环变量i从1到9,打印第i行;

        1.1循环变量j从1到i,打印第j列;

                1.1.1打印第i行第j列的值i*j;

                1.1.2j++;

        1.2第i行打印完毕,打印回车符;

        1.3i++准备打印下一行;

代码实现如下:

#include<stdio.h>

void Table99(void);

int main()
{
	Table99(); 
	return 0;
}

void Table99(void)
{
	int i , j ;
	for(i = 1 ; i <= 9 ; i++)
	{
		for(j = 1 ; j <= i ; j++)
			printf("%d * %d = %2d  ", j ,  i , i * j);
		printf("\n");
	}
}
 3.鸡兔同笼问题

笼子里共有M只头N只脚,问鸡和兔各有多少只?要求用函数实现。

这种题就是很典型的数学题用编程来解决,而根据我们的数学涵养,我们理应很容易列出二元一次方程组从而解决问题,现在只需要把方程式通过编程用表达式表现出来即可。

当然唯一要注意的是这里是用函数来解决,大家记住结合函数相关知识进行编程。

算法实现如下:

设函数Chicken为解决鸡兔同笼问题的函数。变量chicken表示鸡的个数,rabbit表示兔的个数,变量M表示头的个数,变量N表示脚的个数。

1.chicken从0~M重复执行下述操作:

        1.1rabbit = M -chicken;

        1.2如果(2*chicken+4*rabbit等于N),则跳出循环;

        1.3将chicken++;

2.如果是提前跳出循环,则输出chicken和rabbit的值;

否则输出“无解”;

#include<Stdio.h>
void Chicken(int M , int N)
{
	int chicken,rabbit,count;
	for(chicken=0;chicken<=M;chicken++)
	{
		rabbit=M-chicken;
		if(2*chicken+4*rabbit==N)
		{
			printf("鸡有%d只,兔子有%d只",chicken,rabbit);
			break;
		}	
	}
	if(chicken>M)
	{
		printf("输入数据不合理,无解!");
	}
}
int main()
{
	int M,N;
	printf("请输入头的个数和脚的个数:");
	scanf("%d%d",&M,&N);
	Chicken(M,N);
	return 0;
} 
4.字数统计

从键盘上输入若干行字符,统计出现的字符总数。

 这个题本质就像题干一样很简单,我们只需要一直读取字符(并计数),等读到回车符即可结束。

算法实现如下:

设函数count统计每一行文字的字符数,算法如下:

1.ch=读入一个字符;

2.当ch不是回车时,重复执行下述操作;

        2.1sum++;

        2.2ch=读入下一个字符;

3.返回sum;

代码实现如下:

#include<stdio.h>
int Count(void)
{
	int sum=0;
	char ch;
	printf("请输入一行文字:");
	fflush(stdin);
	while((ch=getchar())!='\n')	
		sum++;
	return sum;
} 

int main()
{
	int charcount=0;
	charcount=Count();
	printf("字符数:%d\n",charcount);
	return 0;
}
 5.简单选择排序

将N个元素组成的无序序列调整为有序序列。

什么是简单选择排序呢?我们假设待排序元素进行升序排列,简单选择排序的基本思想是:将整个序列分为有序区和无序区,初始化时有序区为空,无序区含有所有元素;在无序区中找到最小的元素,将它与无序区中的第一个元素交换;不断重复上述过程,直到无序区只剩下一个元素。

算法实现如下:

设置函数Sort实现对无序序列arr[N]进行简单选择排序,参数n表示数组元素的个数。

1.循环变量i从0~n-2,重复执行n-1次下述操作:

1.1在序列arr[i]~arr[n-1]中查找最小值arr[min];

1.2交换arr[min]与arr[i];

1.3i++

2.输出arr[N];

代码实现如下:

#include<stdio.h>
#define N 8
void Sort(int arr[],int n)
{
	int i,j,min,temp;
	for(i=0;i<n-1;i++)
	{
		min=i;
		for(j=i+1;j<n;j++)
			if(arr[j]<arr[min]) min=j;
		temp=arr[i];arr[i]=arr[min];arr[min]=temp;
	}
} 

void Print(int arr[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",arr[i]);
	printf("\n"); 
}

int main()
{
	int i=0;
	int arr[N]={9,5,3,6,7,8,1,2};
	printf("排序前的序列时:");
	Print(arr,N);
	Sort(arr,N);
	printf("排序后的序列时:");
	Print(arr,N);
	return 0;
}

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

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

相关文章

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目&#xff1a;拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;拼车 题目链接&#xff1a;1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…

智能优化算法应用:基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

7个简单技巧,让你从容应对压力面试!

01-什么是压力面试&#xff1f; 压力面试是指有意制造紧张&#xff0c;以了解求职者将如何面对工作压力的一种面试形式。 事实上&#xff0c;压力面试不是单独存在的一类面试&#xff0c;往往是穿插在面试过程中。 面试人通过提出不礼貌、冒犯的问题&#xff0c;或者用怀疑、…

深入学习Synchronized各种使用方法

文章目录 前言一、synchronized关键字通用在下面四个地方&#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法&#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…

Clion自定义管理和配置软件构建过程的工具(代替CMake)构建程序

在公司由于需要x86环境和其他arm环境&#xff0c;同时需要使用公司自定义的mine_x86或者mine_orin对代码进行编译。 编译命令如下mine_x86 build -Dlocal1 -j8,为使用Clion对程序进行调试&#xff0c;需要对程序进行设置。方便调试代码时能够断点查看变量。尝试了很多次&#…

python高级练习题库实验1(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…

基于springboot + vue大学生竞赛管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

详解十大经典排序算法(五):归并排序(Merge Sort)

算法原理 归并排序的核心思想是将一个大的数组分割成多个小的子数组&#xff0c;然后分别对这些子数组进行排序&#xff0c;最后将排序后的子数组合并起来&#xff0c;得到一个有序的大数组。 算法描述 归并排序&#xff08;Merge Sort&#xff09;是一种经典的排序算法&#x…

二百一十二、Flume——Flume实时采集Linux中的目录文件写入到HDFS中(亲测、附截图)

一、目的 在实现Flume实时采集Linux中的Hive日志写入到HDFS后&#xff0c;再做一个测试&#xff0c;用Flume实时采集Linux中的目录文件&#xff0c;即使用 Flume 监听Linux整个目录的文件&#xff0c;并上传至 HDFS中 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、…

Linux使用root用户安装完MySQL软件后,配置MySQL这个普通用户登录

在 Linux 系统中&#xff0c;当您使用 root 用户安装 MySQL 后&#xff0c;系统会自动创建一个名为 mysql 的系统用户。这个 mysql 用户主要用于管理 MySQL 服务的运行&#xff0c;通常是没有登录系统的权限的。如果您希望使这个 mysql 用户能够登录到系统&#xff0c;您需要设…

JAVAEE初阶相关内容第十八弹--网络原理之TCP_IP【续集】

写在前 上一篇博客的重点内容主要讲了关于传输层的TCP协议、UDP协议。 点击跳转上一篇博客 重点介绍了协议的特点、协议端格式、需要重点理解并掌握TCP的工作机制&#xff08;十条&#xff09;。 TCP与UDP对比&#xff1f; TCP用于可靠传输的情况&#xff0c;应用于文件传输&am…

超完整的mysql安装配置方法(包含idea和navicat连接mysql,并实现建表)

mysql安装配置方法 1、下载mysql2、解压到指定的安装目录3、配置初始化文件my.ini4、配置用户变量和系统变量5、初始化mysql6、安装mysql服务并启动修改密码7、使用idea连接mysql8、使用Navicat可视化工具连接mysql&#xff0c;并实现新建数据库&#xff0c;新建表 1、下载mysq…

【数据结构与算法篇】八种排序 (C++实现)

多种排序算法的Cpp实现 一. 排序的概念及其运用排序的概念 二. 一图速览常见排序三. 排序的C实现1> 直接插入排序2> 希尔排序希尔排序代码实现(希尔所实现)希尔排序代码实现(优化版) 3> 选择排序选择排序的代码实现(同时选出最大和最小的元素) 4> 堆排序堆排序的代…

CSS面经(未完待续)

1. CSS选择器及其优先级 !important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符 2. 重排和重绘是什么&#xff1f;浏览器的渲染机制是什么&#xff1f; 重排(回流)&#xff1a;当增加或删除dom节点&…

面试就是这么简单,offer拿到手软(三)—— 常见中间件框架面试题,es,redis,dubbo,zookeeper kafka 等

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…

DAPP开发【09】NFT交易市场开发(hardhat测试)

测试文件下新建market.js文件 扁平化&#xff0c;将所有依赖放在tmp.sol&#xff0c;可以去给他人使用 npx hardhat flatten > tmp.sol 测试文件 const {expect} require(chai); const {ethers} require(hardhat);describe(Market,async function(){//定义三个合约&a…

long转int类型转换问题

在业务代码中排序时需要根据日期排序&#xff0c;写了如下代码 sorted((o1, o2) -> {String str1 null;String str2 null;try {Field field getField(fieldMap, configBO.getCodeName());str1 String.valueOf(field.get(o1));str2 String.valueOf(field.get(o2));} ca…

kubectl获取命名空间下所有configmap集合的方法

前言&#xff1a; 获取单个configmap并忽略特定字段的操作可参照&#xff1a;kubectl获取ConfigMap导出YAML时如何忽略某些字段。 要获取命名空间下所有ConfigMap并忽略特定字段&#xff0c;你可以使用kubectl命令与例如yq这样的工具结合使用来忽略或删除不需要的字段。以下是…

分布式ID服务实践

背景 分布式场景下需要一个全局 ID 来标识唯一性&#xff0c;比如在单数据库时通过表唯一主键即可实现唯一 ID&#xff0c;分库分表时就需要全局唯一 ID。 业务对唯一 ID 的要求如下&#xff1a; 全局唯一性 不能出现重复的 ID 号&#xff0c;既然是唯一标识&#xff0c;这…

CGAL的周期三角剖分(相关信息较少)

CGAL的周期二维三角剖分类旨在表示二维平面上的一组点的三角剖分。该三角剖分形成其计算空间的分区。它是一个单纯复体&#xff0c;即它包含任何k-单纯形的所有关联j-单纯形&#xff08;j<k&#xff09;&#xff0c;并且两个k-单纯形要么不重叠&#xff0c;要么共享一个公共…