質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

干支、誕生石、星座、運勢を出したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,896
退会済みユーザー

退会済みユーザー

わからない点↓
誕生石と星座のundefinedと出ているところはどう書けば正しい表示になるか。
最後のコンソールログで星を出し、さらに運勢ごとに言葉を付け加える、その方法を教えて下さい。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>占い</title>
</head>
<body>
<script>
var name;//名前
var by;//生年
var bm;//生月
var bd;//生日
var isi;
var star;
var message;
var eto;
var seiza;
var Random;
var ran;

name=prompt("お名前は?","");
by=prompt("生まれた西暦年を半角4桁で入力してください","");
bm=prompt("生まれた月を半角(1~12)で入力してください","");
bd=prompt("生まれた日を半角(1~31)で入力してください","");

function zodiac(){

var eto=["申","酉","戌","亥","子","牛","寅","卯","辰","巳","午","未"];
return eto[by%12];
}
function birthstone(){

switch(bm){
case '1': isi="ガーネット";
break;
case '2':isi="アメジスト";
break;
case '3':isi="アクアマリン";
break;
case '4':isi="ダイヤモンド";
break;
case '5':isi="エメラルド";    
break;
case '6':isi="真珠";
break;
case '7':isi="ルビー";
break;
case '8':isi="ペリドット";
break;
case '9':isi="サファイア";
break;
case '10':isi="オパール";
break;
case '11':isi="トパーズ";
break;
case '12':isi="タンザナイト";
break;
}
return isi;
}
function constellation(){
if((bm===3&&bd>=21)||(bm===4&&bd<=19)){seiza="牡羊座";}
else if((bm===4&&bd>=20)||(bm===5&&bd<=20)){seiza="牡牛座";}
else if((bm===5&&bd>=21)||(bm===6&&bd<=21)){seiza="双子座";}
else if((bm===6&&bd>=22)||(bm===7&&bd<=22)){seiza="蟹座";}
else if((bm===7&&bd>=23)||(bm===8&&bd<=22)){seiza="獅子座";}
else if((bm===8&&bd>=23)||(bm===9&&bd<=22)){seiza="乙女座";}
else if((bm===9&&bd>=23)||(bm===10&&bd<=23)){seiza="天秤座";}
else if((bm===10&&bd>=24)||(bm===11&&bd<=22)){seiza="蠍座";}
else if((bm===11&&bd>=23)||(bm===12&&bd<=21)){seiza="射手座";}
else if((bm===12&&bd>=22)||(bm===1&&bd<=20)){seiza="山羊座";}
else if((bm===1&&bd>=21)||(bm===2&&bd<=18)){seiza="水瓶座";}
else if((bm===2&&bd>=19)||(bm===3&&bd<=20)){seiza="魚座";}
return seiza;
}
function fortune(){
var num = Math.floor(5*Math.random())+1;
star=star+"★";
for(var i=0;i<num;i++){star=star+"★";}

String[] message= {"今日はおとなしく過ごしましょう","明日はいいことありますよ、きっと","頑張れば、なにかいいことあるかもよ"
,"今日はいいことあるかもね","今日もいいことあるはずです!"};
Random ran=new Random(message.length);
int N=ran.nextInt();
return star+message;

}
console.log(by+"年生まれの"+name+"さんの干支は"+zodiac()+"です。");
console.log(bm+"月生まれの"+name+"さんの誕生石は"+birthstone()+"です。");
console.log(bm+"月"+bd+"日生まれの"+name+"さんの星座は"+seiza+"です。");
console.log(fortune()+message[N]);
</script>
</body>
</html>

実行結果
HTML1300: ナビゲーションが発生しました。
2019年生まれの浦島ですさんの干支は亥です。
6生まれの浦島ですさんの誕生石はundefinedです。
6月26日生まれの浦島ですさんの星座はundefinedです。
undefined★★undefined
となっている状態です。

実行結果を以下の通りにしたいです。
例、
1963年生まれの浦島さんの干支は卯です。
5月生まれの浦島さんの誕生石はエメラルドです。
5月1日生まれの浦島さんの星座は牡牛座です。
★★★頑張れば、何かいいことあるかもよ
としたいです。

わからない点↓
誕生石と星座のundefinedと出ているところはどう書けば正しい表示になるか。
最後のコンソールログで星を出し、さらに運勢ごとに言葉を付け加える、その方法を教えて下さい。

運勢表
1 ★ 今日はおとなしく過ごしましょう
2 ★★ 明日はいいことありますよ、きっと
3 ★★★ 頑張れば、なにかいいことあるかもよ
4 ★★★★ 今日はいいことあるかもね
5 ★★★★★ 今日もいいことあるはずです!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2019/06/29 18:41

    原因が他にもありますから、それは仕方がないですね……
    初めは、小さいものから作っていくといいかもしれませんよ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/06/29 18:43

    何度か試していたらCONSOLE21301: コンテキストがセキュリティで保護されていないか、E19C4010_task10.html でのホスト制約のため、serviceWorker.getRegistrations が拒否されました。と出たのですが「コンテキストがセキュリティで保護されていないかホスト制約のため、serviceWorker.getRegistrations が拒否されました。」で調べても出てこなかったのですが解決法はありますか?

    キャンセル

  • Lhankor_Mhy

    2019/06/29 18:55

    関係ない話なような気がしますね。

    キャンセル

