配列を用いて指定の機能を実現するためのプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ちゃん
記事: 4
登録日時: 8年前

配列を用いて指定の機能を実現するためのプログラム

#1

投稿記事 by ちゃん » 8年前

初めてトピックを立てさせていただきます"ちゃん"です。
宜しくお願いいたします。

int型10個の初期値を持つ配列に対し、
①再入力(input) ②表示(output) ③昇順での並び替え(min) ④降順での並び替え(max) ⑤総和の算出(total) ⑥平均値の算出(ave)
の機能を実現、
また、総和の算出はint型の範囲を超えても算出可能とするプログラムを作成したいのですが、以下のコードをコンパイルすると、
"Input Command"を求められた際に、どんな数字を入力しても再び"Input Command"を求められてしまいます。

各機能を実現するためには何が必要か、どなたかご教示願えませんでしょうか。
宜しくお願いいたします。

コード:

#include <stdio.h>
#define DSIZE 10

void input(int *array);
void output(int *array);
void min(int *array);
void max(int *array);
void total(int *array);
void ave(int *array);

void input(int *array)
{
	int i;

	for(i = 0; i < DSIZE; i++)
	{
	printf(" Input %2dth data :", i + 1);
	scanf("%4d", array[i]);

        array++;
	}
	printf("\n");
}

void output(int *array)
{
	int i;
	
	printf("\n Array :");

	for(i = 0; i < DSIZE; i++)
        {
	printf("%4d", array[i]);
        array++;
        }

	printf("\n");
}

void min(int *array)
{
    int i, j, num;
    
    for (i = 0; i < DSIZE - 1; i++) 
    {
        for (j = i + 1; j < DSIZE; ++j) 
	{
            if (array[i] < array[j]) 
	    {
                num = array[i];
                array[i] = array[j];
                array[j] = num;
            }
        }
    }

	printf("\n Array :");
	
	for(i = 0; i < DSIZE; i++)
	printf("%4d", array[i]);

	printf("\n");
}

void max(int *array)
{	
	int i,j,num;
	
	  for (i = 0; i < DSIZE; i++)
	{
	    for (j = i + 1; j < DSIZE; j++)
	{
	      if (array[i] < array[j])
	     {
	        num =  array[i];
	        array[i] = array[j];
	        array[j] = num;
	      }
	    }
	  }

	printf("\n Array :");
	
	for(i = 0; i < DSIZE; i++)
	printf("%4d", array[i]);

	printf("\n");
}

void total(int *array)
{
	int i;
        int sum;
	
	for(i = 0; i < DSIZE; i++)
	sum += array[i];

	printf("\n Total is %4d\n", sum);
}

void ave(int *array)
{
	int i;
	double sum;
	
	for(i = 0; i < DSIZE; i++)
	sum += array[i];

	printf(" Average is %.1f\n", sum / 10.0);
}


int main(void)
{
int array[] = { 1, -2, 3, -5, 7, -11, 13, -15, 17, -19 };
int code;

	printf("Welcome to array system\n");
	while( code != 0 )  {
		printf("\n Input data   --> 1");
		printf("\n Output data  --> 2");
		printf("\n Minimum sort --> 3");
		printf("\n Maximum sort --> 4");
		printf("\n Total        --> 5");
		printf("\n Average      --> 6");
		printf("\n End          --> 0");
		printf("\n\n Input Command : ");	scanf("%d",&code);
}
/* この部分でコマンドの解析を行い、それに対応した各関数を呼び出す */

//再入力
if (code == 1)
input(array);

//表示
if (code == 2)
output(array);

//昇順
if (code == 3)
min(array);

//降順
if (code == 4)
max(array);

//総和
if (code == 5)
total(array);

//平均値
if (code == 6)
ave(array);

return 0;
}
最後に編集したユーザー ちゃん on 2016年5月10日(火) 00:48 [ 編集 3 回目 ]

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

Re: 配列を用いて指定の機能を実現するためのプログラム

#2

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

