第15講 多次元配列を送ることによって年間成績一覧表を作成する

第6話 年間成績一覧表の完成!

実行画面
0148
を実現するプログラム例
#include<stdio.h>
#include<stdlib.h>
void f(char n,int p[3][42][8]);
void g(int p[3][42][8]);
void h(int p[3][42][8]);
int main(){
  int n,p[3][42][8];
  for(n=0;n<3;n++)f(n,p);
  g(p);
  h(p);
  printf("プロジェクト終了\n");
}
void f(char n,int p[3][42][8]){
  int i,j;
  for(i=0;i<5;i++){
    for(j=0;j<5;j++){
      p[n][i][j]=rand()%100;
    }
  }
}
void g(int p[3][42][8]){
  int i,j,k,w;
  for(i=0;i<3;i++){
    for(j=0;j<5;j++){
      w=0;
      for(k=0;k<5;k++){
        w+=p[i][j][k];
      }
      p[i][j][5]=w;
    }
  }
  for(i=0;i<3;i++){
      for(j=0;j<6;j++){
        w=0;
        for(k=0;k<5;k++){
          w+=p[i][k][j];
        }
        p[i][5][j]=w;
      }
    }
}
void h(int p[3][42][8]){
  int i,j,k,w;
  for(i=0;i<3;i++){
    printf("%d学期\n",i+1);
    printf("番号 国語 社会 数学 理科 英語  合計  平均\n");
    for(j=0;j<5;j++){
      if(j+1<10)printf(" 0%d  ",j+1);
      if(j+1>=10)printf(" %d  ",j+1);
      for(k=0;k<6;k++){
        if(p[i][j][k]<10)printf("0%d  ",p[i][j][k]);
        if(p[i][j][k]>=10)printf("%d  ",p[i][j][k]);
      }
      printf("%.1f  ",(float)p[i][j][5]/5);
      printf("\n");
    }
    printf("合計 ");
    for(k=0;k<6;k++){
      if(p[i][5][k]<10)printf("0%d  ",p[i][5][k]);
      if(p[i][5][k]>=10)printf("%d  ",p[i][5][k]);
    }
    printf("%.1f  \n",(float)p[i][5][5]/5);
    printf("平均 ");
    for(k=0;k<6;k++){
      printf("%.1f ",(float)p[i][5][k]/5);
    }
    printf(" %.1f  ",(float)p[i][5][5]/25);
    printf("\n");
    printf("\n");
    printf("\n");
  }
  printf("年間成績\n");
  printf("番号 国語 社会 数学 理科 英語  合計  平均\n");
  for(i=0;i<5;i++){
    if(i+1<10)printf(" 0%d ",i+1);
    if(i+1>=10)printf(" %d ",i+1);
    for(j=0;j<6;j++){
      w=0;
      for(k=0;k<3;k++){
        w+=p[k][i][j];
      }
      printf("%.1f ",(float)w/3);
    }
    printf(" %.1f   ",(float)w/15);
    printf("\n");
  }
  printf("合計");
  for(j=0;j<6;j++){
    w=0;
    for(k=0;k<3;k++){
      w+=p[k][5][j];
    }
    printf("%.1f ",(float)w/3);
  }
  printf(" %.1f ",(float)w/15);
  printf("\n");
  printf("平均 ");
  for(j=0;j<6;j++){
    w=0;
    for(k=0;k<3;k++){
      w+=p[k][5][j];
    }
    printf("%.1f ",(float)w/15);
  }
  printf(" %.1f ",(float)w/75);
  printf("\n");
}
完成成績一覧表

本当はこの後、
各生徒の最高点・最低点・5段階評価、
各教科の最高点・最低点
等も入れていく予定でしたが、
すでに頭が大混乱しています。
全体を見通してから、
コーティングを始めれば良かったのですが、
見通しのないまま勘で進めてしまったため、
これ以上動きをとるのは、
難しくなりました。
最高点など表示させるには、
int型にしたp[3][42][8]をfloat型に変更したり、
合計点算出の段階で、
配列のp[3][42][8]に値を入れたり、
してやり直さなければなりません。
「あなたは大変優秀です。」
をもちろんfloat型の配列p[3][42][8]に収納させることはできませんが、
評価に対応する数字を入力しておいて、
if文を使えば、
その課題は解決できますので、こちらはそれほど困難ではないでしょうが。
さらに、出席番号を配列p[3][42][8]に収納しなかったために、
ますますコードが複雑になって、
混迷の度合いを深めてしまいました。
でも、きっと皆さんは、
もっときれいに組んでいて、
各生徒の最高点・最低点・5段階評価、
各教科の最高点・最低点
等を組み込むことは、
おそらく容易に出来るでしょうから、
是非とも挑戦してみて下さい。

第16講では、
24,48,12,59,36
等のデータを
12,24,36,48,59
小さい順に並べ直したり、
59,48,36,24,12
大きい順に並べ直したりすることに挑戦します。
これは、成績順に並べ直して順番を付けるときなどに、
活かせます。

第5話へ 第16講第1話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