回答 3

checkベストアンサー

+2

他の人のコメント欄でやりとりしてもいけないので新しく回答として。

まず、前提としてpromptで入って来るものは文字列になります。
そのためcaseで数値と比較しても比較できませんでしたね。
function constellation()でも同じ事が言えます。
例えば
一番最初のif((bm===3&&bd>=21)
この比較ですが、オペランドの型はbm文字列、3は数値です。
そこで型を揃えるためにどっちを揃えてもいいのですが
文字列として比較する場合はcase文のように値をシングルクォートで囲みます
if((bm==='3'&&bd>='21')
こうすることで文字列の比較となるのでうまく式が評価されるはずです。
逆に数値として比較したい場合は

name=prompt("お名前は?","");
by=prompt("生まれた西暦年を半角4桁で入力してください","");
bm=prompt("生まれた月を半角(1~12)で入力してください","");
bd=prompt("生まれた日を半角(1~31)で入力してください","");

/* 文字列を数値へパースする */
by=parseInt(by);
bm=parseInt(bm);
bd=parseInt(bd);


上記3行を追加してあげてください。(これがコメントで書いたパースです)
パースする場合はcasefunction constellationもシングルクォートで囲む必要はありません。

ランダムで運勢を出すについては
配列に運勢のメッセージを入れてしまい、その中からランダムで選択する方が簡単かと思われます。

function fortune(){
    var fortuneArr = ["★ 今日はおとなしく過ごしましょう",
                      "★★ 明日はいいことありますよ、きっと",
                      "★★★ 頑張れば、なにかいいことあるかもよ",
                      "★★★★ 今日はいいことあるかもね",
                      "★★★★★ 今日もいいことあるはずです!",];

    // 配列からランダムで値を選択
var fortune = fortuneArr[Math.floor(Math.random() * fortuneArr.length)];
return fortune;


こんな感じでしょうか

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/30 13:31

    本当にありがとうございます。<(_ _)>

    キャンセル

  • 2019/06/30 13:37

    解決できたようで良かったです。
    ただ、試した感じ全角半角が考慮されておらず、
    全角数字を入れるとまたundefinedになってしまうので
    そこだけ注意してください。

    キャンセル

+1

機能がいくつかにわかれているのでそれぞれ順に確認していけばよいでしょう
たとえばzodiac()はetoの定義がreturnの後ろにあるのでおかしい

var name="浦島";//名前
var by="1963";//生年
var bm="5";//生月
var bd="1";//生日
var eto;
function zodiac(){
  var eto=["申","酉","戌","亥","子","牛","寅","卯","辰","巳","午","未"];
  return eto[by%12];
}
console.log(zodiac());

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/29 20:35

    ありがとうございます。ご指摘いただいた点を修正することで入力された人の干支が出るようになりました。

    キャンセル

  • 2019/06/29 20:39

    「誕生石と星座のundefinedと出ているところはどう書けば正しい表示になるか。
    最後のコンソールログで星を出し、さらに運勢ごとに言葉を付け加える、その方法」の二つが解決していない状態なのですが、コードをどのように打てば表示されるようになりますか?

    キャンセル

+1

function birthstone(){が閉じられてないです。
etoの定義が関数の中に入っているので、外からアクセスできないです。
fortune() birthstone()を書き忘れています。
isi star message の定義を忘れています。

まず、開発者ツールでエラーメッセージを見ることを覚えましょう。

質問の編集を受けて追記

function birthstone(){を閉じる場所が間違っていると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/29 21:17

    解決しそうなので横から失礼します。
    console.log(bm+"生まれの"+name+"さんの誕生石は"+isi+"です。");
    ここでbirthstone()を呼んであげましょう。
    ちなみにデバッグしてみたところ当方の環境だと
    case文の数字はシングルクォートで囲わないとうまく比較できませんでした。(参考までにどうぞ)
    constellation()も呼んであげてはいますがreturnで返してないので返してあげましょう。
    constellation()内のif分も厳密比較してますがパースしてあげないとうまく比較できませんでした。
    横から失礼しました。

    キャンセル

  • 2019/06/30 10:57

    シングルクォートとパースですか...使ったことがなかったので調べて使ってみます。

    キャンセル

  • 2019/06/30 11:59

    すいません...
    一時間ほどパースについて調べたりランダムで運勢を出すのを調べていたんですけど、パースの使い方、文章の出し方がわからないです...

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る