C算術運算符 printf輸出格式 字符指針打印輸出 使用scanf函數進行輸入

一? 算術運算符

+ 加, 一元取正 ?
- 減, 一元取負 ?
* 乘 ?
/ 除
% 求余
-- 自減1 ?
++ 自加1 ?


邏輯運算符

&& 邏輯與
|| 邏輯或
! 邏輯非


關系運算符

> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于 ?


位運算符號

& 按位與
| 按位或
^ 按位異或
~ 按位取反
>> 右移
<< 左移

二 /****從小到大排列*****已仿真***************/

#include <stdio.h>
#define N 10
void main()
{??? TMOD|=0x20;
??????????????? TH1=0xF3;
??????????????? TR1=0x1;
??????????????? TI=1;
??? int? i,j,min,temp;
??? int a[N]={5,4,3,2,1,9,8,7,6,0};
??? printf("\nThe array is:\n");?????????????????? /* 輸出數組元素 */
??? for (i=0;i<N;i++)
??????? printf("%5d",a[i]);
??? for (i=0;i<N-1;i++)??????????????????????? /* 排序操作 */
??? {
??????? min = i;
??????? for (j=i+1; j<N; j++)
??????????? if? (a[min]>a[j])? min =j;??????? ?
??????? temp=a[min]; a[min]=a[i]; a[i]=temp;???? /* 數據交換 */
??? }??????????????????????????????????? ?
??? printf("\nThe sorted numbers: \n");?????????? /* 輸出排序結果 */
??? for (i=0;i<N;i++)
??????? printf("%5d",a[i]);
??? printf("\n");
}
/*******從大到小排列****已仿真**************/
???????? #include "REG51.H"
???????? #include "stdio.H"
???????? int i,j,p,q,s,
???????? a[10]={12,22,52,32,25,51,23,14,82,36};
???????? void main()
????????? {
?????????? TMOD=0X20;
?????????? TI=1;
?????????? printf("\n input 10 numbers:\n");
?????????? for(i=0;i<10;i++)
??????????? {
???????????? p=i;q=a[i];
???????????? for(j=i+1;j<10;j++)
???????????? if(q<a[j]) { p=j;q=a[j]; }
???????????? if(i!=p)
???????????? {
????????????? s=a[i];
????????????? a[i]=a[p];
????????????? a[p]=s;
???????????? }
???????????? printf("%3d",a[i]);
?????????? }
??????? }

三??printf輸出格式

d? i? 以帶符號的十進制形式輸出整數(正數不輸出符號)
?? o???? 以八進制無符號形式輸出整數(不輸出前導符o)
?? x,X?? 以十六進制無符號形式輸出整數(不輸出前導符x)
???????? 用x則輸出十六進制數的a~f時以小寫形式輸出。用X時則以大寫形式輸出
?? u???? 以無符號十進制形式輸出整數
?? c???? 以字符形式輸出 只輸出一個字符
?? s???? 輸出字符串
?? f???? 以小數形式輸出單.雙精度浮點數,隱含六位小數
?? c,E?? 以指數形式輸出實數,用e時指數以“e”表示(如1.2e+02),
???????? 用E時指數以“E”表示(如1.2E+02)
?? g,G?? 選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0 。用G時
???????? 若以指數形式輸出,則指數以大寫表示

四? 字符指針打印輸出

???????? #include<reg51.h>
????????? #include"stdio.h"
????????? void???? main(void)
???????? {
????????? int k;
???????? char? *pweek[4]={"monday","tuesday","wednesday","thursday",
??????????????????????????????????? "friday","satuaday","sunday"}
????????? for(k=0;k<=7;k++)
?????????? printf("pweek[%d]=%s\n",kpweek[k]);
???????? }

五??使用scanf函數進行輸入

#include<stdio.h>
void main()
{
int a,b,c;
printf("輸入 a,b,c\n");
? scanf("%d,%d,%d",&a,&b,&c);
? printf("a=%d b=%d c=%d\n",a,b,c);
? fflush(stdin); }
? 在Dev-C++上運行程序為:
? #include<stdio.h>
? #include<stdlib.h>
void main()
?? {
? int a,b,c;
? printf("輸入 a,b,c\n");
? scanf("%d,%d,%d",&a,&b,&c);
? printf("a=%d ,b=%d ,c=%d",a,b,c);
??? fflush(stdin);
??? system("pause");
????? }
?? 注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之間有逗號,在輸入數據時也要加逗號,如果去掉逗號,輸入時就不
?? 用逗號,而用空格,tab鍵或回車鍵將各個數據隔開

