学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
御魁

学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#1

投稿記事 by 御魁 » 3年前

「キーボードから0または負の数値を入力するまでに読み込んだ正の整数のうちの最大値、最小値、合計値、平均値を表示するプログラム」をwhile文でつくる、という課題なのですが、全然わからなくて困ってます...。
一応自分でプログラムを作ってみたのですが、きちんと動きません。
下に書いとくんで誰かアドバイス下さい!お願いします!!


   int n,max,sum,s,min;
float ave;
   n=max=sum=s=0; {
          printf("data=");
scanf("%d",&n);
sum+=n;
  s++;
if(n>max)
max=n;
if(n!=0)
if(n<min)
min=n

s--;
ave=sum/s;
printf("最大値は%dで合計は%dで平均は%fで最小値は%dです¥n",max,sum,ave,min);
return0;


(ゲーム機から書いてるので改行とかおかしいです)

box
記事: 1745
登録日時: 9年前

Re: 学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#2

投稿記事 by box » 3年前

ちょっとしたサンプルです。

コード:

#include <stdio.h>

void read_data(int *max, int *min, int *sum, int *count)
{
    int data;

    while (printf("input data:"), scanf("%d", &data) == 1 && data > 0) {
        if (*count == 0) {
            *max = *min = data;
        }
        else {
            if (data > *max) {
                *max = data;
            }
            if (data < *min) {
                *min = data;
            }
        }
        *sum += data, (*count)++;
    }
}

void print_data(int max, int min, int sum, int count)
{
    printf("maximum data = %d\n", max);
    printf("minimun data = %d\n", min);
    printf("total        = %d\n", sum);
    printf("average      = %f\n", (double) sum / count);
}

int main(void)
{
    int maximum, minimum, total = 0, n = 0;

    read_data(&maximum, &minimum, &total, &n);
    print_data(maximum, minimum, total, n);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#3

投稿記事 by みけCAT » 3年前

御魁 さんが書きました:
   int n,max,sum,s,min;
float ave;
   n=max=sum=s=0; {
          printf("data=");
scanf("%d",&n);
sum+=n;
  s++;
if(n>max)
max=n;
if(n!=0)
if(n<min)
min=n

s--;
ave=sum/s;
printf("最大値は%dで合計は%dで平均は%fで最小値は%dです¥n",max,sum,ave,min);
return0;


(ゲーム機から書いてるので改行とかおかしいです)
とりあえずコンパイルが通るように整形しておきました。

コード:

#include <stdio.h>

int main(void) {
	int n,max,sum,s,min;
	float ave;
	n=max=sum=s=0;
	{
		printf("data=");
		scanf("%d",&n);
		sum+=n;
		s++;
		if(n>max)
			max=n;
		if(n!=0)
			if(n<min)
				min=n;
	}
	s--;
	ave=sum/s;
	printf("最大値は%dで合計は%dで平均は%fで最小値は%dです¥n",max,sum,ave,min);
	return 0;
}
オフトピック
さすがにおかしすぎないか…?なぜわざわざこんな大量のスペース(引用で元のテキストを表示すると見える)を入れた…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

inemaru
記事: 108
登録日時: 3年前

Re: 学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#4

投稿記事 by inemaru » 3年前

とりあえず、タイピングミスじゃなさそうな部分で問題になりそうな点を上げてみます。
  • 変数 min が比較に使用しているのに初期化されていない
  • sum / s の部分は、整数で計算されてしまう
  • 0除算が発生する(変数 s を平均計算前にデクリメントしている為)
[hr]
以下、修正したコードです。
できるだけ、元ソースを意識して簡単にしてあります。
(開発環境が明記されていないので、環境によっては動かないかもしれないです。)

コード:

#if _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <climits>
#else
#include <stdio.h>
#include <limits.h>
#endif

int main(void)
{
	// 変数宣言
	int n, max, sum, s, min;
	float ave;

	// 初期化
	n = max = sum = s = 0;
	min = INT_MAX;	// 最小値は、int型の最大値で初期化する

	// 無限ループ
	// (trueでエラーするようなら1とかに変えてください)
	while (true)
	{
		// 入力をとる
		printf("data =");
		scanf("%d", &n);

		// 入力されたデータが「0」または「負の数」だったらループを抜ける
		// つまり「0」以下なら終了
		if (n <= 0){
			break;
		}

		// 最大値の確認
		if (max < n)
		{
			max = n;
		}

		// 合計
		sum += n;

		// 平均
		++s;
		ave = (float)sum / s;

		// 最小値の確認
		if (min > n)
		{
			min = n;
		}
	}

	// 結果の表示
	printf("最大値は%dで合計は%dで平均は%fで最小値は%dです\n", max, sum, ave, min);

	return 0;
}

box
記事: 1745
登録日時: 9年前

Re: 学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#5

投稿記事 by box » 3年前

いきなり0以下の値を入れたら平均値は計算できない。
そのコードを追加。

コード:

#include <stdio.h>

void read_data(int *max, int *min, int *sum, int *count)
{
    int data;

    while (printf("input data:"), scanf("%d", &data) == 1 && data > 0) {
        if (*count == 0) {
            *max = *min = data;
        }
        else {
            if (data > *max) {
                *max = data;
            }
            if (data < *min) {
                *min = data;
            }
        }
        *sum += data, (*count)++;
    }
}

void print_data(int max, int min, int sum, int count)
{
    printf("maximum = %d\n", max);
    printf("minimun = %d\n", min);
    printf("total   = %d\n", sum);
    if (count != 0) {
        printf("average = %f\n", (double) sum / count);
    }
    else {
        printf("average can't be solved.\n");
    }
}

int main(void)
{
    int maximum, minimum, total = 0, n = 0;

    read_data(&maximum, &minimum, &total, &n);
    print_data(maximum, minimum, total, n);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

御魁

Re: 学校の課題なんですが、どうしてもわからないんです。誰か教えてください!

#6

投稿記事 by 御魁 » 3年前

皆さん有り難う御座いました!
皆さんのプログラムやアドバイスを見ながら試行錯誤したら無事完成しました。
本当にありがとうございました!!!

閉鎖

“C言語何でも質問掲示板” へ戻る