サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
www.cc.kyoto-su.ac.jp/~yamada
Cのプログラム中で,整数の定数を16進数で表すことができる. その定数には16進数であることの印のために,頭に 0x を付けることになっている. ( x は16進数 hexadecimal number の x を意味する) 次のプログラムで確かめてみよう.(書式文字列 %x は16進数で整数を表示する指定.) #include <stdio.h> int main() { char c; int i; c = 0x4d; i = 0x0076adf1; printf("%x = %d\n%x = %d\n", c, c, i, i); return 0; } 4d = 77 76adf1 = 7777777 符号無し整数と符号付き整数 C言語では,char 型や int 型などの整数を表す型には, 符号付き(signed)の型と符号無し(unsigned)の型とがある. 符号付きの型は負
有限桁 C言語で扱える実数値は,2進数の有限小数で表された数値である.例えば次のようなものである. 1.5(10) = 1.1(2) 3.25(10) = 11.01(2) 理論的には小数が無限に続く値でも,そのうちの有限個の桁数でその値を表すしかない. 例えば,0.1 を2進数の小数で表すと 0.1(10) = 0.000110011001100110011...(2) と無限に続くが,コンピュータの内部では有限桁で丸められている. このような場合には,本当の値ではなく,近似値でしか表すことができない. 指数表記(浮動小数点表記) 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 1234567890000000000000
プログラミングBのページへ戻る その前に,typedef 構造体とは 構造体の宣言 メンバ参照(直接参照) サンプルプログラム1 構造体の代入 構造体のサイズ 構造体の配列 サンプルプログラム2 構造体をメンバにする構造体 関数と構造体 構造体型の関数引数 構造体型の関数戻り値 構造体ポインタ型の関数引数 メンバ参照(間接参照) レポート問題 その前に, typedef typedef を用いると,既に定義されている型に,別の新しい名前をつけて定義することができる(typedef は型(type)定義(definition)を略したキーワードである).その方法は次の通り. typedef 定義されている型 定義する新しい型名; 具体的には次のようにする. typedef int seisu_t; これは, seisu_t という名前の型は int 型であると定義している. この型定義をした
ヌル文字 「'」という文字は文字定数を表すために使用されているので,「'」自身を意味する文字は「\'」と表すことになっている。したがって,「'」を表す文字定数はこれを「'」で括った「'\''」である。 「"」という文字は文字列を表すために使用されているので,「"」自身を意味する文字は「\"」と表すことになっている。 「\」という文字は特殊文字を表すために使用されているので,「\」自身を意味する文字は「\\」と表すことになっている。 表の最後にあるヌル文字「\0」は,次節で説明する文字列の終端を表す文字として使用される。 char 型は文字を表す型ではあるが,その本質は1バイトで表された整数(-128~127)を表す型である。したがって, 'a' などの文字定数も整数としての意味を持つ。それを次のプログラムを実行して確認しよう。(%d は整数値を10進数で表示することを指定する) #incl
ここでは、真を1で、偽を0で表すことにする。 排他的論理和 xor (exclusive or)とは、 1 xor 1 = 0 1 xor 0 = 1 0 xor 1 = 1 0 xor 0 = 0 と定められるものである。 すなわち a, b のどちらか一方だけが 1 であるときにだけ a xor b = 1 となる。 排他的論理和には、次のような、いくつかの面白い性質がある。 a, b, ..., c は0か1かのどちらかとする。 (1) a xor b xor ... xor c のように複数個のものの xor をとった場合、a, b, ..., c の中で 1 であるものの個数が奇数個ならば結果は 1、偶数個ならば結果は0となる。 (2) a xor a = 0 (3) a xor b = 0 ならば a = b ビットごとの排他的論理和 演算子 ^ はビットご
プログラミングBのページへ戻る 配列とは 配列の要素 配列の宣言 配列の初期化 配列全体の取り扱い 配列と sizeof 演算子 サンプルプログラムと演習問題1 サンプルプログラム1(内容の表示と総和) for文の繰り返し範囲指定の方法 for (i = 0; i < N; i++) サンプルプログラム2(逆順に複写) マクロ定数の活用 #define N 10 サンプルプログラム3(最大値) 演習問題1(ベクトル和) 配列の添字に関する重要な注意事項 2次元配列 2次元配列の初期値 2次元配列サンプルプログラム サンプルプログラムと演習問題2 サンプルプログラム4(成績処理) 演習問題2 多次元配列 レポート問題 配列とは 配列(array)とは,同一の型のデータを(メモリ上に)一列に(隙間をあけずに)並べたものである。違う型のデータを混在して並べて配列とすることはできない。 配列中の各
春学期のプログラミングAの授業では基礎的なC言語のプログラミングについて学習したが, この授業では,以下のような項目に分けて,さらに詳しく学習をする. 同時に開講されているプログラミングCの授業で学習することを補完する内容になっているので, 両方の授業内容をしっかりと習得すること. 配列 文字列 ポインタ 関数 構造体 整数型とビット操作 浮動小数点数と誤差 制御文 コーディング実技試験 問題と解答解説
誰でも知っているとは思うが,そのルールを解説しておく。 下図のように 8×8 のゲーム盤上に,4個の石が初期状態としておいてある。 交互に自分の色の石を置いていく。 石をおける場所は,自分の色の石で相手の石が1個以上挟める所である。挟む方向は,縦横斜めのどれでもよい。 このとき,挟まれた石は,自分の色の石となる。 石をおける場所がない場合には,パスをする。 石をおける場所がある場合には,パスはできない。 両者とも石をおける場所がなくなった場合,ゲームは終了する。 ゲーム終了時の石の個数で勝敗を決める。 ゲーム盤の列と行には図のように,記号と番号がついている。ゲーム盤のマス目は「dの4」のように列と行の記号と番号で指定される。 プログラム仕様 これから作るプログラムの仕様をここで決めておく。 目標のレベルを二つ設定し,それぞれ次のようなプログラムを作ることにする。 第1レベル プログラム仕様
プログラミングBのページへ戻る プログラムの実行(流れ)の制御を行う文を,ここでもう一度詳しく解説する. フローチャート 条件式 演習問題1 if 文 switch 文 for 文 演習問題2 演習問題3 while 文 do - while 文 無限ループ よくある間違い レポート課題 フローチャート フローチャート(流れ図)は,プログラムの実行手続きの流れを図によって表示するものである. その書き方はJIS規格で決まっている. JIS X 0121:1986 情報処理用流れ図・プログラム網図・システム資源図記号 フローチャートで用いる部品 フローチャートの例 1からnまでの整数の和を求めるプログラムと,そのフローチャートとを見比べてみる. #include <stdio.h> main() { int n, i, s; scanf("%d", &n); s = 0; for (i =
春学期のプログラミングAの授業では基礎的なC言語のプログラミングについて学習したが, この授業では,以下のような項目に分けて,さらに詳しく学習をする. 同時に開講されているプログラミングCの授業で学習することを補完する内容になっているので, 両方の授業内容をしっかりと習得すること. 配列 文字列 ポインタ 関数 構造体 整数型とビット操作 浮動小数点数と誤差 制御文
プログラミングBのページへ戻る 関数の定義の方法 戻り値がない関数 引数がない関数 引数について ポインタ型の引数 関数の外部にある変数の値を変更したいとき 演習問題1 配列を引数として渡すとき 演習問題2 レポート問題 関数の定義とその使い方については,プログラミングAで簡単に説明したと思うが, ここでは,もう少し詳しい説明をする. 関数の定義の方法 関数を定義する際には,その戻り値の型と仮引数の型を指定し, それに続いて,関数の本体を書き表す. 戻り値の型 関数名(引数の型 仮引数名, 引数の型 仮引数名, ...) { 関数内の局所変数の宣言; 関数内での計算の記述; return 戻り値; } たとえば,次のようなものである. /* x の n 乗を返す関数 */ double power(double x, int n) { int i; double y; y = 1.0; f
ポインタ (pointer) プログラミングBのページへ戻る メモリモデル 変数のメモリサイズとアドレス 変数のメモリサイズ 変数のアドレス 演習問題1 変数とポインタ アドレス演算子 & 間接参照演算子 * ポインタ型変数 配列とポインタ ポインタによる配列のアクセス ポインタ演算 演習問題2 ポインタへのポインタ レポート課題 コンピュータのメモリを自在にアクセスするために,C言語にはポインタという型がある。 また,C言語を習得しようとしている者にとって,最大の難関が,このポインタを理解して使いこなすことである。 プログラミングにおいてポインタが必要となるのは,次のような場合である。 関数に「参照渡し」という形で引数を渡す場合 ヒープ領域を使う場合 関数自体をデータとして扱う場合 しかし,そのどれも現段階では残念ながらまだ学習していない。 したがって,「何故ポインタが必要なのか」が分か
線形リストとは ヒープの利用法 線形リストの構築 ノード構造体の定義 簡単な線形リストの例 ノードのメモリ割り当て 線形リスト型 線形リスト操作関数 データ内容の表示 リスト先頭へのノード追加 リスト最後尾へのノード追加 任意の場所へのノード挿入 ノードの削除 線形リスト操作関数使用例 レポート問題 線形リストとは 線形リスト(あるいは単に,リスト)というデータ構造も,1次元配列と同様に,データの列を扱うためのものである. 配列が特定の型の要素をメモリ上に整然と並べたものであるのに対して,線形リストはデータとポインタとが入ったノードと呼ばれる要素をポインタでつないだものである. また、そのノードはメモリ上に整然と並んでいるとは限らない。 ノードはメモリ上に順番に存在する必要はないが,ノードのポインタは次の要素をきちんと指している必要がある.リスト最後尾の要素にあるポインタの値は,何も指さな
プログラミング用語に,仮引数(parameter)と実引数(argument)という言葉がある.それについて解説する. まず,引数(引き渡された数)とは,関数につけられた括弧内にある数値あるいは変数のことである.たとえば f(a, b) の a と b が引数である. 仮引数とは関数定義時に使用される引数のことである。 int f(int x, int y) { return x+y; } 実引数とはその関数を実際に使用するときに関数に引き渡される引数のことである. main() { int a = 5, b = 10; a = f(a, b); } C言語では,関数の実引数についての決まり事として,次の重要なことがある. 実引数が関数に引き渡されるとき,その実引数自身ではなく,実引数のコピーが引き渡される. すなわち,関数の側から見ると,引き渡されたのは関数の外にある実引数そのものではな
Nクイーン問題 8クイーン問題と呼ばれるパズルを例にとって,バックトラック法の考え方を説明する。 まず,チェスのクイーンの駒が動ける範囲を解説しよう。クイーンは,次の図のように自分の場所から縦横斜めの方向に何マスでも動くことができる。 8クイーン問題を解く方法として,まず考えられるのは,8個のクイーンの置き方をすべて調べて,条件を満たすものを探す,というものがある。 しかし,8個のクイーンをチェス盤上に置く置き方が 64C8 = 4426165368 通りあることを考えると, この方法があまりにも非現実的であることが分かる。 しかし,1つの行には1個のクイーンしか置けないことを考えると,調べる場合の数を減らすことができる。 すなわち,8つの行それぞれに,1個のクイーンをどこに置くか,ということを考えればいいから, その場合の数は, 8の8乗 = 16777216 通りである。 この考え方で
標準ライブラリ関数 qsort は, stdlib.h の中で次のように宣言されており,ポインタ base を先頭とする配列(ただし,要素数は num,一つの要素のサイズは size)の内容を,指定された比較方法 compareで昇順に並べ替える関数である. void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*)) この関数の使用例は次のようになる. #include <stdlib.h> int compare_int(const void *a, const void *b) { return *(int*)a - *(int*)b; } main() { int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 5, 7}; int i; qso
待ち行列(queue)とは 待ち行列をとりあえず簡単に構築する リングバッファ 待ち行列の構造体を作る レポート問題 待ち行列(queue)とは 待ち行列(キュー)も,逐次入出力が繰り返されるデータを一時的に貯えておくためのデータ構造である。なお,英語でキュー(queue)とは,レジなどで順番を待つ人の列も意味する。 待ち行列にデータを追加することを enqueue と言い,待ち行列からデータを取り出すことを dequeue と言う。待ち行列へのデータの追加取り出しは次のように行われる。 enqueue: 追加されたデータは順次,待ち行列の末尾に付け加わる。行列の長さは1だけ増える。 dequeue: データを取り出すときには,待ち行列の先頭から取り出す。行列の長さは1だけ減る。 すなわち,待ち行列から一つデータを取り出すとき,それは(残っているデータの中で)最初に追加したものである。この
a[9] 上のように宣言された配列の場合, a[10] という要素は存在しない。 しかし, a[10] という存在しない要素をプログラム中で参照したとしても,コンパイル時にはエラーは出ない。 しかし,そのプログラムは期待した通りには動かないだろうし,a[10] に何かの値を代入しようとした場合,それは他のメモリ領域を破壊することになり,プログラムがクラッシュする原因となる。 配列のサイズと要素数 型が必要とするバイト数および変数や配列に割り当てられたバイト数を得るための演算子 sizeof がある。これを用いて,宣言済みの配列の要素数を得ることができる。 sizeof 演算子は, sizeof(型名) または sizeof(変数名) のように使用することで,指定された型が必要とするメモリサイズまたは変数に割り当てられたメモリサイズを得ることができる。得られる数値はバイト単位である。 これを
アドバンスド プログラミング Advanced Programming 講義目的 この講義は,1年次配当のいくつかの講義で習ったC言語を用いて,より高度なプログラミングが行える知識と技術とを修得することを目的としている。 1年次に行われたプログラミングの授業では,C言語に関する基本的な知識とプログラミングにあたっての基礎的な技術とを学んだが, この講義では,有用なアルゴリズムを用いたプログラムを実際にコーディングすることにより, 高度かつ実践的なプログラミングのための知識と技術とを修得する。 講義内容 ウォーミングアップ 上達するために 配列 スタック 待ち行列 線形リスト オセロゲーム作成 バックトラック法 カラム 巡回的添字(剰余演算子% の活用) 配列=ポインタ の例外 array[n]== n[array] ??? 仮引数と実引数 swich文の書き方 レポートについて レポートは
このページを最初にブックマークしてみませんか?
『山田 修司 -- Top page』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く