题目要求:
(1) 用名称、人口、海拔高度、天气、年份等数据成员建立一个名为City的类。建立一个产生City对象的类。
(2)将产生的City对象(数量大于200个)填充至一个容器,容器的类型自选。
(3)对于City对象的具体属性值通过创建发生器来生成。生成规则如下:年份为2006年;名称由4-8个英文小写字符随机构成;人口在范围[100000,10000000)内随机选取;海拔高度在范围[0,4000)米内随机选取;上述三值均不可重复;天气在枚举常量表中{Rainy,Snowy,Cloudy,Sunny}随机选取(1年天气取12个值,即每月一个值)。
(4)容器填充完毕后,将其内容写入一个名为City.txt的文件。
代码实现如下:
#include<iostream>
#include<vector>
#include<string>
#include<time.h>
#include<algorithm>
using namespace std;
//天气在枚举常量中表示
enum Enum_weather
{
Rainy=0,Snowy,Cloudy,Sunny
};
//创建城市类
class City
{
public:
int year;
//char *name;
string name;
int persons;
int elevation;
char *weather[12];
City()
{
//neme=new char[10];
}
~City(){}
};
//随机生成字符串函数
char *rand_str(char *str)
{
int i,n;
n=rand()%5;
for(i=0;i<n+4;++i)
{
str[i]='a'+rand()%26;
}
str[++i]='\\0';
return str;
}
//枚举类型转化为char*
static inline char* weather_str(enum Enum_weather w)
{
char *strings[] = {"Rainy", "Snowy", "Cloudy", "Sunny",};
return strings[w];
}
int main()
{
srand((unsigned)time(NULL));
vector<City>ve(215);
for (int i=0;i<215;i++) //将随机获取每个城市的数据写入vector中
{
ve[i].year=2006;
ve[i].persons=rand()%(10000000 - 100000 + 1) + 100000; //在某范围内随机获取数值
ve[i].elevation=rand()%(4000-0+1)+0;
char name1[10]={};
rand_str(name1); //调用rand_str()函数随机生成城市名称字符串
ve[i].name=name1;
for (int j=0;j<12;j++)
{
int n=rand()%4;
Enum_weather w1=(enum Enum_weather)(n);
char* nc=weather_str(w1); //调用weather_str()函数将枚举类型值转化为char*
ve[i].weather[j]=nc;
}
}
//将2006年各个城市的数据信息写入City.txt文本文件中
FILE *fp;
fp=fopen("D://City.txt","w+");
fprintf(fp,"年份 城市名称 城市人口 海拔高度 1月天气 2月天气 3月天气 4月天气 5月天气 6月天气 7月天气 8月天气 9月天气 10月天气 11月天气 12月天气\n");
for (int i=0;i<215;i++)
{
char name2[10]={};
for (int k=0;k<ve[i].name.size();k++) //string类型转char数组
{
name2[k]=ve[i].name[k];
}
fprintf(fp,"%d%10s%10d%10d",ve[i].year,name2,ve[i].persons,ve[i].elevation);
for (int j=0;j<12;j++)
{
fprintf(fp,"%11s",ve[i].weather[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}