指针与多维数组练习

news2025/1/12 23:44:12

例题一:

矩阵相乘

首先,如果你没学过线代的话,这边建议你去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

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

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

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

相关文章

画中画视频剪辑:批量制作画中画视频,让视频更具吸引力和创意

在今天的视频制作环境中&#xff0c;画中画视频剪辑技术已经成为了一种主流。它不仅能增加视频的视觉吸引力&#xff0c;也可以提升观看体验。画中画视频剪辑是一种制作多个视频画面的技术&#xff0c;它可以将两个或更多的视频画面融合在一起&#xff0c;形成一个全新的视频。…

关于卓越服务的调研报告

NetSuite知识会发起的本次调研从2023年11月2日开始&#xff0c;到11月12日结束。16日已向参与调研的朋友邮件回复&#xff0c;感谢您的付出&#xff01;今朝分享此报告&#xff0c;各位同学参考。 调研问题与反馈总结 问题1&#xff1a;您能想到哪些服务组织能够提供高满意度&…

GIS杂记(三):MaxEnt模型中的图像地理范围不匹配【全网最好的方法,没有之一】

图像地理范围不匹配问题解决方法 1. 问题描述2. 问题范例3. 问题解决4. 其他参考 1. 问题描述 一般在使用全国的的生物气候变量时&#xff0c;由于其地理范围一致&#xff0c;因此不会出现地理范围不匹配的问题。但是&#xff0c;当加入其他影响因子的时候&#xff0c;如海拔、…

vue之浏览器存储方法封装实例

我们在项目中通常会对缓存进行一些操作&#xff0c;为了便于全局调用&#xff0c;会对缓存的设置、获取及删除方法进行封装成一个工具类。 首先我们在src目录下创建一个plugins文件夹&#xff0c;在plugins下创建cache文件夹并创建index.js&#xff0c;代码如下&#xff1a; c…

Linux每日智囊-cat, more, less

每日分享三个Linux命令&#xff0c;悄悄培养读者的Linux技能。 cat 作用 在终端显示文件内容 cat命令允许创建单个或多个文件&#xff0c;查看文件的内容&#xff0c;连接文件并在终端或文件中重定向输出。 语法 cat [选项] 文件 参数&#xff1a; -n:显示行数&#xf…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…

初级程序员如何进阶

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 疑问的无限递归 我刚入…

GMEL:基于地理上下文嵌入的OD流预测

1 文章信息 文章题为“Learning Geo-Contextual Embeddings for Commuting Flow Prediction”&#xff0c;是一篇发表于The Thirty-Seventh AAAI Conference on Artificial Intelligence (AAAI-20)的一篇论文。该论文主要针对交通中OD流预测任务&#xff0c;从地理上下文信息中…

聊聊近些年 CPU 在微架构、IO 速率上的演进过程

大家好&#xff0c;我是飞哥&#xff01; 在上一篇《深入了解 CPU 的型号、代际架构与微架构》 中我们介绍了我手头的一颗 Intel(R) Core(TM) i5 的型号规则&#xff0c;以及它的物理硬件的 Die 图结构。以及它对应的 Skylake 核的微架构实现。 不少同学开始问我其它型号的 CPU…

2023年【金属非金属矿山安全检查(地下矿山)】考试报名及金属非金属矿山安全检查(地下矿山)最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试报名参考答案及金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山安全检查&#…

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

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

超详细vue3选项式父子组件传值

一、问题背景 最近遇到了一个情景&#xff1a; 子组件干完事情&#xff0c;需要对父组件的变量进行更新&#xff0c;因为父组件将该变量传递给子组件&#xff0c;但是不会双向绑定&#xff0c;这时候我们就需要传值或者触发回调去解决这个问题 我们将分为两个部分 1.父组件传…

小美的排列构造

美团2024届秋招笔试第一场编程真题 贪心问题&#xff0c;得到所有n全排列中相邻两数的和&#xff0c;这些和差距要尽可能小。 显然如果1和2排一起&#xff0c;或者让n和n-1相邻都是错误的。最好的方式是让相邻两数的和接近&#xff08;n1&#xff09;/2。 比如:n 1 n-1 2...…

在excel中设置图表的标题

已经在excel做好了一个图&#xff0c;默认是没有标题的&#xff1a; 现在来设置一个标题。 双击图表&#xff0c;进入编辑状态&#xff1a; 右键&#xff0c;选择“插入标题”&#xff1a; 输入标题&#xff1a;

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002类型断言例子003巩固练习 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范…

对象与this

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 最近想再聊聊Java的对象…

vscode pandas无法使用

一、代码内容 import csv csv_reader csv.reader(open("data.csv")) for row in csv_reader:print(row) print(row[2]) 二、错误提示 ModuleNotFoundError: No module named pandas 三、安装pandas 然后我安装pandas&#xff0c;因为我的python的版本是python …

C++类与对象(1)—初步认识

目录 一、面向过程和面向对象 二、类 1、定义 2、类的两种定义方式 3、访问限定符 4、命名规范化 5、类的实例化 6、计算类对象的大小 7、存储方式 三、this指针 1、定义 2、存储位置 3、辨析 四、封装好处 一、面向过程和面向对象 C语言是面向过程的&#xf…

新版mmdetection3d将3D bbox绘制到图像

环境信息 使用 python mmdet3d/utils/collect_env.py收集环境信息 sys.platform: linux Python: 3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 06:08:21) [GCC 9.4.0] CUDA available: True numpy_random_seed: 2147483648 GPU 0,1: NVIDIA GeForce RTX 3090 …

11月19日

一、选择题1.一般认为,世界上第1台电子数字计算机诞生于(&#xff09;年。 A. 1946 B. 1952 C. 1959 D. 1962 1946 记&#xff1a;4 5 6 7 8 平均十年一代 一、计算机发展五代1946年&#xff0c; 世界上第一台数字电子计算机ENIAC 1.1946年开始&#xff0c;第一代电子管计算机…