不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

paizaラーニング『C言語入門編3: ループ処理を学ぶ (全8回) 』を受講してみた

2021-02-03 23:27:02 | paiza

『C言語入門編3: ループ処理を学ぶ (全8回) 』


メモ

#06:データを読み込んでみよう - 標準入力

  • 標準入力からデータを読み込む - fgets
    例:fgets(buf, sizeof(buf), stdin);
  • 読み込んだデータを変換する - sscanf
    sscanfをつかって、データを変換する
    • 例:sscanf(buf, "%s", str);
      ↑これなんで必要なんだっけ?😟 
      → 改行やスペースを取り除くことができるから
    • 例:sscanf(buf, "%d", &n);
      3つの目の引数には変数の値ではなく、アドレスを渡す。
      → したがって、数値の場合は、変数の前に&を付ける。
      ↑上のstrの場合は配列だからstrがアドレスを意味する。
  • 変換指定
    • %d : int型の整数値
    • %s : 文字列
    • %f : double型の実数値
    • %c : 文字
    • %p : ポインタの値
  • マクロ - #define
    • 例:#define N 10
    • マクロ名は見分けがつきやすいように、大文字を使う
※ 標準入力って、CとC++でだいぶ違っているから面倒くさい😫 
っていうかCが決まりごと多すぎなんだよな😡 

認定証

チャプター8の演習課題では、ちゃんと令和に対応した問題となっていた!😲 


学習ステータス

最強の村人から初級兵士に進化!
でももしかしたら、初級兵士よりも最強の村人の方が強いかもしれない😁 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

paizaラーニング『C言語入門編2: 条件によって処理を変えてみよう (全6回) 』を受講してみた

2021-02-03 23:27:02 | paiza

『C言語入門編2: 条件によって処理を変えてみよう (全6回) 』


