掲示板ランキング  プラスター(温感)  プラスター(目立たない)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7172

標準偏差がわかりません
投稿者---C初心者(2007/02/26 11:38:55)


今、三つの値の最小値と平均と標準偏差を求める問題をやっています。
最小値を求める関数と平均、標準偏差を求める関数との二つの関数に分けて
やるのですが、平均と標準偏差がmain関数の方に出力されません。
このプログラムのどこが悪いのでしょうか?
すいませんがよろしくお願いします。

#include<stdio.h>
#include<math.h>
int getmin(int x,int y,int z);
void getavsd(int x,int y,int z);
int main(void){
int x,y,z,ave;
double sd;


printf("x,y,z=");
scanf("%d,%d,%d",&x,&y,&z);

printf("Min=%d\n",getmin(x,y,z));

ave=getavsd(ave);
printf("Av.=%d\n",ave);

sd=getavsd(sd);
printf("Sd.=%f\n",sd);

return (0);
}
int getmin(int x,int y,int z){
int min;
min=x;
if(min>y){
min=y;
}
if(min>z){
min=z;
}
return min;
}
void getavsd(int x,int y,int z){
int ave,total,wa,ave2;
double sd,n;

total=x+y+z;
ave=total/3;

wa=x*x+y*y+z*z;
ave2=ave*ave;

n=wa/3-ave2;
sd=sqrt(n);
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:標準偏差がわかりません 7174 jazz 2007/02/26 11:56:15
<子記事> Re:標準偏差がわかりません 7179 επιστημη 2007/02/26 14:26:21
<子記事> Re:標準偏差がわかりません 7182 - 2007/02/26 15:12:22
<子記事> Re:標準偏差がわかりません 7184 円零 2007/02/26 18:21:18


No.7174

Re:標準偏差がわかりません
投稿者---jazz(2007/02/26 11:56:15)


>平均と標準偏差がmain関数の方に出力されません。
>void getavsd(int x,int y,int z);
> ave=getavsd(ave);
> sd=getavsd(sd);

引数の型・数と戻り値について再検討してください。


この投稿にコメントする

削除パスワード

No.7176

Re:標準偏差がわかりません
投稿者---C初心者(2007/02/26 12:42:59)


>引数の型・数と戻り値について再検討してください。

ありがとうございます。
引数の型・数と戻り値についてもう一度考えてみたんですが、
どのように修正したらよいのでしょうか?


この投稿にコメントする

削除パスワード

No.7177

Re:標準偏差がわかりません
投稿者---jazz(2007/02/26 13:45:28)


>どのように修正したらよいのでしょうか?

No.7174の回答で引用したコードの
どこが正しくないか、わかりますか?


この投稿にコメントする

削除パスワード

No.7178

Re:標準偏差がわかりません
投稿者---C初心者(2007/02/26 13:51:01)


>No.7174の回答で引用したコードの
>どこが正しくないか、わかりますか?

わからないです。すいません。
どこが正しくないのでしょうか?


この投稿にコメントする

削除パスワード

No.7192

Re:標準偏差がわかりません
投稿者---asd(2007/02/27 09:21:07)


>わからないです。すいません。
>どこが正しくないのでしょうか?

わざわざ引用までして指摘されているのですから、
引用されている関数宣言、定義がおかしいのでは?と思って欲しいところですが・・・。

初心者を名乗るのであればそれなりの本なり資料なりがあるかと思います。

考えて分からないなら調べてみてください。


この投稿にコメントする

削除パスワード

No.7179

Re:標準偏差がわかりません
投稿者---επιστημη(2007/02/26 14:26:21)
http://blogs.wankuma.com/episteme/


えーと…、どこを修正と言われたら「全部」。
勉強し直し。




この投稿にコメントする

削除パスワード

No.7182

Re:標準偏差がわかりません
投稿者----(2007/02/26 15:12:22)


#include <stdio.h>
#include <math.h>

#define NUM (3)

double getmin(double *arr, int n);
void getavsd(double *arr, int n, double *av, double *sd);

int main(void)
{
    double arr[NUM], av, sd;
    int i;
    
    for (i = 0; i < NUM; i++) {
        printf("%d番目の数を入力 > ", i + 1);
        scanf("%lf", &arr[i]);
    }
    
    printf("最 小 値=%f\n", getmin(arr, NUM));
    getavsd(arr, NUM, &av, &sd);
    printf("平 均 値=%f\n", av);
    printf("標準偏差=%f\n", sd);
    return 0;
}

double getmin(double *arr, int n)
{
    double min;
    int i;
    
    for (min = arr[0], i = 1; i < n; i++)
        if (arr[i] < min)
            min = arr[i];
    return min;
}

void getavsd(double *arr, int n, double *av, double *sd)
{
    double sum, sumsq;
    int i;
    
    for (sum = sumsq = i = 0; i < n; i++) {
        sum += arr[i];
        sumsq += arr[i] * arr[i];
    }
    *av = sum / n;
    *sd = sqrt(sumsq / n - *av * *av);
}




この投稿にコメントする

削除パスワード

No.7184

Re:標準偏差がわかりません
投稿者---円零(2007/02/26 18:21:18)


こういうことをしたかった、わけじゃないんだろうなと思いつつ混乱させてみる。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <math.h>

#define BUF 10

typedef struct S_Set{
    int *item;
    int count;
    int sum;
    int min;
    void (*setitem)(struct S_Set *set, int i);
    double (*getave)(struct S_Set *set);
    double (*getsd)(struct S_Set *set);
}Set;

void set_item(Set *set, int i);
double get_ave(Set *set);
double get_sd(Set *set);

Set newSet(Set *set){
    static Set newset = {NULL, 0, 0, INT_MAX, set_item, get_ave, get_sd};
    memcpy(set, &newset, sizeof(Set));
    return *set;
}

int main(void){
    Set set = newSet(&set);
    int i, n;
    printf("x,y,z=");
    for(i = 0; i < 3; i++){
        scanf("%d", &n);
        set.setitem(&set, n);
    }
    printf("Min=%d\n", set.min);
    printf("Av.=%f\n", set.getave(&set));
    printf("Sd.=%f\n", set.getsd(&set));
    return 0;
}

void set_item(Set *set, int i){
    void *vp;
    if(set->count % BUF == 0){
        vp = realloc(set->item, sizeof(int) * (set->count + BUF));
        if(vp) set->item = vp;
        else exit(1);
    }
    set->item[set->count] = i;
    set->count++;
    set->sum += i;
    if(set->min > i) set->min = i;
}

double 
get_ave(Set *set){
    return (double)set->sum / set->count;
}

double get_sd(Set *set){
    int i, c = set->count,  d, d2 = 0;
    double a = set->getave(set);
    for(i = 0; i < c; i++){
        d = set->item[i] - a;
        d2 += d * d;
    }
    return sqrt(d2 / set->count);
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