blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C言語をjavaに訳せる方

Q&A

Closed

以下のC言語をjavaに解読できる方はおりませんか?
あるコードの問題でC言語しかなく、自分が学んでいるjavaが無いんです。

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main() {
  int N, K;
  cin >> N >> K;

  vector<string> company(N);
  map<string, string> password;
  map<string, int> deposit;

  for (int i = 0; i < N; i++) {
    int money;
    string pass;
    cin >> company[i] >> pass >> money;
    password[company[i]] = pass;
    deposit[company[i]] = money;
  }

  for (int i = 0; i < K; i++) {
    string g, m;
    int p;
    cin >> g >> m >> p;
    if (m == password[g]) {
      deposit[g] -= p;
    }
  }

  for (int i = 0; i < N; i++) {
    cout << company[i] << " " << deposit[company[i]] << endl;
  }
}

解読できるのはせいぜい最初の宣言文やfor文くらいで他は分かりません。
実はこれだけでなくかなりたくさんあるので、問題を解きようがなく膠着しています。
別コード変換ツールとかあれば大変助かるのですが方法が・・・誰か教えていただきたいです。

0

2Answer

chatGPTに依頼してみました。

IMG_1804.jpg

惜しいですが、変換違いがありますね。

3Like

Comments

  1. @blue-phoenix

    Questioner

    ミャオオ、できました!! chatGPTというサイトがあるんですか!?
    なるほど、そこなら残り全ての問いもなんとかなりそうです!
    毎度お騒がせしております、今回もありがとうございました!

ざっくりですが、元のコードから解説します。

元のコードはCではなくC++です。

※C言語系統に触れるのは久しぶりなので
 インデント等に不備があるかもしれません。ご了承下さい。

/*
    前提:
        (複数可)会社名とパスワード、預金額を入力し、
        預金額に対して引き出し(複数可)を行い、各会社の残高を表示するプログラム
*/

// Javaのimportとほぼ同様
#include <iostream>
#include <map>
#include <string>
#include <vector>

// 名前空間の宣言(std:: 記述省略のため) => 特に気にしなくて大丈夫です
using namespace std;

int main() {
  int N, K;
  /*
    ・C++の標準入力(cin)でNとKを入力する
    ・Nが会社の数
    ・Kが預金から引き出す回数
  */
  cin >> N >> K;

  // 会社名
  vector<string> company(N);
  // パスワード
  map<string, string> password;
  // 預金額
  map<string, int> deposit;

  // N数の会社分「会社名」「パスワード」「預金額」を入力する
  for (int i = 0; i < N; i++) {
    int money;
    string pass;
    cin >> company[i] >> pass >> money;
    password[company[i]] = pass;
    deposit[company[i]] = money;
  }
  
  // K回分預金額から引き出す
  for (int i = 0; i < K; i++) {
    // g:会社名, m:パスワード, p:引出し額
    string g, m;
    int p;
    // 「会社名」「パスワード」「引出し額」を入力する
    cin >> g >> m >> p;
    // 入力したパスワードが会社名にMapで紐付けられているパスワードと一致したら
    if (m == password[g]) {
      // 「預金額」から「引出し額」を差し引く
      deposit[g] -= p;
    }
  }

  for (int i = 0; i < N; i++) {
    // 各会社の名前と預金残高を出力する
    cout << company[i] << " " << deposit[company[i]] << endl;
  }
}

雑ですが、変換の一例です。(可読性等、度外視なので本当に雑です)
※元のコードに解説コメントを記述したのでこちらは記述しません

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int N, K;
        N = scanner.nextInt();
        K = scanner.nextInt();
        scanner.nextLine();

        String[] company = new String[N];
        Map<String, String> password = new HashMap<>();
        Map<String, Integer> deposit = new HashMap<>();

        for (int i = 0; i < N; i++) {
            String line = scanner.nextLine();
            String[] tokens = line.split(" ");
            company[i] = tokens[0];
            password.put(company[i], tokens[1]);
            deposit.put(company[i], Integer.parseInt(tokens[2]));
        }

        for (int i = 0; i < K; i++) {
            String line = scanner.nextLine();
            String[] tokens = line.split(" ");
            String g = tokens[0];
            String m = tokens[1];
            int p = Integer.parseInt(tokens[2]);

            if (m.equals(password.get(g))) {
                deposit.put(g, deposit.get(g) - p);
            }
        }

        for (int i = 0; i < N; i++) {
            System.out.println(company[i] + " " + deposit.get(company[i]));
        }

        scanner.close();
    }
}

何も例外処理等を施していないので
以下の形式で入力しないと例外を吐きます。(値は一例です)

コンソールでの入出力例
# 入力:会社の数
1(整数) => [Enter] キー押下

# 入力:引き出す回数
1(整数) => [Enter] キー押下

# 入力:会社名 パスワード 預金残高(半角空白区切り)
foocompany(文字列) password(文字列) 100000(int表現を含むString) => [Enter] キー押下

# 入力:会社名 パスワード 引出し額(半角空白区切り)
foocompany(文字列) password(文字列) 8000(int表現を含むString)   => [Enter] キー押下

# 出力:会社名と預金残高
foocompany 92000

少しでもイメージし易くなれば幸いです。

1Like

Comments

  1. @blue-phoenix

    Questioner

    ウチュチュウウ、無事に解くことができました、いつもお世話になっております!
    変換サイトがあるらしく残りの問題もどうにかなりそうなので再び進行できそうです。
    ありがとうございました!

Your answer might help someone💌