メモ

  • 現在の日付や時刻を取得する(#06)
    C言語関数辞典 - C言語Tips集 現在の日付や時刻を取得する
    http://www.c-tipsref.com/tips/time/time.html
  • 現在の西暦の取得(#06)
    • #include <time.h>
      time_t timer = time(NULL);
      int seireki = localtime(&timer) -> tm_year + 1900;
  • 西暦年/平成年の計算方法(#06)
    • 平成年から西暦年を求めるには、平成年に「1988」を足す
    • 西暦年から平成年を求めるには、西暦年から「1988」を引く
  • 西暦年/昭和年の計算方法(#06)
    • 昭和年から西暦年を求めるには、昭和年に「1925」を足す
    • 西暦年から昭和年を求めるには、西暦年から「1925」を引く

認定証



学習ステータス

勇敢なだけが取り柄の村人から、斧により最強になった村人に昇格!


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

paizaラーニング『C言語入門編1:プログラミングを学ぶ (全9回) 』を受講してみた

2021-02-03 12:57:29 | paiza
ちょっと初心に戻って、C言語を学んでみよう。
ということで、『C言語入門編 (全9レッスン) 』をやっていく。

とはいっても、既にレッスン1は以前受けていたらしく、
演習課題も含め、全て完了しているようなので、
再学習となる。

その際かどうか忘れてしまったが、C言語のコンパイル環境の構築は多分以前やっていると思われ、
インストールされているgccのversionは次のようになっている。

$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

あるいは、Ubuntuってデフォルト設定でgcc入ってたっけか?

エディタもおそらくVSCodeで設定してたと思うから、
とりあえず、このまま始めてみよう。

学習済みなのので、気になったところのみメモ

  • Cの特徴(#01)
    • 1970年代に登場
    • オブジェクト指向なし
    • ライブラリが充実していない
  • ランダム(#06)
    • #include <stdlib.h>
    • #include <time.h>
    • srand((unsigned int)time(NULL));
    • int number = rand() % 100 + 1;
  • フォーマット指定子一覧(#09)
    http://www.k-cube.co.jp/wakaba/server/format.html

認定証


学習ステータス

多分、村人から勇敢な村人にランクアップしたんだろうな。


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

paizaラーニング『情報処理入門 アセンブラ言語編04: アセンブラ言語でプログラムを作ろう (全10回) 』を受講してみた

2021-02-03 12:57:29 | paiza

『情報処理入門 アセンブラ言語編04: アセンブラ言語でプログラムを作ろう (全10回) 』


アセンブラ言語もこれで最後のレッスンかぁ。
たぶん今後自分でプログラミングすることはないだろうけど、
なんとなくエッセンスはわかったような気がする。

大学で理系(理学部?情報科学部?)を卒業した人たちは、
このようなことを学んできたのかな?
同じプログラミング言語習得するのにも、
そりゃ差がつくだろう、ってことを改めて痛感したな😣 

いっちょ気合い入れて、最後のレッスンに臨むとするか😤 

#01:文字コードを理解しよう

  • 文字コードとは:
    コンピュータで文字を扱うため、1文字ごとにあたえた識別番号
    • 「1」 ⇒ 0011 0001、#31=49
    • 「A」 ⇒ 0100 0001、#41=65
  • 共通の文字コード
    - 多くのコンピュータやソフトウェアは、共通の文字コード表を使う
    - いくつかの種類がある
    • - どの言語のどの文字を収録するか
    • - どのように識別番号を割り当てるか
  • 代表的な文字コード
    • ASCII:
      - 英数字や記号
      - 改行などの制御文字
      - 7ビットであらわす
    • JIS X 0201:ASCIIを8ビットに拡張
      - ASCIIを8ビットに拡張・修正
      - 8ビット領域にカタカナと句読点や濁点・半濁点を追加
      - 「\」(バックスラッシュ)を「¥」(エンマーク)に、
      - 「~」(チルダ)を、「‾」(オーバーライン)に置き換え
      - CASLⅡとCOMETⅡで利用
    • 1バイト文字 > 最大8ビット = 1バイトで表現できる文字コード
      - 最大256文字
      - 漢字が使えない
      - ASCII, JIS X 0201
    • マルチバイト文字 > 漢字や多言語をあつかう
      - UTF-8、UTF-16

#02:スタックポインタの役割を理解しよう

  • スタックとは
    スタック(Stack):データを一時的に退避させる仕組み
    - 入ってきた順番に、積み重ねる
    - 取り出すときは、最後に入れたものから取り出す
    - 後から入れたものを先に出す(LIFO: Last In First Out)、
      先に入れたものを後から出す(FILO: First In Last Out)
  • スタックの基本操作
    - Push:スタックにデータを入れる
    - Pop :スタックからデータを取り出す
  • スタックの用途
    - レジスタ値の一時保存
    - サブルーチンの呼び出し
  • スタックポインタ(SP)とは
    スタックを実現するためのレジスタ
    - 16ビットで、メモリアドレスを保持する
    - メモリに、スタック領域を確保しておく
  • スタックポインタの動作
    最初に、スタックポインタは、スタック領域の最終アドレスの「+1」を保持
    - データをPush:
    スタックポインタの値を「-1」
    現在のスタックポインタのアドレスにデータを格納
    - データをPop:
    現在のスタックポインタのアドレスからデータを取り出す
      スタックポインタの値を「+1」
  • COMETⅡのスタック命令
    - PUSH/POP:スタックに値を出し入れする機械語命令。
    - CALL/RET:サブルーチンを呼び出す、サブルーチンから戻るための機械語命令
    - RPUSH/RPOP:GR1 - GR7の値をスタックに出し入れするマクロ命令。GR0は格納できない。

#03:スタックに値を保存してみよう

  • PUSH命令:スタックに値を入れる
    - レジスタの値だけをスタックに積む: PUSH 0, GR1
    - 指定の値をスタックに積む: PUSH #FF
    - ラベルの値をスタックに積む: PUSH DATA
    ※保存できるレジスタは、GR1 - GR7、GR0は格納できない。
命令書き方命令の説明
命令コードオペランド
プッシュ
PUSH
PUSHr,adr[, x]SP←(SP) -L 1,
(SP)←実効アドレス
  • POP命令:スタックからデータを取り出す
    ※格納できるレジスタは、GR0からGR7
命令書き方命令の説明
命令コードオペランド
ポップ
POP
POPrr←(SP)
SP←(SP) -L 1,

#04:サブルーチンとスタックの関係を理解しよう

  • サブルーチンとは
    • 他のプログラムから呼び出す共通のコード
      - CALL命令でサブルーチンを呼び出し
      - サブルーチンにRET命令があると、呼び出し側に戻る
      - CALL命令の次のコードから処理を再開する
    • RubyやPython・Javaなどの関数・メソッドとの違い
      - 引数やローカル変数はない
      - 必要なデータがあれば、レジスタを退避する
  • サブルーチンとスタックの関係
    • マシン語のプログラム
      - プログラムレジスタのコードを実行する
      - 分岐命令があると、プログラムレジスタの値を書き換える
    • CALL命令でサブルーチンを呼び出し
      - 現在のプログラムレジスタの値を、スタックにプッシュする
      - プログラムレジスタの値を、サブルーチンのアドレスに書き換える
    • RET命令でサブルーチンから復帰
      - スタックのアドレスをプログラムレジスタに読み込む

#05:サブルーチンを呼び出そう

  • CALL命令:指定のサブルーチンを呼び出す
命令書き方命令の説明
命令コードオペランド
コール
CALL subroutine
CALLadr[, x]SP←(SP) -L 1,
(SP)←(PR)
PR←実効アドレス
  • RET命令:呼び出し元に戻る
命令書き方命令の説明
命令コードオペランド
リターン
RETurn from
subroutine
RET
PR←((SP))
SP←(SP) +L 1

#06:スタックにレジスタの値を保存しよう

  • RPUSH命令:レジスタの値をまとめてスタックに入れるマクロ命令
    • GR1からGR7の値を、この順番でスタックにPUSHする
命令書き方命令の説明
命令コードオペランド
レジスタプッシュ
Register PUSH
RPUSH

  • RPOP命令:スタックの値をまとめてレジスタに取り出すマクロ命令
    • GR7からGR1の値を、この順番でスタックからPOPする
命令書き方命令の説明
命令コードオペランド
レジスタポップ
Register POP
RPOP

  • RPUSH命令とRPOP命令の役割
    • サブルーチンを呼び出し
      - プログラムレジスタの値をスタックに格納
      - 戻り先のアドレスを一時退避
    • サブルーチンは、レジスタの値は退避しない
      - サブルーチンの作業用にレジスタを使う
      - レジスタの値が変わってしまう
    • RPUSHで、GR1からGR7の値を一時退避 > RPOPで復帰
      - 元の処理に戻ったとき、レジスタの値をそのまま使える
      - GR0で、サブルーチンの処理結果を受け取る

#07:掛け算プログラムを作ろう - その1

  • 掛け算の求め方
    • 掛け算は、足し算の繰り返し
      10進数:3 x 4 > 3 + 3 + 3 + 3
       2進数:11 x 100    >   11 + 11 + 11 + 11
  • 足し算の繰り返しで、掛け算する手順
    1. 計算結果を初期化
    2. 掛けられる数を用意する
    3. 掛ける数を用意する

    4. 計算結果に、掛けられる数を足す
    5. 掛ける数を1減らす
    6. ゼロでなかったら、4にもどる

    7. 終了

#08:掛け算プログラムを実行しよう - その1

  • 先程作ったプログラムを実行する
  • リテラル表記
    数値の前に「=」を書くと、CASLⅡがDC命令を自動的に生成します。そして、この数値をデータ領域に配置します。リテラル表記で記述したコードでは、そのアドレスからデータを読み込みます。
  • サブルーチンのデータ領域
    データ領域は、メインルーチンとサブルーチンで、それぞれ記述します。CASLⅡでは、自分のコードのデータ領域だけアクセスできます。つまり、メインルーチンで、DATA1やDATA2にアクセスできますが、サブルーチンからDATA1にアクセスできません。このおかげで、ルーチンでラベル名が重複できます。

#09:掛け算プログラムを作ろう - その2

  • シフトで掛け算する手順
    1. 計算結果を初期化
    2. 掛けられる数を用意する
    3. 掛ける数を用意する

    4. 掛ける数の最下位ビットが「1」か調べる
    5. 「0」だったら、7にジャンプ

    6. 計算結果に、掛けられる数を足す

    7. 掛けられる数を1ビット左にシフトする
    8. 掛ける数を1ビット右にシフトする

    9. ゼロでなかったら、4にもどる

    10. 終了

#10:掛け算プログラムを実行しよう - その2

  • Chap09で作ったプログラムを実行する

認定証

全10レッスンあるはずだが、レッスン8を終えたところで、認定証を取得
おそらくレッスン9と10は補講で後から追加されたのだろう
→ レッスン9と10は演習課題がないから、最後の演習課題のある8で認定証が授与されるようになってるんだな😲 


シフト演算で掛け算を計算するのは、結構高度な内容だな😫 

学習ステータス

若手から一気に?一流吟遊詩人にランクアップ!?

楽器もギターから竪琴に変化した!😁 
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする