エクセルの2列5行のファイルがあるとします、
このファイルの各列の平均を求める関数をheikinとします。
エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。
また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。
各列ごとにプロトタイプ宣言を行えば求まるのですが、
どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 あー,Windowsの調子がサイアク.レジストリがぶっ壊れてるらしい.ムカツク~~~~,ってこんなことは関係ありませんね,ごめんなさい.



 統計処理の知識は,私からはもう消え去ってしまいましたが,とりあえず,プログラムの書き方的にそれほどおかしなところはない様に思いますが.

 ただ,bb()の中で,変数 sum1 と変数 sum2 の値を初期化しないまま,直後に += 演算しちゃっているのが気になります.
 Cの仕様でそこまで規定されていたかどうか知りませんが,ひょっとして,変数を宣言して確保しただけでは,その領域の,内容の初期化までは保証されていなかったのでは?.(自信がありません.)

 後細かいことを言いますが,関数の定義で,引数に double x[N] とかで N を書いているのは無意味ではないかしら.
    • good
    • 0

stanakaさんの仰るとおり,sum1,sum2の初期化がされてないのは


問題です.関数内で動的に割当てられた変数内には最初,不定値(何か
分からない値)が入っています.heikin()の中でやってるように,
sum1=0.0; sum2=0.0;としましょう.

あと,個人的に気になるのは,sum/Nです.Nは定数な訳ですが,
定数はどういう型として扱われるんでしょうね?もし,int型と
解釈された場合,sum/Nの演算は整数同士の演算として扱われ,
小数点以下は必ず0になると思います.神経質かもしれませんが,
私ならsum/(double)Nとしますね.
    • good
    • 0

 Cでプログラムを書かれるのは初めてですか?.



 質問の意味が激しく不明です.おそらく用語の問題だと思うので,次の例を見て用語を直しての補足をお願いします.それほど分らない用語はないと思いますが・・・.次の記述はあくまでも例で,あなたの考えているものとは違うと思いますが.
-------------------
ファイル heikin.h
/* 関数heikin()のプロトタイプ宣言 */
/* 返り値はfloat型,引数columnはint型 */

float heikin( int column );

-------------------

ファイル heikin.c
/* 関数heikin()本体の定義 */

float heikin( int culumn ){
 なんとかかんとか・・・・・・.
}

-------------------

ファイル main.c
/* プログラム本体(main関数) */

#include <stdio.h>
#include "heikin.h"
/* 関数heikin()を使うので,プロトタイプ宣言を取り込む */

int main( int argc, char *argv[] ){
 heikin()を使って処理本体を書く.
}
-------------------

 申しわけありませんが,私はWindowsのプログラミングに関してはほとんど分りませんので,問題がExcelのファイルに関する特有の処理であれば,的外れなことを言ってるかもしれませんが,お許し願います.
 いずれにしても,Cのカテゴリでの質問ですので,Cと仮定してお話しています.

この回答への補足

言葉足らずで申し訳ありません。
私の作ったモノを載せておきます
回帰直線のパラメータと回帰直線を求める物です。

#include <stdio.h>
#define N 5
FILE *fp1;
double bb(double y[N],double x[N]);
double heikin(double a[N]);
int main(void) {
long int i;
double y[N],x[N],mx,my,a,b;

fp1=fopen("data2.csv","r");
for(i=0;i<N;i++){
fscanf(fp1,"%lf,%lf",&y[i],&x[i]);}
fclose(fp1);
b=bb(y,x);
my=heikin(y);
mx=heikin(x);
a=my-b*mx;

printf("パラメータaは%.2fです。\nパラメータbは%.2fです。\n",a,b);
if(a<0) printf("直線回帰式はy=%.2fx%.2f\n",b,a);
else printf("直線回帰式はy=%.2fx+%.2f\n",b,a);
return(0);
}
double bb(double y[N],double x[N])
{ long int i;
double sum1,sum2,my,mx;
my=heikin(y);
mx=heikin(x);

for(i=0;i<N;i++){
sum1+=(x[i]-mx)*(x[i]-mx);
sum2+=(y[i]-my)*(x[i]-mx);}
return(sum2/sum1);
}