?? 格式字符說明
%a,%A 讀入一個浮點值(僅C99有效)
??? %c 讀入一個字符
??? %d 讀入十進制整數
??? %i 讀入十進制,八進制,十六進制整數
??? %o 讀入八進制整數
??? %x,%X 讀入十六進制整數
??? %s 讀入一個字符串,遇空格、制表符或換行符結束。
??? %f,%F,%e,%E,%g,%G 用來輸入實數,可以用小數形式或指數形式輸入。
??? %p 讀入一個指針 %u 讀入一個無符號十進制整數
??? %n 至此已讀入值的等價字符數
??? %[] 掃描字符集合
??? %% 讀%符號
?? 附加格式說明字符表修飾符說明

?? L/l 長度修飾符 輸入"長"數據
?? h 長度修飾符 輸入"短"數據
?? W 整型常數 指定輸入數據所占寬度
?? * 表示本輸入項在讀入后不賦值給相應的變量

scanf的返回值

scanf的返回值由后面的參數決定 返回值表示成功讀入的數據的個數
?? 如: scanf("%d%d", &a, &b);
???? 如果a和b都被成功讀入,那么scanf的返回值就是2
???? 如果只有a被成功讀入,返回值為1
???? 如果a和b都未被成功讀入,返回值為0
???? 如果遇到錯誤或遇到end of file,返回值為EOF。 且返回值為int型.

使用scanf函數時應該注意的問題

