また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

Similar documents
#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

Microsoft Word - no202.docx

プログラミング実習I

Microsoft PowerPoint - handout07.ppt [互換モード]

Microsoft PowerPoint ppt

演算増幅器

cp-7. 配列

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint プレゼンテーション

Microsoft PowerPoint - 5Chap15.ppt

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

第 1 回 C 言語講座 1. コンピュータって? だいたいは 演算装置 制御装置 記憶装置 入出力装置から構成されている 演算装置 CPU の一部で実際に計算を行う装置 制御装置 CPU の一部で演算装置や入出力装置 記憶装置の読み書きなどを制御する装置 記憶装置プログラムや情報 データを一時的

Microsoft PowerPoint - prog03.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft Word - no103.docx

memo

CプログラミングI

Microsoft Word - no11.docx

Microsoft Word - 3new.doc

C-programming_kouza4(2007)

Microsoft PowerPoint - lec10.ppt

memo

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

ガイダンス

02: 変数と標準入出力

演算増幅器

PowerPoint Presentation

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

02: 変数と標準入出力

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

Microsoft PowerPoint - 09.pptx

PowerPoint プレゼンテーション

Prog1_10th

スライド 1

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 11.pptx

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

アクション講座 第1回目

gengo1-11

02: 変数と標準入出力

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

PowerPoint Presentation

ポインタ変数

02: 変数と標準入出力

プログラミング基礎I(再)

C#の基本2 ~プログラムの制御構造~

02: 変数と標準入出力

Microsoft Word - CygwinでPython.docx

Microsoft PowerPoint - 計算機言語 第7回.ppt

プログラミングI第5回

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

第9回 配列(array)型の変数

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

PowerPoint プレゼンテーション - 物理学情報処理演習

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft Word - VBA基礎(6).docx

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - 13.ppt [互換モード]

Java講座

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

※ ポイント ※

Microsoft Word - no13.docx

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

2006年10月5日(木)実施

Microsoft Word - Training10_プリプロセッサ.docx

ポインタ変数

ポインタ変数

プログラミング実習I

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Prog1_6th

gengo1-8

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

デジタル表現論・第6回

Microsoft Word - no15.docx

C言語講座 ~ファイル入出力編~

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

program7app.ppt

講習No.9

Microsoft Word - Cプログラミング演習(12)

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Microsoft Word - no12.doc

情報処理Ⅰ演習

memo

Microsoft PowerPoint - prog04.ppt

メソッドのまとめ

データ構造

Transcription:

第 4 回 C 言語講座 1. 配列についていままで 変数は1 個ずつ指定してました が 同名で たくさん必要なときもあるかもしれませんね 例えば 複数人の点数だけを格納するときとか このときは 配列が便利なわけです それぞれを添字によって区別しながら扱えるという便利なものです というわけで サンプルコード %.2lf で小数点以下 2 桁表示を示しています定義時は個数を指定します が その後は [] 内は番号になるので注意が必要です また その番号は int score[ 10 ]; としたときに score[ 0 ] score[ 9 ] の10 個になるので注意が必要です また この10 個以上を勝手に使うことは出来ません つまり score[ 10 ] を使うことは出来ないわけです 注意してください

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる扱いをされます 文字は char sc; のようになり char 型に1 文字分のみ格納します 文字列は char word[ 256 ]; のようになり char 型の配列を利用して表現します また 初回にオマケで説明したフォーマット指定子が異なります このフォーマット指定子を間違えると厄介なことになります ええ バグになります 自分の欲しい結果になりません 変な挙動をします 昔 課題で苦しめられましたよ ええ と いうわけでサンプルコード

このように扱います 文字列は配列を使っているので 指定した分を越える文字列を入れると切れます 切れればいいですね 切れないときもあります 切れなかった時は大変なことになります 0 は終端文字と呼ばれる特殊文字ですなので 配列は大きめに取っておくといいでしょう ちなみに初期化する際 char word[] = sample word とすると sample word 0 が入る丁度のサイズの配列を確保してくれます また 文字列を処理するための関数ライブラリが存在します サンプルコード内の strlen() が文字列長を計算してくれる関数です string.h をインクルードすることによって扱えます どんな関数があるかは自分で調べてみましょう 3. 多次元配列配列は多次元配列として確保することが可能です ちょっと難しいかもしれないけど 例えば int vector[ 2 ][ 2 ]; とすると vector[ 0 ][ 0 ] vector[ 0 ][ 1 ] vector[ 1 ][ 0 ] vector[ 1 ][ 1 ] の 4つを確保することが出来ます 取り敢えず こんなものがあるよ くらいでいいと思います 一応サンプルを以下に示しておきます PersonName[ i ] が [ STRINGLENGTH ] 分だけあるという感じ

