指针与多维数组练习

例题一:

矩阵相乘

首先,如果你没学过线代的话,这边建议你去B站把宋浩的矩阵运算学了再来看题

如果有个矩阵A和一个矩阵B,当A的列数和B的行数相同时,生成一个新矩阵C,且C是通过矩阵乘法得来的

A[3][2]={3,-1,0,3,1,0}

B[2][4]={1,0,1,-1,0,2,1,0}

输出C矩阵

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define M 3
#define S 2
#define N 4
void Print(int(* C)[N])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%d ", *(*(C + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int A[M][S] = { {3,-1},{0,3},{1,0} };
	int B[S][N] = { {1,0,1,-1},{0,2,1,0} };
	int C[M][N] = { 0 };
	int(*p)[N] = C;
	//实现矩阵乘法
	for (int i = 0; i < M; i++)//控制C的行
	{
		for (int j = 0; j < N; j++)//控制C的列
		{
			int sum = 0;//计算
			for (int k = 0; k < S; k++)//利用A和B的一个行一个列相同来实现给C赋值
			{
				sum += (*(*(A + i) + k)) * (*(*(B + k) + j));
				//这里需要仔细理解,最内层使用来行的,外层是用来控制列的
				//即A+i--行,将其解引用可以找到行,*(A+i)+k--可以实现一行中向右找列
				//B+k--列,将其解引用后可以找到列,*(B+k)+j--可以实现一列中向下找行
			}
			*(*(p+i) + j) = sum;//*(p[i]+j)=sum
		}

	}
	p = NULL;
	//打印
	Print(C);
	/*for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%-3d ", C[i][j]);
		}
		printf("\n");
	}*/
	return 0;
}

例题二:

Z字编排

完成如图排序

这题关键就在于找规律!!!

以8*8为例:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define M 8
Print(int(*arr)[M])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			printf("%5d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr1[M][M] = { 0 };
	int arr2[M][M] = { 0 };
	int(*pi)[M] = arr1;
	//第一步:初始化矩阵
	int m = 0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//arr[i][j]=m++;
			*(*(pi + i) + j) = m++;
		}
	}
	//第二步:打印原始数组
	Print(arr1);
	//第三步:Z字编排
	int i = 0; 
	int j = 0;//用来确定arr2
	for (int x = 0; x < M; x++)
	{
		for (int y = 0; y < M; y++)
		{
			*(*(arr2 + i) + j) = *(*(arr1 + x) + y);//赋值
			//判断
			//用来找arr2的位置
			if ((i == 0 && j % 2 == 0) || (i == 7 && j % 2 == 0))
			{
				j++;
				continue;//注意:这里要直接退出本次循环了
			}
			if ((i % 2 != 0 && j == 0) || (i % 2 != 0 && j == 7))
			{
				i++;
				continue;//注意:这里要直接退出本次循环了

			}
			if ((i + j) % 2 == 0)
			{
				i--;
				j++;
			}
			if ((i + j) % 2 != 0)
			{
				i++;
				j--;
			}
		}
	}
	//第四步:打印排好的数组
	Print(arr2);
	return 0;
}

假如我现在要求M可以为其他数呢?

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define M 10
Print(int(*arr)[M])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			printf("%5d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr1[M][M] = { 0 };
	int arr2[M][M] = { 0 };
	int(*pi)[M] = arr1;
	//第一步:初始化矩阵
	int m = 0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//arr[i][j]=m++;
			*(*(pi + i) + j) = m++;
		}
	}
	//第二步:打印原始数组
	Print(arr1);
	//第三步:Z字编排
	int i = 0;
	int j = 0;//用来确定arr2
	for (int x = 0; x < M; x++)
	{
		for (int y = 0; y < M; y++)
		{
			*(*(arr2 + i) + j) = *(*(arr1 + x) + y);//赋值
			//判断
			//用来找arr2的位置
			if ((i == 0 && j % 2 == 0) || (i == M - 1 && j % 2 == 0))
			{
				j++;
				continue;
			}
			if ((j == 0 && i % 2 != 0) || (j == M - 1 && i % 2 != 0))
			{
				i++;
				continue;
			}
			if ((i + j) % 2 == 0)
			{
				i--;
				j++;
			}
			if ((i + j) % 2 != 0)
			{
				i++;
				j--;
			}
		}
	}
	//第四步:打印排好的数组
	printf("排好的如下:\n");
	Print(arr2);
	return 0;
}

结果:假设我输入10

最后,祝福各位学习天天进步!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Schrodinger Shape Screen 工具使用方法

schrodinger的shape screen方法是一种基于ligand的筛选方法。需要提供一个参考分子&#xff0c;和需要筛选的分子库。shape screen可以根据原子类型、药效团对分子的形状相似度进行打分。 shape screen面板 shape screen面板如下&#xff1a; 1. 参考分子来源&#xff0c;可以…