1、scanf()中的變量必須使用地址。
??? 2、scanf()的格式控制串可以使用其它非空白字符,但在輸入時必須輸入這些字符。
?? 3、在用"%c"輸入時,空格和“轉義字符”均作為有效字符。
問題一
scanf()函數不能正確接受有空格的字符串?如:
?? I love you!
? #include <stdio.h>
? int main()
?? {
??? char str[80];
??? scanf("%s",str);
? printf("%s",str);
??? return 0;
??? }
? 輸入:I love you!
?? 輸出:scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,
?? scanf函數僅在每一個數據域均有數據,并按回車后結束)。
? ① 遇空格、“回車”、“跳格”鍵。
??? ② 遇寬度結束。
??? ③ 遇非法輸入。
?? 所以,上述程序并不能達到預期目的,scanf()掃描到"I"后面的空格就認為對str的賦值結束,
?? 并忽略后面的"love you!".這里要注意是"love you!"還在鍵盤緩沖區(關于這個問題,網上我所見的說法都是如此,
?? 但是,我經過調試發現,其實這時緩沖區字符串首尾指針已經相等了,也就是說緩沖區清空了,scanf()函數應該只
?? 是掃描stdin流,這個殘存信息是在stdin中)。我們改動一下上面的程序來驗證一下:
???? #include <stdio.h>
?? #include<windows.h>
???? int main()
?? {
????? char str[80];
??? char str1[80];
????? char str2[80];
????? scanf("%s",str);/*此處輸入:I love you! */
??? printf("%s",str);
??? Sleep(5000);/*這里等待5秒,告訴你程序運行到什么地方*/ /*不是sleep(5) 1,函數名是Sleep不是sleep。
2,C/C++中,unsigned Sleep(unsigned)應該是毫秒ms. scanf("%s",str1);/*這兩句無需你再輸入,是對stdin流再掃描
? */ scanf("%s",str2);/*這兩句無需你再輸入,是對stdin流再掃描 */ printf("\n%s",str1);
? printf("\n%s",str2); return 0; } 輸入:I love you!
?? 輸出: I love you! 好了,原因知道了,所以結論是:殘留的信息 love you是存在于stdin流中,
而不是在鍵盤緩沖區中。那么scanf()函數能不能完成這個任務?回答是:能!別忘了scanf()函數還有一個 %[]
格式控制符(如果對%[]不了解的請查看本文的上篇),請看下面的程序:
? #include "stdio.h"
? int main()
??? {
? char string[50];/*scanf("%s",string);不能接收空格符*/
? scanf("%[^\n]",string);
????? printf("%s\n",string); return 0; }
問題二
鍵盤緩沖區殘余信息問題
#include <stdio.h>
? int main()
??? {
???? int a; char c; do
??? {
?????? scanf("%d",&a);
???? scanf("%c",&c);
?????? printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/
????? }
?????? while(c!='N'); }
???? scanf("%c",&c);這句不能正常接收字符,什么原因呢?我們用printf("c=%d\n",c);將C用int表示出來,
?????? 啟用printf("c=%d\n",c);這一句,看看scanf()函數賦給C到底是什么,結果是c=10 ,ASCII值為10是什么?
?????? 換行即\n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩沖區發去一個“回車”(\r),一個“換行"(\n),
????? 在這里\r被scanf()函數處理掉了(姑且這么認為吧^_^),
?????? 而\n被scanf()函數“錯誤”地賦給了c.解決辦法:可以在兩個scanf()函數之后加個fflush(stdin);,
????? 還有加getch() , getchar()也可以,但是要視具體scanf()語句加那個,這里就不分析了,讀者自己去摸索吧。
??? 但是加fflush(stdin);不管什么情況都可行。 ( 函數名: fflush 功 能: 清除一個流
?? 用 法: int fflush(FILE *stream); )
?? #include <stdio.h>
???? int main()
??? {
???? int a;
???? char c;
?????? do
?????? {
????? scanf("%d",&a);
????? fflush(stdin);
????? scanf("%c",&c);
??????? fflush(stdin);
??????? printf("a=%d c=%c\n",a,c);
?????? }
??????? while(c!='N');
???????? } 這里再給一個用“空格符”來處理緩沖區殘余信息的示例:運行出錯的程序:
???? #include <stdio.h>
? ????? int main()
????????? {
???????? int i;
???????? char j;
?????????? for(i = 0;i < 10;i++)
???????? {
??????????? scanf("%c",&j);/*這里%前沒有空格*/
?????????? }
???????? } 使用了空格控制符后:
????????? #include <stdio.h>
???????? int main()
????????????? {
?????????????? int i;
????????????? char j;
????????????? for(i = 0;i < 10;i++)
??????????????? {
?????????????????? scanf(" %c",&j);/*注意這里%前有個空格*/
????????????????? }
????????????? } 可以運行看看兩個程序有什么不同。
問題三
如何處理scanf()函數誤輸入造成程序死鎖或出錯?
??????????? #include <stdio.h>
????????????? int main()
????????????? {
???????????????? int a,b,c; /*計算a+b*/
?????????????????? scanf("%d,%d",&a,&b); c=a+b;
???????????????? printf("%d+%d=%d",a,b,c);
?????????????? } 如上程序,如果正確輸入a,b的值,那么沒什么問題,但是,你不能保證使用者每一次都能正確輸入,
???????????? 一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?
???????????? 解決方法:
?????????? scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,
?????????? 如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,
?????????? 鍵盤緩沖區就可能還個有殘余信息問題。正確的例程:
??????????? #include <stdio.h>
??????????? int main()
????????? {
??????????? int a,b,c; /*計算a+b*/
????????????? while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
??????????? c=a+b;
????????????? printf("%d+%d=%d",a,b,c);
?????????? }
補充
fflush(stdin)這個方法在GCC下不可用。(在VC6.0下可以) 以下是 C99 對 fflush 函數的定義:
? int fflush(FILE *stream); 如果stream指向輸出流或者更新流(update stream),并且這個更新流
? 最近執行的操作不是輸入,那么fflush函數將把任何未被寫入的數據寫入stream 指向的文件(如標準輸出文件stdout)。
?? 否則,fflush函數的行為是不確定的。 C和C++的標準里從來沒有定義過 fflush(stdin)。 fflush(NULL)
? 清空所有輸出流和上面提到的更新流。如果發生寫錯誤,fflush 函數會給那些流打上錯誤標記,并且返回EOF,
? 否則返回0。 由此可知,如果 stream 指向輸入流(如 stdin),那么 fflush 函數的行為是不確定的。故而使用
? fflush(stdin) 是不正確的,至少是移植性不好的。
?? 可采用如下方法: 方法一:
? /* 此函數可以和scanf函數一起使用,但使用%c輸入時要注意,即此函數只能用于緩沖區非空的情況
?? */
?? #include <stdio.h>
???? void flush()
???? {
????? char c;
???? while ((c=getchar()) != '\n'&&c!=EOF) ;
??? }
???? int main()
???? {
???? int a,b,c; /*計算a+b*/
???? while(scanf("%d,%d",&a,&b)!=2) flush();
? c=a+b;
???? printf("%d+%d=%d",a,b,c);
???? }
?? 方法二:
?? 使用getchar()代替fflush(stdin)[1]
??? 程序示例:
? #include <stdio.h>
? int main(int argc, char* argv[])
?? {
??? int i, c;
?? for ( ; ; )
????? {
???? fputs("Please input an integer: ", stdout);
??? scanf("%d", &i);
????? if
??????? (
?????? feof(stdin) || ferror(stdin) )
???? { /* 如果用戶輸入文件結束標志(或文件已被讀完), */
?? /* 或者發生讀寫錯誤,則退出循環 */
?? /* do something */ break; } /*
??? 沒有發生錯誤,清空輸入流。 */ /*
? 通過 while 循環把輸入流中的余留數據“吃”掉 */
?? while ( (c = getchar()) != '\n' && c != EOF ) ;
?? /*可直接將這句代碼當成fflush(stdin)的替代,直接運行可清除輸入緩存流*/
? /* 使用 scanf("%*[^\n]"); 也可以清空輸入流, */ /* 不過會殘留 \n
?? 字符。 */ printf("%d\n", i); } return 0; }
編輯本段發展
使用scanf函數進行輸入,必須指定輸入的數據的類型和格式,不僅繁瑣復雜,
? 而且很容易出錯.C++保留scanf只是為了和C兼容,以便過去用C語言寫的程序可以
? 在C++的環境下運行。C++的編程人員都愿意使用cin進行輸入,很少使用scanf。