4. ポインタはい C 言語最大の難関です ( 言い過ぎかな?) 割と言い過ぎではないとは思うんですけどね 色んな人がここで挫折します 書いてる本人も出来てるとは思っておりません ただ 順を追ってきちんと理解すればポインタは難しくないそうですよ?? あとは 表記が似通っててこんがらがる というのもありますかね わからなくなったら何度もポインタの最初からやるといいかもね ゲームプログラミングをする上で ポインタは自作関数を作るときによく表れます 実際 ポインタを使おうと思って使用することは無いと思います こういう動作をさせたい ここの値を書き換えたい と思うときがあります でも 関数から書き換えられない ですよね こんなときに 仕方ないからポインタを使うわけです また 配列を扱う際も 実はポインタが絡んでくるわけです とまぁ ポインタというのは便利でもあります いやぁ 便利じゃなかったら入れないわな というわけで 頑張って理解していこう 5. ポインタとアドレスまずは アドレス とはなんぞや から 初回のところにちょこーんと載せてあったよね アドレスとは 場所を特定する値のことです アドレスって日本語で言えば住所のことだよね 住所があれば何処なのかが分かるわけだ メモリ内でもそれは同じわけです メモリ内は幾つものセルに分かれていて それぞれにデータを保存させています でも それぞれのセルの位置が分からないとアクセスが出来ないよね そこでアドレス というものがあるわけです ポインタは その アドレス という概念を用いて色々やっていこうとなっているわけです 6. 変数とアドレスさて 計算機のなかで int a = 123; ってどうしているんでしょうね?? 概略としては こんな感じ * 変数テーブル * メモリ内 変数 a score sum アドレス 0x0004 0x0008 0x000c アドレス 内容 ( データ ) 0x0004 123 0x0008 75 0x000c 2048

こんな感じで対応表があるものだと思ってください ソースコード内で int a = 123; と記述すると int a の部分で 変数 a に対し アドレス 0x0004 が割り振られるものと仮定します ( 毎回同じアドレスが割り振られるわけではありません コンパイル時に決定します ) その後 a = 123 の部分では 変数 a はアドレス 0x0004 だから 0x0004 に 123 のデータを保存すればいい とパソコンの中では認識します これが int a = 123; の処理です このように 代入のときでもアドレスを使用してメモリ内にデータを保存しているわけです で ポインタって何さ? ってなりますよね 実は ポインタを使うというのはアドレスを直接指定しデータを操作する ということなのです さて ここで重要なのは変数と その変数のアドレスです C 言語では a は変数 a の値 ( データ ここでは 123) を示します また &a は変数 a のアドレス ( ここでは 0x0004) を示しています 重要ですよ 結局 ポインタとはアドレス変数 つまり変数のアドレスを記憶する変数のことなのです 7. ポインタの宣言と使い方ポインタは必ず i. 宣言 ii. 値 ( アドレス ) の格納 iii. 使用の3ステップで用います 以下のサンプルコードのような使い方は絶対にしません ですが これが一番理解しやすいと思います * の使い方に注意して確認していこう サンプル C 言語では int * 変数名にしないと いけないから注意 int* でアドレスを格納する変数として宣言している &a で変数 a の定義されているアドレスを表現している *p で p の指すアドレスの内容 という意味

8. 配列とポインタ配列とポインタは実は仲間なわけです 配列を変数のように使ってきましたが 実は やつらはポインタを使っているのです なので 次にやる関数とポインタにおいて同じように扱うことが出来ます 便利ですね 例えば char word[ 128 ] = sample word ; としたとき word == &word[ 0 ] となります これは次の配列を関数で用いるときに重要になります 9. 関数とポインタ 配列関数では 外部の変数にアクセス出来ないと言いました ただ メモリにはアクセス出来るわけです つまり 引数としてアドレスを受け取りそのアドレスの内容を読み書きすることは可能なのです これは便利でもあり バグやエラーの原因にもなり得ます 関数外の変数を書き換えられないのは 勝手に書き換えないため つまり操作ミスによってデータが勝手に変わってしまうことが起こらないようにしているのですが ポインタはその制約をスルーしてしまうわけです では サンプルプログラムです

こんなふうに 関数外の変数の値を書き換えることが出来ました こういうことも可能なわけです 実際 配列などを用いたときはこんな感じで直接書き換えてしまっているわけです また 配列を引数とする関数のサンプルを以下に載せます 配列を引数として与えると 関数内部でも配列内のデータを書き換えることが出来ます 便利ですが 扱いかたを間違えると大変なことになるよ * オマケ多次元配列を関数の引数にするときは 引数に配列名 [][ 個数 ] としてください 例としては void sort( char string[][ 128 ] ) のようにしてください 後ろだけ書くのは 配列の格納状態を認識するために必要です

練習問題 1.20 人分のテスト結果を入力すると 平均点と標準偏差を出力するプログラムを作成しなさい 2.10 人分の名前を入力させ 最後に入力された人の名前から出力するプログラムを作成しなさい 3. 配列に 6 つの数字を代入し その 6 つの数字を大きい順に並び替える関数を作成しなさい ヒント 1. 標準偏差は分散の平方根 分散は平方和を ( 全個数 - 1) で割ったもの 2. 関数に配列を引数で渡して 内部で strcpy を使えばいいんじゃないかな? 3.for 文とか使いつつ出来るといいなぁ