プログラム実行時に任意で決めた個数分、動的にメモリ確保を行って入力された数値データを用い、そのデータ中の最大値、最小値、平均値を表示するプログラムを配列をしようしないで完成させたいのですが教えて下さい。
#include<stdio.h>
#include<stdlib.h>
void statistics(int n,double *x, double *max, double *min, double *av);
int main(void)
{
double *x;
double max, min, av;
int i, num;
printf("データをいくつ入力しますか?");
scanf("%d", &num);
x = (double *)malloc(sizeof(double) * num);
if(x == NULL){
printf("メモリが確保できません\n");
return 1;
}
for( i = 0; i < num; i++){
printf("%d番目のデータ:", i + 1);
scanf("%lf", (x + i));
}
statistics( i, x, &max, &min, &av);
printf("入力データの最大値:%lf\n", max);
printf("入力データの最小値:%lf\n", min);
printf("入力データの平均値:%lf\n", av);
free(x);
return(0);
}
void statistics(int n,double *x, double *max, double *min, double *av)
{
{ここの関数の中がわかりません}
}
メモリ確保、最大値、最小値、平均値表示方法
Re:メモリ確保、最大値、最小値、平均値表示方法
その関数の中で行われなければならないことは
最大値
最小値
平均
を求めることですよね。
では求めましょう。
n個のデータをそれぞれ比較し、最大値に代入、最小値に代入しましょう。
その時にすべての合計も必要です。
比較しないといけないデータは*(x+i)の中に入ってるはずですよね。
では入力と同じようにすればできるのではないでしょうか?
{
int i;
double goukei=0.0;
*max=*x;
*min=*x;
for(i=0;i<n;i++){
if(*(x+i)<*min)*min=*(x+i);
if(*max<*(x+i))*max=*(x+i);
goukei+=*(x+i);
}
*ave=goukei/i;
}
確保とかは苦手なので
見すっていたらすいません。
==
ちょっと修正。
=========
自分で回してみたところ盛大に見すってるっぽいのでこのプログラムは参考にしないでください。
恥ずかしいから消したい・・・
===
修復完了

最大値
最小値
平均
を求めることですよね。
では求めましょう。
n個のデータをそれぞれ比較し、最大値に代入、最小値に代入しましょう。
その時にすべての合計も必要です。
比較しないといけないデータは*(x+i)の中に入ってるはずですよね。
では入力と同じようにすればできるのではないでしょうか?
{
int i;
double goukei=0.0;
*max=*x;
*min=*x;
for(i=0;i<n;i++){
if(*(x+i)<*min)*min=*(x+i);
if(*max<*(x+i))*max=*(x+i);
goukei+=*(x+i);
}
*ave=goukei/i;
}
確保とかは苦手なので
見すっていたらすいません。
==
ちょっと修正。
=========
自分で回してみたところ盛大に見すってるっぽいのでこのプログラムは参考にしないでください。
恥ずかしいから消したい・・・
===
修復完了

