Con este generador de tablas de frecuencias y medidas estadísticas crea Tablas de Frecuencias SIN Internet: Media, Mediana, Moda, Varianza, Cuartiles y Percentiles Fácil. Está diseñado para funcionar 100% offline, sin necesidad de instalar programas ni depender de internet. Solo debes copiar el código HTML, guardarlo en tu computador o USB, y podrás usarlo en cualquier clase o actividad.
Es ideal para profesores, estudiantes de colegio, universitarios y personas que estén aprendiendo estadística y necesiten una herramienta rápida y portable.
Con este material podrás ejecutar un simulador HTML sobre distribución de frecuencias, calcular media mediana y moda, así como calcular cuartiles deciles y percentiles, y ejecutarlo directamente desde tu computador, sin necesidad de conexión. Ideal para aulas rurales o zonas sin conectividad.
Déjanos apoyarte en demostrar que las matemáticas son fáciles si se enseñan bien.
¿Por qué usar juegos offline para enseñar matemáticas?
Al no depender de internet, este material offline garantiza que el aprendizaje continúe en cualquier entorno.
Además, los profesores pueden proyectar la herramienta en clase o dejar que los estudiantes practiquen desde un computador escolar.
Existen varios tipos de juegos didácticos para practicar o enseñar matemáticas… aquí en nuestro sitio encontrarás muchos RETOS MATEMÁTICOS, además de MATEGRAMAS y CRUCIOPERACIONES!
¿Cómo utilizo el simulador de estadística con mis estudiantes sin internet?
Lo primero es copiar el código que aparece a continuación y seguir las instrucciones de nuestro vídeo YouTube:
Código que debes copiar:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Tabla de Frecuencias Offline — Completa v2</title>
<style>
:root{
--azul:#0A2A43;
--rojo:#C21F30;
--negro:#111;
--gris:#f2f2f2;
--blanco:#fff;
--radius:14px;
--shadow:0 4px 14px rgba(0,0,0,0.15);
}
body{
margin:0; padding:20px;
font-family:"Segoe UI", sans-serif;
background:var(--gris);
color:var(--negro);
}
.container{
max-width:1100px; margin:auto;
background:var(--blanco);
padding:28px;
border-radius:var(--radius);
box-shadow:var(--shadow);
}
h2,h3{color:var(--azul); margin-top:30px}
input,select,textarea{
padding:10px; border-radius:var(--radius);
border:1px solid #ccc; width:100%;
}
button{
padding:10px 16px;
border-radius:var(--radius);
border:none; cursor:pointer;
font-weight:600;
box-shadow:var(--shadow);
transition:0.2s;
}
button:hover{opacity:0.85; transform:translateY(-2px)}
#btnGenerar{background:var(--azul); color:var(--blanco)}
#btnCopiar{background:var(--rojo); color:var(--blanco)}
#btnCalcNoCentral{background:var(--rojo); color:var(--blanco)}
#btnDescargar{background:var(--negro); color:var(--blanco)}
table{
width:100%; border-collapse:collapse; margin-top:20px;
background:white; border-radius:var(--radius);
overflow:hidden; box-shadow:var(--shadow);
}
th{
background:var(--azul); color:white; padding:10px;
}
td{
padding:10px; text-align:center;
border-bottom:1px solid #ddd;
}
tr:hover td{background:#fafafa}
.grid{
display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:14px;
}
.titulo{
text-align:center; font-size:26px; font-weight:700;
color:var(--azul);
}
.subtitulo{text-align:center; margin-bottom:18px}
canvas{background:white; border-radius:var(--radius); box-shadow:var(--shadow); margin-top:20px}
</style>
</head>
<body>
<div class="container">
<div class="titulo">LAS MATEMÁTICAS SON FÁCILES SI SE ENSEÑAN BIEN</div>
<div class="subtitulo">
<h2> <a href="https://www.lasmatesfaciles.com" target="_blank"
style="color: red; font-weight: bold; text-decoration: none;">
www.lasmatesfaciles.com
</a></h2>
</div>
<div class="links">
<strong>Material de apoyo:</strong><br>
<a href="https://youtu.be/Xf79KM86qoQ" target="_blank">Video: Tablas de frecuencia</a> —
<a href="https://youtu.be/d8EbV5bnpRw" target="_blank">Video: Media, mediana y moda</a> —
<a href="https://youtu.be/OUyYE7lkJlI" target="_blank">Video: Cuartiles, deciles y percentiles</a>
<br>
<a href="https://play.google.com/store/apps/details?id=com.escobar.calculadoradeestadistica" target="_blank">App Calculadora de Estadística</a>
</div>
<h2 style="text-align:center;">Generador Offline de... <br> Tablas de Frecuencias + Media Mediana Moda <br> Desviación y Varianza + Cuartiles Deciles Percentiles</h2>
<label>Datos (separados por comas, espacios o saltos de línea):</label>
<textarea id="datos" rows="4" placeholder="Ej: 1 2 2 3 4 5 5 6"></textarea>
<div class="controls">
<div>
<label>¿Agrupados?</label>
<select id="tipoDatos">
<option value="no">No agrupados</option>
<option value="si">Agrupados</option>
</select>
</div>
<div>
<label>Número de clases (opcional)</label>
<input id="numClases" type="number" min="1" placeholder="Vacío = Sturges" />
</div>
<div>
<label>Decimales a mostrar</label>
<input id="decimales" type="number" min="0" max="6" value="2" />
</div>
<div>
<label>Separador decimal</label>
<select id="sepDecimal">
<option value="punto">Punto (1.25)</option>
<option value="coma">Coma (1,25)</option>
</select>
</div>
</div>
<div style="margin-top:8px; display:flex; gap:8px; flex-wrap:wrap">
<button id="btnGenerar">Generar tabla</button>
<button id="btnCopiar">Copiar CSV</button>
<button id="btnDescargar">Descargar CSV</button>
</div>
<div id="resultado"></div>
<div id="estadisticos"></div>
<div class="help">Consultar cuartiles/deciles/percentiles: escribe por ejemplo Q1, D3 o P75 y pulsa calcular.</div>
<div style="display:flex;gap:8px;margin-top:6px;">
<input id="indiceMedida" placeholder="Ej: Q1, D3, P75" />
<button id="btnCalcNoCentral">Calcular</button>
</div>
<p><b>Resultado seleccionado:</b> <span id="resultadoNoCentral"></span></p>
<h3>Gráficos</h3>
<canvas id="histograma" width="600" height="250"></canvas>
<canvas id="ojiva" width="600" height="250"></canvas>
<canvas id="poligono" width="600" height="250"></canvas>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
/*
Versión v2: muestra media/mediana/moda (sin paso a paso), varianza (poblacional y muestral),
desviación estándar, y permite calcular cuartiles/deciles/percentiles (método clásico A)
*/
function isIntegerValue(n){ return Number.isFinite(n) && Math.abs(n - Math.round(n)) < 1e-9; }
function roundTo(n,d){ return Number(Number(n).toFixed(d)); }
function fmt(n,d,sep){
if(n === null || n === undefined) return '';
if(!isFinite(n)) return String(n);
const rounded = roundTo(n,d);
if(isIntegerValue(rounded)) return String(Math.round(rounded));
const s = rounded.toFixed(d);
return sep === 'coma' ? s.replace('.',',') : s;
}
function formatInterval(x){
if(isIntegerValue(x)) return String(Math.round(x));
return roundTo(x,2).toFixed(2).replace(/\.00$/,'');
}
function parseInput(text){ if(!text) return []; const cleaned = text.replace(/,/g,' ').trim(); if(!cleaned) return []; return cleaned.split(/\s+/).map(s=>Number(s)).filter(x=>!isNaN(x)); }
function buildUngrouped(datos){
const total = datos.length;
const freq = {};
datos.forEach(x=> freq[x] = (freq[x]||0)+1);
const vals = Object.keys(freq).map(Number).sort((a,b)=>a-b);
const rows = [];
let fac=0, frc=0;
vals.forEach(v=>{
const f = freq[v]; fac += f; frc += f/total;
rows.push({marca:v, f:f, fac:fac, fr:f/total, frc:frc});
});
return {rows, total};
}
function buildGrouped(datos, kProvided){
const total = datos.length;
const min = Math.min(...datos), max = Math.max(...datos);
const k = (kProvided && kProvided>0) ? Math.floor(kProvided) : Math.max(1, Math.round(1 + 3.322 * Math.log10(total)));
const range = (max - min) || 1;
const h = range / k;
const classes = [];
for(let i=0;i<k;i++){ const a = min + i*h; const b = a + h; classes.push({a:a,b:b}); }
const rows=[]; let fac=0, frc=0;
for(let i=0;i<classes.length;i++){
const cl = classes[i];
const f = datos.filter(x => i===classes.length-1 ? (x>=cl.a && x<=cl.b) : (x>=cl.a && x<cl.b)).length;
fac += f; frc += f/total;
const marca = (cl.a + cl.b)/2;
const interval = formatInterval(cl.a) + ' – ' + formatInterval(cl.b);
rows.push({interval:interval, marca:marca, fx:marca*f, f:f, fac:fac, fr:f/total, frc:frc, a:cl.a, b:cl.b});
}
return {rows, total, meta:{k:k,h:h,min:min,max:max}};
}
function renderUngrouped(res, dec, sep){
const container = document.getElementById('resultado');
let html = '<table><thead><tr><th>Marca (valor)</th><th>Frecuencia absoluta (fa)</th><th>Fa acumulada</th><th>Fr</th><th>Fr (%)</th><th>Fr acumulada</th></tr></thead><tbody>';
res.rows.forEach(r=>{
html += '<tr><td>' + fmt(r.marca,dec,sep) + '</td><td>' + r.f + '</td><td>' + r.fac + '</td><td>' + fmt(r.fr,dec,sep) + '</td><td>' + fmt(r.fr*100,dec,sep) + '%</td><td>' + fmt(r.frc,dec,sep) + '</td></tr>';
});
html += '<tr><th>TOTAL</th><th>' + res.total + '</th><th></th><th>' + fmt(1,dec,sep) + '</th><th>' + fmt(100,dec,sep) + '%</th><th></th></tr>';
html += '</tbody></table>';
container.innerHTML = html;
}
function renderGrouped(res, dec, sep){
const container = document.getElementById('resultado');
let html = '<table><thead><tr><th>Clase (intervalo)</th><th>Marca de clase (xi)</th><th>fa</th><th>xi * f</th><th>Fa acum</th><th>fr</th><th>Fr (%)</th><th>Fr acum</th></tr></thead><tbody>';
res.rows.forEach(r=>{
html += '<tr><td>' + r.interval + '</td><td>' + fmt(r.marca,dec,sep) + '</td><td>' + r.f + '</td><td>' + fmt(r.fx,dec,sep) + '</td><td>' + r.fac + '</td><td>' + fmt(r.fr,dec,sep) + '</td><td>' + fmt(r.fr*100,dec,sep) + '%</td><td>' + fmt(r.frc,dec,sep) + '</td></tr>';
});
const sumaFx = res.rows.reduce((a,r)=>a + (r.fx || 0),0);
html += '<tr><th>TOTAL</th><th></th><th>' + res.total + '</th><th>' + fmt(sumaFx,dec,sep) + '</th><th></th><th>' + fmt(1,dec,sep) + '</th><th>' + fmt(100,dec,sep) + '%</th><th></th></tr>';
html += '</tbody></table>';
container.innerHTML = html;
}
function renderStats(datos, dec, sep, grouped=false, groupedResult=null){
const n = datos.length;
// For ungrouped baseline values
const mediaRaw = datos.reduce((s,x)=>s+x,0)/n;
const medianaRaw = (n%2===1) ? datos[Math.floor(n/2)] : (datos[n/2-1] + datos[n/2])/2;
const freq = {};
datos.forEach(x=> freq[x] = (freq[x]||0)+1);
const maxF = Math.max(...Object.values(freq));
const modasRaw = Object.keys(freq).filter(k=>freq[k]===maxF).map(Number);
// Prepare variables to display
let media = mediaRaw;
let mediana = medianaRaw;
let modas = modasRaw.slice();
let varPop = 0, varSample = 0, sdPop = 0, sdSample = 0;
if(!grouped){
// ungrouped: standard formulas already computed
varPop = datos.reduce((a,x)=> a + Math.pow(x-media,2), 0) / n;
varSample = n>1 ? datos.reduce((a,x)=> a + Math.pow(x-media,2), 0) / (n-1) : 0;
sdPop = Math.sqrt(varPop); sdSample = Math.sqrt(varSample);
} else if(groupedResult){
// GROUPED: use textbook formulas (marks and frequencies)
const rows = groupedResult.rows;
// 1) Media agrupada: sum(x_j * f_j) / N
const sumaFx = rows.reduce((a,r)=> a + (r.fx||0), 0);
media = sumaFx / n;
// 2) Mediana agrupada: find median class where cumulative fac >= N/2
const mitad = n/2;
let idxMed = rows.findIndex(r=> r.fac >= mitad);
if(idxMed === -1) idxMed = rows.length-1;
const claseMed = rows[idxMed];
const Lm = claseMed.a; // lower bound
const Fprev = claseMed.fac - claseMed.f;
const fm = claseMed.f;
const h = Math.abs(groupedResult.meta.h) || (rows[0].b - rows[0].a);
mediana = Lm + ((mitad - Fprev) / fm) * h;
// 3) Moda agrupada: find modal class (first with max frequency)
const freqs = rows.map(r=>r.f);
const fMax = Math.max(...freqs);
let idxModal = freqs.indexOf(fMax);
const claseMo = rows[idxModal];
const Lmo = claseMo.a;
const fm1 = claseMo.f;
const f0 = (idxModal-1>=0) ? rows[idxModal-1].f : 0;
const f2 = (idxModal+1<rows.length) ? rows[idxModal+1].f : 0;
// Avoid division by zero; if denominator zero, fallback to class mark
const denom = (2*fm1 - f0 - f2);
let modaValue;
if(denom === 0){ modaValue = claseMo.marca; }
else { modaValue = Lmo + ((fm1 - f0) / denom) * h; }
modas = [modaValue];
// 4) Varianza agrupada: sum f*(m - media)^2 / N (poblacional)
varPop = rows.reduce((a,r)=> a + (Math.pow(r.marca - media,2) * r.f), 0) / n;
varSample = n>1 ? rows.reduce((a,r)=> a + (Math.pow(r.marca - media,2) * r.f), 0) / (n-1) : 0;
sdPop = Math.sqrt(varPop); sdSample = Math.sqrt(varSample);
}
const cont = document.getElementById('estadisticos');
cont.innerHTML = '<h3>Medidas estadísticas</h3>' +
'<p><b>Media:</b> ' + fmt(media,dec,sep) + '</p>' +
'<p><b>Mediana:</b> ' + fmt(mediana,dec,sep) + '</p>' +
'<p><b>Moda(s):</b> ' + modas.map(m=>fmt(m,dec,sep)).join(', ') + '</p>' +
'<p><b>Varianza (poblacional):</b> ' + fmt(varPop,dec,sep) + '</p>' +
'<p><b>Desviación estándar (poblacional):</b> ' + fmt(sdPop,dec,sep) + '</p>' +
'<p><b>Varianza (muestral):</b> ' + fmt(varSample,dec,sep) + '</p>' +
'<p><b>Desviación estándar (muestral):</b> ' + fmt(sdSample,dec,sep) + '</p>';
}
function calculatePositionFor(k, type, n){
if(type==='Q') return k * n / 4;
if(type==='D') return k * n / 10;
if(type==='P') return k * n / 100;
return null;
}
function findClassForPosition(groupedResult, position){
for(let i=0;i<groupedResult.rows.length;i++){
const r = groupedResult.rows[i];
if(position <= r.fac) return {index:i, row:r, prevFac: r.fac - r.f};
}
return null;
}
function calcNonCentral(datos, groupedResult, token){
token = (''+token).trim().toUpperCase();
const m = token.match(/^([QDP])\s*(\d{1,3})$/);
if(!m) return {ok:false, msg:'Formato inválido. Usa Q1, D3 o P75.'};
const type = m[1];
const k = Number(m[2]);
const n = datos.length;
if(type==='Q' && (k<1 || k>3)) return {ok:false, msg:'Cuartil fuera de rango (Q1..Q3).'};
if(type==='D' && (k<1 || k>9)) return {ok:false, msg:'Decil fuera de rango (D1..D9).'};
if(type==='P' && (k<0 || k>100)) return {ok:false, msg:'Percentil fuera de rango (P0..P100).'};
if(!groupedResult){
const pos = calculatePositionFor(k,type,n);
if(!Number.isFinite(pos)) return {ok:false,msg:'Error de posición.'};
if(Number.isInteger(pos)){
const val = datos[pos-1];
return {ok:true, value:val};
} else {
const low = Math.floor(pos); const high = Math.ceil(pos);
const vLow = datos[low-1]; const vHigh = datos[high-1];
const frac = pos - low;
const val = vLow + (vHigh - vLow)*frac;
return {ok:true, value:val};
}
}
const pos = calculatePositionFor(k,type,n);
const cls = findClassForPosition(groupedResult, pos);
if(!cls) return {ok:false, msg:'Clase no encontrada.'};
const L = cls.row.a;
const Fprev = cls.prevFac;
const f = cls.row.f;
const a = groupedResult.meta.h;
const value = L + ((pos - Fprev) / f) * a;
return {ok:true, value:value};
}
let G1,G2,G3;
function drawCharts(res, grouped, dec){
const labels = res.rows.map(r => grouped ? r.interval : fmt(r.marca,dec,'punto'));
const dataFA = res.rows.map(r=>r.f);
const dataFAC = res.rows.map(r=>r.fac);
const ctx1 = document.getElementById('histograma').getContext('2d'); if(G1) G1.destroy();
G1 = new Chart(ctx1, {type:'bar', data:{labels:labels, datasets:[{label:'Frecuencia absoluta', data:dataFA}]}, options:{responsive:true}});
const ctx2 = document.getElementById('ojiva').getContext('2d'); if(G2) G2.destroy();
G2 = new Chart(ctx2, {type:'line', data:{labels:labels, datasets:[{label:'FA acumulada', data:dataFAC, fill:false}]}, options:{responsive:true}});
const ctx3 = document.getElementById('poligono').getContext('2d'); if(G3) G3.destroy();
G3 = new Chart(ctx3, {type:'line', data:{labels:labels, datasets:[{label:'Polígono de frecuencias', data:dataFA, fill:false}]}, options:{responsive:true}});
}
function toCSV(res, grouped, dec){
const lines = [];
if(grouped){
lines.push(['Clase (intervalo)','Marca de clase','f','Marca·f','Fac','Fr','Fr (%)','Fr acumulada'].join(','));
res.rows.forEach(r=> lines.push([`"${r.interval}"`, fmt(r.marca,dec,'punto'), r.f, fmt(r.fx,dec,'punto'), r.fac, fmt(r.fr,dec,'punto'), fmt(r.fr*100,dec,'punto')+'%', fmt(r.frc,dec,'punto')].join(',')));
const sumaFx = res.rows.reduce((a,r)=>a + (r.fx||0),0);
lines.push(['TOTAL','',res.total, fmt(sumaFx,dec,'punto'),'',fmt(1,dec,'punto'),fmt(100,dec,'punto')+'%',''].join(','));
} else {
lines.push(['Marca','f','Fac','Fr','Fr (%)','Fr acumulada'].join(','));
res.rows.forEach(r=> lines.push([fmt(r.marca,dec,'punto'), r.f, r.fac, fmt(r.fr,dec,'punto'), fmt(r.fr*100,dec,'punto')+'%', fmt(r.frc,dec,'punto')].join(',')));
lines.push(['TOTAL', res.total, '', fmt(1,dec,'punto'), fmt(100,dec,'punto')+'%', ''].join(','));
}
return lines.join('\n');
}
function procesar(){
const text = document.getElementById('datos').value;
const datos = parseInput(text);
if(!datos || datos.length===0){ alert('Ingresa datos válidos'); return; }
datos.sort((a,b)=>a-b);
const agrupados = document.getElementById('tipoDatos').value === 'si';
const kVal = Number(document.getElementById('numClases').value) || null;
const dec = Number(document.getElementById('decimales').value) || 2;
const sep = document.getElementById('sepDecimal').value || 'punto';
if(!agrupados){
const res = buildUngrouped(datos);
renderUngrouped(res, dec, sep);
renderStats(datos, dec, sep, false, null);
drawCharts(res, false, dec);
window._lastCSV = toCSV(res, false, dec);
window._lastResult = {res:res, grouped:false, dec:dec, sep:sep};
} else {
const k = kVal && kVal>0 ? kVal : Math.max(1, Math.round(1 + 3.322 * Math.log10(datos.length)));
const res = buildGrouped(datos, k);
renderGrouped(res, dec, sep);
renderStats(datos, dec, sep, true, res);
drawCharts(res, true, dec);
window._lastCSV = toCSV(res, true, dec);
window._lastResult = {res:res, grouped:true, dec:dec, sep:sep};
}
}
document.getElementById('btnGenerar').addEventListener('click', procesar);
document.getElementById('btnCopiar').addEventListener('click', async function(){
if(!window._lastCSV){ alert('Genera la tabla primero'); return; }
try{ await navigator.clipboard.writeText(window._lastCSV); alert('CSV copiado al portapapeles'); }
catch(e){ alert('No se pudo copiar automáticamente. Abre la consola para ver el CSV.'); console.log(window._lastCSV); }
});
document.getElementById('btnDescargar').addEventListener('click', function(){
if(!window._lastCSV){ alert('Genera la tabla primero'); return; }
const blob = new Blob([window._lastCSV], {type:'text/csv;charset=utf-8;'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a'); a.href = url; a.download = 'tabla_frecuencias.csv'; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);
});
document.getElementById('btnCalcNoCentral').addEventListener('click', function(){
const token = document.getElementById('indiceMedida').value;
if(!window._lastResult){ alert('Genera la tabla primero'); return; }
const datos = (window._lastResult.grouped) ? (function(){
const arr = [];
window._lastResult.res.rows.forEach(r=>{ for(let i=0;i<r.f;i++) arr.push(r.marca); });
return arr.sort((a,b)=>a-b);
})() : (function(){
const arr = [];
window._lastResult.res.rows.forEach(r=>{ for(let i=0;i<r.f;i++) arr.push(r.marca); });
return arr.sort((a,b)=>a-b);
})();
const groupedRes = window._lastResult.grouped ? window._lastResult.res : null;
const out = calcNonCentral(datos, groupedRes, token);
if(!out.ok){ document.getElementById('resultadoNoCentral').textContent = out.msg; }
else { document.getElementById('resultadoNoCentral').textContent = fmt(out.value, window._lastResult.dec, window._lastResult.sep); }
});
</script>
</body>
</html>
Beneficios de aprender con juegos matemáticos
Jugar con las matemáticas hace que el aprendizaje sea más interactivo, divertido y efectivo. Este tipo de actividades mejora la agilidad mental, el razonamiento lógico y la memoria visual.
Además, permite que los estudiantes asocien los números con emociones positivas, reduciendo el miedo o aburrimiento hacia la materia.
Por eso en lasmatesfaciles.com creemos firmemente que “las matemáticas son fáciles si se enseñan bien”.
No olvides suscribirte a nuestro Canal de YouTube y descubrir que las matemáticas son fáciles si se enseñan bien.
Si lo que deseas es imprimir nuestro mategrama de geometría te lo dejamos aquí en versión pdf para que te diviertas con tus estudiantes o pongas a prueba tus conocimientos.
¿Odias las matemáticas pero amas los crucigramas? Pues acá te tenemos más de nuestros Crucigramas Matemáticos – MATEGRAMAS para que odies ambas cosas al tiempo!
De momento tenemos disponibles estos mategramas pero iremos añadiendo muchos más!
Si te gustaría descargar más de nuestras actividades y material didáctico de matemáticas no dudes en visitar nuestra sección MATERIAL.
¿Te gusto nuestro MATEGRAMA DE GEOMETRÍA – CRUCIGRAMAS MATEMÁTICOS?
Suscríbete gratis para ser el primero en enterarte de cada nuevo mategrama:




Tal vez te interese el CRUCIGRAMA de Las Matemáticas en la vida cotidiana
Si deseas que te avisemos a tu correo electrónico cada vez que publicamos algo nuevo, no dudes en suscribirte gratis!
¿Por qué no miramos un poco hacia el espacio y la inmensidad del universo?

¿Sabías que tenemos varias app que pueden ayudarte con tus tareas?
Descubre una gran colección de herramientas para echarte una mano con los deberes de Matemáticas, Física, Trigonometría y Geometría!
Si lo tuyo es ir directo al grano… aquí tenemos el enlace de descarga!!

Nuestra App es gratuita y la puedes buscar en la tienda de aplicaciones de Google Play en tu teléfono Android con el nombre de Ayudante de Tareas (lo sentimos pero todavía no estamos disponibles para dispositivos iOS… pronto!)




¿Problemas con estadística?
Descargar GRATIS nuestra CALCULADORA DE ESTADÍSTICA

