プログラミング入門I
1月20日の提出状況

Back to index page



  1. 目次

  2. 前回の確認テストについて

    1

    タイムプレッシャーがかかるテストでは相変わらずエラーになるものの提出が多いですね.以下のように7人出てきました.基本の基本が分かっていないためにエラーになっている人がほとんどで,やはりそれも実力の表れかと思います.

    実行時エラー: b2407 b2428 b2430 b2432 b2446 b2456 b2459

    前回の課題?: b2457

    演習問題の提出: b2446

    以下は例によって問題のあるプログラムの例です.参考にしてください.

    st = (shimane university)
    

    上のような文字列を引用符 ' ' でくくって定義するという基本を知らない人が数名いました.未定義の変数を使用すると当然エラーになります.

    print('Original:', st)
    print('Sorted: ',''.join(sorted(st)))
    

    勝手に出力表現を変えない!

    st1 = 'shimane'
    st2 = 'university'
    

    2つのオブジェクトに分ける必要は無いですね.後でも出てくるのですが,スペースを含んだ文字列のソートを行うのが今回の課題です.問題文の出力例をよく見てほしいのですが,ソートされたものは先頭にスペースが入っていますね.文字コードではスペースは 32 なので,アルファベットより前です.

    original_string = "shimane university"
    
    sorted_string = ''.join(sorted(original_string))
    
    reversed_string = ''.join(sorted(original_string, reverse=True))
    

    逆順表示は必要ないですが?

    s = 'shimane university'
    
    char_list = []
    for char in s:
        if char != ' ':
            char_list.append(char)
    
    sorted_s = ''.join(sorted(char_list))
    

    今回学習した内容をまったく無視していますね.

    print(f'Name:  shimane university')
    st =sorted('shimane university')
    print(f"Sort:  {''.join(st)}")
    

    このパターンも結構見られました.なぜ文字列 st を使いまわししないのでしょうか?

    name = 'shimaneuniversity'
    
    print(f'Name: shimane university')
    
    print(f'Sort:', '' .join(sorted (name)))
    

    なぜスペースを抜いた文字列を作るのでしょうかねえ.その結果,下のようにソートしても先頭にスペースが来ません.

    Name: shimane university
    Sort: aeehiiimnnrsstuvy
    

    print(f'Name:  {st}')
    print(f'Sort:',''.join(sorted(st)))
    

    上の print 文のコロン : の後に余分にスペースが入っているので,下のように先頭が揃って表示されます.

    Name:  shimane university
    Sort:  aeehiiimnnrsstuvy
    

    print('Name:  shimane university')
    print('Sort:   sort(shimaneuniversity)')
    

    文字列のソートが分かっていないので,結局下のようになりますよね.

    Name:  shimane university
    Sort:   sort(shimaneuniversity)
    

    print('Name: shimane university')
    print(f'Sort:  {''.join(sorted('shimaneuniversity'))}')
    

    何度も同じ文字を入力しなくても済むように文字列を値に持つ変数(オブジェクト)を作るのが今回のポイントでしたが.

    filtered_string = input_string.replace(" ", "")  
    

    sorted_name = ''.join(sorted(name.replace(" ", "")))
    

    上の2つの例のように replace を使ってスペースを除去している人がそこそこいました.スペースも含めてのソートなのに.

    print(f'Sort:' ''.join(sorted(name)))
    

    これはやっかいな間違いですね.print のカッコの中の一つ目の f 文字列と2つ目のソートされた文字列の間にカンマがありません.カンマがあると2つのオブジェクトを出力するのですが,カンマがないと大変ややこしい動作になります.結果としては下のように表示されるのですが,何をやっているかというと,まず Sort: を出力して次にソートした結果の a が出力されます.そして,また Sort: が出力され他後に次にソートされた e が来るという順番に総当たりで出力されるという動作です.ややこしいですね.

    Sort:aSort:eSort:eSort:hSort:iSort:iSort:iSort:mSort:nSort:nSort:rSort:sSort:sSort:tSort:uSort:vSort:y
    

  3. 前回の宿題について

    今回は提出数が少なかったのが驚きです.今回提出が無かったために総合得点が合格基準を満足しないことになり不可となった学生さんが複数人います.残念です.

    以下は例によって問題のあるプログラムの例です.今後の参考にしてください.

    start_num = 1330
    

    今回もなぜか最初の数値を乱数でなく決め打ちしている人がいました.不思議です.

    for _ in range(100):
        num1 = ''.join(sorted(st))
        rt = int(num1)
    
        num1_re = ''.join(sorted(st, reverse = True))
        rt_re = int(num1_re)
    
        after = rt_re - rt
    
        print(f'{rt_re} - {rt} = {after}')
    
        if after == before:
            break
        else:
            before = 0
            before += after
            st = str(after)
     
    else:
        print()
    

    上のように for 文で作っている人が数人いました.繰り返す回数が決まっていない処理は while 文が原則ですし,その方が簡単に書けます.解答例を参考にして,今後は使い方をマスターしてください.

    num1 = int(''.join(sorted(st,reverse = True)))
    num2 = int(''.join(sorted(st)))
    num3 = num1 - num2
    while n != num3:
        print(f'{num1:4} -{num2:5} ={num3:5}')
        n = num3
        st = str(n)
        num1 = int(''.join(sorted(st,reverse = True)))
        num2 = int(''.join(sorted(st)))
        num3 = num1 - num2
    else:
        print(f'{num1:4} -{num2:5} ={num3:5}')
    

    while 文の中で行う並べ替え処理を1回だけループの前で行っています.無駄な処理です.

    print(f" {descending} - {ascending} = {num}")
    

    最後まで表示する文字数の幅をそろえて綺麗に見せることができない人がいました.それも複数です.結果の表示を見やすくすることは重要ですので,ちゃんとそこも意識してください.

    Start from 3529
     9532 - 2359 = 7173
     7731 - 1377 = 6354
     6543 - 3456 = 3087
     8730 - 378 = 8352
     8532 - 2358 = 6174
     7641 - 1467 = 6174
    

    print(f'{n2:4}-{n3:5}={n4:5}')
    

    上の例は桁数の指定はしているのですが,演算記号との間隔のところで下のように変なことになってしまっています.そこも注意しましょう.

    Start from 1335
    5331- 1335= 3996
    9963- 3699= 6264
    6642- 2466= 4176
    7641- 1467= 6174
    7641- 1467= 6174
    

    while base!=random:
        num1=sorted([int(digit) for digit in str(random)])
        num1_a=int(''.join(map(str,num1)))
        num2=sorted([int(digit) for digit in str(random)],reverse=True)
        num2_a=int(''.join(map(str,num2)))
        num3=num2_a-num1_a
        print(f'{num2_a}-{num1_a}={num3}')
        if num3==random:
            random=base
        else:
            num3=random
        a+=1
        if a==5:
            break
    

    訳の分からない処理をしていますが,結局は5回実行したら終わるというもので,下のように意味のないことをやっています.

    Start from 6115
    6511-1156=5355
    6511-1156=5355
    6511-1156=5355
    6511-1156=5355
    6511-1156=5355
    


目次ページに戻る