if分岐が上手くいかないのはなぜ?

このQ&Aのポイント
  • 基本的なif分岐だと思われるコードが上手く動作しない。外出時間の判定が常に分岐1に入る問題が発生している。
  • 外出時間の判定において、分岐1と分岐2の条件が正しく設定されていない可能性がある。
  • コードの分岐条件を見直し、外出時間を適切に判定するよう修正する必要がある。
回答を見る
  • ベストアンサー

if分岐が上手くいかない。

if分岐が上手くいかない。 お世話になっております。 基本的なif分岐だと思うのですが、 なぜ動かないのか、どうしても理解できずにいます。 目的は勤務表の作成で、 数値型で取得している外出時間(例.1時間15分⇒1.25) この分の部分を、 0分なら0,(1時間0分⇒1.0なのでそのまま)、 1分から30分までは30分扱い、(0.01⇒0.5,1.01⇒1.5) 31分から60分までは1時間扱い、(0.51⇒1.0,0.9⇒1.0) と、判断する部分を書いているのですが、 何故か分岐が上手くいきません。 下記のように、時間を一度文字列型に変換し、 小数点を条件に分割、 分割した分の部分を数値型にし、その値で比較する。 そんなソースを書いているのですが、 常に1の分岐に入ってしまうのです。 更に1.0時間など、0の分岐を追加するとエラーとなり動きません。 基本的なif分岐だとは思うのですが なぜ上手く行かないのか、 自力でどうしても解決できず相談致します。 よろしくお願いします。 temp = 1.75; alert(temp + "この数字は1時間45分数値型"); //外出時間に関しては、小数部分を0.5単位で切り上げる str = new String(temp); tempstr = str.split('.'); alert(tempstr[0] + "外出時間、HH"); hun_str = tempstr[1].substring(0,2); alert(hun_str + "外出時間、MI"); //hun_strを数値型に hun_int = hun_str - (-0); alert(hun_int + "外出時間、MI(この値で判定)"); if( 0 < hun_int <= 50 ){  //分岐1  alert("1分以上、30分以下。0.5時間とする。"); }else if( hun_int > 50){  //分岐2  alert("30分以上は1時間扱い"); }

質問者が選んだベストアンサー

  • ベストアンサー
  • markelf
  • ベストアンサー率71% (5/7)
回答No.1

