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

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

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

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

Q&A

3回答

6025閲覧

Javaで、シーザー暗号化・複合化プログラムについて

nakajiiSN

総合スコア10

Java

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

0グッド

1クリップ

投稿2016/08/24 03:30

編集2016/08/24 07:33

Javaで、シーザー暗号化・複合化プログラムを作成せよ。という問題についてですが、普通に作ることはできたのですが、これをアルファベット以外はそのまま、keyは0~9の数値としたいのですが、どうしたらよいでしょうか。どうか回答よろしくお願いいたします。(Zの次はA、zの次はaというように。keyはずらす文字数のことです)

アルファベットのみ暗号化させるためにinputDataに1文字入っているとして、if( inputData >='A' && inputData <='z' ) {の一文を下の方の// 暗号化処理,// 復号化処理のそれぞれ2行下にそれぞれ付け加えておきましたが、うまく動作しません。

ソースコードは以下の通りです。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Caesar extends JFrame implements ActionListener{

public static void main(String[] args) { // 自身のインスタンスを生成 new Caesar("シーザー暗号化・復号化プログラム"); } // 暗号化、復号化のラジオボタン JRadioButton rb1 = new JRadioButton("暗号化",true); JRadioButton rb2 = new JRadioButton("復号化"); // テキストフィールド JTextField txtField_input = new JTextField(50); JTextField txtField_output = new JTextField(50); JTextField txtField_key = new JTextField(3); // 変換ボタン JButton btn_convert = new JButton("変換"); // コンストラクタ Caesar(String str){ ButtonGroup bg = new ButtonGroup(); // ラジオボタンのグループ作成 JPanel p1 = new JPanel(); // パネル(ラジオボタンを載せる) JPanel p2 = new JPanel(); // 入力部分のコンポネートを載せる JPanel p3 = new JPanel(); // キー入力と変換ボタンを載せる JPanel p4 = new JPanel(); // p2とp3のパネルを載せる JPanel p5 = new JPanel(); // 出力部分のコンポーネントを載せる JLabel lbl_input = new JLabel("入力:"); JLabel lbl_key = new JLabel("key:"); JLabel lbl_output = new JLabel("暗号・復号化:"); super.setTitle(str); // ウィンドウのタイトルを設定 txtField_key.setText("3"); // Keyのデフォルト値 btn_convert.addActionListener(this); // イベントリスナを登録 bg.add(rb1); bg.add(rb2); p1.setLayout(new GridLayout(2,1)); p1.add(rb1); p1.add(rb2); p2.setLayout(new BoxLayout(p2, BoxLayout.X_AXIS)); p2.add(lbl_input); p2.add(txtField_input); p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS)); p3.add(lbl_key); p3.add(txtField_key); p3.add(btn_convert); p4.setLayout(new GridLayout(2,1)); p4.add(p2); p4.add(p3); p5.setLayout(new BoxLayout(p5, BoxLayout.X_AXIS)); p5.add(lbl_output); p5.add(txtField_output); getContentPane().setLayout(new GridLayout(3, 1)); getContentPane().add(p1); getContentPane().add(p4); getContentPane().add(p5); // Xボタン処理 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Windowサイズを指定 setSize(640,240); // ウィンドウを表示 setVisible(true); } public void actionPerformed(ActionEvent e){ if(e.getSource() == btn_convert){ String inputData, inputKey; String outputData=""; int key; // 入力値を読み込む inputData = txtField_input.getText(); inputKey = txtField_key.getText(); key = Integer.parseInt(inputKey); if(rb1.isSelected()){ // 暗号化処理 for (int i=0; i<inputData.length(); i++) { if( inputData >='A' && inputData <='z' ) { outputData = outputData + String.valueOf((char)(inputData.charAt(i) + key)); } txtField_output.setText(outputData); } if(rb2.isSelected()){ // 復号化処理 for (int i=0; i<inputData.length(); i++) { if( inputData >='A' && inputData <='z' ) { outputData = outputData + String.valueOf((char)(inputData.charAt(i) - key)); } txtField_output.setText(outputData); } } }

}

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

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

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

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

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

guest

回答3

0

大げさかもしれませんが、暗号・複合処理をクラスにしてみました。

java

1class Trans { 2 private final int key; 3 private final String fromStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 4 private final String toStr; 5 6 Trans(int key) { 7 if ((key < 0) || (9 < key)) { 8 throw new IllegalArgumentException("Bad key:" + key); 9 } 10 this.key = key % fromStr.length(); 11 this.toStr = this.fromStr.substring(this.key) + this.fromStr.substring(0, this.fromStr.length() - this.key); 12 } 13 14 private String trans(String str, String fromStr, String toStr) { 15 String ans = ""; 16 char[] cArray = str.toCharArray(); 17 for (char ch : cArray) { 18 char ch2 = ch; 19 int p = this.fromStr.indexOf(ch); 20 if (p != -1) { 21 ch2 = this.toStr.charAt(p); 22 } 23 ans += ch2; 24 } 25 return ans; 26 } 27 28 public String encode(String str) { 29 return trans(str, this.fromStr, this.toStr); 30 } 31 32 public String decode(String str) { 33 return trans(str, this.toStr, this.fromStr); 34 } 35} 36 37public class TransApp { 38 public static void main(String args[]) { 39 Trans trans = new Trans(3); 40 String str = "ABCabcあい"; 41 String enc = trans.encode(str); 42 String dec = trans.decode(enc); 43 System.out.println(str + " -> " + enc + " -> " + dec); 44 } 45}

実行した時の出力

ABCabcあい -> DEFdefあい -> ABCabcあい

投稿2016/08/25 15:51

katoy

総合スコア22324

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

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

0

keyは普通に負の数と10以上の数をエラー扱いにしたらいい.

static char[][] RANGE = {{'a', 'z'}, {'A', 'Z'}}; static char slide(char c, int key) { int ret = c + key; for(char[] t : RANGE) { if(c >= t[0] && c <= t[1]) { if(ret < t[0]) ret = t[1] - (t[0] - ret); if(ret > t[1]) ret = ret - t[1] + t[0]; return (char)ret; } } return c; } static String encrypt(String str, int key) { StringBuilder sb = new StringBuilder(); str.chars().forEach(c -> sb.append(slide((char)c, key))); return sb.toString(); } static String decrypt(String str, int key) { return encrypt(str, -key); }

投稿2016/08/24 07:27

tamy

総合スコア442

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

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

0

java

1- String.valueOf((char)(inputData.charAt(i) + key)); 2+ String.valueOf((char)shift(inputData.charAt(i),key)); 3 4- String.valueOf((char)(inputData.charAt(i) - key)); 5+ String.valueOf((char)shift(inputData.charAt(i),26-key));

java

1 int shift(char c, int key) { return 2 c < 'A' ? c : 3 c <= 'Z' ? (c + key - 'A') % 26 + 'A' : 4 c < 'a' ? c : 5 c <= 'z' ? (c + key - 'a') % 26 + 'a' : c; 6};

解説はしない。「keyは0~9」は無視した。

投稿2016/08/24 07:23

matobaa

総合スコア2493

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問