C言語関係掲示板

過去ログ

No.951 表計算プログラム

[戻る] [ホームページ]
No.12164

表計算プログラム
投稿者---さち(2004/01/26 18:30:13)


表計算プログラムを作りたいのですが。

例えば最初、行数列数を指定し、
その数だけそれぞれのセルに数値を入力したら
表を作成し、セル数値の最後にそれぞれの行と列の最大値、合計を
求めたいのですが、自分でも頑張って作ってみましたが、

ポインタを用いるともっと
簡単なプログラムになると思うのですが
ポインタを用いるとどんなプログラムになるのですか。
どなたか教えて頂けないでしょうか。

    #include  <stdio.h>                                                                                                 
    #define M 100                                                                                                                   
    main()                                                                                                              
                                                                                                                        
    {                                                                                                                                                                                                                                        
                                                                                                      
      int  i, j,m,n,max;                        /*変数i,j,m,n,maxを宣言*/
      int  gyougoukei,retugoukei;               /*変数gyougoukei,retugoukeiを宣言*/ 
      int  gyou,retu,x;                       /*変数gyou,retu,xを宣言*/
      int  gyoumax[M], retumax[M];              /*配列を宣言*/
      int  Gyougoukei[M], Retugoukei[M];
      int table[M][M];


      gyougoukei=0;                             /*行合計を0に定義*/
      retugoukei=0;                             /*列合計を0に定義*/
                                                    
                                                                                                         
      printf("行列数を指定してください\n");     /*何行何列かを決定*/
      printf("行数は");                         /*行数出力*/
      scanf("%d",&gyou);                        /*行数入力*/   
      printf("列数は");                         /*列数出力*/
      scanf("%d",&retu);                        /*列数入力*/
      printf("セルに数字を入力してください\n"); /*文字の出力*/
       


                                                                                        
      for(i=0;i<gyou;i++){                      /*二次元配列tableに入力した数値を代入*/

    for(j=0;j<retu;j++){

      printf("セル[%d][%d]=",i+1,j+1);      /*セルの出力*/
          scanffor(i=("%d",&x);                       /*xの値を入力*/

      table[i][j]=x;                      /*table[i][j]にdatの値を代入*/                                                                                                   
    }
      }
      
      for(i=0;i<retu;i++) {                     /*各列の合計を出す*/
        for(j=0;j<gyou;j++){


      retugoukei +=table[j][i];             /*合計を出す*/
          retumax[j]=table[j][i];               /*最大値について配列に格納*/
    }



        Retugoukei[i]=retugoukei;               /*合計を配列に代入*/
    retugoukei=0;                           /*合計の初めの値を定義*/
    max=retumax[0];                         /*列の最大値の決定*/
    for(m=0;m<j;m++) if (max<retumax[m]) max=retumax[m];
    table[gyou][i]=max;
      }

      for(i=0;i<gyou;i++) {                     /*各行の合計を出す*/
    for(j=0;j<retu;j++){

      gyougoukei +=table[i][j];             /*合計を出す*/
      gyoumax[j]=table[i][j];               /*最大値について配列に代入*/

    }



    Gyougoukei[i]=gyougoukei;               /*合計を配列に代入*/
    gyougoukei=0;                           /*合計の初めの値を定義*/
    max=gyoumax[0];                         /*行の最大値決定*/
    for(m=0;m<j;m++) if (max<gyoumax[m]) max=gyoumax[m];
    table[i][retu]=max;          

      }

     for(i=0;i<gyou;i++)   table[i][retu+1] =Gyougoukei[i];    
     for(j=0;j<retu;j++)   table[gyou+1][j] =Retugoukei[j];

     printf("以上のデータより表は次のようになります\n\n");


     for(i=0;i<gyou+2;i++) {                   /*表を出力し,最大値合計値が各行各列最後のセルにくるようにする*/
   
    for(j=0;j<retu+2;j++){                 

      x=table[i][j];
      printf("%d\t",x);
    }
    printf("\n\n"); 
      }

      
      return 0;
                                                                                 
    }


No.12168

Re:表計算プログラム
投稿者---あかま(2004/01/26 21:42:16)


インデントがいい加減で読みにくいです。
ただコメント付いてて分かりやすかったけど。

>ポインタを用いるともっと
>簡単なプログラムになると思うのですが
>ポインタを用いるとどんなプログラムになるのですか。
>どなたか教えて頂けないでしょうか。
個人的に思う。たぶん簡単にならない。というよりポインタの使いどころがない。
せいぜい2次元配列を動的に確保するぐらいでしょう。
でも2次元配列の動的確保は結構めんどくさいです。逆に複雑になります。
過去ログにありますので、気になりましたらどうぞ。

No.12174

Re:表計算プログラム
投稿者---NykR(2004/01/27 00:38:55)


>個人的に思う。たぶん簡単にならない。というよりポインタの使いどころがない。
>せいぜい2次元配列を動的に確保するぐらいでしょう。

強いて言えば、配列を構造体に突っ込んで不完全型だけを公開するようにすれば、例えば「空欄を見分ける」というようなことをするのに、
表自身が自動的に空欄の位置を記憶するようにさせることが出来るので便利かもしれません。

#別に簡単にはならない

↓面倒なのでstaticで隠蔽。これだと表は一つだけど、ポインタを使えば表がいっぱい作れるんだよってことで。
###############################################################################
#  Table.h                                                                    #
###############################################################################

#ifndef TABLE_H_INCLUDED
#define TABLE_H_INCLUDED

#define NCOL 10
#define NROW  10

int     hasValue(int col, int row);
double  getValue(int col, int row);
void    setValue(int col, int row, double value);

#endif /* #ifndef TABLE_H_INCLUDED */




###############################################################################
#  Table.c                                                                    #
###############################################################################

#include "Table.h"

static double   table[NCOL + 1][NROW + 1] = {{0.0}};
static int      has_value[NCOL][NROW]     = {{0}};

int    hasValue(int col, int row) { return has_value[col][row]; }
double getValue(int col, int row) { return table[col][row];     }
void   setValue(int col, int row, double value)
{
    if (col < 0 || col >= NCOL || row < 0 || row >= NROW)
        return;

    has_value[col][row] = 1;

    table[NCOL][row] -= table[col][row];
    table[col][NROW] -= table[col][row];
    table[NCOL][NROW] -= table[col][row];

    table[col][row] = value;

    table[NCOL][row] += table[col][row];
    table[col][NROW] += table[col][row];
    table[NCOL][NROW] += table[col][row];
}




###############################################################################
#  main.c                                                                     #
###############################################################################


#include "Table.h"
#include <stdio.h>

#define HLINE1 "+----------"
#define HLINE2 "+=========="
#define BLANK  "|          "

int main(void)
{
    for (;;) {
        int     i, j;
        double  val;

        printf("Cell (usage:col, row    max:%d,%d)\n> ", NCOL, NROW);
        if (scanf("%d, %d", &i, &j) != 2) break;
        printf("Value\n> ");
        if (scanf("%lf", &val) != 1) break;

        setValue(i - 1, j - 1, val);

        for (i = 0; i < NCOL; i++) {
            for (j = 0; j < NROW; j++) printf( HLINE1 );    puts("+" HLINE1 "+");
            for (j = 0; j < NROW; j++)
                if (!hasValue(i, j)) printf( BLANK );
                else printf("|%9.2g ", getValue(i, j));
            printf("||%9.2g |\n", getValue(i, j));
        }
        for (j = 0; j < NROW; j++) printf( HLINE2 );    puts("+" HLINE2 "+");
        for (j = 0; j < NROW; j++) printf("|%9.2g ", getValue(i, j));
        printf("||%9.2g |\n", getValue(i, j));
        for (j = 0; j < NROW; j++) printf( HLINE1 );    puts("+" HLINE1 "+");
    }
    return 0;
}