基礎プログラミングおよび演習 第9回 担当:長谷川晶一@5階522/520.

Slides:



Advertisements
Similar presentations
University of Electro-Communications Human Interface section 基礎プログラミングおよび演 習 第7回.
Advertisements

第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
問題提起その 1 一文字ずつ文字(数字)を読み込み、それぞれの文字が何回入力されたかを数えて出力するプログラム。
第2回ネットワークプログラミング 中村 修.
基礎プログラミングおよび演習 第8回.
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング論 II 電卓,逆ポーランド記法電卓
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング応用 printfと変数.
プログラミング論 II 2008年10月30日 文字列
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング序論 2. n人のインディアン.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第10章 これはかなり大変な事項!! ~ポインタ~
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
基礎プログラミングおよび演習 第3回
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
2013年度 プログラミングⅡ ~ 計算してみよう ~.
2015年度 プログラミングⅡ ~ 計算してみよう ~.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
プログラミング序論演習.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
プログラミング序論演習.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
情報処理Ⅱ 2006年11月24日(金).
標準入出力、変数、演算子、エスケープシーケンス
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング論 文字列
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第9回(後半第3回) 課題の回答
C言語講座 四則演算  if ,  switch 制御文.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

基礎プログラミングおよび演習 第9回 担当:長谷川晶一@5階522/520

文字と文字列

変数の型とメモリ上でのサイズ 変数の型をもういくつか int (整数)と double (実数) 以外: char (整数) short(整数) long(整数)と float(実数) たくさんの数を表すにはたくさんのメモリが必要 同じ整数でも表せる数の範囲が違う

変数の型とメモリ上でのサイズ 整数の型 実数の型 型名 範囲 メモリ使用量 char -127~+128 1byte(8bit) short int, long -32768~+32767 -2147483648~+2147483647 2byte(16bit) 4byte(32bit) (16bit CPUの場合、 int は short と同じになります) 型名 範囲(float.hにあります) メモリ使用量 float -3.402823466×1038~ +3.402823466×1038 1byte(8bit) double -1.7976931348623158×10308~ +1.7976931348623158×10308 4byte(32bit) 8byte(64bit)

文字列 文字列は、実は char 型整数の配列です 中身は文字コード 長さが、文字数+1個の配列になります。 ”abc”[0] == ’a’ ”abc”[1] == ’b’ ”abc”[2] == ’c’ ”abc”[3] == 0 長さが、文字数+1個の配列になります。 なので こんな事も #include <stdio.h> int main(){ printf(”’%c’ : %d\n”, ”abc”[0], ”abc”[0]); printf(”’%c’ : %d\n”, ”abc”[1], ”abc”[1]); printf(”’%c’ : %d\n”, ”abc”[2], ”abc”[2]); printf(”’%c’ : %d\n”, ”abc”[3], ”abc”[3]); } 'a' : 97 'b' : 98 'c' : 99 ' ' : 0 文字列の終わりには、0が入ってる。 #include <stdio.h> int main(){ char str[4]; str[0]=’a’; str[1]=’b’; str[2]=’c’; str[3]=0; printf(str); } abc

