ページ 1 / 1
無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月03日(木) 23:07
by ut
5が出るまで数字を入力して5が出たらそれまで入力した数字の5以外の最大値と最小値を入れ替えたのを左から順番に表示するプログラムの作り方を教えてください
for文から無限ループして何回もscanfで入力するまではわかったのですが
そこから最大と最小を出して
それを入れ替えるやりかたがわかりません
教えてください
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 08:50
by non
課題がよくわかりません。もっと、正確に書いてください。
>5が出るまで数字を入力して
「出る」とはどこから出るのでしょうか、乱数ですか?
>左から順番に表示する
最大と、最小を除いて入力された順ということでしょうか?
すると、すべての入力されたデータを記憶しておく必要があるように思えますが、
データの最大個数はあるのでしょうか?
>for文から無限ループして何回もscanfで入力するまではわかったのですが
そのプログラムを添付しましょう。
フォーラムルールを守って、これが学校の課題ならどこまで習っているのかを
示してください。
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 09:32
by tn
例えば
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;
}
までです
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 10:02
by non
今できているプログラムは、うまく動かないはずです。
実行して確認しましょう。
また、scanfの次の行に、printfでnを表示するようにしましょう。
永久ループですから止めるにはCTRL-cで止めます。
さて、うまくいったなら、5を入力したらループから抜けるようにプログラムを変更し
できたら、プログラムを添付してください。
なお、プログラムを添付するときにはタグを使ってください。
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 14:00
by tn
#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;
}
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 14:02
by tn
↑間違えました
少し直してみたのですが
<#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;
}>
配列を使って表示する方法がわかりません
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 14:27
by ut
<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>
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 18:19
by パコネコ
あー惜しいですが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をおきっぱなしにしてるようなので少し気にしてあげてください。
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月04日(金) 18:37
by non
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;
}
最初に添付してもらったプログラムの悪いところにコメントをつけました。動くように手直ししてください。
完成したら、添付してね。
Re: 無限ループから配列処理をして最大と最小を求めてそれを入れ替えるやり方
Posted: 2011年11月05日(土) 00:52
by 初級者
コード:
#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;
}