六 while do while 語句

8、FLASH腳本-while與 do while循環、循環語句的嵌套、組件? 二十二、while與 do while循環
在編程的許多問題中都要用到循環結構,比如要對 10 個數字的排序,兩個數字之間的比較,如
果采用選擇結構,進行的條件分支非常多,所以寫的代碼也相當長,利用循環結構可快速解決
這個問題,大大提高程序的效率.
ActionScript 語言中可通過四種語句實現程序的循環,分別是 while、do...while、for 循環和
for in 循環語句.它們與 if 語句的最大區別在于只要條件成立,循環里面的程序語句就會不
斷地重復執行.而 if語句中的程序代碼只可能被執行一次.
while 的格式如下:
while(條件表達式) {
循環體;
}
說明:在運行語句塊之前,首先測試條件表達式;如果該測試返回 true,則運行該語句塊。
如果該條件為 false,則跳過該語句塊,并執行 while 動作語句塊之后的第一條語句。其流
程圖如圖所示. 通常當計數器變量小于某指定值時, 使用循環執行動作。 在每個循環的結尾遞增計數器的值,
直到達到指定值為止。此時,件條表達式的返回值不再為 true,且循環結束。
求 1 + 2+ 3+…+100 的和
新建一個 FLASH 文檔,在第一幀打開動作面板,輸入下列代碼:
var i = 1;
var sum = 0;
while (i<=100) {
sum += i;
i++;
}
trace(sum)
代碼執行過程:
在上面的循環程序中,變量 i 的初始值是 1,表達式 i<=100 為真,變量 sum 加上 1,然
后 i+1 等于 2。再進行 i<=100 的判斷,條件真,sum 再加上 2,i 又加上 2 等于 3,這樣
循環執行,i 一直自加到 101,此時條件 i<=100 為假,結束循環。這樣程序共進行了 100
次判斷,也就是進行了 100 次循環,100 次執行表達式 sum+=i,這樣就算出了 1+2+3+…
+100 和。
注意:在循環結構中,應該有使循環趨于結束的語句,在本例的代碼中,用變量 i 來控制,
i 不斷遞加到 101,使條件為假,結束循環。
在前面我們知道 enterFrame 事件也是循環執行的,但是循環結構的執行要快行多,我們通
過下面的小程控來測試 while語句的執行速度:
var t = getTimer()/1000;//開始時間以秒為單位
var i = 0;
while (i<1000) {
i++
}//進行 100 次循環
trace(getTimer()/1000-t+"秒");
//結束時間減去開始時間,即循環所需時間.
用 while語句優化代碼
大家還記得在第十四課中我們用加法賦值作了一個鼠標跟隨效果, 當時每個字我們都要分別
設置它的_x 和_y。如果有 10個字就要寫 20 行語句,如果 100 個字呢,那不是就很麻煩
嗎?我們用 while就可以把代碼優化了。
打開第十四課鼠標跟隨特效源文件,把第 1 幀上的代碼刪除,選中第 1 個字的影片
剪輯元件,打開動作面板,輸入代碼:
onClipEvent (enter Frame) {
var i = 1;
while (i<=6) {
_root.mc1._x += (_root._xmouse-_x)/5;
_root.mc1._y += (_root._ymouse-_y)/5;
_root["mc"+i]._x += (_root["mc"+(i-1)]._x-_root["mc"+i]._x)/5+8;
_root["mc"+i]._y += (_root["mc"+(i-1)]._y-_root["mc"+i]._y)/5;
i++;
}
}
說明:
(1)如果字的個數增加了,只需改條件即可,例如是 10 個字,那么只需把條件 i<=6 改為
i<=10 就可以了。
(2)由于我們用了 enter Frame事件,所以第 2 幀就可以不要了。
用 while循環實現批量復制影片剪輯
打開源文件,場景第一幀加上代碼:
var i = 1;
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2
_root["qiu"+i+".txt"] = "qiu"+i;
i++;
}
這段代碼作用是復制5 個影片剪輯實例,實例名分別為 qiu1、qiu2、qiu3、qiu4、qiu5,并
實現橫向等距離排列。要實現同樣的交果,代碼的寫法有很多,如:
var i = 0
var num = 5;
while (i++<num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2;
_root["qiu"+i+".txt"] = "qiu"+i;
}
或者這樣寫:
var i = 1
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i++, i);
_root["qiu"+(i-1)]._x = Stage.width/6*(i-1);
_root["qiu"+(i-1)]._y = Stage.height/2;
_root["qiu"+(i-1)+".txt"] = "qiu"+(i-1);
}
dowhile語句:
do while 語句的格式
do {
循環體;
} while(條件表達式)
說明:和 while 循環語句相反,do while 循環語句是一種先斬后奏的循環語句。不管怎樣
do{“和”}之間的程序至少要執行一次,然后再判斷條件是否要繼續循環。如果 while()里
的條件成立,它繼續執行 do 里面的程序語句,直到條件不成立為止。其流程圖如圖用 do while 語句求和
同樣的累加問題:1+2+3+…+100,用 do while語句程序為:
var i = 1;
var sum = 0;
do {
sum = sum+i;
i++;
} while (i<=100);
trace(sum);
程序中的 i 不一定只能加 1,可能加上任意數,比如求 100 以內的偶數之和,用這程這樣
表示:
var i = 1;
var sum = 0;
do {
sum += i;
} while ((i += 2)<=100);
trace(sum);
區別 whi le與 dowhile 語句
(1) 選中第 1 幀,打開動作面板,輸入下列代碼;
var i=1
var j=5
(2) 在場景中創建兩個按鈕實例,分別測試兩種語句的結果,兩個按鈕上的語句分別為;
on (press) {
while (i<j) {
i++;
}
trace(i);
}
on (press) {do {
i++
} while (i<j);
trace(i)
}
(3) 測試影片,不斷地單擊按鈕
從輸出面板可以看出,當程序第一次執行時,就是第一次單擊按鈕時,。結果都是一樣,都
是數字 5。 但多單擊一次時, while 語句結果還是 5, 而 do while 語句的測試結果不斷加 1,
原因是 do while 語句先執行程序, 再進行條件判斷, 所以從第二次單擊按鈕開始, 變量 i 就
加 1。
小結:
while 與 do_while 結構都可以按照一定的條件循環執行循環體,wihle 結構先判定循環條件,
當條件符合時就執行循環體,按順序執行完循環體中的語句后,在返回 wihle 語句開始處,重新
判定條件,并以此規則進行循環操作,直到循環條件為 false時終止循環,轉而執行 wihle 結構
下面的命令,與 wihle 結構不同的是 do_while 循環結構先執行循環體中的語句,然后判定循
環條件.這就是說 do_while循環結構無論條件是否符合,循環至少執行一次.

