C言語を復習

競技プログラミングが難しいのでC言語を復習する

 

R6.4.23------------------------------------------------------------------------------

・マクロで複数の文を含む場合

#define swap(type, x, y) do { type tmp = x; x = y; y = tmp; } while (0)

R6.4.22------------------------------------------------------------------------------

  scanf("%Lf", &ld); // %Lfはlong doubleのためのフォーマット指定子
    printf("1辺の長さが%Lfの正方形です。\n", sqrtl(ld));

// sqrtlはlong doubleの平方根を計算するための関数

R6.4.20------------------------------------------------------------------------------

・printf("nのアドレス:%p\n", &n);  ポインターのp

・int *isako; int型オブジェクトを指すためのポインターisako

・ポインタpがxを指すとき、 *p は x のエイリアス(別名)

・関数の仮引数

int max_of(int *v, int n){   [ ]でなくポインタで 参照外し

     .........

}

・a      =  &a[0]

・p+i  =  &a[i]   =  a+i  =  &p[i]

・a[2]  =  *(a + 2)  =  p[2]  =   *(p+2)

・char *ptr = "123";  3文字+\n+ポインタの5バイト必要

・char *p="123";

 p="456";    456が作られpが指す、123は掃除できないゴミ

・char *p[ ]={"PAUL", "X", "MAC"};

・struct student {          struct studentという型 studentはタグ

              char name[64];  メンバ

              int    height;

              float  weight;

              long  schols;

};

void hiroko(struct student *std)

{

     if(std->height < 180) std->height=180;   stdが指す構造体のメンバ

}

 

 

R6.4.15------------------------------------------------------------------------------

57 = 111001

2  |  57

2  |  28       1

2  |  14       0

2  |    7       0

2  |    3       1

2 |     1       1 

   0       1

・signed int y;       符号付きint (負と0と正を表現する整数)

・unsigned int z;   符号無しint (0と正を表現する整数)

・char型は、signedunsigned もつかないchar型がある

・短縮名

 short / unsigned short / int / unsigned / long / unsigned long

・printf("long :%ld", long);

・printf("unsigned short :%u", ushort);

・printf("unsigned long :%lu", ulong);

・'C'  '\n' はint型   char型ではない

・ ビットを1にすることを、ビットをセットする

・typedef  A  B; A に Bというあだ名をつける

・int型は高速

sizeof(a) / sizeof(a[0])    配列aの要素数

& :  and  ,   | : or  ,   ^ :exor ,   ~ :1の補数

・ a>>b:aを右にbビットずらす

  論理シフト(左を0で埋める)と算術シフト(左を1で埋める)

1U:unsigned 1

・1L :long 1

・57.3F:float型

013:8進数、 0x12:16進数

・unsigned は、オーバーフローは発生しない。

 最大値+余り

浮動小数点型 1.2345 * 10**9

        ↑仮数   ↑指数

・89.3E-5  89.3*10^-5

・for 分の繰り返し判定には、浮動小数点型は使用しない

・#define   sqr(x)   ((x)*(x))     関数形式マクロ 

 型が異なっても使用可能(関数だと型ごとに作成することに)

 マクロの副作用に注意 sqr(a++)   →    *1  

・#define   puts-alert(str)    (putchar('\a') , puts(str))   ←構文的に一つの式に

・ x = ++i,++j;  

  i も j もインクメントされ、xには j が入力される

enum animal  { Dog, Cat, Monkey, Invalid };  列挙体(整数の集まりに使用)

  ↑ 型名    0  1  2  3

while*2 != EOF)  ←Ctrl + Z

     putchar(ch);

・バッファリング

 完全バッファリング・・・バッファ一杯になるまで

 行バッファリン・・・・・改行まで

 無バッファリング・・・・即座に

・文字は、非負の整数値

・文字'0'と数値0 は別物