double heikin(double x[N])
{ long int i;
double sum=0.0;
for(i=0;i<N;i++){
sum+=x[i];}

return(sum/N);
}

ご回答ありがとうございます
大体は理解できたのですが、heikinで平均を求めそれをbbで呼び出すんですが、実行した時に1回目はうまくいくんですが2回目に実行したら全然違う答えが返ってくるんです。。返り値が違うんでしょうか?

補足日時:2002/02/10 23:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q関数のプロトタイプ宣言の文法は次のようになります。

関数のプロトタイプ宣言の文法は、次のようになります。 
 型 関数名(引数);
 関数定義から処理部分を取り除き、ひとつのステートメントとして完結するように、文末に;
を付けてたものになります。
 基本的に関数を呼び出すための形式を宣言するためのものですから、型、関数名、引数は
関数定義と同じになります。プロトタイプ宣言は、対象となる関数を呼び出す前に行う必要があります。
 
 
以上は参考書の説明ですが!「関数定義から”処理部分”を取り除き」とあります。
 その中の”処理部分”とは何を指すのでしょうか!?
 宜しくお願いします。


 

Aベストアンサー

関数の定義の方法は、理解できていますか?

型 関数名(引数){
※ここ
}

って感じですよね?

では、「{※ ここ}」は何するためのものですか?

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

QC言語 関数プロトタイプ宣言の引数に配列を入れたいのですが

関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。

A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。

良い方法は無いでしょうか?

Aベストアンサー

下のように書けばよいと思います。

#include <stdio.h>

void func(int arr[4][4]);
void func2(int (*arr)[4]);

int main(void)
{
int array[4][4];

func(array);
func2(array);
return 0;
}

void func(int arr[4][4])
{

}

void func2(int (*arr)[4])
{

}

Qborlandでコンパイルすると、「プロトタイプ宣言のない関数 'exit' の呼び出し」という警告が出てきます。

borlandでコンパイルすると、「プロトタイプ宣言のない関数 'exit' の呼び出し」という警告が出てきます。
一応ソースの文頭には、

#include<stdio.h>

を入れているのですが、この警告を出なくするのにはどの様にしたらいいのでしょうか?

Aベストアンサー

以下を参照してください。二番目のURLは一番目のスレの続きみたいです。

参考URL:http://ybbs.admin-man.net/8500/0002/00003098.htm,http://ybbs.admin-man.net/8500/0002/00003101.htm

Qmain関数の中でパラメータを宣言

c言語で積分をしています。

a~bまで積分する関数を
dobule integral(double (*f)(double), double a, double b)
{
・・・・・・
return s; /*sが計算結果*/
}
としています。


fx=x*x を積分するときは
double fx(double x)
{
return x*x;
}
を用意して、

main()
{
double ans = integral(fx, 0.0, 1.0);
}
という具合で現在やっています。


本題なのですが、
main関数の中でxを宣言して、そのxで同じように積分をしたいのです。
どうすればよいのでしょうか?
良い方法があれば教えて頂きたいです。

Aベストアンサー

No2の方が既に書いてますように、gxを定義して、gxを呼び出す形になると思います。mainの中で、x1=x/3を定義するのは、無理があります。ここでxは、本来、integral関数の中で、a~bまでxを変化させる時の用途で用いられます。従って、integral関数の中でのみ、意味があります。
従って
double gx(double x)
{
double x1;
x1 = x/3.0;
return fx(x);
}
の関数を定義します。
main関数で
ans = integral(gx,0.0,1.0);
とすれば、integral関数の中からgxを呼び出すはずですので、このようにするのが最も素直な方法かと思います。


人気Q&Aランキング

おすすめ情報