用html5写一个可输入1-100行1-100列的矩阵计算器

矩阵行输入生命支出时间,小时,日,周,月,年为单位,矩阵列输入每生命支出时间获得的资源,金钱,时间,声誉,人口,矩阵总生命支出时间可选择1-100年,计算总资源获得量,剩余资源量,数值精确到小数点两位

<!DOCTYPE html>

<html lang="zh-CN">

<head>

<meta charset="UTF-8">

<title>人类生命周期矩阵计算器</title>

<meta name="viewport" content="width=device-width, initial-scale=1">

<style>

:root{--bg:#0f2027;--panel:#132332;--row:#1b2e42;--accent:#4fc3f7;--hl:#6dd5ed;}

body{margin:0;padding:20px;background:linear-gradient(135deg,var(--bg),#203a43,#2c5364);color:#e0f7fa;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif;min-height:100vh;}

.wrap{max-width:100%;margin:auto;background:rgba(19,35,50,.85);padding:25px;border-radius:15px;box-shadow:0 10px 30px rgba(0,0,0,.5);backdrop-filter:blur(10px);}

h1{text-align:center;color:var(--accent);margin-bottom:10px}

.ctrl{display:flex;flex-wrap:wrap;gap:15px;justify-content:center;margin:20px 0;}

button{padding:10px 20px;border:none;border-radius:25px;background:linear-gradient(to right,var(--accent),var(--hl));color:#0a1929;font-weight:bold;cursor:pointer;transition:.3s;}

button:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(79,195,247,.5)}

.tb{overflow:auto;margin-top:20px;border-radius:10px;box-shadow:0 5px 15px rgba(0,0,0,.3);max-height:70vh}

table{width:100%;border-collapse:collapse;font-size:12px;background:var(--panel);}

th,td{border:1px solid rgba(64,224,208,.15);padding:6px 8px;text-align:center;white-space:nowrap}

th{background:linear-gradient(to bottom,#1a2a3a,var(--bg));color:var(--accent);position:sticky;top:0;z-index:10}

tr:nth-child(even){background:var(--row)}tr:hover{background:rgba(33,147,176,.15)}

inputtype=number{width:70px;padding:6px;background:rgba(13,19,33,.7);border:1px solid rgba(64,224,208,.3);border-radius:5px;color:var(--text);}

label{margin:0 8px;color:#b2ebf2}

.cfg{background:rgba(25,39,61,.7);padding:15px;border-radius:10px;margin-bottom:15px}

</style>

</head>

<body>

<div class="wrap">

<h1>人类生命周期矩阵计算器</h1>

<div class="cfg ctrl">

<label>行数 (1-100): <input id="rows" type="number" min="1" max="100" value="3"></label>

<label>列数 (1-100): <input id="cols" type="number" min="1" max="100" value="5"></label>

<label>总生命年 (1-100): <input id="lifeY" type="number" min="1" max="100" value="80"></label>

<label>每日小时: <input id="dayH" type="number" min="1" max="24" value="24"></label>

<button onclick="build()">生成矩阵</button>

<button onclick="exportCSV()">导出CSV</button>

</div>

<div id="matWrap" class="tb"></div>

</div>

<script>

let R,C,totalH,d=\[\]; // R=行 C=列 totalH=单人总生命(小时)

const $=id=>document.getElementById(id);

const fix=n=>Number(n).toFixed(2);

/* 单位换算基础 */

const base={h:1,d:24,w:24*7,m:24*7*4.33,y:365*24};

/* 生成或重建矩阵 */

function build(){

R=Math.min(100,Math.max(1,+$('rows').value));

C=Math.min(100,Math.max(1,+$('cols').value));

const yrs=+$('lifeY').value;

const dh=+$('dayH').value;

totalH=yrs*365*dh;

d=...Array(R).map((_,r)=>({

r,rName:`行${r+1}`,

h:0,d:0,w:0,m:0,y:0,

rg:0,mg:0,te:0,rg2:0,pg:0,

tr:0,tm:0,tt:0,tra:0,tp:0,

rem:fix(totalH*0.1)

}));

render();

}

/* 渲染表格 */

function render(){

const wrap=$('matWrap');

let html='<table id="mat"><thead><tr><th>行名</th>';

for(let c=0;c<C;c++) html+=`<th>列${c+1}<br>资源/时</th><th>金钱/时</th><th>时间/时</th><th>声誉/时</th><th>人口/时</th>`;

html+='</tr></thead><tbody>';

for(let r=0;r<R;r++){

const row=dr;

html+=`<tr>

<td><input type="text" value="{row.rName}" onchange="nameRow({r},this)"></td>`;

for(let c=0;c<C;c++){

html+=`

<td><input type="number" id="rg_{r}_{c}" value="{row.rg}" step="0.01" onchange="up({r},${c})"></td>

<td><input type="number" id="mg_{r}_{c}" value="{row.mg}" step="0.01" onchange="up({r},${c})"></td>

<td><input type="number" id="te_{r}_{c}" value="{row.te}" step="0.01" onchange="up({r},${c})"></td>

<td><input type="number" id="rg2_{r}_{c}" value="{row.rg2}" step="0.01" onchange="up({r},${c})"></td>

<td><input type="number" id="pg_{r}_{c}" value="{row.pg}" step="0.01" onchange="up({r},${c})"></td>`;

}

html+=`</tr>`;

}

html+='</tbody></table>';

html+=`<div class="mt10"><b>生命支出时间输入(行维度)</b></div><table class="mt10"><thead><tr><th>行名</th><th>小时</th><th>日</th><th>周</th><th>月</th><th>年</th><th>总生命量</th><th>总资源</th><th>总金钱</th><th>总时间</th><th>总声誉</th><th>总人口</th><th>剩余资源</th></tr></thead><tbody>`;

for(let r=0;r<R;r++){

const row=dr;

html+=`<tr>

<td>${row.rName}</td>

<td><input type="number" id="h_{r}" value="{row.h}" step="0.01" onchange="syncTime(${r},'h')"></td>

<td><input type="number" id="d_{r}" value="{row.d}" step="0.01" onchange="syncTime(${r},'d')"></td>

<td><input type="number" id="w_{r}" value="{row.w}" step="0.01" onchange="syncTime(${r},'w')"></td>

<td><input type="number" id="m_{r}" value="{row.m}" step="0.01" onchange="syncTime(${r},'m')"></td>

<td><input type="number" id="y_{r}" value="{row.y}" step="0.01" onchange="syncTime(${r},'y')"></td>

<td>${fix(totalH)}</td>

<td id="tr_{r}"\>{row.tr}</td>

<td id="tm_{r}"\>{row.tm}</td>

<td id="tt_{r}"\>{row.tt}</td>

<td id="tra_{r}"\>{row.tra}</td>

<td id="tp_{r}"\>{row.tp}</td>

<td id="rem_{r}"\>{row.rem}</td>

</tr>`;

}

html+='</tbody></table>';

wrap.innerHTML=html;

}

/* 行名修改 */

function nameRow(r,input){

dr.rName=input.value.trim()||`行${r+1}`;

}

/* 时间单位联动 */

function syncTime(r,srcU){

const val=parseFloat((\`{srcU}_${r}`).value)||0;

const hours=val*basesrcU;

'h','d','w','m','y'.forEach(u=>{

(\`{u}_${r}`).value=fix(hours/baseu);

});

dr.h=fix(hours);

dr.d=fix(hours/base.d);

dr.w=fix(hours/base.w);

dr.m=fix(hours/base.m);

dr.y=fix(hours/base.y);

calcRow(r);

}

/* 单位收益更新 */

function up(r,c){

/* 简单策略:整行使用同一套单位收益,以第一列为准 */

dr.rg=parseFloat((\`rg_{r}_0`).value)||0;

dr.mg=parseFloat((\`mg_{r}_0`).value)||0;

dr.te=parseFloat((\`te_{r}_0`).value)||0;

dr.rg2=parseFloat((\`rg2_{r}_0`).value)||0;

dr.pg=parseFloat((\`pg_{r}_0`).value)||0;

calcRow(r);

}

/* 计算整行总计 & 剩余 */

function calcRow(r){

const h=parseFloat(dr.h)||0;

const rg=dr.rg,mg=dr.mg,te=dr.te,rg2=dr.rg2,pg=dr.pg;

dr.tr=fix(rg*h);

dr.tm=fix(mg*h);

dr.tt=fix(te*h);

dr.tra=fix(rg2*h);

dr.tp=fix(pg*h);

dr.rem=fix(totalH*0.1-h);

/* 刷新显示 */

'tr','tm','tt','tra','tp','rem'.forEach(k=>(\`{k}_${r}`).textContent=drk);

}

/* 导出CSV */

function exportCSV(){

const head='行名,小时,日,周,月,年,总生命量,资源/时,金钱/时,时间/时,声誉/时,人口/时,总资源,总金钱,总时间,总声誉,总人口,剩余资源\n';

const rows=d.map(r=>`{r.rName},{r.h},{r.d},{r.w},{r.m},{r.y},{fix(totalH)},{r.rg},{r.mg},{r.te},{r.rg2},{r.pg},{r.tr},{r.tm},{r.tt},{r.tra},{r.tp},{r.rem}`).join('\n');

const blob=new Blob(head+rows,{type:'text/csv;charset=utf-8;'});

const url=URL.createObjectURL(blob);

const a=document.createElement('a');a.href=url;a.download='生命周期矩阵.csv';a.click();

URL.revokeObjectURL(url);

}

/* 初始化 */

window.onload=build;

</script>

</body>

</html>

相关推荐
Bobolink_1 天前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
H178535090961 天前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks
AI_yangxi1 天前
短视频矩阵系统专业公司
大数据·人工智能·矩阵
昇腾CANN1 天前
【cann-samples系列】GroupedMatmul MX量化矩阵乘的深度性能优化实践
线性代数·性能优化·矩阵·昇腾·cann
青山木1 天前
Hot 100 --- 矩阵置零
线性代数·算法·leetcode·矩阵·哈希算法
Jasmine_llq1 天前
《B4264 [GESP202503 四级] 二阶矩阵》
线性代数·算法·矩阵·二维矩阵遍历枚举所有2×2矩阵·交叉乘积等式条件判断·输入输出快读加速·长整型防溢出计数统计
阿泽·黑核2 天前
05 keyflow 扩展设计方案:矩阵键盘/组合键/事件队列/中断驱动
线性代数·矩阵·计算机外设·嵌入式·agent·vibe coding
工头阿乐2 天前
相机坐标系标定与外参矩阵求解
数码相机·线性代数·矩阵
金色熊族3 天前
QTransform使用心得(二)--仿射变换、非仿射变换、矩阵
qt·线性代数·矩阵