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);
}
}
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
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);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
大げさかもしれませんが、暗号・複合処理をクラスにしてみました。
class Trans {
private final int key;
private final String fromStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private final String toStr;
Trans(int key) {
if ((key < 0) || (9 < key)) {
throw new IllegalArgumentException("Bad key:" + key);
}
this.key = key % fromStr.length();
this.toStr = this.fromStr.substring(this.key) + this.fromStr.substring(0, this.fromStr.length() - this.key);
}
private String trans(String str, String fromStr, String toStr) {
String ans = "";
char[] cArray = str.toCharArray();
for (char ch : cArray) {
char ch2 = ch;
int p = this.fromStr.indexOf(ch);
if (p != -1) {
ch2 = this.toStr.charAt(p);
}
ans += ch2;
}
return ans;
}
public String encode(String str) {
return trans(str, this.fromStr, this.toStr);
}
public String decode(String str) {
return trans(str, this.toStr, this.fromStr);
}
}
public class TransApp {
public static void main(String args[]) {
Trans trans = new Trans(3);
String str = "ABCabcあい";
String enc = trans.encode(str);
String dec = trans.decode(enc);
System.out.println(str + " -> " + enc + " -> " + dec);
}
}
実行した時の出力
ABCabcあい -> DEFdefあい -> ABCabcあい
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
- String.valueOf((char)(inputData.charAt(i) + key));
+ String.valueOf((char)shift(inputData.charAt(i),key));
- String.valueOf((char)(inputData.charAt(i) - key));
+ String.valueOf((char)shift(inputData.charAt(i),26-key));
int shift(char c, int key) { return
c < 'A' ? c :
c <= 'Z' ? (c + key - 'A') % 26 + 'A' :
c < 'a' ? c :
c <= 'z' ? (c + key - 'a') % 26 + 'a' : c;
};
解説はしない。「keyは0~9」は無視した。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
2016/08/24 13:19
こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。