・while*3 != EOF){

      if (ch >= '0' && ch <= '9')

          cnt[ch - '0']++

・EOFは、負の値

・拡張表記

 " は \"

 '    は '\''

・8進拡張子   \

・16進拡張子 \x

 ’1’ は 10進数の49、8進拡張表記 '\61'、16進拡張表記 '\x31'

・文字列リテラル "ABC"   ABC\n の4文字

・\n は ナル文字

・文字列リテラルには、性的記憶域期間が与えられる

・printf("文字列%sです。\n" , str);         stringのs

〇 char str[4]="ABC";

〇 char str={'A' ,'B' ,'C' ,'\n'};

〇 char str = "ABC";

×  char s[4]; s = "ABC";

・空文字列 char ns = "";   

・文字列をナルまで書き出す

①while(s[i])

      putchar(s[i++]);

②while(s[i][j])

      putchar(s[i][j++]);

void put_strary(const char s[ ][6] ,int n) { }   省略可

R6.4.11------------------------------------------------------------------------------

・int tensu1[4][3]={{91,81,71},{{91,81,71},{{91,81,71},{{91,81,71}};

・オブジェクト形式マクロ #define NUMBER 7

・関数は一つの値しか返却できない

・関数内で使用する変数は、関数内で宣言

・なるべくreturn文は、一つにする

・while(n-->0)

         tmp *=x;

・関数を利用して、「2重ループ → 1重ループ」見やすくなる

・関数で配列の受取り

int max_of(const int v[ ],int n){変更しない場合は、constを付ける

     .........

}

int main(void){

     int eng[NUMBER]

     max_e=max_of(eng,NUMBER);

}

・線形探索=逐次探索→番兵法で判定を簡略化

 関数に配列渡すときに、 int vx[NUMBER+1];

v[n]=key;    ←番兵を末端に

while(1){

    if(v[i]==key)

        break;

    i++;

}

return (i<n) ? i :FAILED;

シンプル化すると

for ( i = 0 ; v[i] != key ; i++)

    ;

return (i<n) ? i :FAILED;

・int m[ ][3]  ←一番左は省略可。

・スコープ ファイル有効範囲とブロック有効範囲なら、より内側が有効

・自動記憶域期間(はかない命) int ax=0;

・静的記憶域期間(永遠の命)       static int sx; ←自動で0で初期化

         ヘッダー部に書く

R6.4.8-------------------------------------------------------------------------------

・ for(int i = 1; i <= number; i++){
        printf("%dの2乗は%d \n", i, i * i);
    }

・入力が0 or 1まで繰り返す

        do {
            printf("続けますか? Yes:1, No:0\n");
            scanf("%d", &roop);
        } while(roop != 0 && roop != 1); 

・無限ループ

 while(1)

 for(;;)

・変数や関数は、A~Z,a~z,_ の文字から始める

捜査・・・配列要素をひとつづつ順番になぞっていく

・〇 int v[5]={1,2,3,4,5}

 〇 int v={1,2,3,4,5}

 〇 int v[5]={0} 全要素0で初期化

 × v={1,2,3,4,5}はできない!

 〇 a[5]=b[5];

 ×  a = b

・ min = max = tensu[0];

R6.4.6-------------------------------------------------------------------------------

montsh >= 3 && month <= 5 

    左オペランドが0なら、右オペランドは評価は行われない

・montsh >= 3 || month <= 5   

    左オペランドが1なら、右オペランドは評価は行われない

・if(n>0)

       ;          ←空文(何もしない)

&&:かつ      ||:または

単一の式の値による分岐は、switch分が見やすい

・switch分は、break;がないと次のcaseを実行する

・条件演算子 min = a < b ? a : b ;

・do {

        .......

   } while(継続条件)

・表示の使い分け

 printf("%dです",no);

 puts("文字だけ");

 putchar('a');   

'a' :文字定数でint型  "a":文字列リテラル  putchar("a"); はエラー

・do文:後判定繰返し

 while文:前判定繰返し

R6.4.4-------------------------------------------------------------------------------

・%    剰余はintの場合のみ。doubleでは使えない。
・double int 混合の演算では、intはdoubleに変更される

・(no1+no2)/2.0  ←(int+int/double)という意味になる
(double)(no1+no2)/2  キャスト演算子でint→double

・scanf("%lf",&no1);  ←doubleの読み込み

*1:a++)*(a++

*2:ch = getchar(

*3:ch = getchar(

freenove StopWatch.py

次のコードが間違っていた

 

def selectDigit(digit): # Open one of the 7-segment display and close the remaining three, the parameter digit is optional for 1,2,4,8
    GPIO.output(digitPin[0],GPIO.LOW if ((digit&0x08) == 0x08) else GPIO.HIGH)
    GPIO.output(digitPin[1],GPIO.LOW if ((digit&0x04) == 0x04) else GPIO.HIGH)
    GPIO.output(digitPin[2],GPIO.LOW if ((digit&0x02) == 0x02) else GPIO.HIGH)
    GPIO.output(digitPin[3],GPIO.LOW if ((digit&0x01) == 0x01) else GPIO.HIGH)

 LOWとHIGHを入れ替えたら、うまくいった。

7segLEDでやること

7segLEDでやること

①0,1,2と1秒ごとに上がっていく
②ボタンを押すごとに0,1,2と上がっていく
③0,1,2と1秒ごとに上がっていく
 ボタンを押している間、1秒ごとに数字が下がっていく

 

①ミッションクリアー

#光らせるLED
seg_0 = [19, 26, 16, 20, 21, 13]     #「0」を表示
seg_1 = [26, 16]                      #「1」を表示
seg_2 = [19, 26, 20, 21, 6]          #「2」を表示
seg_3 = [19, 26, 16, 20, 6]         #「3」を表示
seg_4 = [26, 16, 13, 6]
seg_5 = [19, 16, 20, 13, 6]
seg_6 = [19, 16, 20, 21, 13, 6]
seg_7 = [19, 26, 16]
seg_8 = [19, 26, 16, 20, 21, 13, 6]
seg_9 = [19, 26, 16, 20, 13, 6]
seg_10 = [19, 26, 16, 21, 13, 6]
seg_11 = [16, 20, 21, 13, 6]
seg_12 = [19, 20, 21, 13]
seg_13 = [26, 16, 20, 21, 6]
seg_14 = [19, 20, 21, 13, 6]
seg_15 = [19, 21, 13, 6]

RaspberryPIのOSをbullseyeにしたら

RaspberryPIのOSをbullseyeにしたら、VNCアイコンが表示された。

(R5.10のOSでは、VNCアイコンが表示されなかった。)

ディスプレイサイズを設定して、RaspberryPIのモニターケーブルを外しても表示できた。(設定しないと、VNCも切れるそうです。)

 

その後、OSのアップデート、日本語表示可能にした。

 

Thonnyは、操作可能だった。

明日から頑張るぞい!