プロが教える店舗&オフィスのセキュリティ対策術

HTMLで誕生石と星座をアラート表示するスクリプトを作っています。

プロンプトで入力された数字(19900425)から誕生石と星座をアラート表示するスクリプトを作っています。

この場合、switchで行う場合、それぞれどのようにコードを組めばいいのでしょうか?

できれば解説のコメント付きでお願いします。

どうぞよろしくお願いします。

A 回答 (2件)

かいとうがつきませんね。


ところで、ほんとうに switch ぶんをつかわないとだめですか?
むだにながくなるようにおもいます。

alert (['yes', 'no'][1]); //はいれつの n ばんめをとりだす。を、きほんとして、いか。

var A = ['やぎ', 'みずがめ', 'うお', 'おひつじ', 'おうし', 'ふたご', 'かに',
     'しし', 'おとめ', 'てんびん', 'さそり', 'いて'];
    
var B = ['ガーネット', 'アメシスト', 'アクアマリン', 'ダイヤモンド', 'エメラルド', 'パール',
     'ルビー', 'ペリドット', 'ブルーサファイア', 'オパール', 'トパーズ', 'トルコ'];


function constellation (yyyymmdd) {
 var ymd = parseInt (yyyymmdd, 10); //文字列だと思うので十進数の数値に変換
 var md = ymd % 10000;
 var m = Math.floor (md / 100);
 var x = m * 100 + 21 + (4 < m) + (6 < m) * 2 - ( 9 < m);//省略しすぎ?

 return md < x ? m - 1: m == 12 ? 0: m;
}


function birthstone (yyyymmdd) {
 var ymd = parseInt (yyyymmdd, 10); //文字列だと思うので十進数の数値に変換
 var m = Math.floor (ymd % 10000 / 100) - 1; // 月の部分だけを計算する

 return m;
}

alert (A[constellation ('20000101')]);
alert (B[birthstone ('20001231')]);
    • good
    • 0

回答がないみたいなので…



>誕生石と星座をアラート表示するスクリプトを作っています
どのような処理にしているのか、どこまでできているのかまったくわからないので、できているところまでを提示した方が回答が付きやすいはずです。


>switchで行う場合、それぞれどのようにコードを組めばいいのでしょうか?
switchで行なう方法は思いつきませんが、以下のような考え方でもできると思いますのでご参考までに。

入力の方法や、表示メッセージの内容などをどうしたいのかも不明なので、そのあたりは空白にしてあります。
コメントの内容に応じた処理を入れてください。(変数名や関数名は適当です)

* 誕生石は複数あるし違う月だったりもするので仮に適当に設定。
* 星座の区切り日の正確なのも不明なのでこれも仮に設定。(いろいろあるみたい)
* (↑)どれが正かわからないため、計算で求めずに配列に入れて比較する方式にしています。
(全角空白は半角に)


// ***** 誕生日から誕生石・星座を表示するメイン処理
function BirthstoneAndZodiac(){
 var day;        // プロンプトで値を入力、または
             // テキストボックスの値を取得する等
             // (入力値を変数dayに)

 if(dateCheck(day)){   // 入力値をチェック

   var bz = dayToBZ(day);//正しければ日付から誕生石と星座を得る
             // 誕生石・星座名から表示する文章を
             // 作成して表示する

 } else {
             // 入力値が正しくない場合の処理
             // (エラー表示など)
 }
}


// *** "yyyymmdd"形式の誕生日から誕生石・星座を返す関数
function dayToBZ(day){

 // 変数及びデータの定義 
 var birthday, i, index_b, index_z,
    bzData = {

 // 星座の区切り日(一律の規則ではないので配列化)
 date:["0121","0221","0321","0421","0522","0622",
     "0724","0824","0924","1023","1123","1223"],

 // 誕生石の配列(12月がindex=0)
 birthstone:["turquoise","garnet","amethyst","aquamarine","diamond",
        "emerald","pearl","ruby","peridot","sapphire","opal","topaz"],

 // 星座の名前(12/23~1/20のindexが0:dateの日付順に対応)
 zodiac:["Capricornus","Aquarius","Pices","Aries","Taurus","Gemini",
      "Cancer","Leo","Virgo","Libra","Scorpius","Sagittarius"]
 };


 // yyyymmddの後ろの4文字(=mmdd)
 var birthday = day.slice(-4);

 // 該当する星座を探すためのループ
 // 該当する日付(月)の時にループを抜ける
 for(i=0; i<12; i++)
  if(bzData.date[i]>birthday) break;
    //(mmddの文字列の値で比較)
    //(数値化しても同じ結果なので文字のまま比較)

 // 該当しなかった場合も含め適正化(0~11の値にする)
 index_z = i%12;

 // mmの文字を数値化して、0~11の値に
 //(誕生石は月と合致しているので、月を求めるだけでよい)
 index_b = +birthday.substring(0,2)%12;

 // 該当する誕生石・星座を返す
 //(値が2種類あるのでオブジェクトで)
 return { birthstone:bzData.birthstone[index_b],
      zodiac:bzData.zodiac[index_z] };
}

// *** 入力値をチェックする関数(正しければtrueを返す)
function dateCheck(d){
 // とりあえず一番簡単なチェックのみ(8文字の数字をチェック)
 return d?/^\d{8}$/.test(d):d;

  // きちんとやるなら、入力値を一旦Dateオブジェクトに変換して
  // 再度yyyymmdd形式に変換し、最初の文字列と比較するとか。
  // (同じなら正)
  //(意味は00日や35日、13月のような存在しない日の入力チェック)
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!