MuseScore 輸入複製歌詞
輸入歌詞 出處
a.首先點選欲輸入歌詞的音符
按下 Ctrl + L 按鍵在音符下方就會出現輸入框,直接打字即可也支援中文字輸入。
b.輸入中文歌詞
想要輸入下一個歌詞直接按 → 按鍵,就可以輸入下一段歌詞,使用左右鍵可以移動歌詞的位置,此外按空白鍵可以跳到下一個音符(要切換為英文輸入模式)。

輸入歌詞 出處
a.首先點選欲輸入歌詞的音符
按下 Ctrl + L 按鍵在音符下方就會出現輸入框,直接打字即可也支援中文字輸入。
b.輸入中文歌詞
想要輸入下一個歌詞直接按 → 按鍵,就可以輸入下一段歌詞,使用左右鍵可以移動歌詞的位置,此外按空白鍵可以跳到下一個音符(要切換為英文輸入模式)。
佇列除了能以陣列的方式來實作外,我們也可以鏈結串列來實作佇列。在宣告佇列類別中,除了和佇列類別中相關的方法外,還必須有指向佇列前端及佇列尾端的指標,即front及rear。例如我們以學生姓名及成績的結構資料來建立佇列串列的節點,及front與rear指標宣告如下:
class student {
constructor() {
this.name='';
this.score=0;
this.next=null;
}
}
front=new student();
rear=new student();
front=null;
rear=null;
至於在佇列串列中加入新節點,等於加入此串列的最後端,而刪除節點就是將此串列最前端的節點刪除。加入與刪除運算法如下:
var enqueue=(name, score)=> { //置入佇列資料
new_data= new student(); //配置記憶體給新元素
new_data.name=name; //設定新元素的資料
new_data.score = score;
if (rear==null) //如果rear為null,表示這是第一個元素
front = new_data;
else
rear.next = new_data; //將新元素連接至佇列尾端
rear = new_data; //將rear指向新元素,這是新的佇列尾端
new_data.next = null; //新元素之後無其他元素
}
var dequeue=()=>{ // 取出佇列資料
if (front == null)
process.stdout.write('佇列已空!\n');
else {
process.stdout.write('姓名:'+front.name+'\t成績:'+front.score+'...取出'); //將佇列前端一致下一個元素
}
}
JS list_queue.js
class student {
constructor () {
this.name='';
this.score=0;
this.next=null;
}
}
front=new student();
rear=new student();
front=null;
rear=null;
var enqueue=(name, score)=> { //置入佇列資料
new_date=new student(); //配置記憶體給新元素
new_date.name=name;
new_date.score=score;
if (rear==null) //如果rear為null,表示這是第一個元素
front=new_date;
else
rear.next=new_date; //將新元素連接至佇列尾端
rear=new_date; //將rear指向新元素,這是新的佇列尾端
new_date.next = null; //新元素之後無其他元素
}
var dequeue=()=>{ //取出佇列資料
if(front == null)
process.stdout.write('佇列已空!\n');
else {
process.stdout.write('姓名:'+front.name+'\t成績:'+front.score+'....取出\n');
front = front.next; //將佇列前端移至下一個元素
}
}
var show=()=> { //顯示佇列資料
ptr = front;
if (ptr == null)
process.stdout.write('佇列已空!\n');
else {
while (ptr !=null) { //由front往rear走訪佇列
process.stdout.write('姓名:'+ptr.name+'\t成績:'+ptr.score+'\n');
ptr = ptr.next;
}
}
}
select=0;
const prompt = require('prompt-sync')();
while (true) {
const select = parseInt(prompt('(1)存入 (2)取出 (3)顯示 (4)離開=> '));
if (select==4)
break;
if (select==1) {
const name = prompt('姓名: ');
const score = parseInt(prompt('成績: '));
enqueue(name, score);
}
else if (select==2)
dequeue();
else
show();
}
所謂雙向佇列Double Ended Queue, Deque 為一有序串列,加入與刪除可在佇列的任一端進行,請看下圖:
具體來說,雙向佇列就是允許兩端中任意一端都具備有刪除或加入功能,而且無論與尾端指標都是朝佇列中央來移動。通常在一般的應用上,雙向佇列可以區分為兩種:第一種是資料只能從一端加入,但是可從兩端取出。另一種則是可由兩端加入,但由一端取出。以下我們將討論第一種輸入限制的雙向佇列的節點宣告、加入與刪除運算法如下:
class Node {
constructor() {
this.data=0;
this.next=null;
}
}
front=new Node();
rear=new Node();
front=null;
rear=null;
//方法enqueue:佇列資料的存入
var enqueue=(value)=> {
node = new Node();
node.data=value;
node.next=null; //檢查是否為空佇列
if (rear==null)
fornt=node; //新建立的節點成為第一個節點
else
rear.next=node; //將節點加入到佇列的尾端
rear=node;
}
//方法dequeue:佇列資料的取出
var dequeue=(action)=> {
//從前端取出資料
if (!(front==null) && action==1) {
if (front==rear) rear=null;
value=front.data;
front=front.next;
return value;
}
//從尾端取出資料
else if (!(rear==null) && action=2) {
startNode=front; //先記下前端的指標值
value=rear.data; //取出目前尾端的資料
//尋找最尾端節點的前一個節點
tempNode=front;
while (front.next!=rear && front.next!=null){
front=front.next;
tempNode=front;
}
front=startNode; //記錄從尾端取出資料後的佇列前端指標
rear=tempNode; //紀錄從尾端取出資料後的佇列尾端指標
//下一列程式是指當佇列中僅剩下最後節點時
//取出資料後便將 front 及 rear 指向 null
if (front.next==null || rear.next==null) {
front=null;
rear==null;
}
return value;
}
else return -1;
}
JS dequeue.js
class student {
constructor () {
this.name='';
this.score=0;
this.next=null;
}
}
front=new student();
rear=new student();
front=null;
rear=null;
var enqueue=(name, score)=> { //置入佇列資料
new_date=new student(); //配置記憶體給新元素
new_date.name=name;
new_date.score=score;
if (rear==null) //如果rear為null,表示這是第一個元素
front=new_date;
else
rear.next=new_date; //將新元素連接至佇列尾端
rear=new_date; //將rear指向新元素,這是新的佇列尾端
new_date.next = null; //新元素之後無其他元素
}
var dequeue=()=>{ //取出佇列資料
if(front == null)
process.stdout.write('佇列已空!\n');
else {
process.stdout.write('姓名:'+front.name+'\t成績:'+front.score+'....取出\n');
front = front.next; //將佇列前端移至下一個元素
}
}
var show=()=> { //顯示佇列資料
ptr = front;
if (ptr == null)
process.stdout.write('佇列已空!\n');
else {
while (ptr !=null) { //由front往rear走訪佇列
process.stdout.write('姓名:'+ptr.name+'\t成績:'+ptr.score+'\n');
ptr = ptr.next;
}
}
}
select=0;
const prompt = require('prompt-sync')();
while (true) {
const select = parseInt(prompt('(1)存入 (2)取出 (3)顯示 (4)離開=> '));
if (select==4)
break;
if (select==1) {
const name = prompt('姓名: ');
const score = parseInt(prompt('成績: '));
enqueue(name, score);
}
else if (select==2)
dequeue();
else
show();
}
若是沒有先宣告 $arr=array();
會出現array_push() expects parameter 1 to be array, null 連結
解決方式:
用 $arr[]=$add_item,代替用array_push($arr, $add_item),就不會出現錯誤。
可變變數是一個滿酷的用法,適當使用可以增加程式的開發效率
可變變數就是「把變數的名稱變成變數」,看起來頭很暈對吧哈哈
直接來看程式碼
<?php
$num1 = 100;
$numString = "num1";
echo ${$numString};//也可以寫成$$numString
?>
這段程式碼最後會輸出100
原因是$numString的值是num1,將$numString的值取出放進大括號中,程式就變成了。${num1}再把大括號拿掉就變成了$num1,而$num1的值就是100,所以最後輸出100這就是可變變數的特性與用法 -「把變數的名稱變成變數」,而${$numString}這樣的寫法也能把大括號拿掉直接寫$$numString,有沒有大括號都可以正常運作。
八皇后問題也是一種常見的堆疊應用實例。在西洋棋中的皇后可以在沒有限定一步走幾格的前提下,對其盤中的其他棋子直吃、橫吃及對角斜吃(左斜吃或右斜吃皆可),只要後放入的新皇后,再放入前必須考慮所放置直線方向、橫線方向或對角線方向是否已被放置就皇后,否則就會被先放入的舊皇后吃掉。
利用這個觀念,我們可以將其應用在4*4的棋盤,就稱為4-皇后問題;應用在8*8的棋盤,就稱為8-皇后問題。應用在N*N的棋盤,就稱為N-皇后問題。要解決N-皇后問題(在此我們以8-皇后為例),首先當於棋盤中置入一新皇后,且這個位置不被先前放置的皇后吃掉,則將此新皇后的位置存入堆疊。
但若欲放置新皇后的該行(或該列)的8個位置,都沒有辦法放置新皇后(亦即一放入任何一個位置,就會被先前放置的舊皇后給吃掉)。此時,就必須由堆疊中取出前一個皇后的位置,並於該行(或該列)中重新尋找另一個新的位置放置,在將該位置存入堆疊中,而這種方式就是一種回溯Backtracking)演算法的應用概念。
N-皇后問題的解答,就是配合堆疊及回溯兩種演算概念,以逐行(或逐列)找新皇后位置(如果找不到,則回溯到前一行找尋前一個皇后另一個新位置,以此類推)的方式,來尋找N-皇后問題的其中一組解答。
JS queen.js
程式碼:如下
const EIGHT=8; //定義最大堆疊容量
queen = []; //存放8個皇后之列位
number=0; //計算總共幾組解的總數
//決定皇后存放的位置
//輸出所需要的結果
var print_table=()=> {
let x=y=0;
number+=1;
process.stdout.write('\n');
process.stdout.write('八皇后問題的第'+number+'組解\n\t');
for (x=0; x<EIGHT ; x++) {
for (y=0; y<EIGHT ; y++){
if (x==queen[y])
process.stdout.write('<q>');
else
process.stdout.write('<->');
}
process.stdout.write('\n\t');
}
}
//測試在(row,col)上的皇后是否遭受攻擊
//若遭受攻擊則傳回值為1,否則傳回0
var attack=(row, col)=>{
let i=0;
atk=false;
offset_row=offset_col=0;
while ((atk!=1) && i<col) {
offset_col=Math.abs(i-col);
offset_row=Math.abs(queen[i]-row);
//判斷兩皇后是否在同一對角線上
if ((queen[i]==row || offset_row==offset_col))
atk=true;
i=i+1;
}
return atk;
}
var decide_position=(value)=>{
let i=0;
while (i<8) {
//是否受到攻擊攻擊判斷式
if (attack(i,value)!=1) {
queen[value]=i;
if (value==7)
print_table();
else
decide_position(value+1);
}
i++;
}
}
//主程式
decide_position(0);
以陣列結構來製作佇列的好處是演算法相當簡單,不過與堆疊不同之處是需要擁有兩種基本動作加入與刪除,而且使用frint與rear兩個註標來分別指向佇列的前端與尾端,缺點是陣列大小並無法事先規劃宣告。首先我們需要宣告一個有限容量的陣列,並以下列說明:
const MAXSIZE=4;
queue=[]; //佇列大小為4
front=-1;
rear=-1;
JS array_queue.js
const MAX=10; //定義佇列的大小
queue=[];
var front=rear=-1;
var choice='';
const prompt = require ('prompt-sync')();
while (rear<MAX-1 && choice !='e') {
const choice = prompt('[a]表示存入一個數值[d]表示取出一個數值[e]表示跳出此程式: ');
if (choice=='a') {
const val = parseInt(prompt('[請輸入數值]: '));
rear+=1;
queue[rear]=val;
}
else if (choice=='d') {
if (rear>front) {
front+=1;
process.stdout.write('[取出數值為]: ' +queue[front]+'\n');
queue[front]=0;
}
else{
process.stdout.write('[佇列已經空了]\n');
return;
}
}
else {
process.stdout.write('\n');
break;
}
}
process.stdout.write('---------------------------\n');
process.stdout.write('[輸出佇列中所有元素]: \n');
if (rear==MAX-1)
process.stdout.write('[佇列已滿]\n');
else if (front>=rear) {
process.stdout.write('沒有\n');
process.stdout.write('[佇列已空]\n');
}
else {
while (rear>front) {
front+=1;
process.stdout.write('['+queue[front]+'] ');
}
process.stdout.write('\n');
process.stdout.write('---------------------------------------------\n');
}
process.stdout.write('\n');
PHP array_queue.php
$choice="n";
$queue=$_SESSION['queue'];
$length = length($queue);
if($_GET['choice'])
$choice=$_GET['choice'];
echo "<center>[<a href=".$_SERVER['PHP_SELF']."?choice=a>A</a>]表示存入一數值|
[<a href=".$_SERVER['PHP_SELF']."?choice=d>D</a>]表示取出一數值|
[<a href=".$_SERVER['PHP_SELF']."?choice=e>E</a>]表示跳出此程式|
[<a href=".$_SERVER['PHP_SELF']."?choice=n>N</a>]清空佇列
</center>";
if($choice)
switch ($choice){
case 'a':
echo "
<center>
<form method='post' action={$_SERVER['[PHP_SELF]']}>
請輸入數值:
<input name='add_queue' type='text'>
<input type='submit' name='submit' value='送出''>
</form>
</center>
";
break;
case 'd':
$queue=$_SESSION['queue']; //取出
$del=$queue[0];
array_shift($queue);
echo "<center> 刪除 {$del} </center>";
$_SESSION['queue']=$queue; //存入
break;
case 'e':
//$length = length($queue);
echo "
<center>目前佇列數目:{$length}</center>
";
break;
case 'n':
unset($_SESSION['queue']);
session_destroy();
break;
}
if ($_POST['submit']=='送出'){
//echo $_POST['add_queue'];
$queue=array(); //先宣告陣列
//print_r($queue)."<br>";
//print_r($_SESSION['queue'])."<br>";
$queue = $_SESSION['queue']; //取出
//array_push ($queue, $_POST['add_queue']); //不知為什麼會出現錯誤,但是queue有值後就不會出現
$queue[]=$_POST['add_queue']; //加入陣列
$_SESSION['queue']=$queue; //存入
}
echo "<center>目前陣列"."<br>";
//print_r($queue);
//echo "here";
foreach ($_SESSION['queue'] as $value){
echo $value." ";
}
function length ($arr){
return count($arr);
}
$queue=array();
$queue = $_SESSION['queue']; //取出
$queue[]=$_POST['add_queue']; //加入陣列
可以改寫為
$_SESSION['queue'][]=$_POST['add_queue'];
法國數學家Lucas在1883年介紹了一個十分經典的河內塔Tower of Hanoli智力遊戲,是典型使用遞迴式與堆疊觀念來解決問題的範例,內容是說在古印度神廟,廟中有三根木樁,天神希望和尚們把某些數量大小不同的圓盤,由第一個木樁全部移動到第三個木樁。
更精確來說,河內塔問題可以這樣形容:假設有A、B、C三個木樁和n個大小均不同的套環Disc,由小到大編號為1,2,3,…n,編號越大直徑越大。開始的時候,n個套環套進A木樁上,現在希望找到將A木樁上的套環藉著B木樁當中間橋樑,全部移到C木樁上最少次數的方法。不過在搬動時還必須遵守下列規則:
1.直徑較小的套環永遠置於直徑較大的套環上。
2.套還可任意弟由一個木樁移到其他的木樁上。
3.每一次僅能移動一個套環,而且只能從最上面的套環開始移動。
現在我們考慮n=1~3的狀況,以圖示方式為大家示範處理河內塔問題的步驟:
結論:移動了2@2-1=3次,盤子移動的次序為1,2,1(此處為盤子次序)
步驟:1->2,1->3,2->3(此處為木樁次序)
結論:移動了2@3-1=7次,盤子移動的次序為1,2,1,3,1,2,1(盤子次序)。
步驟為1->3,1->2,3->2,1->3,2->1,2->3,1->3(木樁次序)
當有4個盤子時,我們實際操作後(在此不作圖說明),盤子移動的次序為121312141214121,而移動木樁的順序為1->2,1->3,2->3,1->2,3->1,3->2,1->2,1->3,2->3,2->1,3->1,2->3,1->2,1->3,2->3,而移動次數為2@4-1=15。
當n不大時,各位可以逐步用圖示解決,但n的值較大時,那就十分傷腦筋了。
事實上,我們可以得到一個結論,例如當有n個盤子時,可將河內塔問題歸納成三個步驟:歸納成三個步驟:
1.將n-1個盤子,從木樁移動到木樁2。
2.將第n個最大盤子,從木樁1移動到木樁3。
3.將n-1個盤子,從木樁2移動到木樁3。
由上圖中,應該發現河內塔問題是非常適合以遞迴式與堆疊來解決。因為它滿足了遞迴的兩大特性1.有反覆執行的過程、2.有停止的出口。以下則以遞迴式來表示河內塔遞迴函數的演算法。
var hanoi=(n, p1, p2, p3)=>{
if (n==1) //遞迴出口
process.stdout.write(‘套環從 ‘+p1+ ‘移到 ‘+p3+’\n’);
else {
hanoi(n-1, p1, p3, p2);
process.stdout.write(‘套環從 ‘+p1+’ 移到 ‘+p3+’\n’);
hanoi(n-1, p2, p1, p3);
}
}
JS haoni.js
var hanoi=(n, p1, p2, p3)=> {
if (n==1) //遞迴出口
process.stdout.write('套環從'+p1+'移到 '+p3+'\n');
else {
hanoi(n-1, p1, p3, p2);
process.stdout.write('套環從 '+p1+'移到' +p3+'\n');
hanoi(n-1, p2, p1, p3);
}
}
const prompt = require('prompt-sync')();
const j= parseInt(prompt('請輸入所移動套環數量:'));
hanoi(j,1,2,3);
PHP haoni.php
$n=3;
echo "您所輸入的N是{$n}<br>";
haoni($n,1,2,3);
function haoni ($j, $p1, $p2, $p3){
switch ($j){
case 1;
echo "套環從{$p1}移到{$p3}<br>";
break;
default:
haoni($j-1,$p1, $p3, $p2);
echo "套環從{$p1}移到{$p3}<br>";
haoni($j-1,$p2, $p1, $p3);
}
}
*花盆是由小盆慢慢種到大盆,這種過程比較不會對玫瑰產生壓力。
*疏鬆營養通風的土壤,最適合玫瑰生長
粗泥炭土、碳化稻殼、椰塊、火山石、蚯蚓糞土、中大粒赤玉土
*需要通風良好的土當介質。
*澆水:需要土乾後再澆水,每次要把土交透後才行。
*植株的間隔要有空間讓空氣流通,病菌與害蟲不容易互相傳染。
*玫瑰基本的日照為,日光直射4的小時。
*用小蘇打粉加水,比例為1:1000。噴灑的時間為。頻率是每週一次。
用途是消毒。
*葵無露:沙拉油9、洗碗精1的比例混合後,以10:1000的比例噴灑。頻率也是每週一次。
用途是殺菌和殺蟲。
玫瑰花有愈修剪愈開花的特性,所以,修剪對它愈好(應該說是人類吧)。
下肥的時機:
*春天:下液肥、花開之後下禮肥。
*夏天:下液肥,容易吸收。摘下花苞讓植物休息,不要開花。
*冬天:放固體肥。在花盆外圍挖三個洞,放入肥料讓植物吸收。
肥料種類:
氮肥--促進葉子的生長。
磷肥--幫助植物開花。
鉀肥--促進植物健壯莖及生根,並使植物結果。
咖啡渣:氮肥,必須要充分發酵後才可以。
蛋殼:鈣、磷。幫助植物開花結果。
香蕉皮:鉀肥。
香蕉皮液肥的做法:
一、剩下的香蕉皮剪成小片,放入容器中加水,加到八分滿。
二、放置於半陰涼的地方,每天一次打開瓶蓋並搖晃。
三、快的話3-4天就可以,放置兩個月也行。
澆水比例:
1:10,要淡一點也可以,以薄肥多澆的原則最好。
美國總統川普(Donald Trump)2日宣布大規模徵收「對等關稅」計畫,美國各地海關由台灣時間9日中午12時起,開始對全球86國輸美貨品課徵新關稅,範圍遍及世界各角落。業者過去把生產基地由中國移至東南亞和墨西哥,遷廠與洗產地等策略這次將難以複製,工廠恐無法轉進第三地規避進口關稅,20世紀中起建立的國際經貿秩序將重新洗牌。
4月2日川普公布加關稅細節,臺灣排名第四名,加34%對等關稅。公布時正值臺灣春假期間,星期一(7)股市開市後就………
台股今(7)日爆出股災,受到國際利空與連假累積賣壓衝擊,加權指數終場狂瀉2065.87點,收在19232.35點,跌幅高達9.7%;許多個股開盤即鎖跌停價,導致成交量急縮,成交量1473億元。權值股台積電、聯發科、鴻海等全數跌停,高價股創意、健策失守千金。