2017-01-26 11 views
-1

私の高校のクラスでは、私はキーワード暗号を作成するタスクを割り当てられています。しかし、私はPythonのビジュアライザーを介してそれを実行するときに私はそれが間違って何を見ていない。私はPythonはいくつかの単語を文字列に残しています

は、あなたの文章を入力し、次の入力でそれを実行すると

n = 0 
l = 0 
string = "" 
message = input("enter your sentence: ") 
message = (message.lower()) 
keyword = input("enter keyword: ") 
keyword = (keyword.lower()) 
listkw = list(keyword) 
def change(message,listkw,n,string,l): 
    try: 
     for letter in message: 
      if letter == " ": 
       string += " " 
      else: 
       temp = listkw[n] 
       mtemp = ord(letter) 
       mtemp -= 96 
       ktemp = ord(temp) 
       ktemp -= 96 
       letterans = mtemp+ktemp 
       if letterans >= 27: 
        letterans -= 26 
       letterans += 96 
       ans = chr(letterans) 
       string += ans 
       print (string) 
       n+=1 
       message = message[l:] 
       l+=1 
    except IndexError: 
     n= 0 
     change(message,listkw,n,string,l) 
change(message,listkw,n,string,l) 
print (string) 

:ここ

は、これまでの私のコードであるので、GCSEそれは jrfubwbsnllkbqを印刷する必要があります

:computingisfun は、キーワードを入力してくださいアルファベットで各文字が追加され、その文字が印刷されます。例えば

change('a', list('b'), 0, "", 0) 

プリントアウトc = 1、B = 2、A + B = 3であるために((C)である)

しかしである、jrfupqznをプリントアウト私が期待したことは全くありません。

+5

入力内容は何ですか?期待される成果は?代わりにあなたの出力は何ですか?あなたの質問に[mcve]を含めるように編集してください。 –

+0

あなたはそれを反復している間に 'message'の値を変更することをお勧めしません。 IndexErrorsを捕まえて何か問題が起こった場合には、もう一度関数を実行することをお勧めします。 – Kevin

答えて

0

私はあなたが、あなたがより良い経験とやる必要以上に記述するコードのいくつかの部分を置き換えるよう、あなたが高校にいることを理解;)すべての

まず、あなたはそれがないことを知っている必要があります条件を追加してnの値を再初期化すると例外が発生するので、例外に基づいてプログラミングすることをお勧めします。その後n = n + 1 if n + 1 < len(listkw) else 0

は、あなたが変数のスコープで少し問題を抱えている、あなたは、あなたのスクリプトの先頭にstring = ""を設定するが、関数を呼び出すときstring内部関数が大きく異なる範囲を持っているときにエンドあなたにあなたprint(string)だから

あなたが関数のスコープ内で定義し、最終的に所望の値(計算(暗号)の文字列)を返した場合、それは良いでしょうstring空の文字列値を持っているので、あなたがnのような関数に使用する値、lとコードは次のようなものです:

読むと、あなたの必要なデータを初期化:

message = input("enter your sentence: ").lower() 
keyword = input("enter keyword: ").lower() 
listkw = list(keyword) 

は、あなたの関数を定義します。

def change(message,listkw): 
    n = l = 0 
    string = "" 
    for letter in message: 
     if letter == " ": 
      string += " " 
     else: 
      temp = listkw[n] 
      mtemp = ord(letter) - 96 
      ktemp = ord(temp) - 96 
      letterans = mtemp + ktemp 
      if letterans >= 27: 
       letterans -= 26 
      letterans += 96 
      string += chr(letterans) 
      message = message[l:] 
      l+=1 
      n = n + 1 if n + 1 < len(listkw) else 0 
    return string 

コールと同時に、戻り値を印刷;)

print(change(message,listkw)) 
+0

いくつかの言語では、それは良い考えではありませんが、Pythonで例外を使用するのはまったく問題ありません。 (OPの使用法はここで少し疑わしいですが) –

+0

@WayneWernerええ!もちろん、例外を使用するのは良い練習です。つまり、予想されるワークフローとデータを使用してフローを制御し、IndexErrorを待ってから関数を再度呼び出す方が良い方法です。接続の切断、タイムアウト例外などの実際のエラーを管理するために例外を追加しますが、自然なワークフローとは異なります –

0

をあなたはかなり持っていますここでやっていることにいくつかの問題があります。再帰、反復、例外を束ねての束に入れているのですが、はありません。

