C++算法入门之数组找峰点(文件操作)

该文章描述了一个C++程序,其功能是从名为data.txt的文件中读取数据到二维数组,然后找出并打印出所有峰值元素的位置。峰值元素是指在二维数组中比其相邻元素都大的元素。程序首先读取文件的行数和列数,然后将数据加载到数组中,接着遍历内部元素,使用isPeak函数判断每个元素是否为峰值。
摘要由CSDN通过智能技术生成

题目描述:

名为data.txt的文件中存在着如下的数据:

在这里插入图片描述
现在通过简单算法找出这个文件中类似小数组的所有元素中被认为是峰点的元素,其中峰点的定义为:当二维数组中某个数比其上下左右侧数字都大时,可称其为峰点,打印出被视为峰点的元素位置


思路:

将文件中的数据读入到二维数组中,通过二维数组下标去判断元素与周围数的大小关系,思路简单,关键在于代码的积累上。


代码:

//输入输出
#include <iostream>
//此头文件是对文件进行操作时所需
#include <fstream>
//字符串
# include <string>
//std命名空间
using namespace std;
//二维数组的维度值
#define N 64
//函数声明:数组grid中r行c列的值是峰点就表示true,不是就表示false
bool isPeak(int grid[N][N],int r,int c);

int main(void) {
	//用于存储file读取出来的行和列值,也就是文件中的6 和 7
	int nrows, ncols;
	//二维数组
	int map[N][N];
	//文件名
	string filename;
	//定义file
	ifstream file;
	cout << "请输入文件名:\n";
	//输入文件名
	cin >> filename;
	//打开文件
	file.open(filename.c_str());
	//如果文件打开失败
	if (file.fail()) {
		cout << "打开输入文件出错\n";
		//异常结束:1,正常结束:0
		exit(1);
	}
	//文件读取前两个元素分别作为行和列
	file >> nrows >> ncols;
	//如果行列大于我们设置的二位数组的维度
	if (nrows > N || ncols > N) {
		cout << "网格太大,调整程序\n";
		exit(1);
	}

	//从数据文件读取数据到二位数组
	for (int i = 0; i < nrows; i++) {
		for (int j= 0; j < ncols; j++) {
			file >> map[i][j];
		}
	}

	//外围的一圈数据永远不是峰点
	for (int i = 1; i < nrows - 1; i++) {
		for (int j = 1; j < ncols - 1; j++) {
			if (isPeak(map, i, j)) {
				cout << "峰点出现在行:" << i << "列:" << j << endl;
			}
		}
	}
	//暂停一下,不让画面瞬间闪过
	system("pause");
	//关闭文件
	file.close();
	return 0;
}

//判断并打印峰值的位置
//数组中某个点是峰值的条件是:某个点比它四周的点都要大则就是峰点
bool isPeak(int grid[N][N], int r, int c) {
		//大于上面
	 if((grid[r][c] > grid[r - 1][c]) &&
**加粗样式**	    //大于下面
		(grid[r][c] > grid[r + 1][c]) &&
		//右侧
		(grid[r][c] > grid[r][c + 1]) &&
		//左侧
		(grid[r][c] > grid[r][c - 1])){
		 return true;
	 }
	 return false;
}

结果展示:
由结果所示,这三个元素为峰点,其在数组中的位置也正确
在这里插入图片描述


知识积累:

1、c_str()函数是string 类的一个函数,作用是把string类型转化为char类型,因为文件名被声明为string类型,则必须使用文件名.c_str()形式
2、ifstream函数是fstream头文件提供的,从一个文件读取数据的函数。ofstream函数是往文件中写数据的函数。其读取和写入的操作与cin/cout相似,都使用了IO运算符(>> 和 <<)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南霹雳堂雷家雷无桀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值