第5回C言語講座 ~ポインタと配列.

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

知能情報工学演習 I 第 12 回( C 言語第6 回) 課題の回答 岩村雅一
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
プログラムのパタン演習 解説.
情報理論2 第4回 小林 学 湘南工科大学 2011年11月1日 〒 神奈川県藤沢市辻堂西海岸1-1-25
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
第2章 数値の入力と変数 scanfと変数をやります.
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミングおよび演習 第9回
P129 モンテカルロ シミュレーション 乱数を使ったシミュレーション.
基礎プログラミングおよび演習 第8回.
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
基礎プログラミング 第13回(2007年5月28日) 「関数」の補足説明 Report-Fの解説.
C言語講座 第4回 ポインタ.
構造体.
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 1 前回の課題の復習
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
第10章 char 文字列; 文字列を入力させるよ!.
C言語講座 第3回 ポインタ、配列.
プログラミング演習 バージョン1 担当教員:綴木 馴.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング応用 printfと変数.
第10章 これはかなり大変な事項!! ~ポインタ~
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
知能情報工学演習I 第12回(後半第6回) 課題の回答
今までの練習問題の復習.
前回の練習問題.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
C言語講座第二回 2017 分岐とループと乱数.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報理論2 第3回 小林 学 湘南工科大学 2011年10月25日 〒 神奈川県藤沢市辻堂西海岸1-1-25
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
疑似乱数, モンテカルロ法によるシミュレーション
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
プログラミング序論演習.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
第13回 ポインタ 1 1.
C言語講座 制御(選択) 2006年 計算技術研究会.
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
変数を一度にたくさん宣言するよ! それだけじゃないよ!
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
知能情報工学演習I 第12回( C言語第6回) 課題の回答
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
第12章 乱数という業の深い存在 ~ランダムな値・他~
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第11回(後半第5回) 課題の回答
第12章 ランダム関数.
C言語講座第5回 2017 構造体.
C言語講座 四則演算  if ,  switch 制御文.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
知能情報工学演習I 第10回( C言語第4回) 課題の回答
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
第13章 構造体 講習最後だよ!.
Presentation transcript:

第5回C言語講座 ~ポインタと配列

今回なにやるか ・ポインタと配列 →前回引き続きポインタを使って配列を弄ります ・乱数 →ランダムな値を取り出す。ゲームなどに応用が 効く便利なものです。

先週の復習(ポインター) ・int* ポインタ変数 (int* aなど) →int型のポインタ変数を宣言している ・&変数 (&aなど) →変数のアドレスを表している、アドレスを渡し たい時などに使用 ・*ポインタ変数(*a など) →ポインタ変数の中身

以上を踏まえて今回は・・・ 配列を導入していきます!

配列とポインターって何か関係あるの? int number[]={0,1,2}; main文の中に上のように配列を定義する。 そこで printf(“%d\n”,*number); と入力してみてください。 すると・・・

・・・前ページの続き “0”が表示された。つまり・・・ *numberはnunber[0]と同義である!

・・・さらに 先程の printf(“%d\n”,*number); の下に printf(“%d\n”,*(number+1)); と入力してみよう。 すると・・・

“0,1“と表示された。 →*(number+1)とはnumber[1]と同じである! 以上をまとめると・・・

配列を用いたポインタ a[b]=*(a+b) まずこれだけは覚えてください!