【Linux】C文件系统详解(三)——如何理解缓冲区以及自主封装一个文件接口

文章目录 如何理解缓冲区现象概念:文件缓冲区为什么要有缓冲区缓冲区在哪里 自己封装一个简单的文件接口自主封装目标 代码关于缓冲区强制刷新内核 关于字符串格式化函数printf和scanf函数 如何理解缓冲区 以前写过一个进度条, 有一个输出缓冲区->这个缓冲区在哪里,为什么要…

十三、Linux文件目录指令

pwd 指令 基本语法&#xff1a;pwd &#xff08;功能描述&#xff1a;显示当前工作目录的绝对路径&#xff09; 应用实例&#xff1a;案例&#xff1a;显示当前工作目录的绝对路径 ls 指令 基本语法&#xff1a;ls 【选项】【目录或是文件】 常用选项 -a &#xff1a;显示当…

卡片排列-第15届蓝桥第二次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第159讲。 第15届蓝桥杯第2次STEMA测评已于2023年10月29日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&…

最强人工智能ChatGPT引领AIGC发展

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- ——AI不会淘汰所有人&#xff0c;但会淘汰不懂AI的人 一、最强人工智能GPT-4 Turbo 在前不久的OpenAI开发者大会&#xff0c;正值Chatgpt3.5发布一…

UDS 14229-1定义的请求的响应行为

UDS服务响应规则 重要提示服务器一般响应行为包含子功能的请求响应行为物理寻址请求功能寻址请求 没有子功能参数的服务响应行为物理寻址客户端请求功能寻址客户端请求 伪代码示例 重要提示 服务应当支持物理寻址方式请求&#xff0c;部分服务也支持功能寻址方式请求。在功能寻…

Java集合大总结——List的简单使用

List简单介绍 鉴于Java中数组用来存储数据的局限性&#xff0c;我们通常使用java.util.List替代数组List集合类中元素有序、且可重复&#xff0c;集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有&#xff1a;ArrayList、LinkedList和Vector。 List…

五、Linux目录结构

1.基本介绍 1.Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"r/"&#xff0c;然后在此目录下再创建其他的目录。 2.深刻理解linux树状文件目录是非常重要的 3.记住一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件…

asp.net智能考试系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 智能考试系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 系统运行视频 https://www.bilibili.com/video/BV1gz4y1A7Qp/ 二、功能介绍 本系统使用Microsoft Visual Studio 201…

4.6每日一题(多元函数的隐函数求导)

三元方程确定的二元函数类型的隐函数 方法一&#xff1a;两边对x求偏导&#xff0c;把y看成常数 注&#xff1a;z可以把x和y同时代入求出答案 方法二&#xff1a;带公式

Linux tc 使用

tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的&#xff0c;如果没有安装该驱动&#xff0c;构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…

油猴脚本(JavaScript)-练手-简单的随机音乐播放器

浅浅的写个简单的随机音乐播放脚本(可移动)&#xff0c;注释很详细&#xff0c;直接上源码 效果&#xff1a; // UserScript // name 播放音乐脚本 // namespace 代码对我眨眼睛 // version 1.2 // description 在API上请求音乐链接并随机自动连续播放音乐&…

斯坦福机器学习 Lecture1

https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义&#xff1a;不需要明确编程就能让计算机去学习做某件事情 另一个定义 TODO:here

【网络】OSI模型 与 TCP/IP模型 对比

一、OSI模型 OSI模型包含7个层次&#xff0c;从下到上分别是&#xff1a; 1. 物理层&#xff08;Physical Layer&#xff09; - 功能&#xff1a;处理与电子设备物理接口相关的细节&#xff08;如电压、引脚布局、同步&#xff0c;等等&#xff09;。 - 协议&#xff1a;以…

clusterProfiler包学习

&#x1f4d6; Introduction | Biomedical Knowledge Mining using GOSemSim and clusterProfiler (yulab-smu.top) 部分使用 #GO classificationlibrary(clusterProfiler) data(geneList, package"DOSE") gene <- names(geneList)[abs(geneList) > 2]# Entre…

cesium雷达扫描(模糊圆效果)

cesium雷达扫描(模糊圆效果) 1、实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写自己的glsl来实现当前效果 1、示例源码 index.html <!DOCTYPE html> <html lang="en"><head><!<

常见树种(贵州省):002杉类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、杉木 …

9、传统计算机视觉 —— 边缘检测

本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…

TURN 协议

TURN 地址分配 抓包过程 TURN 连接建立 这里指的是 Client 收到对端从 TURN 分配的 IP 和 端口 &#xff0c;和对端的 TURN 和 IP 绑定的过程 CreatePermission Request 等消息&#xff0c;都会携带有对端的 TURN 和 IP 抓包过程