無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

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

無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#1

投稿記事 by ut » 9年前

5が出るまで数字を入力して5が出たらそれまで入力した数字の5以外の最大値と最小値を入れ替えたのを左から順番に表示するプログラムの作り方を教えてください

for文から無限ループして何回もscanfで入力するまではわかったのですが
そこから最大と最小を出して
それを入れ替えるやりかたがわかりません
教えてください

non
記事: 1097
登録日時: 9年前

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#2

投稿記事 by non » 9年前

課題がよくわかりません。もっと、正確に書いてください。

>5が出るまで数字を入力して

「出る」とはどこから出るのでしょうか、乱数ですか?

>左から順番に表示する

最大と、最小を除いて入力された順ということでしょうか?
すると、すべての入力されたデータを記憶しておく必要があるように思えますが、
データの最大個数はあるのでしょうか?

>for文から無限ループして何回もscanfで入力するまではわかったのですが

そのプログラムを添付しましょう。

フォーラムルールを守って、これが学校の課題ならどこまで習っているのかを
示してください。
non

tn

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#3

投稿記事 by tn » 9年前

例えば

2 1 3 7 8 10 5
と入力すると

2 10 3 7 8 1 と最大値と最小値が出力されるプログラムです


学校で習ったのは

printf scanf for do while while 配列 です


無限ループして何回も入力するのは


今できているところは
#include<stdio.h>
int main (void)
{
int n;
printf("入力¥n")
for(;;)
{
scanf("%d",n);
}
return 0;
}


までです

non
記事: 1097
登録日時: 9年前

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#4

投稿記事 by non » 9年前

今できているプログラムは、うまく動かないはずです。
実行して確認しましょう。
また、scanfの次の行に、printfでnを表示するようにしましょう。
永久ループですから止めるにはCTRL-cで止めます。

さて、うまくいったなら、5を入力したらループから抜けるようにプログラムを変更し
できたら、プログラムを添付してください。
なお、プログラムを添付するときにはタグを使ってください。
non

tn

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#5

投稿記事 by tn » 9年前

#include<stdio.h>
int main (void)
{
int n[900],i,k;
printf("入力¥n")
for(;;)
{
scanf("%d",n);
if(n==5)
break;
}
for(j=0;j<i;k++)
printf("%d¥n",n);
return 0;
}

tn

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#6

投稿記事 by tn » 9年前

↑間違えました


少し直してみたのですが

<#include<stdio.h>
int main (void)
{
int i,j;

printf("入力\n");
for(;;)
{
scanf("%d",&i);
if(i==5)
break;
}
printf("%d\n",i);
return 0;
}>


配列を使って表示する方法がわかりません

ut

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#7

投稿記事 by ut » 9年前

<code>
#include<stdio.h>
int main (void)
{
int i,j;

printf("入力\n");
for(;;)
{
scanf("%d",&i);
if(i==5)
break;
}
printf("%d\n",i);
return 0;
} </code>

アバター
パコネコ
記事: 139
登録日時: 10年前
住所: 大阪

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#8

投稿記事 by パコネコ » 9年前

あー惜しいですがcodeは[]でくくってください。
tn さんが書きました:配列を使って表示する方法がわかりません
最後に配列が出てきたコードの

コード:

for(j=0;j<i;k++)
printf("%d¥n",n[i]);
を書き換えてみると

コード:

for(j=0;j<最大数(配列の大きさとか入力数とか);j++){
    printf("%d¥n",n[j]);
}
for文のループに使ってる変数がバラバラだったのでjのみにしました。
後入力のときにiをおきっぱなしにしてるようなので少し気にしてあげてください。
ニャン!!\(゜ロ\)(/ロ゜)/

non
記事: 1097
登録日時: 9年前

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#9

投稿記事 by non » 9年前

utとtnさんは同一人物ですか?統一してね。

コード:

#include<stdio.h>
int main (void)
{
	int n[900],i,k;       // iは何から始めましょうか?
	printf("入力¥n")    // セミコロンがない
	for(;;)
	{						// 繰り返すたびにiは増やしたいよね。
		scanf("%d",n[i]);  // n[i]の前に何かおまじないをつけるって習いませんでしたか
		if(n[i]==5)
			break;
	}
	for(j=0;j<i;k++)    // jでカウントしてるのになんで、kを増やすの?
		printf("%d¥n",n[i]);   //カウントはjだろ
	return 0;
}
最初に添付してもらったプログラムの悪いところにコメントをつけました。動くように手直ししてください。
完成したら、添付してね。
non

初級者
記事: 200
登録日時: 9年前

Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方

#10

投稿記事 by 初級者 » 9年前

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *p = NULL, *q, num, max, min, mx, mn, n = 0, t, i;

    // データの入力
    while (1) {
        scanf("%d", &num);
        if (num == 5) break;
        // 動的に領域を拡張する
        q = realloc(p, sizeof(int) * (++n));
        if (!q) exit(1);
        // 入力値をセットする
        p = q, p[n-1] = num;
    }

    // 1個以上データがあれば
    if (n) {
        // 最大値と最小値の値と場所を求めて
        for (max = min = p[0], mx = mn = 0, i = 1; i < n; i++) {
            if (p[i] > max) max = p[i], mx = i;
            if (p[i] < min) min = p[i], mn = i;
        }
        // 入れ替える
        t = p[mx], p[mx] = p[mn], p[mn] = t;
        // 結果の出力
        for (i = 0; i < n; i++) printf("%d ", p[i]);
        putchar('\n');
        // 後始末
        free(p), p = NULL, free(q), q = NULL;
    }
    return 0;
}


閉鎖

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