分岐条件の下記の部分が問題かと思われます。 if( 0 < hun_int <= 50 ){ もし、0以上かつ50以下と記述したいのであれば、 if( hun_int>=0 && hun_int <=50 ){ と記述してください。

wendy0303
質問者

お礼

markelfさん、早速の回答ありがとうございます。 条件式の書き方、まさにその通りでした。 お陰で解決いたしました。 何か別の言語と勘違いしていたのかもしれません。

関連するQ&A

  • 条件分岐

    以下の条件分岐について教えてください。 条件:str の 文字に ”0.0”や”0000”などの入力があっ   た場合、NG_FLAGを返したいのです。 どこがいけないのか、教えてください。 int CheckData2(char *str) {  if (str[0] == '0');{   printf("%c", str[0]);   if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はOK_FLAG");    return OK_FLAG;   } else if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はNG_FLAG;");   return NG_FLAG; } } puts("CheckData2はOK_FLAG"); return OK_FLAG; }

  • LCDに小数点以下の数字を表示する方法

    現在、PIC18F14K50を用いたLCD電圧計をつくっています。 sprintfを使って文字列にして表示させようとしたのですが、int型は数字が表示されるのに double型は数字が表示されません。 具体的には int temp = ReadADC(); sprintf(buf,"VOLTAGE=%d",temp); LCD_str(buf); ↑これがうまく表示されて int temp = ReadADC(); double data = (double)(temp); sprintf(buf,"VOLTAGE=%.2lf",data); LCD_str(buf); ↑これが数字の部分が表示されません。 PC(コマンドプロンプト)ではしっかり表示できているのでプログラムは間違っていないと思うのですが、なぜなのでしょうか? また、ほか小数点以下の数字を表示させる方法がありましたら教えて下さい。

  • ポインタのアドレス渡し。。。

    ポインタ配列を関数で渡す方法教えてください。 for(cnt1 = 0 ; cnt1 < 5 ;cnt1++) { for(cnt2=cnt1 + 1 ; cnt2 < 5 ;cnt2++) { ret=strcmp(srt[cnt1],str[cnt2]); if(ret>0)    { temp = str[cnt1]; str[cnt1] =str[cnt2]; str[cnt2] = temp; } } この並び替え処理を関数で渡したいのですが、 この処理を関数で以下のようにするとエラーが・・・ void sort(char *pstr,int cnt) { int ct1; int ct2; char *temp; for(ct1 = 0 ; ct1 < cnt-1 ;ct1++) { for(ct2=ct1 + 1 ; ct2 < cnt ; ct2++)   { ret=strcmp(pstr+ct1,pstr+ct2); if(ret>0) { temp = pstr+cnt1; pstr[ct1] = pstr[ct2]; pstr[ct2] = temp; }}} どのように渡せば良いのかわかる方教えていただけませんか??

  • 分を表す数値(int型)を、小数点に直したい

    例えば、 左↓の分を表すint型数値の値を、 右↓のような小数点の形式に直す方法を教えて下さい。 どちらもint型で。 もし、int型で小数点が扱えないなら、最適な型で直したいのですが・・。 ※小数点以下の桁数は一桁です。 ----------------------------- 120 (分) → 2  (時間) 125 (分) → 2.1 (時間) 130 (分) → 2.2 (時間) 135 (分) → 2.3 (時間) 140 (分) → 2.3 (時間) 145 (分) → 2.4 (時間) 150 (分) → 2.5 (時間) 155 (分) → 2.6 (時間) 160 (分) → 2.7 (時間) 165 (分) → 2.7 (時間) 170 (分) → 2.8 (時間) 175 (分) → 2.9 (時間) 180 (分) → 3 (時間) -----------------------------

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えて下さい

    //Sample.java class Sample void methodA(int temp) if(temp == 0) String str = new String("Exception"); Integer.parseInt(str); else if(temp == 1) int[] array = new int[temp]; else Exception exc = new Exception(); throw exc; //SampleMain.java class ExceptionMain public static void main(string[] args) Sample sam = new Sample(); Int temp = Integer.parseInt(args[0]); Sam.method(temp); } } このプログラムの場合、ExceptionMainに新たにコードを加えて、コマンドライン引数が0,1,その他の場合に例外メッセージを出力するプログラムを教えて下さい。

    • ベストアンサー
    • Java
  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • UNIX(Cシェル)での数値判断での条件分岐がうまくいきません。

    いつもお世話になっております。 宜しく御願い致します。 if文で数値判断により条件分岐をしようと思ってます。 条件は”0<変数<=20”(仮)で、エラーだと警告文表示後に変数入力部に戻したいのです。 変数を画面上から”変数 = $<”で読み込み、処理をしたいのですが、うまくいきません。 整数値だとうまく行く方法を見つけましたが、小数値が入るとNG、小数値でもうまく行く方法を見つけました(bcを使用)が、文字列が入力されるとNG、と行き詰まってしまいました。 入力値としては小数値を期待しているのですが、操作する人が間違って”3..2”や”2 5”、”4rr”等が入力された場合も偽の判断をもって処理を戻したいのですが、ifの形式がおかしいとか、文法上のエラーがあると表示され、うまく戻ってくれません。 なにか良い方法はないでしょうか? 要は、if(変数 > 0 && 変数 <= 20) then で変数の値が文字列、小数、整数問わずに処理をしたいだけなんですが・・・。 どうぞ宜しく御願いします。

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • 実行できません

    #include<iostream> #include<cstring> using namespace std; void reverse(char *str,int count=0); int main(){ char *s1="this is a test."; reverse(s1); cout<<s1; return 0; } void reverse(char *str,int count){ int i,j; char temp; if(!count)count=strlen(str)-1; for(i=0,j=count;i<j;i++,j--){ temp=str[i]; str[i]=str[j]; str[j]=temp; } } これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:samplem.exe samplem.obj どうしてでしょうか?よろしくお願いします。

  • IF文と文字列の組み合わせについて

    今回、InputStreamReader、BufferedReaderクラスを用いての応答処理を返事次第で処理を分岐させるということを、IF文を用いて行うつもりでした。 ソースは以下の通りです。 import java.io.*; class test1{ public static void main(String[] args){ int num=0; do{ String str1; String str2; try{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println("今日の日付を入力して下さい。"); str1=br.readLine(); System.out.println("今日の日付は"+str1+"でよろしいでしょうか?[はい/いいえ]"); str2=br.readLine(); if(str2.toString()=="はい"){ System.out.println("日付登録完了しました。"); }else if(str2.toString()=="いいえ"){ System.out.println("ただしい日付を入力して下さい。(1)"); num=1; }else System.out.println("ただしい日付を入力して下さい。(2)"); num=1; }catch(Exception e){ System.out.println("入力が正しくないです。"); num=1; } }while(num==1); } } 実際に処理をさせたときに、 c:\javasrc>java test1 今日の日付を入力して下さい。 8/1 今日の日付は8/1でよろしいでしょうか?[はい/いいえ] はい ただしい日付を入力して下さい。(2) 今日の日付を入力して下さい。 というように何を入力しても最終的にelseに返されてしまいます。 IF文と文字列の組み合わせが悪いのでしょうか…。 色々と考えてはみたものの解決策が見つかりませんでした。 どなたか詳しい方いましたら教えていただけると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう