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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2366閲覧

一か月のバイト代を計算するプログラムを書きたいです

chimo

総合スコア55

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/04/10 02:42

編集2020/04/10 08:23

一か月の労働状況(出勤日、労働開始時間、労働終了時間)を記してあるcsvを読み取り、一か月のバイト代を算出するプログラムを書きました。

java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.IOException; 5import java.sql.Date; 6import java.sql.Time; 7import java.util.ArrayList; 8import java.util.List; 9import java.lang.Math; 10 11public class ReadFileSample { 12 public static void main(String[] args) { 13 14 // WorkingResult.csvのパス ※「C:\WorkSpace」直下に配置していない場合は適宜変更してください。 15 final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv"; 16 // コンマ 17 final String COMMA = ","; 18 19 // 計算用の数値を定数で用意 20 final long ONE_HOUR_BY_MILLI_SEC = 1000 * 60 * 60; // 1時間のミリ秒換算 21 final long ONE_MIN_BY_MILLI_SEC = 1000 * 60; // 1分のミリ秒換算 22 final int ONE_HOUR_BY_MIN = 60; // 1時間の分換算 23 24 25 List<String> workingResults = new ArrayList<String>(); //ファイルから読み込んだデータを格納しておくArrayList 26 27 // WorkingResult.csvを読み込む 28 try { 29 // WorkingResult.csvの読み込み準備 30 File workingResultFile = new File(WORKING_RESULT_FILE_PATH); 31 BufferedReader br = new BufferedReader(new FileReader(workingResultFile)); 32 33 // WorkingResult.csvを1行ずつ読み込んでArrayListに格納する 34 String recode = br.readLine(); 35 while (recode != null) { 36 workingResults.add(recode); 37 recode = br.readLine(); 38 } 39 br.close(); 40 } catch (IOException e) { 41 System.out.println(e); 42 } 43 44 // ArrayListから1行ずつ取り出して日付/出勤時間/退勤時間に振り分け 45 for (int i = 0; i < workingResults.size() ; i++) { 46 47 String workingRecode = workingResults.get(i); // 1行ずつ文字列を取り出す 48 String[] forSplitRecode = workingRecode.split(COMMA); // splitメソッドを用いてカンマ区切りで文字列を分解&配列にそれぞれ格納 49 50 Date workingDate = Date.valueOf(forSplitRecode[0]); // 出勤日 51 Time startTime = Time.valueOf(forSplitRecode[1]); // 出勤時間 52 Time finishTime = Time.valueOf(forSplitRecode[2]); // 退勤時間 53 54 // getTimeメソッドを使って労働時間をミリ秒(0.001秒単位)で取得する 55 long workingTime = finishTime.getTime() - startTime.getTime(); 56 57 int day_wtm = (int)(workingTime/ONE_MIN_BY_MILLI_SEC) ; //働いた時間を分のみで表示 58 59 // ミリ秒で取得した労働時間を○時間△分の形式に直す 60 int workingHour = (int)( workingTime / ONE_HOUR_BY_MILLI_SEC ); // 時間に換算 61 int workingMin = (int)( ( workingTime / ONE_MIN_BY_MILLI_SEC ) % ONE_HOUR_BY_MIN ); // 分に換算 62 63 int real_wtm = 0; //real_wtmの初期化 64 int paycheck = 0; //paycheckの初期化 65 int paycheckPerHour = 900 ; 66 double paycheckPerMin = paycheckPerHour/60 ; 67 int sum_paycheck = 0; 68 69 if((6<=workingHour) && (workingHour<8)){ 70 real_wtm = day_wtm - 45 ; 71 paycheck = (int)Math.floor(real_wtm * paycheckPerMin) ; 72 73 }else if( 8<=workingHour ){ 74 real_wtm = day_wtm - 60 ; 75 76 if( real_wtm>8*60 ){ 77 int zngy_min = real_wtm - 8*60 ; 78 paycheck = (int)Math.floor( 8*60*paycheckPerMin ) + (int)Math.floor( zngy_min*paycheckPerMin*1.25 ) ; 79 80 }else{ 81 paycheck = (int)Math.floor( real_wtm*paycheckPerMin ) ; 82 } 83 84 }else{ 85 real_wtm = day_wtm ; 86 paycheck = (int)Math.floor(real_wtm * paycheckPerMin) ; 87 } 88 89 sum_paycheck = sum_paycheck + paycheck ; 90 91 } 92 93 System.out.println( "今月のお給料は" + sum_paycheck + "円です。" ); 94 System.out.println( "今月もお疲れ様でした。" ); 95 } 96}

これを実行すると以下のようなエラーがでてきました。
【エラー】-----------------
ReadFileSample.java:21: error: illegal escape character
final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv";
^
ReadFileSample.java:21: error: illegal escape character
final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv";
^
ReadFileSample.java:21: error: illegal escape character
final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv";
^
ReadFileSample.java:21: error: illegal escape character
final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv";
^
ReadFileSample.java:21: error: illegal escape character
final String WORKING_RESULT_FILE_PATH = "C:\WorkSpace\Java.El\Practice\Test2\WorkingResult.csv";
^
ReadFileSample.java:70: error: > expected
if( (6=<workingHour) && (workingHour<8) ){
^
ReadFileSample.java:70: error: ')' expected
if( (6=<workingHour) && (workingHour<8) ){
^
ReadFileSample.java:80: error: > expected
}else if( 8=<workingHour ){
^
ReadFileSample.java:80: error: ')' expected
}else if( 8=<workingHour ){
^
ReadFileSample.java:91: error: 'else' without 'if'
}else{
^
ReadFileSample.java💯 error: <identifier> expected
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: illegal start of type
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: ')' expected
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: ';' expected
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: illegal start of type
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: <identifier> expected
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java💯 error: ';' expected
System.out.println( "今月のお給料は" + sum_paycheck + "円です。" );
^
ReadFileSample.java:101: error: <identifier> expected
System.out.println( "今月もお疲れ様でした。" );
^
ReadFileSample.java:101: error: illegal start of type
System.out.println( "今月もお疲れ様でした。" );
^
ReadFileSample.java:103: error: class, interface, or enum expected
}
^
20 errors
ーーーーーーーーーーーーーーーーーーーーーーーーーー
このうち、 illegal escape characterと<identifier> expectedとが、エラー内容をしらべてもほとんどが英語で出てきてしまうので、よくわかりませんでした。どういうエラーなのでしょうか?どなたか教えていただければうれしいです。

【追記】
ご指摘いただいた点を全て修正いたしましたところ、新たに以下のようなエラーがでてきました。また、上記のプログラミングコードも編集してご指摘いただいた点をなおした状態にしております。

plane

1C:\WorkSpace\Java.El\Practice\Test2>javac ReadFileSample.java 2ReadFileSample.java:99: error: cannot find symbol 3 System.out.println("今月のお給料は" + sum_paycheck + "円です。"); 4 ^ 5 symbol: variable sum_paycheck 6 location: class ReadFileSample 71 error

sum_paycheckがスコープからはずれているということでしょうか?ifの外で宣言し、ifの中でも使い、ifの外でもつかってる…というかんじですが…ifの中でprintlnしないといけないのでしょうか

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/04/10 04:39

エラーの部分も(コードと同じように) ``` の行で囲ったほうが読み易いかと思います. その際, コードでは ```java と書いていた部分は ```plain text としてみてください.
chimo

2020/04/10 05:29

ご指摘ありがとうございます。たしかにそちらのほうが読みやすいですね、以降そのようにして参ります。
guest

回答3

0

>sum_paycheckがスコープからはずれているということでしょうか?
forより外側に定義してください。

投稿2020/04/10 08:48

junzi

総合スコア279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/04/10 08:58

なるほど、そうですね、ありがとうございます!
guest

0

コードは一気に書くのではなく、EclipseなどのIDEを使って少しずつ書いて、都度コンパイルしてください(Eclipseの場合は、デフォルトで自動的にコンパイルしてくれる)。コンパイルエラーがある場合は即座に教えてくれるので、原因の特定がしやすくなります。

投稿2020/04/10 04:54

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/04/10 08:59

そうですね、Eclipseになれていくようにします!ご指摘ありがとうございました!
guest

0

ベストアンサー

文字列中で\を書く場合は、\と2つ続けて書く必要があります

特殊な文字の入力(エスケープシーケンス) - 文字列と数値 - Java入門


あと、

ReadFileSample.java:70: error: > expected

if( (6=<workingHour) && (workingHour<8) ){

=< としてますが、<= としてみてください(他のところも一緒)


possible lossy conversion from double to int

google翻訳
doubleからintへの不可逆変換の可能性

ってことで、関数の戻り値がDouble型なのに、int型の変数に代入してるってことですね
intでキャストしてみるとかしてみれば。

paycheck = (int)Math.floor(real_wtm * paycheckPerMin) ;

#しかしこれ、どれもint型の変数になってますが、これであってるでしょうか

投稿2020/04/10 02:45

編集2020/04/10 03:59
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/04/10 03:18

あと、sum_paycheck が未定義ですね。
chimo

2020/04/10 03:26

momon_gaさん、y_waiwaiさん、コメントありがとうございます!!ご指摘いただいた部分なおしてみます!
chimo

2020/04/10 03:45

コードを修正してコンパイル致しましたが、新しいエラーがでてきてしまいました。そのエラーの内容が調べてもまた英語でしか説明されておらず理解するのが難しいです。お助け頂けると嬉しいです。
y_waiwai

2020/04/10 04:00

回答に追記しました
chimo

2020/04/10 05:35

追記ありがとうございます。Math.floorの戻り値がdoubleなのに…ということですか?でも小数点以下を切り捨てるから、結果をint型の変数に格納してもいいのではないかと感じましたが...。
y_waiwai

2020/04/10 05:38

int型どおしの掛け算の結果はintにしかなり得ないので、そもそもfloor関数が無駄ですが
chimo

2020/04/10 08:09

たしかに今回は自給900円で一分単位で自給換算されていると考えているので900÷60が割り切れているので問題ないのですが、自給を変えてもプログラムが動くようにしたいので小数点切り捨てのfloorを使ってやったほうがいいのかなとおもったのです…
y_waiwai

2020/04/10 08:12

それなら、paycheckPerMin 変数はdoubleにするほうがいいんじゃないでしょうか > #しかしこれ、どれもint型の変数になってますが、これであってるでしょうか
chimo

2020/04/10 08:22

あー!!なるほど!おっしゃるとおりです。どれもintになってしますが…というのはそういうことだったのですね。真意をはかりかねていました。 改めて(int)のキャストとpaycheckPerMinをdoubleで宣言したあとコンパイルすると、一つだけエラーがでてしまいました。cannot find symbolとなりますが、理由が分かりません...。(質問編集済です。)
y_waiwai

2020/04/10 08:25

エラーメッセージを読もう。英語だからわからんというなら、ネットにある翻訳サイトなどで翻訳してみましょう。 そのシンボルが存在しない、といってるんで、それがあってるのか確認してみよう
y_waiwai

2020/04/10 08:33

変数は、変数を定義した{}の中でしか有効ではないです この場合、変数を定義したカッコ{}から外れたところで参照しようとしたために未定義になってしまってます 参照しようとしたところと同じカッコの中で定義すればいいですな。 # for の手前で
chimo

2020/04/10 09:01

あー、forの中で使いたいときはforの外で定義しないとだめなんですね...。もう基本がグダグダですね^^; 長時間対応してくださってありがとうございます!!おかげさまで、プログラムちゃんとうごきました!!感動しました!本当にありがとうございます*^-^*
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問