?????? 二十三、循環語句的嵌套

一個循環體內包含另一個循環體結構,稱為循環的嵌套.在這一講中我們介紹 for 語句的嵌套、for 與while語句的嵌套。

二個for嵌套(乘法九九表)
(1)在舞臺上創建一個動態文本,變量名為: “sir”
(2)插入“圖層 2”在此第 1 幀輸入代碼:
var str:String = "";
for (var i = 1; i<=9; i++) {
for (var j = 1; j<=i; j++) {
var k = i*j;
str = str+i+"×"+j+"="+k+(k<10 ? " " : " ")+(j == i ? "\n" : "");
}
}

三個f or嵌套(求水仙花數)
提示:所謂的“水仙花數” ,是指一個三位數,其各位數字的立方和等于該數本身,例如:153 是一個,“水仙花數” ,因為 153 等于 1的立方加上 5 的立方加上 3 的立方。程序如下:
var str:String = "";
var n = 0;
for (var i = 1; i<=9; i++) {
for (var j = 0; j<=9; j++) {
for (var k = 0; k<=9; k++) {
m = i*100+j*10+k;
if(m == i*i*i+j*j*j+k*k*k) {
n++;
str = str+m+(n == 0 ? " " : " ");
}
}
}
}

for語句可以和while語句嵌套使用。(因數分解)
下面我們做一個因數分解的程序。這個實例子 for 語句可以和 while語句嵌套。
(1) 在舞臺上創建一個輸入文本, 變量名為: “my_txt1” ,再創建一個動態文本, 變量名為: “my_txt2” 。
(2) 創建兩個按鈕實例,分別用來做分解計算和清空
(3) 添加代碼:
“分解”按鈕上的代碼:
on (release) {
m = Number(my_txt1);
var str:String = m+"=";
var flag = 1;
for (i=2; i<m; i++) {
?? while (m%i == 0) {
??? if (flag == 1) {
???? str = str+""+i;
???? flag = 0;
??? } else {
???? str = str+"×"+i;
??? }
??? m = m/i;
?? }
}
if (m != 1) {
?? str = str+"×"+m;
}
my_txt2 = str;
}

