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型は、signed もunsigned もつかない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
・montsh >= 3 || month <= 5
・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の読み込み