题目描述:
名为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运算符(>> 和 <<)