清空按鈕上的代碼:
on (release) {
my_txt1 = "";
my_txt2 = "";
}

嵌套復制
(1)打開素材源文件。
(2)選中復制按鈕,打開動作腳本面板,添加代碼:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
duplicateMovieClip("mc", "mc"+i+j, i*4+j);
this["mc"+i+j]._x = (i-1)*100;
this["mc"+i+j]._y = (j-1)*100;
this["mc"+i+j+".txt"] = "mc"+i+j;
}
}
}
(3)選中刪除按鈕,打開動作在板,添加代碼:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
removeMovieClip("mc"+i+j);
}
}
}
說明:本課中的實例理論性較強,牽涉的數學知識較多

?????? 二十四、組件

組件是擁有已定義了參數的復雜影片剪輯,這些參數在文檔創作時設置。通過參數的設置和使用,我們可以修改組件的外觀和行為。每個組件都有自己的AS方法,允許我們設置和修改其選項。
??? FLASH提供幾類組件,它包括數據組件、多媒體組件、UI組件。使用組件時,我們可以使用動作腳本方法添加組件,也可以按下Ctrl+F7組合鍵打開組件面板。

組件的添加和參數設置
使用組件面板來選擇添加組件,按下Ctrl+F7組合鍵,打開組件面板,將需要的組件拖到場景中。打開屬性面板,就可以在屬性面板中的參數選項卡中為組件添加參數,并為組件命名和設置組件尺寸及位置。屬性面板中的ComboBox組件參數選項卡如圖所示

也可以按Alt+F7組合鍵打開組件檢查器,如圖所示,我們可以對組件進行設置。


建立ComboBox組件
下面通過使用組件面板來建立組件。
1、按下Ctrl+F7組合鍵,打開組件面板,選擇UI組件類中的ComboBox組件,將它拖入場景中。
2、打開屬性面板,在屬性面板中的參數選項卡中為組件添加參數。選擇labels項,單擊labels右面的數據欄,彈出值對話框
3、在值對話框中輸入數據項參數。
4、選擇rowCount行數項,輸入所需要的行數
測試效果


用程序指令控制組件

用程序指令處理組件時事件,有兩種方法:一種使用on()函數控制組件,另一種使用Click組件偵聽器控制組件。使用on()函數控制組件是FLASH傳統的編程思想,容易理解和掌握。使用Click組件偵聽器控制組件,是FLASH提倡使用的編程思想,這種方法更符合面向對象的編程特性,程序更安全,功能更強。

使用on()函數控制組件
1、建立組件對象。按下Ctrl+F7組合鍵,打開組件面板,選擇UI組件類中的RadioButton組件,將它拖入場景中。
2、打開屬性面板,在屬性面板的參數選項卡中為組件添加參數。選擇label數據項,在右面的數值欄中輸入"選擇"
3、對組件進行編程。選中組件,打開動作面板,輸入幀指令:
on(click){
trace("選擇正確");
}
測試影片,單擊"選擇"按鈕,將在輸出面板中輸出"選擇正確"字樣


使用組件偵聽器控制組件
將上例中控制組件的on()函數去掉,改為使用組件偵聽器控制組件
1、選中場景中的組件,打開屬性面板,在屬性面板左邊,輸入組件實例名為"hack"。
2、選擇第一幀,輸入幀指令:
zt=new Object();//建立偵聽器對象
zt.click=function(){
trace("選擇正確");
};//為偵聽器對象上的click定義一個函數
hack.addEventListener("click",zt);//將組件名為hack的組件注冊到偵聽對象


組件應用
利用組件制作選擇題
1、按下Ctrl+F7組合鍵,打開組件面板,選擇UI組件類中的RadioButton組件,將它拖入場景中。并復制一個RadioButton組件。在場景中建立選擇題畫面
2、選擇左邊的RadioButten組件,打開屬性面板,在屬性面板的參數選項卡中為組件修改參數。

在寬度欄輸入60,將該組件的寬度改為60像素寬。

