[嵌套循環特點]
外層循環轉一次,內層循環轉一圈
外層循環控制行數,內層循環控制每行元素個數
[做圖形題思路]
1確定圖形一共幾行 極為外層的循環的次數
2確定每行有幾種元素,代表有幾個內層循環。
3 確定每種元素的個數,即為每個內層循環的次數
tips:通常:找出每種元素個數,與行號的關系式,極為當前循環的最大值(從1開始循環)
題目:1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=?
var sum = 0,sumrow=0;
for(var a =1;a>=1&&a<=5;a++){
sumrow=0;
if(a!=1)document.write("(")
for(var b=1;b<=a;b++){
if(b<5)document.write(b+"+");
else document.write(b);
sumrow+=b;
}
if (a==1)document.write("+");
else if(a==5)document.write(")=");
else document.write(")+");
sum+=sumrow;
}
document.write(sum)
圖形題
[長方形]
*****
*****
*****
*****
for(var a=1;a<=5;a++){
for(var b=1;b<=5;b++){
document.write(b)
}
document.write("<br />");
}
[直角三角形]
*
**
***
****
*****
for(var a=1;a<=5;a++){
for(var b=1;b<=a;b++){
document.write(b)
}
document.write("<br />");
}
[平行四邊形]
*****
*****
*****
*****
*****
for(var a=1;a<=5;a++){
for(var c=1;c<=a-1;c++){
document.write(" ")
}
for(var b=1;b<=5;b++){
document.write(b);
}
document.write("<br />")
}
[菱形]
* 1 3
*** 2 2
***** 3 1
******* 4 0
***** 1 5
*** 2 3
* 3 1
for(var a=1;a<=4; a++){
for(var c=1;c<=4-a;c++){
document.write("<span style='display: inline-block;width: 7px;'></span>")
}
for(var b=1;b<=2*a-1;b++){
document.write("*")
}
document.write("<br />")
}
for(var d=1;d<=3;d++ ){
for(var f=1;f<=d;f++){
document.write("<span style='display: inline-block;width: 7px;'></span>");
}
for(var e=1;e<=7-2*d;e++){
document.write("*")
}
document.write("<br />")
}
[數字等邊三角形]
1
121
12321
1234321
for(var a=1;a<=4; a++){
for(var c=1;c<=4-a;c++){
document.write("<span style='display: inline-block;width: 7px;'></span>")
}
var n=1
for(var b=1;b<=a;b++){
document.write(n)
n++
}
for(var d=1;d<=a-1;d++){
document.write(n-2)
n--
}
document.write("<br />")
}
[九九乘法表]
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
…………
document.write("<table border='1'>")
for(var a=1;a<=9;a++){
document.write("<tr>")
for(var b=1;b<=a;b++){
document.write("<td>"+a+"*"+b+"="+a*b+"</td>")
}
document.write("</tr>")
}
document.write("</table>")
控制台打印ATM 取款機
瀏覽器控制台打印輸出
console.log("請輸入0-6之間的數字\n111");
\n 表示換行
\t 制表符,使光標退到下一個制表位。(每個制表位,4個字符;前一制表位若不滿4個字符,則后面內容在下一格顯示;前一制表位若滿4個字符,則后面內容空一個顯示;)
console.log("請輸入0-6之間的數字\n1111\t2\t333");
需求描述:假設一個簡單的ATM機的取款過程為:
首先提示用戶輸入密碼(password),假設默認密碼為111111,最多只能輸入3次,
超過3次則提示用戶“密碼錯誤,請取卡”,結束交易。
如果用戶密碼正確,再提示用戶選擇金額(amount),
“請輸入0到6中任意數字選擇對應錢數:0手動輸入金額,1100元, 2300元,
3500元, 41000元, 53000元, 65000元”。
輸入數字如果錯誤,提示“輸入錯誤,是否繼續 Y/N”,選擇Y重新提示輸入錢數編號,
選擇N提示“輸入錯誤,請取卡!”。選擇數字為1到6,打印對應錢數,
並提示“是否繼續 Y/N”。選擇數字0,ATM機只能輸出100元紙幣,
自定義錢數要求最低為100元,最高為1000元。如果用戶輸入的金額符合上述要求,
則打印輸出用戶取的錢數,並提示“取款完成,是否繼續Y/N”;否則輸出一句話“金額錯誤,
是否繼續 Y/N”,如果用戶輸入Y,提示用戶重新選擇取款金額,如果用戶輸入 N,
打印“交易取消,請取卡!”
ps:取款成功后,應該提示用戶是否繼續,總取款金額不能超過2萬
【解題思路】
1、驗證密碼
① 密碼正確,繼續執行下面操作;
② 密碼錯誤3次,return;
2、取款操作。全部包含在 while循環內部。
① 提示選擇編號;
② 根據編號,給money賦值。用switch結構實現。
1~6:直接給money賦固定值,0:手動賦值操作;
③ 驗證取款是否成功。money-本次取款金額,moneySum-本次取款之前的總金額
判斷moneySum+money是否>20000,3種情況:
>2000 本次取款超額,但moneySum之前並不足20000,繼續下次循環;
=2000 取完本次money后,剛好滿額。money可以加到sum上,然后return;
<2000 取完本次money后,仍未上限。money可以加到sum上,繼續下次循環。
④ 驗證是否繼續,while-if結構實現,有3種情況:
Y/y 將小循環break,繼續執行取款大循環;
N/n 直接return,停止所有操作;
其他 continue,繼續執行小循環,重復輸入Y/N
代碼開始
function func(){
console.log("***********歡迎使用ATM機取款業務**********");
驗證密碼
var i = 1;
for(; i <= 3; i++) {
console.log("請輸入密碼:");
var pwd = parseInt(prompt("請輸入密碼:"));
if(pwd == 111111) {
console.log("密碼輸入正確!");
break;
}
}
if(i > 3) {
return;
}
console.log("************請根據序號進行取款************");
取款操作
var moneySum = 0; //取款總金額
var money = 0; //本次取款金額
while(true) {
console.log("0-手動輸入金額");
console.log("1-100元\t\t2-300元\t\t3-500元");
console.log("4-1000元\t\t5-3000元\t\t6-5000元");
console.log("請選擇:");
var chooseNum = parseInt(prompt("請選擇取款序號0-6:"));
switch(chooseNum) {
case 1:
money = 100;
break;
case 2:
money = 300;
break;
case 3:
money = 500;
break;
case 4:
money = 1000;
break;
case 5:
money = 3000;
break;
case 6:
money = 5000;
break;
case 0:
while(true) {
console.log("請輸入取款金額:");
money = parseInt(prompt("請輸入取款金額:"));
if(money >= 100 && money <= 1000 && money % 100 == 0) {
break;
} else {
console.log("您輸入的金額不合法,");
continue;
}
}
break;
default:
console.log("序號選擇錯誤!");
break;
}
驗證總取款金額是否超過20000
if(moneySum + money < 20000) {
console.log("取款成功,本次取款" + money + "元,");
moneySum += money;
console.log("總取款" + moneySum + "元");
} else if(moneySum + money == 20000) {
console.log("取款成功,本次取款" + money + "元,");
moneySum += money;
console.log("總取款" + moneySum + "元");
console.log("今日取款已達上限,情取卡!");
break;
} else {
console.log("取款失敗!每日取款上限20000元,您已取" +
moneySum + "元,還可取" + (20000 - moneySum) + "元");
}
驗證是否繼續
while(true) {
console.log("是否繼續(Y/N):");
var isGoON = prompt("是否繼續(Y/N):");
if(isGoON == 'y' || isGoON == 'Y') {
break;
} else if(isGoON == 'n' || isGoON == 'N') {
return;
} else {
console.log("輸入有誤,請選擇Y-繼續,N-退出,");
}
}
}
console.log("感謝您的使用!");
代碼結束
}
判斷正整數
判斷是否為正數 Number(num)>0 肯定正確
parseFloat(a)==parseInt(a) 肯定是整數
while(true){
var a = prompt("請輸入一個數");
if(Number(a)>0&&parseFloat(a)==parseInt(a)){
break;
}
}
while(a>10){
var b = parseInt(a%10);
document.write(b);
a = parseInt(a/10);
}
編寫一個程序,最多輸入十個數字,並求出其中所有正數的和,用戶可通過輸入999終止程序,統計用戶輸入的正數個數,並顯示這些數的和
輸入非數值,不占用十次機會,但要求重新輸入。
輸入的是數值,只累加正數。
var sum=0,count=0;
document.write("您輸入的數值為:");
for(var a=1;a<=10;){
var num = prompt("請輸入第"+count+"個數") ;
if(!Number(num)&&Number(num)!=0){
//非數值
continue;
}
if(num==999){
break;
}
document.write(num+" ");
if(num>0){
sum+=parseFloat(num);
count++;
}
a++
}
document.write("您輸入了"+count+"個數");
document.write("<br />正數的和為"+sum);
簡易ATM取款機
var isTrue =false;
for(var n=1;n<=3;n++){
num = prompt("請輸入密碼:");
document.write("您輸入的密碼:"+num+"<br />")
if(num==111111){
isTrue=true;
break;
}else{
}
}
if(!isTrue)alert("密碼輸入錯誤,請取卡")
while(isTrue){
a =prompt("請輸入金額")
if(a>0&&a<=1000&&a%100==0){
document.write("您取了"+a+"元!<br />交易完成,請取卡");
break
}else{
alert("請重新輸入金額");
document.write("您輸入的金額有誤,請重新輸入金額:"+a+"<br />")
}
}
請輸入某年某月某日,並判斷是這一年的第幾天
var year = parseFloat(prompt("請輸入年份"));
var month = parseFloat(prompt("請輸入月"));
var day = parseFloat(prompt("請輸入日期"));
var sum = 0;
假設是平年 2月28日
方法一
for(var i=1;i<month;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
sum+=31;
}else if(i==4||i==6||i==9||i==11){
sum+=30;
}else if(i==2){
sum+=28;
}
}
if((year%4==0&&year%100!=0||year%400==0)&&month>2){
sum+=(day+1);
}else{
sum+=day;
}
document.write(sum) ;
方法二
switch(month-1){
case 12 :
sum+=31
case 11:
sum+=30
case 10 :
sum+=31;
case 9 :
sum+=30;
case 8 :
sum+=31;
case 7 :
sum+=31;
case 6 :
sum+=30;
case 5 :
sum+=31;
case 4 :
sum+=30;
case 3 :
sum+=31;
case 2 :
sum+=28;
case 1 :
sum+=31 ;
}
if((year%4==0&&year%100!=0||year%400==0)&&month>2){
sum+=(day+1);
}else{
sum+=day;
}
document.write(sum) ;
BOM 函數
[函數的聲明即調用]
1 函數聲明的格式
使用function 函數名(參數1,參數2,……………){
函數體
return 結果;
}
函數調用的格式。
函數名(參數1的值,參數2的值,參數3的值,………………)
2 函數聲明的幾點強調
①函數名的聲明,必須符合小駝峰法則,首字母小寫,之后每個首字母大寫。
②參數列表可以有參數可以無參數,分別稱為有參函數和無參函數。、
③聲明函數時的參數列表稱為形參列(變量的名),調用參數是的列表稱為實參列表(變量的值)。
函數中實際有效的參數取決於實參的賦值,未被賦值的形參,稱為Undefined。
④函數如果需要返回值,可用return返回結果,
調用函數時,使用var 變量名=函數名();的方式,接受返回結果。
如果沒有返回值,則接受的結果為Undefined;
⑤函數中變量的作用域;
在函數中,使用var聲明的變量,默認為函數局部的變量,只在函數內容能用
不適用var聲明的變量,默認為全局變量,(函數中的全局變量,必須在函數調用后,才能使用)
函數的形參列表,為函數局部的變量,只能在函數內部使用。
⑥函數聲明和函數調用沒有先后之分,即,調用語句可寫在聲明語句之前。
function func1(){
console.log("調用無參函數");
}
func2(1,2,3)
var func2Num;
function func2(num1,num2,num3){
func2Num = num1;
console.log("調用有參函數");
console.log("num為:"+num)
console.log("參數1為:"+num1)
console.log("參數1為:"+num2)
console.log("參數1為:"+num3)
return true;
}
var num = func2(1,2,3);
console.log(num)
[匿名函數的聲明及調用]
1 聲明一個匿名函數,直接發個一個事件,
window.onload=function(){}\
2 使用函數表達式,聲明匿名函數
聲明函數表達式 var func = function(){}
調用函數表達式 func();
>>>使用匿名函數表達式,則調用語句,必須在聲明語句之后,否則報錯,(對比常規函數聲明與調用的區別)
3 使用自執行函數,聲明並直接調用匿名函數
!function(參數1){}(參數1的值);//使用任意運算符,一般用!
(function(){}());//使用()將匿名函數及之后的括號包括
(function(){})()//使用()只包裹匿名函數表達式
三種寫法特點:
① 結構清晰,開頭加!,結尾加() 不易亂,推薦使用.
② 可以表明匿名函數與之后的()為一個整體,推薦使用。
③ 無法表明匿名函數與之后的()為一個整體,不推薦使用。
window.onload=function(){
console.log("使用window.onload調用匿名事件");
}
var func3 = function(){
console.log("使用函數表達式,調用匿名函數。")
}
func3();
!function(){
console.log("使用函數表達式,調用匿名函數。")
}();
(function(){
console.log("使用函數表達式,調用匿名函數。")
}());
(function(){
console.log("使用函數表達式,調用匿名函數。")
})();
!function(num){
console.log("使用函數表達式,調用有參函數,參數為:num="+num)
}(1);
[函數內部的屬性]
[arguments對象]
1 作用 用於保存調用函數時,所賦值的實參列表。
>>>當我們調用函數,並使用實參賦值時,實際上參數已經保存在arguments數組中,即使沒有形參,也可以使用arguments[]的形式調用函數。
2 arguments數組的個數,取決於實參列表,與形參無關。(順序從0開始)
但當第N個位置的實參,形參,arguments都存在時,形參與arguments是同步的,及在函數中修改其中一個的值,另一個也會同步變化。
3 arguments.callee是arguments的重要屬性,用於返回arguments所在函數的引用。
arguments.callee()可以調用自身函數執行。
在函數內部調用函數自身的寫法,被稱為遞歸,所以arguments。callee ()是遞歸調用時常用的方式。
[this]:
指向函數調用語句所在的作用域,即誰調用函數,this指向誰。
function func6(){
function func6_1(){
return this;
}
console.log(func6_1())
return this;
}
console.log(func6())
function func4(num1,num2,num3,num4,num5){
console.log("Arguments")
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
console.log(arguments[3]);
console.log(arguments[4]);
//arguments.callee();
//func4();
}
func4(1,2,3,4);
console.log(num)
var num =10
funN();
function funcN(){}
1上述代碼執行流程
JS中代碼運行,會先進行檢查,裝載,即聲明變量,函數等操作,
然后再進行執行階段,(變量的賦值等屬於執行階段)
所以函數的聲明屬於檢查裝載階段,函數調用屬於執行階段,所以,函數調用語句寫在函數聲明語句之前,並沒有任何關系
所以上述代碼執行流程
檢查裝載階段
var num; 聲明變量
function funcN{} 聲明函數
執行階段
console.log(num);
num=10;
funcN{}; 執行函數的{}中的代碼。