あなたは何をすべきかについていくつかのアイデアを持っていて、1つのトラックを開始して別のトラックに移動するように変更したと思います。あなたが初心者であるという事実を考えると、それは驚くべきことではありません。しかし、は一貫してとすることをお勧めします。また、再帰、反復、スライシング、または例外を使用してこれを実行できます。しかし、あなたがそれをやっている理由を理解せずにそれらをすべて組み合わせることは問題です。

デザイン

実際にしようとしていることにアプリケーションを巻き戻しましょう。コードを書くことなく、あなたが取っているステップをどのように記述しますか?

メッセージ内のすべての文字の場合:これは私が言うものです

  • キーワードから次の文字を取る手紙がbeyond Z(ebra)であれば2つの文字
  • の数値を組み合わせてAで始まり、カウントを続ける
  • キーワードの最後の文字に到達すると、先頭に戻る

これは私たちにどのようにと書くことができるかのヒントを与える。確かに最も単純な方法ですが、あなたが部分的にやっている方法です。

の反復

ここで別のポインタです - ではなく、動的問題での起動よりも、のは、それはかなり静的作ってみましょう:

message = 'computing is awesome' 

for letter in message: 
    print(letter) 

あなたは、これはメッセージ出力していることがわかります - 1行につき1つの文字が。すばらしいです!問題の最初の部分が完了しました。次のステップはキーから文字を取り出すことです。さて、そこに鍵を入れましょう。しかし、一度に2つの文字列をどのように反復するのですか?私たちがpython iterate over two sequencesのためにgoogleを検索すると、私の最初の結果はHow can I iterate through two lists in parallel?でした。悪くない。便利なダンディzipの機能について教えてください。あなたがそれについて学ぶ場合は、python3 zipを検索するか、>>> help(zip)をあなたのREPLで実行するだけです。今

message = 'computing is awesome' 
keyword = 'gcse' 

for letter, key in zip(message, keyword): 
    print(letter, key) 

我々はこれを実行する場合...ああ、ええと:

だから、ここで私たちのコードです!

c g 
o c 
m s 
p e 

残りの文字列はどこですか?私たちが最短の文字列の終わりに達すると、それは止まります。私たちはジッパーのヘルプを見れば、我々は以下を参照してください。引数の順序で最短のiterableが

を使い果たすまで

が続くので、それだけで最短のものまで行くことになるだろう。まあ、それはバマーです。つまり、キーとメッセージの長さを同じにする必要があります。それとも?私たちの鍵がより長い場合は、メッセージよりもでしょうか?うまくいけば、今ではあなたはこのような何かを行うことができますことを知っている:

>>> 'ab'*10 
'abababababababababab' 

私達は私達のキーは動作します私たちのメッセージ、と少なくとも同じ長さであることを確認してください。だから、私たちはメッセージの中の文字の数を鍵の倍数だけ増やすことができます。私たちが必要とする以上にの方法を持っていますが、それはうまくいくはずですか?試してみましょう:

message = 'computing is awesome' 
keyword = 'gcse'*len(message) 

for letter, key in zip(message, keyword): 
    print(letter, key) 

Sweet!出来た!

だから今ちょうどord値を追加してみましょうと我々は何を得る見てみましょう:

for letter, key in zip(message, keyword): 
    print(chr(ord(letter)+ord(key))) 

をああ...親愛なります。 ASCII文字ではありません。すでに分かっているように、それぞれから96を引く必要があります。数学のおかげで判明したように、すでに得られた合計から96 * 2を引くことができます。

for letter, key in zip(message, keyword): 
    if letter == ' ': 
     print() 
    else: 
     new_code = (ord(letter)+ord(key)-96*2) 
     print(chr(new_code+96)) 

ただし、まだアルファベット以外の文字があります。だから、その価値を取り戻すには、

for letter, key in zip(message, keyword): 
    if letter == ' ': 
     print() 
    else: 
     new_code = (ord(letter)+ord(key)-96*2) 
     if new_code > 26: 
      new_code -= 26 
     print(chr(new_code+96)) 

これでいいですね。私たちが残している唯一のことは、私たちのメッセージをプリントアウトする代わりに文字列に組み合わせて、このコードを関数に貼り付けることです。そして、ユーザーから私たちの入力を得る。

