第6講 配列の学習
第8話 成績一覧表に各生徒合計・平均を加える
を実現するプログラム例
#include <iomanip>
using namespace std;
int x[40][6];
int sg[40];
float sh[40];
void f1(); //1行目(ラベル)表示
void f2(); //データ作成
void f3(); //データ表示と各生徒合計・平均の表示
void f4(); //各教科の合計と平均を算出して表示
void f5(); //各生徒の合計と平均の算出
void main(){
f1(); //1行目(ラベル)表示
f2(); //データ作成
f5(); //各生徒の合計と平均の算出
f3(); //データ表示と各生徒合計・平均の表示
f4(); //各教科の合計と平均を算出して表示
}
//1行目(ラベル)表示
void f1(){
cout<<"出席番号 国語 社会 数学 理科 英語"<<endl;
}
//データ作成
void f2(){
srand(time(NULL));
int i,j;
for(i=0;i<40;i++)x[i][0]=i+1;
for(i=0;i<40;i++){
for(j=1;j<6;j++){
x[i][j]=rand()%100;
}
}
}
//データ表示と各生徒合計・平均の表示
void f3(){
int i,j;
for(i=0;i<40;i++){
for(j=0;j<6;j++){
if(j==0)cout<<" ";
if(x[i][j]<10)cout<<"0"<<x[i][j]<<"
";
if(x[i][j]>=10)cout<<x[i][j]<<" ";
}
cout<<" "<<sg[i]<<" "<<setprecision(3)<<sh[i]<<"
";
cout<<endl;
}
cout<<endl;
}
//各教科の合計と平均を算出して表示
void f4(){
int w[5]; //各教科の合計を入れる配列
float h[5]; //各教科の平均を入れる配列
int i,j;
for(i=0;i<5;i++)w[i]=0;
for(i=0;i<5;i++){
for(j=0;j<40;j++){
w[i]=w[i]+x[i][j];
}
h[i]=(float)w[i]/40;
}
cout<<"合計 ";
for(i=0;i<5;i++)cout<<w[i]<<" ";
cout<<endl;
cout<<"平均 ";
for(i=0;i<5;i++)cout<<setprecision(4)<<h[i]<<"
";
cout<<endl;
}
//各生徒の合計と平均の算出
void f5(){
int i,j;
for(i=0;i<40;i++)sg[i]=0; //各生徒合計の初期化
for(i=0;i<40;i++){
for(j=0;j<5;j++){
sg[i]=sg[i]+x[j][i+1];
}
sh[i]=(float)sg[i]/5;
}
}
2次元配列とfor文を組み合わせれば、
3次魔方陣自動生成プログラムを組むことができるなど、
配列を使った面白いプログラムはたくさん組むことができますが、
3次魔方陣自動生成プログラムなどの興味深いテーマは、
独立の講にしたいと思います。
尚、魔方陣とは
1 |
6 |
11 |
16 |
15 |
12 |
5 |
2 |
8 |
3 |
14 |
9 |
10 |
13 |
4 |
7 |
1 |
7 |
13 |
19 |
25 |
18 |
24 |
5 |
6 |
12 |
10 |
11 |
17 |
23 |
4 |
22 |
3 |
9 |
15 |
16 |
14 |
20 |
21 |
2 |
8 |
7 |
23 |
37 |
64 |
33 |
57 |
25 |
14 |
3 |
55 |
44 |
18 |
50 |
6 |
21 |
63 |
61 |
27 |
30 |
26 |
60 |
1 |
31 |
24 |
46 |
36 |
12 |
17 |
15 |
38 |
34 |
62 |
19 |
51 |
22 |
53 |
28 |
16 |
29 |
42 |
35 |
9 |
59 |
20 |
56 |
39 |
32 |
10 |
40 |
48 |
4 |
54 |
13 |
58 |
41 |
2 |
49 |
11 |
52 |
8 |
5 |
45 |
47 |
43 |
などです。
魔方陣とは、すべての行・列・対角線の合計が同じくなるものです。
1辺がnのとき、n次魔方陣というのです。
ですから、3次魔方陣とは
です。3次魔方陣は、全部で8個の解答をもちます。
もっとも、その8個は対称移動や鏡像移動などで重ねることができますので、
本質的には解答は1個しかありません。
5次魔方陣では、本質的に異なる魔方陣は、
約3億個あることが知られ、
6次以上の魔方陣では、何個存在するか分かっていません。
6次の段階で京(兆の1万倍)以上の個数が
あることは確実ですし、
20次ぐらいになると『京×京×京×京×京』個以上
存在することは間違いないと思われます。
魔方陣の自動生成は、プログラミングの腕を
鍛えていく上で格好の題材だといえます。
はじめて、6次魔方陣をコンピュータに作らせたときは、
3日もかかりました。
夏の暑い日に三日三晩をコンピュータに計算させ続け、
やっと1個6次魔方陣を見つけることに成功したときには、
極めて感動しました。
今では最速のプログラムなら、
6次魔方陣は1秒で数万個の単位で生成します。
3日で1個から、1秒で数万個へと・・・
長足の進歩を遂げたわけです。
プログラミングは、
工夫しただけ答えてくれる楽しい取り組みです。
さて、配列の講は終了して、
C言語やC++の大きな魅力の1つである
ポインタの学習に進むことにしましょう。
ポインタを利用すれば、
ここ数話で使ってきたグローバル変数を
利用しないプログラムを組むことができます。
第7話へ 第7講第1話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