Re:メモリ確保、最大値、最小値、平均値表示方法
最大値、最小値、平均値くらいなら
毎度入力された値と比較していけば
わざわざ動的なメモリの確保や配列なしでいけるんじゃないでしょうか
多分こんな感じで
#include<stdio.h>
#include<stdlib.h>
struct str{
int x;
double max,min,sum;
int num;
};
int main(void)
{
int i,flag=0;
struct str par;
//構造体の値
par.sum=0;
par.max=0;
par.min=0;
printf("データをいくつ入力しますか?");
scanf("%d", &par.num);
for( i = 0; i < par.num;i++){
printf("%d番目のデータ:",i+1);
scanf("%d", (&par.x));
printf("x=%d\n",par.x);
//最初に入力された値が最大であり最小
if(flag==0){
par.max=par.x;
par.min=par.x;
printf("max=%f\nmin=%f\n",par.max,par.min);
flag=1;
}
//入力された値が最大値より大きい場合
if(par.max<par.x){
par.max=par.x;
printf("swap max:%f\n",par.max);
}
//入力された値が最大値より小さい場合
if(par.min>par.x){
par.min=par.x;
printf("swap min:%f\n",par.min);
}
//平均値は途中の値はいらないので
//和をとっておき
//全て足した後に割ればよい
par.sum+=par.x;
printf("sum=%f\n",par.sum);
}
printf("入力データの最大値:%f\n", par.max);
printf("入力データの最小値:%f\n", par.min);
printf("入力データの平均値:%f\n", par.sum/i);
return(0);
}
毎度入力された値と比較していけば
わざわざ動的なメモリの確保や配列なしでいけるんじゃないでしょうか
多分こんな感じで
#include<stdio.h>
#include<stdlib.h>
struct str{
int x;
double max,min,sum;
int num;
};
int main(void)
{
int i,flag=0;
struct str par;
//構造体の値
par.sum=0;
par.max=0;
par.min=0;
printf("データをいくつ入力しますか?");
scanf("%d", &par.num);
for( i = 0; i < par.num;i++){
printf("%d番目のデータ:",i+1);
scanf("%d", (&par.x));
printf("x=%d\n",par.x);
//最初に入力された値が最大であり最小
if(flag==0){
par.max=par.x;
par.min=par.x;
printf("max=%f\nmin=%f\n",par.max,par.min);
flag=1;
}
//入力された値が最大値より大きい場合
if(par.max<par.x){
par.max=par.x;
printf("swap max:%f\n",par.max);
}
//入力された値が最大値より小さい場合
if(par.min>par.x){
par.min=par.x;
printf("swap min:%f\n",par.min);
}
//平均値は途中の値はいらないので
//和をとっておき
//全て足した後に割ればよい
par.sum+=par.x;
printf("sum=%f\n",par.sum);
}
printf("入力データの最大値:%f\n", par.max);
printf("入力データの最小値:%f\n", par.min);
printf("入力データの平均値:%f\n", par.sum/i);
return(0);
}
Re:メモリ確保、最大値、最小値、平均値表示方法
statistics関数使うの忘れてました
#include<stdio.h>
#include<stdlib.h>
struct str{
int x;
double max,min,sum;
int num;
};
struct str statistics(struct str par);
int main(void)
{
int i;
struct str par;
//構造体の値
par.sum=0;
par.max=0;
par.min=0;
printf("データをいくつ入力しますか?");
scanf("%d", &par.num);
for( i = 0; i < par.num;i++){
printf("%d番目のデータ:",i+1);
scanf("%d", (&par.x));
printf("x=%d\n",par.x);
par=statistics(par);
}
printf("入力データの最大値:%f\n", par.max);
printf("入力データの最小値:%f\n", par.min);
printf("入力データの平均値:%f\n", par.sum/i);
return(0);
}
struct str statistics(struct str par){
static flag=0;
//最初に入力された値が最大であり最小
if(flag==0){
par.max=par.x;
par.min=par.x;
printf("max=%f\nmin=%f\n",par.max,par.min);
flag=1;
}
//入力された値が最大値より大きい場合
if(par.max<par.x){
par.max=par.x;
printf("swap max:%f\n",par.max);
}
//入力された値が最大値より小さい場合
if(par.min>par.x){
par.min=par.x;
printf("swap min:%f\n",par.min);
}
//平均値は途中の値はいらないので
//和をとっておき
//全て足した後に割ればよい
par.sum+=par.x;
printf("sum=%f\n",par.sum);
return par;
}
#include<stdio.h>
#include<stdlib.h>
struct str{
int x;
double max,min,sum;
int num;
};
struct str statistics(struct str par);
int main(void)
{
int i;
struct str par;
//構造体の値
par.sum=0;
par.max=0;
par.min=0;
printf("データをいくつ入力しますか?");
scanf("%d", &par.num);
for( i = 0; i < par.num;i++){
printf("%d番目のデータ:",i+1);
scanf("%d", (&par.x));
printf("x=%d\n",par.x);
par=statistics(par);
}
printf("入力データの最大値:%f\n", par.max);
printf("入力データの最小値:%f\n", par.min);
printf("入力データの平均値:%f\n", par.sum/i);
return(0);
}
struct str statistics(struct str par){
static flag=0;
//最初に入力された値が最大であり最小
if(flag==0){
par.max=par.x;
par.min=par.x;
printf("max=%f\nmin=%f\n",par.max,par.min);
flag=1;
}
//入力された値が最大値より大きい場合
if(par.max<par.x){
par.max=par.x;
printf("swap max:%f\n",par.max);
}
//入力された値が最大値より小さい場合
if(par.min>par.x){
par.min=par.x;
printf("swap min:%f\n",par.min);
}
//平均値は途中の値はいらないので
//和をとっておき
//全て足した後に割ればよい
par.sum+=par.x;
printf("sum=%f\n",par.sum);
return par;
}