def change(message, keyword): 
    if len(keyword) < len(message): 
     keyword = keyword * len(message) 
    result = '' 
    for letter, key in zip(message, keyword): 
     if letter == ' ': 
      result += ' ' 
     else: 
      new_code = (ord(letter)+ord(key)-96*2) 
      if new_code > 26: 
       new_code -= 26 
      result += chr(new_code+96) 
    return result 

message = input('enter your sentence: ') 
keyword = input('enter your keyword: ') 
print(change(message, keyword)) 

再帰

だから我々はそれが反復を使用して作業を持っている:我々はまた、関数に当社の主要長増加コードを固執するつもりです。再帰はどうですか?あなたはであり、あなたの解決策で再帰を使用しているのは確かにです。さて、始めに戻って、手紙による手紙を印刷する方法を考えてみましょう。

message = 'computing is awesome' 

def change(message): 
    if not message: 
     return 
    print(message[0]) 
    change(message[1:]) 

change(message) 

これは機能します。ここでキーを追加します。実際には前と同じことをすることができます。ただ乗算するだけです。

def change(message, keyword): 
    if not message: 
     return 

    if len(keyword) < len(message): 
     keyword = keyword*len(message) 

    print(message[0], keyword[0]) 
    change(message[1:], keyword[1:]) 

これは驚くほど単純です。今度は、変換された値をプリントアウトしてみましょう:

def change(message, keyword): 
    if not message: 
     return 
    if len(keyword) < len(message): 
     keyword = keyword*len(message) 
    new_code = (ord(message[0])+ord(keyword[0])-96*2) 
    if new_code > 26: 
     new_code -= 26 
    print(chr(new_code+96)) 
    change(message[1:], keyword[1:]) 

は再び我々はスペース文字を処理する必要があります。

def change(message, keyword): 
    if not message: 
     return 

    if len(keyword) < len(message): 
     keyword = keyword*len(message) 

    if message[0] == ' ': 
     print() 
    else: 
     new_code = (ord(message[0])+ord(keyword[0])-96*2) 
     if new_code > 26: 
      new_code -= 26 
     print(chr(new_code+96)) 
    change(message[1:], keyword[1:]) 

は今残っている唯一のことは、結果を組み合わせることです。再帰では、通常、前後の値のいくつかの種類を渡し、我々は我々の結果とそれをやろうとしている:私たちは、再帰的なアプローチでは、いくつかのスライスを使用

をスライス

def change(message, keyword, result=''): 
    if not message: 
     return result 

    if len(keyword) < len(message): 
     keyword = keyword*len(message) 

    if message[0] == ' ': 
     result += ' ' 
    else: 
     new_code = (ord(message[0])+ord(keyword[0])-96*2) 
     if new_code > 26: 
      new_code -= 26 
     result += chr(new_code+96) 
    return change(message[1:], keyword[1:], result) 

print(change(message, keyword)) 

。私たちは、文字列の一部を切り取るのではなく、インデックスを渡すことさえできました。しかし、今我々はスライスし、ダイスするつもりです。

はデフ変更(メッセージ、キーワード):それは私たちの再帰的なソリューションにかなり似ているようになるだろうlenの場合 (キーワード)< LEN(メッセージ): キーワード=キーワード* LEN(メッセージ)

while message: 
    print(message[0], keyword[0]) 
    message = message[1:] 
    keyword = keyword[1:] 

あなたはそれはあなたが私たちの再帰的な溶液からのコードに置くことができることを実現するためのストレッチの多くすべきではない、ということを参照してください。

while message: 
    if message[0] == ' ': 
     print() 
    else: 
     new_code = (ord(message[0])+ord(keyword[0])-96*2) 
     if new_code > 26: 
      new_code -= 26 
     print(chr(new_code+96)) 
    message = message[1:] 
    keyword = keyword[1:] 

そして、我々はただ、結果に文字を組み合わせる:

def change(message, keyword): 
    if len(keyword) < len(message): 
     keyword = keyword*len(message) 

    result = '' 
    while message: 
     if message[0] == ' ': 
      result += ' ' 
     else: 
      new_code = (ord(message[0])+ord(keyword[0])-96*2) 
      if new_code > 26: 
       new_code -= 26 
      result += chr(new_code+96) 
     message = message[1:] 
     keyword = keyword[1:] 
    return result 

さらに読書

あなたは、いくつかのよりよいことを行うことができます。私たちが鍵で行った愚かな乗算よりも、itertools.cycleはどうですか?

減算の代わりにモジュロ除算を使用するとどうなりますか?

関連する問題