【応用】こんなこともできます int main(){ int number[3]={1,2,3}; int *p= number; for(int i=0;i<3;i++){ printf(“number[%d]:%d\n”,i,*(number+i)); }

関数に配列を渡す!【重要】 前回、swap(&a,&b)のようにアドレスを関数に渡 すことによってポインタを関数で扱った。 では、今回は配列を関数に渡してみよう!!

不可能です。 配列を渡す!? ・・・と言っても配列をそのまま渡すことは じゃあどうすればいいの? →配列の先頭のアドレスだけなら渡せます!!!

配列の先頭のアドレスの渡し方 ~配列の先頭のアドレスの渡し方~ 関数number()と配列a[]があるとすると number(a) これだけで配列の先頭のアドレスが渡せます!

関数内での配列の使用(ポインタ) void print_number(int number[]){ printf(“number[0]:%d”,number[0]); } int main(){ int number[3]={0,1,2}; print_number(number); 配列の先頭が表示された

また、void numberの中身を下記のように変えて みよう void print_number(int number[]){ for(int i=0;i<3;i++){ printf("number[%d]:%d\n",i,number[i]); }

すると・・・ 関数を使用して配列の中身を表示できた! やったね!

演習1 int number[4]={0,1,2,3} 配列を受け取るswap関数を自作し、上の配列の中 身を逆順にしなさい

解答1 #include <stdio.h> void swap(int a[]){ int i, tmp; printf("swap中・・・\n"); for(i=0;i<4/2;i++){ tmp = a[i]; a[i]=a[4-1-i]; a[4-1-i] = tmp; } int main(){ int number[4]={0,1,2,3}; int i; for(i=0;i<4;i++) printf("number[%d]:%d\n",numb er[i],number[i]); swap(number); return 0;

解答1

【時間あったら】乱数 実用的なプログラムを書く上で必要となるであろ うもののひとつである乱数。読んで字のごとく、 ランダムな数値のことである。 この講座でも何回か触れているが、あえて詳しく 解説してみようと思う。

#include<stdlib.h> 乱数を使用する前に・・・ #include<stdlib.h> まずはこれを導入しよう! ※stdlib・・・Standard libraryのこと、まあ気に しなくて良い

乱数を使用する前に・・・(2) 次に乱数を生成するために必要なSEED値(種) を設定する。 srand(); srandの()の中にSEED値を入れることで乱数の初 期設定となる。

乱数を使用する前に・・・(3) なんでSEED値なんて設定するの? →SEED値を設定するのは乱数を生成するための 初期設定だと思ってください。 SEED値って何? →SEED値が同じだと同じ結果になってしまいま す。SEED値を変えずに何回も生成してみると分 かります。

これだけ! 乱数を生成する 乱数の生成はとっても簡単! #include<stdio.h> #include<stdlib.h> int a; srand(1); a=rand(); これだけ!

それでは、本当に生成できてるか確認してみま しょう! 先程のプログラムの乱数を何回か生成してみよう。 すると、下記のような結果となる。

SEED値を時刻によって変更する srand((unsigned int)time(NULL)); 方法は簡単!srand()を下記に変え、 #include<time.h>を加えるだけである。 srand((unsigned int)time(NULL)); おまじないみたいなものだと思って覚えよう。

自由自在な範囲で乱数を生成する ここまでやってきた方法では、「1~10までの 乱数を作りたい!」など任意の範囲での乱数の生 成はできない・・ →なら、乱数を加工して自分で作ってしまおう!

a=rand() ← ここを加工する! 試しに、先程作った乱数のプログラムのa=rand() をa=rand()%10 に変えてみよう! すると・・・以下のように生成できる。

結果のように1~10の乱数を生成できた、 ようにみえるがa=rand()%10では、10で割ったと きのあまりであるので0~9の乱数となってしま う。 1~10までの乱数を生成するにはどうすればいい か?簡単である。rand()を以下のように書き換え る。 a=1+rand()%10

以上のように1~10の乱数を生成できた。 ・・・このように、rand()を四則演算で加工することによって任意の範囲の乱数を生成することができる! 覚えておいて損はない。

演習2 乱数により1~9同士の足し算の問題を表示し、そ の答えを入力させて正解かどうかを判定するプロ グラムを作りなさい。 余力があれば正解数をカウントし、表示させなさ い

解答2 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> int main(){ int ran1, ran2, i, input, cnt; cnt = 0; srand((unsigned int)time(NULL)); for(i=0;i<5;i++){ ran1=rand()%9+1; ran2=rand()%9+1; printf("%d + %d = ",ran1 ,ran2); scanf("%d",&input); if(ran1+ran2==input){ printf("正解!\n"); cnt++; } else{ printf("不正解...\n"); Sleep(500);//0.5秒だけ処理を待たせ る printf("%d問正解!\n",cnt); return 0;

解答2

演習3 #define N 7 int array[N] = {6,5,2,7,4,8,4} 以上の配列の平均値、最大値、最小値を返す関数 float ave(int a[]) int max(int a[]) int min(int a[]) をそれぞれ実装しなさい

解答3 #include <stdio.h> #define N 7 float ave(int a[]){ int i; float ave = 0; for(i=0;i<N;i++){ ave+=a[i]; } ave/=N; return ave; int max(int a[]){ int max = 0; if(max==0 || max<a[i]){ max = a[i]; return max; int min(int a[]){ int min = 0; if(min==0 || a[i]<min){ min = a[i]; return min; int main(){ int array[7] = {6,5,2,7,4,8,4}; printf("平均値:%.2f\n",ave(array)); printf("最大値:%d\n",max(array)); printf("最小値:%d\n",min(array));

解答3

解答3

おわり 以上、お疲れ様でした^~