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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

3611閲覧

シーザー暗号についての問題

mrjohansson0901

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/07/25 15:33

編集2017/07/25 15:56

シーザー暗号についての質問です
大文字を3字ずらす小文字を5字ずらすというプログラムを作っています。
ぶち当たった壁が大文字は3字ずらすことは可能なのですが小文字を5字ずらすことができません
どなたかどこに問題があるのか教えていただいてもよろしいでしょうか。

C

1#include <stdio.h> 2#include <string.h> 3 4#define X 5 5#define Y 3 6 7void decode(char *str, char *to){ 8 int i; 9 int len1, len2; 10 len1 = strlen(str); 11 len2 = strlen(to); 12 for(i=0;i<len1;i++){ 13 if(str[i] >= 'a' && str[i] <= 'z') 14 str[i] = (str[i] - 'a' + X ) % 26 + 'a'; 15 } 16 for(i=0;i<len2;i++){ 17 if(to[i] >= 'A' && to[i] <= 'Z') 18 to[i] = (to[i] - 'A' + Y ) % 26 + 'A'; 19 } 20 return; 21} 22int main(void) { 23 char str[256]; 24 char to[256]; 25 for( ;NULL != fgets(str, sizeof(str), stdin);) { 26 for( ;NULL != fgets(to, sizeof(to), stdin);){ 27 decode(str, to); 28 printf("%s%s",str,to); 29 } 30 } 31

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

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

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

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

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

LouiS0616

2017/07/25 15:43

コードはバッククオート三つで括ってください。よくわからない場合は、マークダウン記法について調べてみてください。
LouiS0616

2017/07/25 15:44

あと、なぜmain関数で二重ループを用いているんです?ご提示のコードの方針がわからないです。
mrjohansson0901

2017/07/25 15:58

fgetsの中にすべてまとめてしまうと中身が多すぎるといわれたので別にループさせる必要があるのかなと思いこの形をとりました
LouiS0616

2017/07/25 15:59

よくわからないです。そもそもstrとtoの違いはなんですか?strを復号してtoにするのだとしたら、なぜtoに対する入力を求めているのでしょう?
mrjohansson0901

2017/07/25 16:01

えっと初心者なのでというのが言い訳になっちゃうレベルなんですが例えばstrのみで大文字小文字両方を復元することは可能なんでしょうか?
LouiS0616

2017/07/25 16:03

一文字一文字チェックするのなら充分可能です。
mrjohansson0901

2017/07/25 16:12

strのみで復元してみたらできました。ありがとうございます
LouiS0616

2017/07/25 16:14

出来たようでなによりです。ぜひ、ご自身で回答を書いて自己解決ボタンを押してください。これからのプログラミング資源の一つになります。
LouiS0616

2017/07/25 16:16

なお、もし入力が二つ必要な場合も、二重ループにすると上手くいかないと思います。単一のfor文で、条件分岐部分をちょいと工夫してやってください。
guest

回答1

0

自己解決

Lousi0616さんのアドバイスで出来ました

C

1#include <stdio.h> 2#include <string.h> 3 4#define X 5 5#define Y 3 6 7void decode(char *str){ 8 int i; 9 int len1; 10 len1 = strlen(str); 11 for(i=0;i<len1;i++){ 12 if(str[i] >= 'a' && str[i] <= 'z') 13 str[i] = (str[i] - 'a' + X ) % 26 + 'a'; 14 } 15 for(i=0;i<len1;i++){ 16 if(str[i] >= 'A' && str[i] <= 'Z') 17 str[i] = (str[i] - 'A' + Y ) % 26 + 'A'; 18 } 19 return; 20} 21int main(void) { 22 char str[256]; 23 for( ;NULL != fgets(str, sizeof(str), stdin);) { 24 decode(str); 25 printf("%s",str); 26 } 27 28 29 return 0; 30}

投稿2017/07/25 16:13

mrjohansson0901

総合スコア10

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

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

LouiS0616

2017/07/25 16:21 編集

もうちょっとシンプルになりますよ。 for(i=0;i<len1;i++){ if(str[i] >= 'a' && str[i] <= 'z') { str[i] = (str[i] - 'a' + X ) % 26 + 'a'; } else if(str[i] >= 'A' && str[i] <= 'Z') { str[i] = (str[i] - 'A' + Y ) % 26 + 'A'; } }
mrjohansson0901

2017/07/25 16:35

確かに!! こういうものってやっぱりできるだけ簡潔にしたほうがいいんですよね?
LouiS0616

2017/07/25 16:42

ある程度可読性を残すのも大事ですけどね。このコードはよく書けていると思いますが、XとYという命名がちょっと惜しいなぁって感じです。 ある程度きれいなコードなら、ある程度習熟した人は作文のようにすらすら読めます。 あとは、main関数のfor文はwhile文に置き換えてしまってもいいですし、 int len = strlen(str);って書いちゃってもいいんじゃないですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問