今日学习任务
[ ] 01-案例:动态生成柱状图
[ ] 02-能够使用循环结构数组遍历应用
[ ] a.数组遍历输出
- b.反转数组
- c.嵌套循环遍历
[ ] 03-函数
[ ] a.掌握函数的基础语法
- b.理解函数的实际应用
- c.掌握函数的形参、实参和返回值的作用
- d.掌握js的外联引入方式
01-循环结构应用场景练习
1.1-动态生成柱状图
- 允许用户输入要生成的柱状图数量
- 随机生成柱状图的每个柱子的高度(实际开发从后台获取)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
/* 父盒子 */
.box {
/* 子盒子要绝对定位,父盒子相对定位 */
position: relative;
margin: 100px auto;
width: 1200px;
height: 200px;
border: 1px solid skyblue;
}
/* 子盒子 */
.dis {
position: absolute;
text-align: center;
}
</style>
</head>
<body>
<script>
/*
动态生成用人输入数量的柱状图
思路分析
1.设计div包括和显示柱子
1.1.柱子包含在大的div中:box
1.2.柱子要平铺在box中,对小柱子(内部div)定位
2.获取用户输入的柱子数量
3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)
3.1.计算柱子数量:图形柱子 + 空白柱子
3.2.计算柱子宽度:铺满整个空间
4.动态生成柱形图
4.1.空白柱子高度填满父盒子,背景透明
4.2.数据柱子颜色随机,高度随机
5.输出柱形图
*/
//2.获取用户输入的柱子数量
let num = +prompt('请输入柱形图数量:');
//3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)
//3.1.计算柱子数量:图形柱子 + 空白柱子
let picNum = num * 2 + 1;
//3.2.计算柱子宽度:铺满整个空间
let divWidth = 1200 / picNum;
//4.动态生成柱形图
let divs = '<div class="box">';
//循环要生成的柱子数量
for (let i = 0; i < picNum; i++) {
//计算每个柱子的偏移量:绝对定位的left距离
let left = divWidth * i;
// 偶数为透明柱子,奇数为图形柱子
if (i % 2 == 0) {
//4.1.空白柱子高度填满父盒子,背景透明
divs += `
<div class="dis" style="width:${divWidth}px;height:200px;background-color:transparent;left:${left}px;top:0"></div>
`;
} else {
//4.2.数据柱子颜色随机,高度随机
//随机产生高度
let divHeight = Math.ceil(Math.random() * 200);
//随机产生颜色
let red = green = blue = 0;
//按照柱子的高度来分配颜色:高度低于60,深色区间80;高度大于60 小于120,中色区间80 - 160,高度大于120,浅色区间160-240
if (divHeight < 60) {
//深色区间:80
red = Math.random() * 80;
green = Math.random() * 80;
blue = Math.random() * 80;
} else if (divHeight < 120) {
//中色区间80-160
red = Math.random() * 80 + 80;
green = Math.random() * 80 + 80;
blue = Math.random() * 80 + 80;
} else {
//浅色区间160-240
red = Math.random() * 80 + 160;
green = Math.random() * 80 + 160;
blue = Math.random() * 80 + 160;
}
//将产生的柱子div绑定到父盒子内部
//需要对每个柱子增加宽度divWidth,盒子高度divHeight,颜色rgb,偏移量left
divs += `
<div class="dis" style="width:${divWidth}px;height:${divHeight}px;background-color:rgb(${red},${green},${blue});left:${left}px;"></div>
`;
/*
正常柱状图应该是下面平行,上面显示锯齿,怎么实现?锯齿的Y轴偏移量top
*/
}
}
//拼凑完整父盒子
divs += '</div>';
//5.输出柱形图
document.write(divs);
</script>
</body>
</html>
02-数组练习
1.1-数组练习1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*1.求数组中元素的平均值
2.求数组中元素的最大值
3.求数组中元素的最小值
4.将1-100中3的倍数放入数组中
*/
//1.求数组中元素的平均值
let arr = [98,59,99,60,100];
//(1)声明空箩筐
let sum = 0;
//(2)遍历萝卜堆数
for(let i = 0;i<arr.length;i++){
//(3)添加到箩筐
sum += arr[i];
};
console.log(sum / arr.length);
//2.求数组中元素的最大值
let arr = [98,59,99,60,100];
//(1)声明空擂主
let max = -Infinity;
//(2)遍历挑战者
for(let i = 0;i<arr.length;i++){
//(3)挑战者依次和擂主PK
if(arr[i] > max){
max = arr[i];
};
};
console.log(max);
//3.求数组中元素的最小值
//4.将1-100中3的倍数放入数组中
//思路:遍历指定范围符合条件的数
let arr = [];
for(let i = 1;i<=100;i++){
if(i%3==0){
arr[arr.length] = i;
};
};
console.log(arr);
</script>
</body>
</html>
1.2-数组练习2(翻转数组)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*1.翻转数组
*/
//1.翻转数组
let arr = [20, 25, 66, 88, 90];//[90,88,66,25,20]
/*
1.1 翻转法
(1)声明空数组newArr
(2)倒着遍历arr,添加到空数组中
*/
// //1.声明空数组newArr
// let newArr = [];
// //2.倒着遍历arr,添加到空数组中
// for(let i = arr.length-1;i>=0;i--){
// console.log(arr[i]);
// newArr[newArr.length] = arr[i];
// };
// console.log(newArr);
/*
1.2 交换法
(1)遍历数组一半
(2)下标为 i元素 与 下标为 arr.length-1-i 元素交换
*/
//1.遍历数组的一半
for (let i = 0; i < arr.length / 2; i++) {//i = 0 1 2
//2. 下标为i元素 和 下标为arr.length-1-i元素交换
let temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
};
console.log(arr);
</script>
</body>
</html>
1.3-数组练习3(实际应用场景)
- 需求:根据数组将数据加工输出到页面上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
* 1.目前阶段的学习中,我们仅能做一些静态网页,也就是说所有的数据都是写死的
* 2.实际开发中,我们通常会使用js代码从服务器请求数据加载到网页中,而这些数据通常都是数组
* 3.本小节我们来学习如何根据数组的内容来产生网页的结构
*/
//1.请求服务器,得到一个数组的数据
let books = ["js语言很牛逼","C语言从入门到放弃", "编程之道:从程序员到卖麻辣烫", "颈椎病治疗指南", "JavaScript权威指南","js从入门到入坟"];
// document.write('<ul><li>老铁666</li></ul>');
document.write('<ul>');
for(let i = 0;i<books.length;i++){
document.write('<li>' + books[i] + '</li>');
};
// document.write('<li>' + books[0] + '</li>');
// document.write('<li>' + books[1] + '</li>');
// document.write('<li>' + books[2] + '</li>');
// document.write('<li>' + books[3] + '</li>');
// document.write('<li>' + books[4] + '</li>');
document.write('</ul>');
</script>
</body>
</html>
1.4-字符串数组访问扩展
- 在JS中,字符串的每个符号都有一个下标,默认从0开始
- 字符串数组访问只是可读,不能修改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
* 1.字符串的组成符号也是有下标的,而且从0开始
* 2.可以利用数组下标访问的特性,通过下标访问字符串的某个符号
*/
let str = '我好想你';
console.log(str[0],str[1],str[2],str[3]); // 我 好 想 你
//无效
//str[0] = 'I';
/*
* 1.可以利用字符串特性,灵活的实现水仙花数
* 2.实现步骤
* * 1.将数字转换成字符串
* * 2.通过字符串下标访问形式,取得每个位置上的值,然后进行求立方
*/
for (let i = 100; i <= 999; i++) {
//类型转换,不影响i本身
let str = String(i);
if (Math.pow(str[0], 3) + Math.pow(str[1], 3) + Math.pow(str[2], 3) == i) {
console.log(i);
}
}
</script>
</body>
</html>
03-循环嵌套(进阶)
嵌套循环:一个循环中嵌套另一个循环
- 嵌套循环执行的总次数 = 外层循环执行次数 * 内层循环执行次数
- 嵌套执行逻辑:外部循环每执行一次,内部循环就要执行全部
1.1-循环嵌套练习:九九乘法表
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
第一行 i= 1 ,列数 1
第二行 i= 2 ,列数 2
第三行 i= 3 ,列数 3
^^^
i = 9 ,列数 9
内层循环次数 = i
*/
//1.外层循环 : 行 9
for(let i = 1;i<=9;i++){
//2.内层循环次数 = i
for(let j = 1;j<=i;j++){// i = 9 j = 1 2 3 4 5 6 7 8 9
document.write(j + '*' + i + '=' + j*i + ' ');
};
document.write('<br><br>');
};
</script>
</body>
</html>
1.2-循环嵌套练习:二维数组遍历
- 二维数组:数组本身还是一个数组
二维数组遍历:先遍历外部数组,内部遍历数组元素(还是数组)
- 一般情况下:我们都是直接遍历外部(元素个数不确定),而内部通常是直接取(数据明确长度,且有规范)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.news {
width: 400px;
margin: 50px auto;
text-align: left;
}
.news li {
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.news a {
text-decoration: none;
font-size: 14px;
color: #222;
line-height: 20px;
}
.news a:hover {
color: #20a1f1;
}
</style>
</head>
<body>
<script>
//显示后台提供的新闻信息:news模拟后台返回的数据
//新闻信息:news外部数组包含了很多条新闻
//新闻信息:news元素都是数组,包含了分类、新闻标题、新闻链接
let news = [
['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK'],
['要闻', '你以生命相托,我必全力以赴', 'https://news.ifeng.com/c/7wM1V3EzQBM'],
['要闻', '中国无人战车正式服役:机枪显示惊人杀伤力', 'https://tech.ifeng.com/c/7wMT02ftUZ4'],
['健康', '独家 | 武汉封城建议者:向武汉人民致敬,向援助武汉的人致敬', 'https://finance.ifeng.com/c/7wM0E6Bs8PI'],
['汽车', '马斯克发飙:起诉当地政府!总部搬离加州!', 'http://auto.ifeng.com/c/7wM43afWMFs'],
['汽车', '奇瑞真正的旗舰SUV,车长近5米+2.0T动力,气场不输路虎揽胜', 'https://auto.ifeng.com/c/7wIpWtWvHYv'],
['房产', '广州即将推出9宗土地 涉及22.2万平米4宗宅地', 'https://gz.house.ifeng.com/news/2020_05_11-52744145_0.shtml'],
];
//制作字符串:包含div和ul的前半部分
let newsStr = `
<div class="news">
<ul>
`;
//遍历数组:构造li内部的a标签
for (let i = 0; i < news.length; i++) {
//外部循环:确定出现的li数量
//内部循环:确定li里面的a标签内容,但是实际上数据是规定的
//news[i]就是一条具体的新闻数组:['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK']
//news[i][0]是分类,news[i][1]是标题,news[i][2]是链接
//所以这样是不需要进行内部循环遍历的
//ES6模板字符串应用
newsStr += `
<li>
<a href="${news[i][2]}">【${news[i][0]}】${news[i][1]}</a>
</li>
`;
}
// 补全标记
newsStr += `
</ul>
</div>
`;
//输出
document.write(newsStr);
</script>
</body>
</html>
04-函数
函数作用:将代码存入变量中,实现代码复用
1.1-函数介绍
- 函数是一种结构,使用function关键字声明
- 函数不会自动运行
- 函数定义后,需要主动调用才会触发
//1.声明函数:将代码存入结构中
function 函数名(){
函数体:一段代码
}
//2.调用函数:执行函数体代码
函数名();
<script>
/*1.函数与循环区别:本质区别
a.作用不同:
循环:一段代码在一个地方执行多次(主动运行)
函数:一段代码在多个地方执行一次(被动运行)
b.本质不同
循环:只是一种语法,让代码重复执行
函数:是一种数据类型,存储的是代码
*/
/*2.什么样的代码需要使用函数
a.这段代码需要在多个地方执行
b.这段代码通常都是完成一个独立的小功能
*/
/*3.语法误区:函数语法就两个(声明与调用)
1.声明函数: function 函数名(){ 函数体代码 }
2.调用函数: 函数名()
3.变量取值: 函数名 (不会执行函数体代码,只是以字符串形式将变量中存储的东西打印出来而已)
*/
//需求 : 一段代码 需要在多个地方执行
//复制粘贴弊端 : (1)代码冗余 (2)不便于维护
/*
1.函数作用 : 实现某个功能代码的重复利用
2.函数语法
a. 声明函数 : ( *** 函数体代码不会执行 ***)
function 函数名(){
函数体 :一段代码
};
b. 调用函数 : 执行函数体代码
函数名();
*/
//(1)声明函数:打印99乘法表
function getChengFa() {
//定义一个变量,保存即将产生的字符串(实用,后面return讲)
let chengfaStr = '';
//外层循环:控制层数
for (let i = 1; i <= 9; i++) {
//内存循环:控制列数
for (let j = 1; j <= i; j++) {
//拼接内容
chengfaStr += `${j} * ${i} = ${j * i}  `;
}
//换行
chengfaStr += '<br>';
}
//返回结果
document.write(chengfaStr);
}
//(2)调用函数 : 执行函数体代码
getChengFa();
console.log('99乘法表,我的最爱');
//(3)既然这么爱,那就再来一次
getChengFa();
console.log('不爱了,吐了');
/*
3.函数注意点
a.以后什么样的代码你会放入函数中?
(1)多个地方执行
(2)独立的小功能
b.函数与循环 有着本质的区别
(1)本质区别
函数 :是一种数据类型,存储代码
循环 :是一种语法,重复执行代码
(2)作用不同
函数 : 一段代码在多个地方执行一次
循环 : 一段代码在一个地方执行多次
*/
</script>
1.2-函数参数
- 参数的目的是让函数能够变的灵活,可以完成不同的,但是功能类似的需求
函数参数分为两种:
- 形参:定义函数时的参数,属于
占座位
- 实参:调用函数时的参数,属于
实际数据
- 形参:定义函数时的参数,属于
- 函数不会自动运行:所以先
占位
;调用时就是要实际运行,所以给数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
1.函数作用 : 实现某个功能代码的重复利用
2.参数
2.1 参数作用 : 调用者 传递数据 给函数
2.2 语法
传 : 调用者
函数名(实参:实际参数)
收 : 函数
function 函数名(形参:形式参数){ 函数体代码 }
2.3 函数传参的本质 : 实参给形参赋值
* 实参和形参数量可以不一致,但是按照顺序赋值
*/
// 2.利用函数实现指定层数的乘法表
/**
* @description: 得到指定层数的乘法表
* @param {number} level:层数
* @return: 产生的字符串
*/
function getChengFa(level) { // level = 9
//定义一个变量,保存即将产生的字符串
let chengfaStr = '';
//外层循环:控制层数
for (let i = 1; i <= level; i++) {
//内存循环:控制列数
for (let j = 1; j <= i; j++) {
//拼接内容
chengfaStr += `${j} * ${i} = ${j * i}  `;
}
//换行
chengfaStr += '<br>';
}
//返回结果
document.write(chengfaStr);
}
//用户输入层数
let level = +prompt('请输入一个要打印的乘法表的层数:');
// 调用函数
getChengFa(level);
</script>
</body>
</html>
课后练习
写一个函数 求任意两个数字之间的和
1.3-函数返回值
- 返回值是函数运行后的结果处理方式
实际开发过程中,
不会在函数内部进行输出
,都是把结果返回给调用者- 函数不对结果负责:函数只负责做,至于做出来是否合适不管
return关键字
- JS函数可以没有返回值
- 可以使用return返回任意类型数据
- return会终止函数的继续执行(结束函数运行)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
1.函数作用 : 将代码存入变量中,可以实现代码的复用
2.返回值
2.1 返回值 : 函数 传递数据 给调用者
2.2 语法
传 : 函数
function 函数名(形参){ return 值; }
收 : 调用者
let 变量名 = 函数名()
*/
//求任意两个数字的和
function getSum(a,b){
let sum = a+b;
console.log(sum);
return sum;
console.log('1111');//不会执行
};
//将函数调用结果显示到页面
// 函数外部 无法直接 获取函数内部的变量
//console.log(sum);
/*函数调用工作流程 : 固定三个步骤
1. 传参
2. 执行函数体代码
3. 返回值
*/
let res = getSum(100,50);
console.log(res);
/*
函数总结
1.函数几种形态
无参无返回 : 使用较少
无参有返回 : 使用不多
有参无返回 : 使用不多
有参有返回 : 使用最多
2.函数完整的工作流程(原理)
a. 传参 : 调用者传递数据给函数
b. 执行函数体代码
c. 返回值 : 函数将结果返回给调用者
3.函数返回值语法注意点
a. 如果函数没有写return,默认返回值是undefined
b. 如果函数有写return,但是后面没有接值。返回值是undeifined
c. 如果函数有写return,并且return后面有值。返回值就是return后面的值
d. return关键字作用 : 结束函数体代码。 return后面代码不执行
*/
</script>
</body>
</html>
1.4-函数另一种声明方式
- 1.函数声明:
function 函数名() {};
2.函数表达式:
let 函数名 = 匿名函数
- 匿名函数:函数的字面量又称为匿名函数,顾名思义就是没有变量名的函数
let 函数名 = function(){};
- 3.两者唯一区别:函数声明可以在任何地方调用,而函数表达式方式调用必须在声明后面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
fn1();
//1.函数声明 : function 函数名(){ 函数体代码 }
function fn1(){
console.log('11111');
};
fn1();
//2.表达式声明 : let 函数名 = 匿名函数
//具名函数 : 有名字的函数 匿名函数 = 没名字的函数
// fn2();//报错
let fn2 = function(){
console.log('2222');
};
fn2();
//3.唯一区别 : 函数声明可以在任何地方调用,表达式声明只能在声明后调用
</script>
</body>
</html>
课后练习
1.写一个函数 求n-m之间的和
2.写一个函数:求任意数组的最大值
1.5-函数练习
- 利用函数实现对应数组的最大值元素获取
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*函数三要素
1.功能
2.参数
3.返回值
*/
// 1.写一个函数:求任意数组的最大值
/**
* @description: 求任意数组最大值
* @param {array} arr : 数组
* @return: max:最大值
*/
function getMax(arr) { //let arr = [88,90,100,20,66]
//擂台思想
let max = -Infinity;
for (let i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
};
};
return max;
};
let max1 = getMax([88, 90, 100, 20, 66]);
console.log(max1);
//注意:函数是用来实现代码复用的,函数实现的功能越小,代码的复用性越强,所以不要尝试让一个函数去解决所有问题;而是多用几个函数去实现不同功能,然后大功能调用几个小函数实现
//如:数组获取最大值,获取最小值,获取平均值应该是三个不同的函数
</script>
</body>
</html>
1.6-函数实战思想
- 函数应该独立存在于js文件
- 在需要使用对应函数的html中引入js文件
/**
* arr.js
* @description: 求任意数组最大值
* @param {array} arr : 数组
* @return: max:最大值
*/
function getMax(arr) { //let arr = [88,90,100,20,66]
//擂台思想
let max = -Infinity;
for (let i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
};
};
return max;
};
//可以将数组相关操作的函数封装到一个文件中,形成自己的API库
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="js/arr.js"></script>
</head>
<body>
<script>
//直接调用引入的js文件中的函数即可
let max = getMax([88, 90, 100, 20, 66]);
console.log(max);
</script>
</body>
</html>
1.7-封装自己的API库
- 将自己所做的内容沉淀下来,供未来使用
- 懂得根据业务进行分类
数组API封装
- 最大值
- 最小值
- 平均值
- 数组翻转
05-课后作业
课后作业
今日作业要求:函数都需要定义这js文件中,使用外联方式引入js
1.实现柱状图(从上面生长)
2.使用函数实现将数组中指定的元素去掉(★)
- function arrTrip(数组,要去除的变量)
- 例如:[0,10,20,30,0,40,0] 变成[10,20,30,40]:arrTrip([0,10,20,30,0,40,0] ,0)
3.使用函数求出数组中是否所有的数字都是正数,打印结果(★★)
- 例如:[10,20,30,40,50],打印:
true
- 例如:[-10,20,30,40,50],打印:
false
- 例如:[10,20,30,40,50],打印:
4.使用函数求出任意指定数组中的最小值(★)
以下题目为循环嵌套题目(不要思维卡在数组上):使用函数完成一下作业
5.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配?(★★★)
6.小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元整好花掉,可如有哪些购买结合?(★★★★)
扩展题
(1) 1000~ 5000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数2003的各位数字之和为 2+0+0+3 ,等于5)),并统计满足条件的整数有多少个。(★★)
- 如果没有思路,可以查看课外拓展求水仙花数
(2)猜数字游戏. 随机产生1个1-100之间的数 让用户猜(★★)
当用户输入的数比产生的随机数大 就输出 猜大了 并让用户继续输入新的数.。 当用户输入的比产生的随机数小的时候 就输出 猜小了 并且继续猜 当用户刚好输入的就是这个随机数的时候 提示成功 并显示用户猜了多少次
- a. 先产生1-100的随机数 b. 写1个循环 让用户反复不停的去猜 直到猜对结束.
1.1-寻找水仙花数
/**
* 水仙花数:是一个三位数,每一位的数字的三次方相加刚好等于自身
* 例如: 153 = 1*1*1 + 5*5*5 + 3*3*3
* = 1 + 125 + 27
* = 153
*
* 如何知道一个三位数的百位十位个位的数字?
* 例如:235
* 百位(除以一百取整): (1)235/100 = 2.35 (2)parseInt(2.35) = 2;
* 十位(除以10求模):(1)235/10 = 23.5 (2)parseInt(23.5)%10 = 3;
* 个位(模10): 235%10 = 5;
*
*/
/*思路分析:(1)遍历所有的三位数 100-999
(2)将每一位的数字三次方后相加判断是否是水仙花数
(3)如果是则打印这个数,然后继续寻找
(3.1)如果不是,则不打印继续寻找
*/
for(let i = 100;i <= 999;i++){//(1)循环所有的三位数
//2.判断是否是是水仙花数
let bai = parseInt(i / 100); // i/100结果是小数,通过parseInt可以取整
let shi= parseInt(i / 10) % 10;
let ge = parseInt(i) % 10;
if(Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3) == i){
//(3)如果是水仙花数则打印
console.log ( "找到一个水仙花数:" + i );
}
//3.1 继续寻找
}
1.2-农场繁殖
- 农场第一年有两头牛,每两头牛每一年可以生一头小牛,小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
/**
* 农场第一年有两头牛,每两头牛每一年可以生一头小牛
* 小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
* * 例如
* * 第一年:两头牛 1 + 1 = 2
* * 第二年: 三头牛 2 + 1 = 3(生一头)
* * 第三年 :四头牛 3 + 3/2 = 4(两头牛生小牛,另一头旁边观望学习经验)
* * 第四年: 六头牛 4 + 4/2 = 6(两对牛各生一头小牛)
* * 总结:每一年增加的小牛数是农场总牛数除以2的倍数(取整)
*/
//1.初始两头牛
let sum = 2;
//2.死循环(省略条件判断),不达到一千的产量誓不罢休
for(let i = 2;;i++){ //第二年开始生小牛,所以循环变量初始值是2
sum += parseInt(sum/2);
if(sum >= 1000){
console.log("第" + i + "年,牛的数量是" + sum);//第17年,牛的数量是1066
break; //完成任务,停止循环
}
}