下面我們來解釋下該組件的參數作用:
data數據參數:在數據參數欄輸入數據15,這個數據將會作為選擇題的判斷依據。
label標簽參數:將標簽參數改為"對"。
groupName組名參數:它是很重要的參數,擁有相同組名的單選按鈕,同時只能有一個被選中,這樣在同一組內就不會出現多個選擇。在這個參數欄輸入a1。
選擇右邊的RadioButten組件,在寬度欄同樣輸入60,將該組件的寬度改成了40像素寬。右邊的label標簽采納數欄改成"錯",數據欄data中輸入數據"13",這個數據將會作為選擇題的判斷依據,在組名參數欄輸入a1

3、選擇右下方的文本框,打開屬性面板,在左邊的文本類型欄中選擇動態文本,在文本類型欄下面輸入文本框名為"txt"

4、插入新的圖層,作為AS層,選中第一幀,輸入幀指令:
Listener=new Object();//建立偵聽對象
Listener.click=function(hk){//建立偵聽對象的click事件函數
if(15==hk.target.selection.data){//判斷單選按鈕組件中數據欄中的數值是不是等于15
txt.text="選擇正確";//如果等于15,將"選擇正確"賦予txt文本變量
}else{
txt.text="選擇錯誤";//如果不等于15,將"選擇錯誤"賦予txt文本變量
}
};
a1.addEventListener("click",Listener);//將組名為"a1"的單選按鈕注冊到偵聽對象測試影片

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76392.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32中Hz和時間的轉換

目錄 一、常見的頻率單位及其轉換 二、計算公式 三、STM32中定時器的應用 四、例子 一、常見的頻率單位及其轉換 赫茲&#xff08;Hz&#xff09;是頻率的國際單位&#xff0c;表示每秒鐘周期性事件發生的次數。 1 kHz&#xff08;千赫茲&#xff09; 1,000 Hz1 MHz&#…

《分布式軟總線:不同頻段Wi-Fi環境下設備發現兼容性難題》

分布式軟總線技術作為實現設備互聯互通的關鍵&#xff0c;正逐漸成為構建萬物互聯世界的基石。然而&#xff0c;當分布式軟總線面臨不同頻段Wi-Fi環境時&#xff0c;設備發現的兼容性問題成為了阻礙其廣泛應用的一大挑戰。這一問題不僅影響著用戶體驗&#xff0c;也制約著分布式…

MCP(Model Context Protocol 模型上下文協議)科普

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是由人工智能公司 Anthropic 于 2024年11月 推出的開放標準協議&#xff0c;旨在為大型語言模型&#xff08;LLM&#xff09;與外部數據源、工具及服務提供標準化連接&#xff0c;從而提升AI在實際…

【mongodb】數據庫操作

目錄 1. 查看所有數據庫2. 切換到指定數據庫&#xff08;若數據庫不存在&#xff0c;則創建&#xff09;3. 查看當前使用的數據庫4. 刪除當前數據庫5.默認數據庫 1. 查看所有數據庫 1.show dbs2.show databases 2. 切換到指定數據庫&#xff08;若數據庫不存在&#xff0c;則…

ICPR-2025 | 讓機器人在未知環境中 “聽懂” 指令精準導航!VLTNet:基于視覺語言推理的零樣本目標導航

作者&#xff1a;Congcong Wen, Yisiyuan Huang, Hao Huang ,Yanjia Huang, Shuaihang Yuan, YuHao, HuiLin and Yi Fang 單位&#xff1a;紐約大學阿布扎比分校具身人工智能與機器人實驗室&#xff0c;紐約大學阿布扎比分校人工智能與機器人中心&#xff0c;紐約大學坦登工程…

基于DeepSeek的考研暑假日志分析

注&#xff1a;我去年考研時寫了日志&#xff0c;大致記錄了我每天的主要活動。由于過于瑣碎&#xff0c;一直沒有翻看。突發奇想&#xff0c;現在利用deepseek總結其中規律。 從你的日志中可以總結出以下規律和活動興衰起落&#xff1a; ??一、學習活動規律與演變?? ??…

【刷題Day20】TCP和UDP

TCP 和 UDP 有什么區別&#xff1f; TCP提供了可靠、面向連接的傳輸&#xff0c;適用于需要數據完整性和順序的場景。 UDP提供了更輕量、面向報文的傳輸&#xff0c;適用于實時性要求高的場景。 特性TCPUDP連接方式面向連接無連接可靠性提供可靠性&#xff0c;保證數據按順序…

REST 架構詳解:從概念到應用的全面剖析

REST&#xff08;Representational State Transfer&#xff09;即表述性狀態轉移&#xff0c;是一種用于構建網絡應用程序的架構風格和設計理念&#xff0c;由計算機科學家羅伊?菲爾丁&#xff08;Roy Fielding&#xff09;在 2000 年提出。以下是關于它的詳細介紹&#xff1a…

