#include iostream
#include fstream//即写入、读出的时候要用到这个头文件
#include string
#include <stdlib.h>//标准库头文件
#define num 128//网格数据大小
using namespace std;
bool isPeak(int grid[num][num],int r, int c);
void extremes(int grid[num][num], int nrows, int ncols);
int main (void){
int nrows,ncols;//行,列
int map[num][num];
string filename;//文件名
ifstream file;//建立一个文件流对象
cout<<"请输入文件名:\n";
cin>>filename;
//c_str是string类的一个函数,可以把string类型变量转换成char*变量open()要求的是一个char*字符串
file.open(filename.c_str());
/*EOF是baiEnd Of File 的缩写,表示“文件结束”。
从输入流读取数据,如果到达文件末尾(遇到文件结束符),eof函数值为非零值(表示真),如果未到文件结尾则为0(表示假)。
eof 函数用来判断是否到达文件结尾;
fail()用来判断一个流是否“坏”掉了。如果failbit、badbit中任意一种或两种被设置,则fail()返回true,否则返回false;
调用方式cin.fail();*/
if(file.fail()){
cout<<"打开文件出错.\n";
exit(1);
}
file>>nrows>>ncols;
if(nrows > num || ncols > num ){
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;
}
}
}
extremes(map, nrows, ncols);
//关闭文件
file.close();
system("pause");
return 0;
}
//grid 网格
bool isPeak(int grid[num][num],int r, int c){
//八个位置峰点的判断
if((grid[r][c] > grid[r-1][c])&&(grid[r][c] > grid[r - 1][c-1])&&
(grid[r][c] > grid[r+1][c])&& (grid[r][c] > grid[r - 1][c+1])&&
(grid[r][c] > grid[r][c-1])&& (grid[r][c] > grid[r + 1][c + 1]) &&
(grid[r][c] > grid[r][c+1])&& (grid[r][c] > grid[r + 1][c -1])){
return true;
}else{
return false;
}
}
void extremes(int grid[num][num], int row, int column){
int max = grid[0][0];
int min = grid[0][0];
for (int r = 0; r < row; r++)
{
printf("\n");
for (int c = 0; c < column; c++)
{
printf("%d", grid[r][c]);//打印每一个元素
if (max <grid[r][c])
{
max = grid[r][c];
}
if (min >grid[r][c])
{
min = grid[r][c];
}
}
}
cout << endl <<"海拔的最大值" << max << endl << "海拔的最小值" << min ;
}