コードを提示する際は、BBCodeを有効にした(無効にしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。

とりあえず
ちゃん さんが書きました:以下のコードをコンパイルすると、
"Input Command"を求められた際に、どんな数字を入力しても再び"Input Command"を求められてしまいます。
再現できませんでした。
0を入力すると、"Input Command"を再び求められずにプログラムが停止しました。
実行結果 → https://ideone.com/StRoCG
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 配列を用いて指定の機能を実現するためのプログラム

#3

投稿記事 by box » 8年前

ちゃん さんが書きました:

コード:

	array++;
	array++;
この2行、必要ですか?
ちゃん さんが書きました:

コード:

		  for (i = 0; i < DSIZE; i++)
	{
	    for (j = i + 1; j < DSIZE; j++)
	{
	      if (array[i] < array[j])
arrayが配列の定義範囲外の領域を指すように見えます。
ちゃん さんが書きました:

コード:

	sum += array[i];
	sum += array[i];
初期化していないsumに足し込んでいくのはまずいと思います。
ちゃん さんが書きました:

コード:

	printf(" Average is %.1f\n", sum / 10.0);
どうして10.0という固定値を使っているのですか?配列のサイズが変わったとき、どうしますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 配列を用いて指定の機能を実現するためのプログラム

#4

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

ちゃん さんが書きました:

コード:

scanf("%4d", array[i]);
ポインタを渡すべき場所にポインタでないものを渡しているため、未定義動作です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 配列を用いて指定の機能を実現するためのプログラム

#5

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

box さんが書きました:
ちゃん さんが書きました:

コード:

		  for (i = 0; i < DSIZE; i++)
	{
	    for (j = i + 1; j < DSIZE; j++)
	{
	      if (array[i] < array[j])
arrayが配列の定義範囲外の領域を指すように見えます。

それはなぜですか?
もし引数arrayにmain関数で定義された配列arrayの最初の要素へのポインタが渡された場合、
この配列の要素数は10であり、DSIZEも10です。
さらに、array(arrayが指しているオブジェクトやそのまわりのオブジェクトではない)を書き換えるコードも見当たらないので、
arrayが配列の定義範囲外の領域を参照することは無いように見えます。
オフトピック
arrayは整数だからどこも指さないとか、そもそもここはこのプログラムでは実行されないから挙動を考えるのはナンセンスとか、そういうことではなくて。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ちゃん
記事: 4
登録日時: 8年前

Re: 配列を用いて指定の機能を実現するためのプログラム

#6

投稿記事 by ちゃん » 8年前

皆様、ご教示いただきありがとうございます。
指摘していただいた点は修正し、再度コンパイルをかけましたが、やはり最初のscanfでループしてしまいます...。
何度もコードを見直しましたが、解決方法が皆目検討がつきません。

どうか再度ご教示のほどをよろしくお願いいたします。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 配列を用いて指定の機能を実現するためのプログラム

#7

投稿記事 by へにっくす » 8年前

ちゃん さんが書きました:皆様、ご教示いただきありがとうございます。
指摘していただいた点は修正し、再度コンパイルをかけましたが、やはり最初のscanfでループしてしまいます...。
何度もコードを見直しましたが、解決方法が皆目検討がつきません。

どうか再度ご教示のほどをよろしくお願いいたします。
修正したソースを載せてください。
それをしないで修正したと言っても、本当に修正したのかこちらでは分かりません。
(こちらが思う修正点と、あなたが修正した点は違っているかもしれないのですから)
written by へにっくす

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

Re: 配列を用いて指定の機能を実現するためのプログラム

#8

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

最初のコードが書き換わっていますね。
書き換えられる前のコードはこれです。
書き換えられる前のコードと書き換えられた後のコードを比較すると、少なくとも18行目のscanfの引数が変わっていますが、
今度は間違った型のオブジェクトへのポインタが渡されているので同じく実行されればundefined behaviorですね。

>> ちゃんさん
投稿したコードを書き換えることは
  • 話の流れがおかしくなる
  • 更新されたことがわかりにくい
というデメリットがあるので、そのようなことはせず、新しいコードは返信で投稿してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 配列を用いて指定の機能を実現するためのプログラム

#9

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

ちゃん さんが書きました:指摘していただいた点は修正し、再度コンパイルをかけましたが、やはり最初のscanfでループしてしまいます...。
何度もコードを見直しましたが、解決方法が皆目検討がつきません。
きちんと0を入力しましたか?
ループの条件が「codeが0以外である間」なので、codeに0が入るまでループするのは当たり前です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 配列を用いて指定の機能を実現するためのプログラム

#10

投稿記事 by かずま » 8年前

インデントをちゃんとしましょうよ。

コード:

int main(void)
{
    int array[] = { 1, -2, 3, -5, 7, -11, 13, -15, 17, -19 };
    int code = 1;

    printf("Welcome to array system\n");
    while (code != 0) {
        printf("\n Input data   --> 1");
        printf("\n Output data  --> 2");
        printf("\n Minimum sort --> 3");
        printf("\n Maximum sort --> 4");
        printf("\n Total        --> 5");
        printf("\n Average      --> 6");
        printf("\n End          --> 0");
        printf("\n\n Input Command : ");
        scanf("%d", &code);
    }
    /* この部分でコマンドの解析を行い、それに対応した各関数を呼び出す */
    if (code == 1) input(array);  // 再入力
    if (code == 2) output(array); // 表示
    if (code == 3) min(array);    // 昇順
    if (code == 4) max(array);    // 降順
    if (code == 5) total(array);  // 総和
    if (code == 6) ave(array);    // 平均値
    return 0;
}
次のようにしないとダメなことが、わかりませんか?

コード:

int main(void)
{
    int array[] = { 1, -2, 3, -5, 7, -11, 13, -15, 17, -19 };
    int code = 1;

    printf("Welcome to array system\n");
    while (code != 0) {
        printf("\n Input data   --> 1");
        printf("\n Output data  --> 2");
        printf("\n Minimum sort --> 3");
        printf("\n Maximum sort --> 4");
        printf("\n Total        --> 5");
        printf("\n Average      --> 6");
        printf("\n End          --> 0");
        printf("\n\n Input Command : ");
        scanf("%d", &code);
        /* この部分でコマンドの解析を行い、それに対応した各関数を呼び出す */
        if (code == 1) input(array);  // 再入力
        if (code == 2) output(array); // 表示
        if (code == 3) min(array);    // 昇順
        if (code == 4) max(array);    // 降順
        if (code == 5) total(array);  // 総和
        if (code == 6) ave(array);    // 平均値
    }
    return 0;
}

ちゃん
記事: 4
登録日時: 8年前

Re: 配列を用いて指定の機能を実現するためのプログラム

#11

投稿記事 by ちゃん » 8年前

皆様、大変失礼いたしました。
先ほど編集したものを前回のコードに戻し、こちらに修正後のコードを貼付しておきます。
ご迷惑おかけいたしました。

コード:

#include <stdio.h>
#define DSIZE 10

void input(int *array);
void output(int *array);
void min(int *array);
void max(int *array);
void total(int *array);
void ave(int *array);

void input(int *array)
{
	int i;

	for(i = 0; i < DSIZE; i++)
	{
	printf(" Input %2dth data :", i + 1);
	scanf("%4d", &array);
	}
	printf("\n");
}

void output(int *array)
{
	int i;
	
	printf("\n Array :");

	for(i = 0; i < DSIZE; i++)
	printf("%4d", array[i]);

	printf("\n");
}

void min(int *array)
{
    int i, j, num;
    
    for (i = 0; i < DSIZE - 1; i++) 
    {
        for (j = i + 1; j < DSIZE; ++j) 
	{
            if (array[i] < array[j]) 
	    {
                num = array[i];
                array[i] = array[j];
                array[j] = num;
            }
        }
    }

	printf("\n Array :");
	
	for(i = 0; i < DSIZE; i++)
	printf("%4d", array[i]);

	printf("\n");
}

void max(int *array)
{	
	int i,j,num;
	
	  for (i = 0; i < DSIZE; i++)
	{
	    for (j = i + 1; j < DSIZE; j++)
	{
	      if (array[i] < array[j])
	     {
	        num =  array[i];
	        array[i] = array[j];
	        array[j] = num;
	      }
	    }
	  }

	printf("\n Array :");
	
	for(i = 0; i < DSIZE; i++)
	printf("%4d", array[i]);

	printf("\n");
}

void total(int *array)
{
	int i;
	int sum = 0;
	
	for(i = 0; i < DSIZE; i++)
	sum += array[i];

	printf("\n Total is %4d\n", sum);
}

void ave(int *array)
{
	int i;
	double sum = 0;
	
	for(i = 0; i < DSIZE; i++)
	sum += array[i];

	printf(" Average is %.1f\n", sum / DSIZE);
}


int main(void)
{
int array[] = { 1, -2, 3, -5, 7, -11, 13, -15, 17, -19 };
int code = 1;

	printf("Welcome to array system\n");
	while( code != 0 )
	{
		printf("\n Input data   --> 1");
		printf("\n Output data  --> 2");
		printf("\n Minimum sort --> 3");
		printf("\n Maximum sort --> 4");
		printf("\n Total        --> 5");
		printf("\n Average      --> 6");
		printf("\n End          --> 0");
		printf("\n\n Input Command : ");	scanf("%d",&code);
	}
/* この部分でコマンドの解析を行い、それに対応した各関数を呼び出す */

//再入力
if (code == 1)
input(array);

//表示
if (code == 2)
output(array);

//昇順
if (code == 3)
min(array);

//降順
if (code == 4)
max(array);

//総和
if (code == 5)
total(array);

//平均値
if (code == 6)
ave(array);

return 0;
}

閉鎖

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