第12講 ベクタの学習
第10話 ベクタを関数に送るその2
実行結果
main上での表示 a[0]=1 a[1]=2 a[2]=3
関数f()上で表示 a[0]=1 a[1]=2 a[2]=3
main上での表示 a[0]=2 a[1]=4 a[2]=6
関数f()上で表示 a[0]=2 a[1]=4 a[2]=6
を導く
プログラミング例その1
#include<vector> //ベクタを使うのに必要なvectorをインクルード
#include <stdio.h> //printfを使うのに必要なstduio.hをインクルード
using namespace std; //ベクタを使うために必要
void f(vector<int>::iterator a);
void g(vector<int>::iterator a);
void main(){
vector<int> a(3);
for(char i=0;i<3;i++)a[i]=i+1; //mainにおいてデータを作成
printf("main上での表示 ");
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,a[i]); //main上でデータを表示
printf("\n");
f(a.end()); //関数f()上でデータを表示
g(a.end()); //関数g()上でデータを加工
printf("main上での表示 ");
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,a[i]); //main上でデータを表示
printf("\n");
f(a.end()); //関数f()上でデータを表示
printf("\n");
}
void f(vector<int>::iterator a){ //データ表示関数
printf("関数f()上で表示 ");
for(char i=3;i>0;i--)printf("a[%d]=%d ",i,*(a-i));
printf("\n");
}
void g(vector<int>::iterator a){ //データを2倍に加工する関数
for(char i=3;i>0;i--)*(a-i)=2*(*(a-i));
}
プログラミング例その2
#include<vector> //ベクタを使うのに必要なvectorをインクルード
#include <stdio.h> //printfを使うのに必要なstduio.hをインクルード
using namespace std; //ベクタを使うために必要
void f(vector<int>::iterator a);
void g(vector<int>::iterator a);
void main(){
vector<int> a(3);
for(char i=0;i<3;i++)a[i]=i+1; //mainにおいてデータを作成
printf("main上での表示 ");
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,a[i]); //main上でデータを表示
printf("\n");
f(a.end()); //関数f()上でデータを表示
g(a.end()); //関数g()上でデータを加工
printf("main上での表示 ");
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,a[i]); //main上でデータを表示
printf("\n");
f(a.end()); //関数f()上でデータを表示
printf("\n");
}
void f(vector<int>::iterator a){ //データ表示関数
printf("関数f()上で表示 ");
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,*(a-3+i));
printf("\n");
}
void g(vector<int>::iterator a){ //データを2倍に加工する関数
for(char i=0;i<3;i++)*(a-3+i)=2*(*(a-3+i));
}
解説
for(char i=3;i>0;i--)printf("a[%d]=%d ",i,*(a-i));
for(char i=3;i>0;i--)*(a-i)=2*(*(a-i));
for(char i=0;i<3;i++)printf("a[%d]=%d ",i,*(a-3+i));
for(char i=0;i<3;i++)*(a-3+i)=2*(*(a-3+i));
この辺頭が混乱しますが、
試行錯誤でやるしかありません。
例えば、*(a-3+i)は*(a-2+i)または*(a-4+i)でないかと、
迷いませんでしたか。
頭の良くない私は、迷いました。
迷ったときは、それぞれ試してみて、
上手くいくまで繰り返すしかないと思います。
人間には勘違いは避けて通れないものであるからです。
同じくfor(char i=3;i>0;i--)もかなり混乱しますよね。
これもすんなり出来たわけではなく、
何回か試しました。
尚、2*(*(a-3+i))は2**(a-3+i)でも問題ありません。
ポインタが指す変数を示す*の方が、
×を表す*より、優先順序が高いからです。
ただ、優先順序に迷った場合は2*(*(a-3+i))のように
()を付けましょう。
()を付ける方が、プログラムを読み人にとってもわかりやすい、
といえます。
さて、次ぎに、
関数側でベクタを定義して、
データを作成して、
そのデータをmainや他の関数で利用する方法について
考えたいと思いますが、
それを考えるために、
動的変数と静的変数について学習しなければなりません。
次話では、静的変数を学び第12話の準備としたいと思います。
第9話へ 第11話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