配列の面倒 配列は代入できません 初期化だけはできます。 代入はだめ 関数の引数にできません 関数の戻り値にできません  では、printf()はどうやってるの? ⇒ 最後の方の授業でお話します。 初期化だけはできます。 初期化:宣言と同時の代入 int func1(char s[4]){ printf(s); } char func2[4](){ int main(){ char str[4]; str = ”abc”; #include <stdio.h> int main(){ char str1[5] = "abcd"; printf(str1); char str2[5] = {'a', 'b', 'c', 'd', 0} ; printf(str2);   double array[2] = {10.0, 1.25}; } int main(){ char str1[5]; str1 = "abcd"; } 代入はだめ

文字列の編集 文字列は配列なので、一つ一つを書き換えると、文字列を書き換えられる 例:小文字から大文字へ 例:2文字の文字列に #include <stdio.h> int main(){ int c; char str[5] = "abcd"; for(c=0; str[c]; ++c){ str[c] = str[c]+(’A’-’a’); } printf(str); #include <stdio.h> int main(){ int c; char str[5] = "abcd"; str[2] = 0; printf(str); } 文字列の配列は最後に0が入っている 最後の0でforを抜ける

文字列の編集 キーボードから文字列を入力 str[end-1] まで文字が詰ってる getchar() で文字入力 改行文字なら終了 printf() で表示 #include "curses_subset.h" int main(){ cbreak(); noecho(); clear(); char str[200]; int end = 0; while(1){ int ch = getchar(); if (ch=='\n'){ break; }else if (ch >= ' '){ str[end] = ch; end ++; } str[end] = 0; clear(); printf(str); cbreak(); noecho(); edit.c

課題15 文字列の編集 ^ キーが入力されたとき、 最後の文字を1文字削除するような文字列編集 プログラムを作ってください。 課題15 文字列の編集 ^ キーが入力されたとき、 最後の文字を1文字削除するような文字列編集 プログラムを作ってください。 余裕があれば、ラインエディタを作ってみてください: ←キーでカーソル1文字左 →キーでカーソル1文字右 カーソル位置に文字を挿入 BSで、カーソル前の文字を削除 Delで、カーソル位置の文字を削除

変数のメモリ上での表現 メモリの最小単位は bit(ビット)。 1bit は 0 か 1を記憶できるメモリ。 Bitが8個集まると byte (バイト)になる。 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 : 11111110 11111111 全部で、28 =256個のパターンがある。 ⇒ 256種類の値を記憶できる

整数とビット Bitが8個集まると byte になる。 27 =128個 各パターンに左のように 数値を割り当てている 27 =128個 00000000 00000001 00000010 : 01111110 01111111 10000000 10000001 10000010 10000011 11111110 11111111 1 2 : 126 127 -128 -127 -126 -125 -2 -1 27 =128個 各パターンに左のように 数値を割り当てている 27 =128個

ビットと2進数 00000000 : 0×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 0×21 + 0×20 = 0 00000001 : 0×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 0×21 + 1×20 = 1 00000010 : 0×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 0×20 = 2 00000011 : 0×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 1×20 = 3 : 01111110 : 0×27 + 1×26 + 1×25 + 1×24+ 1×23+ 1×22 + 1×21 + 0×20 =126 01111111 : 0×27 + 1×26 + 1×25 + 1×24+ 1×23+ 1×22 + 1×21 + 0×20 =127 10000000 : 1×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 1×20 – 256=-128 10000001 : 1×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 1×20 – 256=-127 10000010 : 1×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 1×20 – 256=-126 10000011 : 1×27 + 0×26 + 0×25 + 0×24+ 0×23+ 0×22 + 1×21 + 1×20 - 256 : = 128+2+1-256=-125 11111110 : 1×27 + 1×26 + 1×25 + 1×24+ 1×23+ 1×22 + 1×21 + 0×20 - 256= -2 11111111 : 1×27 + 1×26 + 1×25 + 1×24+ 1×23+ 1×22 + 1×21 + 1×20 - 256= -1 1の位 2の位 4の位 8の位 100000000

変数とbit char型は、メモリ上での8bit のパターンと整数値が前頁のように対応する。 short, int/long型では、16bit,32bitのパターンが整数値と対応する(前頁の表が伸びる) double, float は もうちょっとややこしい 00000010 10000000 : 640 00000010 10000000 00000100 00000011 : 41944067

Bitの演算子 C言語は整数をビット単位で操作できます。 00000001 : 1 00010000 : 16 00010010 : 18 #include <stdio.h> int main(){ char c = 1; c = c<<4; printf("%d\n", c); c = c | 2; c = ~c; c = c&14; } 00000001 : 1 00010000 : 16 00010010 : 18 11101101 : -19 00001100 : 12 00001110 : 14 16 18 -19 12

Bit演算子 << 左 Bit Shift >> 右Bit Shift & Bit And | Bit OR i & 3 iと3で両方が1のビットだけを1にした整数 | Bit OR i | 3 iと3でどちらかでも1のビットを1にした整数 ^ Bit XOR i ^ 3 iと3でビットが異なるビットを1にした整数 ~ Bit Complement ~i iのビットの0と1を入れ替える

課題16  Bit演算子を使ってみよう 2進数で表示すると 10101010101010101010101010101010 となるような数値を、定数を書くのではなく、for文などを使って作り10進数と2進数で表示する。 この数とgetchar()でキー入力した文字コードの&を取って10進数と文字で表示する。 ようなプログラムを 作ってください int print8bit(int c){ int i; for(i=0; i<8; ++i){ if (c & (1<<(7-i)) ) printf("1"); else printf("0"); } 整数 c を2進数で表示する関数