藍橋杯之遞歸二

1.數的劃分 題目描述 將整數 nn 分成 kk 份&#xff0c;且每份不能為空&#xff0c;任意兩份不能相同(不考慮順序)。 例如&#xff1a;n7&#xff0c;k3n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。 1&#xff0c;1&#xff0c;5;1&#xff0c;5&#xff0c;…

LeetCode(Hot.2)—— 49.字符異位詞分組題解

Problem: 49. 字母異位詞分組 字母異位詞的定義是&#xff1a;兩個單詞的字母組成一樣&#xff0c;但順序可以不同&#xff0c;比如 eat、tea 和 ate 就是一個組的。 思路 將每個字符串按字母排序&#xff0c;把排序后的字符串作為 key&#xff0c;相同 key 的放在一個 list 中…

為什么信號完整性對于高速連接器設計至關重要?

外部連接器通過在各種電子元件和系統之間可靠地傳輸數據而不損失保真度來保持信號完整性。在本文中&#xff0c;我們將討論信號完整性的重要性&#xff0c;回顧高速部署挑戰&#xff0c;并重點介紹各種連接器設計策略&#xff0c;以防止失真和降級。 了解連接器信號完整性挑戰…

得物官網sign簽名逆向分析

打開得物官網&#xff0c;點擊鞋類&#xff0c;可以看到請求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…

Ubuntu 安裝WPS Office

文章目錄 Ubuntu 安裝WPS Office下載安裝文件安裝WPS問題1.下載缺失字體文件2.安裝缺失字體 Ubuntu 安裝WPS Office 下載安裝文件 需要到 WPS官網 下載最新軟件&#xff0c;比如wps-office_12.1.0.17900_amd64.deb 安裝WPS 執行命令進行安裝 sudo dpkg -i wps-office_12.1…

javaSE.判空包裝類

判空包裝類Optional&#xff0c;這個類可以很有效的處理空指針問題 空指針異常&#x1f447; 特判null&#x1f447; Optional類可以更加優雅地處理這種問題&#x1f447;&#x1f447; ofNullable&#x1f447; isPresent isEmpty &#x1f447; &#x1f447; 包裝之后&…

使用 vcpkg 構建支持 HTTPS 的 libcurl 并解決常見鏈接錯誤

適用環境&#xff1a;Windows 10/11 Visual Studio 2022 CMake ≥ 3.20 目標讀者&#xff1a;希望在 C 項目中輕松調用 HTTPS&#xff08;GET/POST/PUT/DELETE&#xff09;&#xff0c;又被 LNK20xx 鏈接錯誤困擾的開發者 目錄 為什么選 vcpkg 與 libcurl用 vcpkg 安裝帶 SS…

ISO26262-淺談用例導出方法和測試方法

目錄 1 摘要2 測試方法3 測試用例導出方法4 測試方法與用例導出方法的差異和聯系5 結論 1 摘要 ISO26262定義了測試方法和用例導出方法&#xff0c;共同保證產品的開發質量。但在剛開始學習ISO26262的時候&#xff0c;又不是非常清晰地理解它倆的區別和聯系。本文主要對它倆的…

RoBoflow數據集的介紹

https://public.roboflow.com/object-detection&#xff08;該數據集的網址&#xff09; 可以看到一些基本情況 如果我們想要下載&#xff0c;直接點擊 點擊圖像可以看到一些基本情況 可以點擊紅色箭頭所指&#xff0c;右邊是可供選擇的一些yolo模型的格式 如果你想下載…

基于CFSSL構建高可用ETCD集群全指南(含TLS證書管理)

基于CFSSL構建高可用ETCD集群全指南&#xff08;含TLS證書管理&#xff09; 摘要&#xff1a;本文深入講解使用CFSSL工具簽發TLS證書&#xff0c;并部署生產級高可用ETCD集群的完整流程。涵蓋證書全生命周期管理、集群配置優化及安全加固方案&#xff0c;適用于Kubernetes、分…

【設計模式】適配器模式:讓不兼容的接口和諧共處

引言 在軟件開發中&#xff0c;我們經常會遇到這樣的情況&#xff1a;兩個已經存在的接口無法直接協同工作&#xff0c;但我們又希望它們能夠無縫對接。這時&#xff0c;適配器模式就派上用場了。適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&…

doris/clickhouse常用sql

一、doris常用SQL 1、doris統計數據庫的總大小&#xff08;單位&#xff1a;MB&#xff09; SELECT table_schema AS database_name,ROUND(SUM(data_length) / 1024 / 1024, 2) AS database_size_MB FROM information_schema.tables WHERE table_schema NOT IN (information…