vue+d3js+fastapi实现天气柱状图折线图饼图

说明:
vue+d3js+fastapi实现天气柱状图折线图饼图
效果图:
在这里插入图片描述
step0:postman

1. 生成天气数据(POST请求):URL: http://localhost:8000/generate-data/?year=2024&month=3&seed=42
方法: POST
Headers:Content-Type: application/json
成功响应示例:
{"status": "success","message": "成功生成31条天气数据","year": 2024,"month": 3
}2. 查询天气数据(GET请求):URL: http://localhost:8000/weather-data/?year=2024&month=4
方法: GET
成功响应示例:{"status": "success","count": 31,"year": 2024,"month": 3,"data": [{"record_date": "2024-03-01","temperature": 16.4,"humidity": 72,"precipitation": 0.0,"wind_speed": 7.2,"weather_condition": "Cloudy"},{"record_date": "2024-03-31","temperature": 17.3,"humidity": 62,"precipitation": 3.8,"wind_speed": 1.4,"weather_condition": "Rain"}]
}

step1:sql

CREATE TABLE weather_data (id INT AUTO_INCREMENT PRIMARY KEY,record_date DATE NOT NULL,temperature DECIMAL(4,1) NOT NULL,  -- 格式:-99.9 到 99.9humidity TINYINT UNSIGNED NOT NULL,  -- 范围:0-100precipitation DECIMAL(5,1) NOT NULL, -- 最大999.9mmwind_speed DECIMAL(4,1) NOT NULL,   -- 最大99.9m/sweather_condition VARCHAR(50) NOT NULL,  -- 修改列名INDEX (record_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;select *from weather_data;

step2:python test
C:\Users\wangrusheng\PycharmProjects\FastAPIProject1\hello.py

import random
from datetime import date
from decimal import Decimal
import calendar
import pymysql.cursors
import json
# 数据库配置(根据实际情况修改)
DB_CONFIG = {'host': 'localhost','user': 'root','password': '123456','db': 'db_school','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}def generate_temperature(rng, min_temp=10.0, max_temp=20.0):"""生成温度数据(均匀分布)"""temp = rng.uniform(min_temp, max_temp)return round(temp, 1)def generate_humidity(rng):"""生成湿度数据(正态分布)"""humidity = rng.gauss(60, 15)humidity = max(0, min(humidity, 100))return int(round(humidity))def generate_precipitation(rng):"""生成降水量数据(20%概率下雨)"""if rng.random() < 0.2:amount = rng.expovariate(1 / 5.0)  # 平均5mmamount = max(0.1, min(amount, 30.0))return round(amount, 1)return 0.0def generate_wind_speed(rng):"""生成风速数据(伽马分布)"""speed = rng.gammavariate(2, 2)speed = max(0.0, min(speed, 20.0))return round(speed, 1)def get_weather_condition(temperature, precipitation, humidity, rng):"""根据天气参数判断天气状况"""if precipitation > 0:return 'Snow' if temperature < 3.0 else 'Rain'if humidity >= 70:return 'Cloudy'if humidity <= 30:return 'Sunny'return rng.choice(['Partly Cloudy', 'Mostly Cloudy'])def generate_monthly_weather_data(year, month, rng=None):"""生成整月天气数据"""if rng is None:rng = random.Random()_, num_days = calendar.monthrange(year, month)data = []for day in range(1, num_days + 1):record_date = date(year, month, day)temperature = generate_temperature(rng)humidity = generate_humidity(rng)precipitation = generate_precipitation(rng)wind_speed = generate_wind_speed(rng)condition = get_weather_condition(temperature, precipitation, humidity, rng)data.append({'record_date': record_date,'temperature': temperature,'humidity': humidity,'precipitation': precipitation,'wind_speed': wind_speed,'weather_condition': condition})return datadef insert_weather_data(data):"""批量插入天气数据到数据库"""connection = pymysql.connect(**DB_CONFIG)try:with connection.cursor() as cursor:sql = """INSERT INTO weather_data (record_date, temperature, humidity, precipitation, wind_speed, weather_condition)VALUES (%s, %s, %s, %s, %s, %s)"""params = [(d['record_date'],d['temperature'],d['humidity'],d['precipitation'],d['wind_speed'],d['weather_condition'])for d in data]cursor.executemany(sql, params)connection.commit()return len(data)except Exception as e:connection.rollback()raise efinally:connection.close()def get_weather_data(year: int, month: int) -> list:"""从数据库获取指定年月的天气数据并转换为JSON兼容格式"""connection = pymysql.connect(**DB_CONFIG)try:with connection.cursor() as cursor:sql = """SELECT record_date, temperature, humidity, precipitation, wind_speed, weather_conditionFROM weather_dataWHERE YEAR(record_date) = %s AND MONTH(record_date) = %sORDER BY record_date"""cursor.execute(sql, (year, month))results = cursor.fetchall()# 转换日期和数值类型for record in results:record['record_date'] = record['record_date'].isoformat()# 处理Decimal类型(如果存在)for key in ['temperature', 'precipitation', 'wind_speed']:if isinstance(record[key], Decimal):record[key] = float(record[key])return resultsfinally:connection.close()if __name__ == '__main__':# 示例:生成并插入2024年4月的天气数据year = 2024month = 4# 创建带种子的随机生成器(保证结果可复现)rng = random.Random(42)try:# 生成模拟数据weather_data = generate_monthly_weather_data(year, month, rng)# 插入数据库# inserted_count = insert_weather_data(weather_data)# print(f"成功插入{inserted_count}条天气数据")# 获取并打印JSON数据weather_json = get_weather_data(year, month)print(json.dumps(weather_json, indent=2, ensure_ascii=False))except Exception as e:print(f"操作失败: {str(e)}")

step3:python fastapi
C:\Users\wangrusheng\PycharmProjects\FastAPIProject1\main.py

from fastapi import FastAPI, HTTPException, Query
from datetime import date
from decimal import Decimal
from typing import Optional
import random
import calendar
import pymysql.cursors
import json
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# CORS配置
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)
# 数据库配置(根据实际情况修改)
DB_CONFIG = {'host': 'localhost','user': 'root','password': '123456','db': 'db_school','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}# 以下保持原有函数定义不变(generate_temperature、generate_humidity等)
# [原有函数定义区,保持与问题中完全相同的函数实现]def generate_temperature(rng, min_temp=10.0, max_temp=20.0):"""生成温度数据(均匀分布)"""temp = rng.uniform(min_temp, max_temp)return round(temp, 1)def generate_humidity(rng):"""生成湿度数据(正态分布)"""humidity = rng.gauss(60, 15)humidity = max(0, min(humidity, 100))return int(round(humidity))def generate_precipitation(rng):"""生成降水量数据(20%概率下雨)"""if rng.random() < 0.2:amount = rng.expovariate(1 / 5.0)  # 平均5mmamount = max(0.1, min(amount, 30.0))return round(amount, 1)return 0.0def generate_wind_speed(rng):"""生成风速数据(伽马分布)"""speed = rng.gammavariate(2, 2)speed = max(0.0, min(speed, 20.0))return round(speed, 1)def get_weather_condition(temperature, precipitation, humidity, rng):"""根据天气参数判断天气状况"""if precipitation > 0:return 'Snow' if temperature < 3.0 else 'Rain'if humidity >= 70:return 'Cloudy'if humidity <= 30:return 'Sunny'return rng.choice(['Partly Cloudy', 'Mostly Cloudy'])def generate_monthly_weather_data(year, month, rng=None):"""生成整月天气数据"""if rng is None:rng = random.Random()_, num_days = calendar.monthrange(year, month)data = []for day in range(1, num_days + 1):record_date = date(year, month, day)temperature = generate_temperature(rng)humidity = generate_humidity(rng)precipitation = generate_precipitation(rng)wind_speed = generate_wind_speed(rng)condition = get_weather_condition(temperature, precipitation, humidity, rng)data.append({'record_date': record_date,'temperature': temperature,'humidity': humidity,'precipitation': precipitation,'wind_speed': wind_speed,'weather_condition': condition})return datadef insert_weather_data(data):"""批量插入天气数据到数据库"""connection = pymysql.connect(**DB_CONFIG)try:with connection.cursor() as cursor:sql = """INSERT INTO weather_data (record_date, temperature, humidity, precipitation, wind_speed, weather_condition)VALUES (%s, %s, %s, %s, %s, %s)"""params = [(d['record_date'],d['temperature'],d['humidity'],d['precipitation'],d['wind_speed'],d['weather_condition'])for d in data]cursor.executemany(sql, params)connection.commit()return len(data)except Exception as e:connection.rollback()raise efinally:connection.close()def get_weather_data(year: int, month: int) -> list:"""从数据库获取指定年月的天气数据并转换为JSON兼容格式"""connection = pymysql.connect(**DB_CONFIG)try:with connection.cursor() as cursor:sql = """SELECT record_date, temperature, humidity, precipitation, wind_speed, weather_conditionFROM weather_dataWHERE YEAR(record_date) = %s AND MONTH(record_date) = %sORDER BY record_date"""cursor.execute(sql, (year, month))results = cursor.fetchall()# 转换日期和数值类型for record in results:record['record_date'] = record['record_date'].isoformat()# 处理Decimal类型(如果存在)for key in ['temperature', 'precipitation', 'wind_speed']:if isinstance(record[key], Decimal):record[key] = float(record[key])return resultsfinally:connection.close()@app.post("/generate-data/")
async def generate_weather_data(year: int = Query(..., ge=2000, le=2100, description="年份"),month: int = Query(..., ge=1, le=12, description="月份"),seed: Optional[int] = Query(None, description="随机种子(可选)")
):"""生成并插入指定月份的天气数据"""try:rng = random.Random(seed) if seed else random.Random()weather_data = generate_monthly_weather_data(year, month, rng)inserted_count = insert_weather_data(weather_data)return {"status": "success","message": f"成功生成{inserted_count}条天气数据","year": year,"month": month}except ValueError as e:raise HTTPException(status_code=400, detail=str(e))except Exception as e:raise HTTPException(status_code=500, detail=f"数据库操作失败: {str(e)}")@app.get("/weather-data/")
async def get_weather(year: int = Query(..., ge=2000, le=2100, description="年份"),month: int = Query(..., ge=1, le=12, description="月份")
):"""获取指定月份的天气数据"""try:data = get_weather_data(year, month)return {"status": "success","count": len(data),"year": year,"month": month,"data": data}except Exception as e:raise HTTPException(status_code=500, detail=f"数据查询失败: {str(e)}")if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

step4:vue
C:\Users\wangrusheng\PycharmProjects\untitled3\src\views\Lottery.vue

<template><div><div class="controls"><input v-model.number="year" type="number" placeholder="年份"><input v-model.number="month" type="number" placeholder="月份" min="1" max="12"><button @click="fetchData">查询</button><button @click="generateData">生成数据</button></div><div class="charts-container"><div class="chart-box"><h3>每日温度柱状图</h3><div ref="barChart" class="chart"></div></div><div class="chart-box"><h3>温度趋势折线图</h3><div ref="lineChart" class="chart"></div></div><div class="chart-box"><h3>天气状况分布饼图</h3><div ref="pieChart" class="chart"></div></div></div></div>
</template><script>
import * as d3 from 'd3';
import axios from 'axios';export default {data() {return {weatherData: [],year: null,month: null};},methods: {async fetchData() {if (!this.validateInput()) return;try {const response = await axios.get('http://localhost:8000/weather-data/', {params: { year: this.year, month: this.month }});this.weatherData = response.data.data;this.redrawCharts();} catch (error) {this.handleError(error, '查询');}},async generateData() {if (!this.validateInput()) return;try {const response = await axios.post('http://localhost:8000/generate-data/', null, {params: { year: this.year, month: this.month, seed: 42 },headers: { 'Content-Type': 'application/json' }});alert(`生成成功:${response.data.message}`);await this.fetchData();} catch (error) {this.handleError(error, '生成');}},validateInput() {if (!this.year || !this.month) {alert('请填写年份和月份');return false;}if (this.month < 1 || this.month > 12) {alert('月份必须为1-12');return false;}return true;},handleError(error, operation) {console.error(`${operation}失败:`, error);alert(`${operation}失败,请检查控制台`);},redrawCharts() {this.clearCharts();this.drawBarChart();this.drawLineChart();this.drawPieChart();},clearCharts() {[this.$refs.barChart, this.$refs.lineChart, this.$refs.pieChart].forEach(ref => ref.innerHTML = '');},// 各图表绘制方法(保持原有实现,开头添加清除逻辑)// 绘制柱状图drawBarChart() {const margin = { top: 30, right: 30, bottom: 50, left: 60 };const width = 800 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;const svg = d3.select(this.$refs.barChart).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', `translate(${margin.left},${margin.top})`);// 创建比例尺const x = d3.scaleBand().domain(this.weatherData.map(d => d.record_date)).range([0, width]).padding(0.2);const y = d3.scaleLinear().domain([0, d3.max(this.weatherData, d => d.temperature)]).range([height, 0]);// 添加柱状svg.selectAll("rect").data(this.weatherData).join("rect").attr("x", d => x(d.record_date)).attr("y", d => y(d.temperature)).attr("width", x.bandwidth()).attr("height", d => height - y(d.temperature)).attr("fill", "#4CAF50");// 添加坐标轴svg.append("g").attr("transform", `translate(0,${height})`).call(d3.axisBottom(x).tickValues(x.domain().filter((d,i) => !(i%5))));svg.append("g").call(d3.axisLeft(y));// 添加标签svg.append("text").attr("transform", `translate(${width/2}, ${height + 40})`).style("text-anchor", "middle").text("日期");svg.append("text").attr("transform", "rotate(-90)").attr("y", 0 - margin.left).attr("x",0 - (height / 2)).attr("dy", "1em").style("text-anchor", "middle").text("温度(℃)");},// 绘制折线图drawLineChart() {const margin = { top: 30, right: 30, bottom: 50, left: 60 };const width = 800 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;const svg = d3.select(this.$refs.lineChart).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', `translate(${margin.left},${margin.top})`);// 创建比例尺const x = d3.scaleBand().domain(this.weatherData.map(d => d.record_date)).range([0, width]);const y = d3.scaleLinear().domain([d3.min(this.weatherData, d => d.temperature) - 2, d3.max(this.weatherData, d => d.temperature) + 2]).range([height, 0]);// 创建折线生成器const line = d3.line().x(d => x(d.record_date) + x.bandwidth()/2).y(d => y(d.temperature));// 绘制折线svg.append("path").datum(this.weatherData).attr("fill", "none").attr("stroke", "#2196F3").attr("stroke-width", 2).attr("d", line);// 添加坐标轴svg.append("g").attr("transform", `translate(0,${height})`).call(d3.axisBottom(x).tickValues(x.domain().filter((d,i) => !(i%5))));svg.append("g").call(d3.axisLeft(y));},// 绘制饼图drawPieChart() {const width = 400;const height = 400;const radius = Math.min(width, height) / 2;const svg = d3.select(this.$refs.pieChart).append('svg').attr('width', width).attr('height', height).append('g').attr('transform', `translate(${width/2},${height/2})`);// 统计天气状况const data = Array.from(d3.rollup(this.weatherData,v => v.length,d => d.weather_condition),([name, value]) => ({name, value}));// 创建颜色比例尺const color = d3.scaleOrdinal().domain(data.map(d => d.name)).range(d3.schemeCategory10);// 饼图生成器const pie = d3.pie().value(d => d.value);// 弧形生成器const arc = d3.arc().innerRadius(0).outerRadius(radius);// 绘制扇形const arcs = svg.selectAll("arc").data(pie(data)).enter().append("g").attr("class", "arc");arcs.append("path").attr("d", arc).attr("fill", d => color(d.data.name)).attr("stroke", "white").style("stroke-width", "2px");// 添加标签arcs.append("text").attr("transform", d => `translate(${arc.centroid(d)})`).attr("text-anchor", "middle").text(d => d.data.name);}}
};
</script><style>
.controls {padding: 1rem;display: flex;gap: 1rem;align-items: center;
}.controls input {padding: 0.5rem;border: 1px solid #ddd;border-radius: 4px;width: 120px;
}.controls button {padding: 0.5rem 1rem;background: #2196F3;color: white;border: none;border-radius: 4px;cursor: pointer;
}.controls button:hover {background: #1976D2;
}.charts-container {display: flex;flex-direction: column;gap: 2rem;padding: 2rem;
}.chart-box {background: white;padding: 1rem;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);width: 100%;
}.chart-box h3 {margin: 0 0 1rem;color: #333;
}.chart {width: 100%;height: 400px;
}
</style>

end

//我是分割线
step101: old vue

下面的代码修改:1.年份 月份 改为可选,
2.新增两个按钮,查询和添加
3.查询和添加,需要做网络请求
4.三个图表 需要垂直排列1. 生成天气数据(POST请求):URL: http://localhost:8000/generate-data/?year=2024&month=3&seed=42
方法: POST
Headers:Content-Type: application/json
成功响应示例:
{"status": "success","message": "成功生成31条天气数据","year": 2024,"month": 3
}<template><div class="charts-container"><div class="chart-box"><h3>每日温度柱状图</h3><div ref="barChart" class="chart"></div></div><div class="chart-box"><h3>温度趋势折线图</h3><div ref="lineChart" class="chart"></div></div><div class="chart-box"><h3>天气状况分布饼图</h3><div ref="pieChart" class="chart"></div></div></div>
</template><script>
import * as d3 from 'd3';
import axios from 'axios';export default {data() {return {weatherData: []};},async mounted() {try {const response = await axios.get('http://localhost:8000/weather-data/?year=2024&month=4');this.weatherData = response.data.data;this.drawBarChart();this.drawLineChart();this.drawPieChart();} catch (error) {console.error('数据获取失败:', error);}},methods: {// 绘制柱状图drawBarChart() {const margin = { top: 30, right: 30, bottom: 50, left: 60 };const width = 800 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;const svg = d3.select(this.$refs.barChart).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', `translate(${margin.left},${margin.top})`);// 创建比例尺const x = d3.scaleBand().domain(this.weatherData.map(d => d.record_date)).range([0, width]).padding(0.2);const y = d3.scaleLinear().domain([0, d3.max(this.weatherData, d => d.temperature)]).range([height, 0]);// 添加柱状svg.selectAll("rect").data(this.weatherData).join("rect").attr("x", d => x(d.record_date)).attr("y", d => y(d.temperature)).attr("width", x.bandwidth()).attr("height", d => height - y(d.temperature)).attr("fill", "#4CAF50");// 添加坐标轴svg.append("g").attr("transform", `translate(0,${height})`).call(d3.axisBottom(x).tickValues(x.domain().filter((d,i) => !(i%5))));svg.append("g").call(d3.axisLeft(y));// 添加标签svg.append("text").attr("transform", `translate(${width/2}, ${height + 40})`).style("text-anchor", "middle").text("日期");svg.append("text").attr("transform", "rotate(-90)").attr("y", 0 - margin.left).attr("x",0 - (height / 2)).attr("dy", "1em").style("text-anchor", "middle").text("温度(℃)");},// 绘制折线图drawLineChart() {const margin = { top: 30, right: 30, bottom: 50, left: 60 };const width = 800 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;const svg = d3.select(this.$refs.lineChart).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', `translate(${margin.left},${margin.top})`);// 创建比例尺const x = d3.scaleBand().domain(this.weatherData.map(d => d.record_date)).range([0, width]);const y = d3.scaleLinear().domain([d3.min(this.weatherData, d => d.temperature) - 2, d3.max(this.weatherData, d => d.temperature) + 2]).range([height, 0]);// 创建折线生成器const line = d3.line().x(d => x(d.record_date) + x.bandwidth()/2).y(d => y(d.temperature));// 绘制折线svg.append("path").datum(this.weatherData).attr("fill", "none").attr("stroke", "#2196F3").attr("stroke-width", 2).attr("d", line);// 添加坐标轴svg.append("g").attr("transform", `translate(0,${height})`).call(d3.axisBottom(x).tickValues(x.domain().filter((d,i) => !(i%5))));svg.append("g").call(d3.axisLeft(y));},// 绘制饼图drawPieChart() {const width = 400;const height = 400;const radius = Math.min(width, height) / 2;const svg = d3.select(this.$refs.pieChart).append('svg').attr('width', width).attr('height', height).append('g').attr('transform', `translate(${width/2},${height/2})`);// 统计天气状况const data = Array.from(d3.rollup(this.weatherData,v => v.length,d => d.weather_condition),([name, value]) => ({name, value}));// 创建颜色比例尺const color = d3.scaleOrdinal().domain(data.map(d => d.name)).range(d3.schemeCategory10);// 饼图生成器const pie = d3.pie().value(d => d.value);// 弧形生成器const arc = d3.arc().innerRadius(0).outerRadius(radius);// 绘制扇形const arcs = svg.selectAll("arc").data(pie(data)).enter().append("g").attr("class", "arc");arcs.append("path").attr("d", arc).attr("fill", d => color(d.data.name)).attr("stroke", "white").style("stroke-width", "2px");// 添加标签arcs.append("text").attr("transform", d => `translate(${arc.centroid(d)})`).attr("text-anchor", "middle").text(d => d.data.name);}}
};
</script><style>
.charts-container {display: grid;grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));gap: 2rem;padding: 2rem;
}.chart-box {background: white;padding: 1rem;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}.chart-box h3 {margin: 0 0 1rem;color: #333;
}.chart {width: 100%;height: 400px;
}
</style>

step102:c++ 模拟数据
C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\CMakeProject1.cpp

#include <iostream>
#include <random>
#include <vector>
#include <string>
#include <iomanip>
#include <cmath>struct WeatherData {int day;double temperature;int humidity;double precipitation;double wind_speed;std::string condition;
};// 生成温度(可指定范围)
double generate_temperature(std::mt19937& gen, double min_temp = 10.0, double max_temp = 20.0) {std::uniform_real_distribution<double> dist(min_temp, max_temp);return std::round(dist(gen) * 10) / 10.0; // 保留1位小数
}// 生成湿度(正态分布)
int generate_humidity(std::mt19937& gen) {std::normal_distribution<double> dist(60.0, 15.0);double humidity = dist(gen);humidity = std::clamp(humidity, 0.0, 100.0);return static_cast<int>(std::round(humidity));
}// 生成降水量(20%概率下雨)
double generate_precipitation(std::mt19937& gen) {std::bernoulli_distribution rain_dist(0.2);if (rain_dist(gen)) {std::exponential_distribution<double> amount_dist(1.0 / 5.0); // 平均5mmdouble amount = amount_dist(gen);amount = std::clamp(amount, 0.1, 30.0);return std::round(amount * 10) / 10.0; // 保留1位小数}return 0.0;
}// 生成风速(伽马分布)
double generate_wind_speed(std::mt19937& gen) {std::gamma_distribution<double> dist(2.0, 2.0);double speed = dist(gen);speed = std::clamp(speed, 0.0, 20.0);return std::round(speed * 10) / 10.0; // 保留1位小数
}// 生成天气状况
std::string get_condition(double temp, double precip, int humidity) {if (precip > 0) {return (temp < 3.0) ? "Snow" : "Rain";}if (humidity >= 70) return "Cloudy";if (humidity <= 30) return "Sunny";// 随机选择部分多云或阴天static std::vector<std::string> options = { "Partly Cloudy", "Mostly Cloudy" };std::uniform_int_distribution<int> dist(0, 1);std::mt19937 temp_gen(std::random_device{}());return options[dist(temp_gen)];
}// 生成完整月份数据
std::vector<WeatherData> generate_april_data(std::mt19937& gen) {std::vector<WeatherData> data;for (int day = 1; day <= 30; ++day) {WeatherData wd;wd.day = day;wd.temperature = generate_temperature(gen);wd.humidity = generate_humidity(gen);wd.precipitation = generate_precipitation(gen);wd.wind_speed = generate_wind_speed(gen);wd.condition = get_condition(wd.temperature, wd.precipitation, wd.humidity);data.push_back(wd);}return data;
}int main() {// 初始化随机数生成器std::random_device rd;std::mt19937 gen(rd());// 生成数据auto weather_data = generate_april_data(gen);// 输出CSV格式std::cout << "Day,Temperature,Humidity,Precipitation,Wind Speed,Condition\n";for (const auto& wd : weather_data) {std::cout << wd.day << ","<< std::fixed << std::setprecision(1) << wd.temperature << "°C,"<< wd.humidity << "%,"<< wd.precipitation << "mm,"<< wd.wind_speed << "m/s,"<< wd.condition << "\n";}return 0;
}

end

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

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

相关文章

UE5,LogPackageName黄字警报处理方法

比如这个场景&#xff0c;淘宝搜索&#xff0c;ue5 T台&#xff0c;转为ue5.2后&#xff0c;选择物体&#xff0c;使劲冒错。 LogPackageName: Warning: DoesPackageExist called on PackageName that will always return false. Reason: 输入“”为空。 2. 风险很大的删除法&…

量子代理签名:量子时代的数字授权革命

1. 量子代理签名的定义与核心原理 量子代理签名&#xff08;Quantum Proxy Signature, QPS&#xff09;是经典代理签名在量子信息领域的延伸&#xff0c;允许原始签名者&#xff08;Original Signer&#xff09;授权给代理签名者&#xff08;Proxy Signer&#xff09;代为签署文…

【ESP32-C6】Base on esptool commands to enable Flash Encryption and Secure Boot

Please refer to Security Guides Security Overview Flash Encryption Secure Boot v2 Security Features Enablement Workflows Vulnerabilities You can base on “esp-idf/examples/security/flash_encryption” example for testing. Partition Table setting&#…

Kotlin 学习-方法和参数类型

/*** kotlin 的方法有三种* */fun main() {/*** 方法一* 1.普通类的成员方法申明与调用* &#xff08;1&#xff09;需要先构建出实例对象&#xff0c;才能访问成员方法* &#xff08;2&#xff09;实例对象的构建只需要在类名后面加上()* */Person().test()/*** 方法二&#x…

头歌 | WPS文档基本操作

若为出现预期结果可私信我答疑 2025年4月9日 第1关&#xff1a;新建WPS文档和保存文档 在本地创建一个1.sh,内容写入echo 我的第一个WPS文档.docx创建成功点击工具栏 点击上传文件把刚刚创建的1.sh上传 点击图形化 点击workspace>userfiles, 复制上传的文件1.sh返回上一级…

使用docker 安装向量数据库Milvus

Miluvs 官网 www.milvus.io/ https://milvus.io/docs/zh/install_standalone-docker-compose-gpu.md 一、基本概念 向量数据库&#xff1a;Milvus是一款云原生向量数据库&#xff0c;它支持多种类型的向量&#xff0c;如浮点向量、二进制向量等&#xff0c;并且可以处理大规模…

ps 人像学习

视频&#xff1a; 一ps快捷键 1.1 创建图层 ctrlj 1.2 放大缩小图片的大小 按住alt 滚轮 1.3 移动图片 空格 左键 1.4 撤回 ctrlz 二 精修的第一步是去除斑点&#xff0c;瑕疵&#xff0c; 2.1 污点修复画笔工具 新建一个图层&#xff0c;点击污点修复工具进行修复…

数据结构第五版【李春葆】

​ 数据结构教程上机实验指导第5版&#xff08;李春葆主编&#xff09;.pdf 数据结构教程&#xff08;第5版&#xff09;&#xff08;李春葆&#xff09;.pdf 数据结构教程&#xff08;第五版&#xff09;课后习题参考答案&#xff08;李春葆&#xff09;.pdf 数据结构教…

(二十三)安卓开发中数据存储之Room详解

在安卓开发中&#xff0c;Room 是一个强大的本地数据库解决方案&#xff0c;它是 Android Jetpack 的一部分&#xff0c;基于 SQLite 构建&#xff0c;提供了更高层次的抽象。Room 简化了数据库操作&#xff0c;减少了样板代码&#xff0c;同时支持与 LiveData 和 ViewModel 的…

[C++面试] 初始化相关面试点深究

一、入门 1、C中基础类型的初始化方式有哪些&#xff1f;请举例说明 ​默认初始化​ 对于全局变量和静态变量&#xff0c;基础类型&#xff08;如int、float、double等&#xff09;会被初始化为 0&#xff1b;而对于局部变量&#xff0c;其值是未定义的&#xff0c;包含随机…

网络安全之-信息收集

域名收集 域名注册信息 站长之家 https://whois.chinaz.com/ whois 查询的相关网站有:中国万网域名WHOIS信息查询地址: https://whois.aliyun.com/西部数码域名WHOIS信息查询地址: https://whois.west.cn/新网域名WHOIS信息查询地址: http://whois.xinnet.com/domain/whois/in…

Linux网络http与https

应用层协议HTTP 提示 因为现在大多数都是https&#xff0c;所以就用https来介绍http&#xff0c;https比http多了一个加密功能&#xff0c;不影响介绍http。 什么是http 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的…

讲解贪心算法

贪心算法是一种常用的算法思想&#xff0c;其在解决问题时每一步都做出在当前状态下看起来最优的选择&#xff0c;从而希望最终能够获得全局最优解。C作为一种流行的编程语言&#xff0c;可以很好地应用于贪心算法的实现。下面我们来讲一篇关于C贪心算法的文章。 目录 贪心算法…

vue3中watch的使用示例

使用情况说明&#xff1a; 1、父组件中有个表格&#xff0c;点击表格行的修改基础信息&#xff0c;弹出修改对话框&#xff1b; 2、修改内容点击确认&#xff0c;发送请求&#xff0c;后端更新数据&#xff1b;不修改内容不发送请求&#xff1b; 3、可以连续修改&#xff1b…

Spring MVC 请求类型注解详解

Spring MVC 请求类型注解详解 1. 核心注解分类 Spring MVC 中的请求处理注解分为以下几类&#xff1a; 类别注解示例作用范围方法级注解RequestMapping, GetMapping 等方法级别参数级注解RequestParam, RequestBody方法参数模型/会话注解ModelAttribute, SessionAttributes方…

C#: DxF文件中Spline解析

以下是使用C#解析DXF文件中Spline(样条曲线)的完整代码示例&#xff0c;使用流行的netDxf库来处理DXF文件&#xff1a; 1. 安装netDxf库 首先通过NuGet安装netDxf库&#xff1a; Install-Package netDxf 2. 完整Spline解析代码 using System; using System.Collections.Ge…

【软考系统架构设计师】系统架构设计知识点

1、 从需求分析到软件设计之间的过渡过程称为软件架构。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象&#xff0c;由构件的描述、构件的相互作用&#xff08;连接件&#xff09;、指导构件集成的模式以及这些模式的约束组成。 软件架构不仅指定了系统的组织结构和…

二.springBoot项目集成ElasticSearch及使用

二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰&#xff0c;用rest-high-level-client代替--> <dependency><groupId>org.elasticse…

微服务多模块构建feign项目过程与一些报错(2025详细版)

目录 1.eureka-server的注意事项 2.eureka-feign的注意事项 3.多模块构建feign项目过程 3.1创建父项目 3.2创建子项目eureka-server 3.3创建子项目eureka-provider 3.4创建子项目eureka-feign 3.5运行 给个点赞谢谢 1.eureka-server的注意事项 eureka-server的yml文件…

第十一届 蓝桥杯 嵌入式 省赛

一、分析 本届的风格又变了一番&#xff0c;但是难度也降低了些。 又是考察了 PWM 和 ADC。 第八、九届也考察了 PWM。建议先复习这两届&#xff0c;再回来模拟。 LCD的显示也提了额外的要求。 1. 功能概述 电位器 R37 输出的模拟电压信号 PA6输出频率固定&#xff0c;占…