• 締切済み

int num[10]という配列に、適当な整数が入っています。

kmeeの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

・バブルソートや選択ソートで、大きい3つが確定した段階でやめる どちらの場合でも、ソートのプログラムの昇順/降順とアルゴリズムをよく確認する。 昇順で最大値から確定する →num[7],num[8],num[9]が確定したら止める 降順で最大値から確定する →num[0],num[1],num[2]が確定したら止める 最小値から確定する →全部ソートしなければならない 問題点:配列 numの順番が入れ替わってしまう → 順番が関係ないなら問題なし。 残しておきたいのなら、int num1[10]とか作って、内容をコピーして、コピーの方を並び換える ・int num2[4]とかして長さ4の配列を準備 1) num2[0~3]にnum[0~3]をコピー→降順でソート→num2[0~2]が暫定トップ3.num2[3]は脱落 2) num2[3] = num[4]→降順でソート→num2[0~2]が暫定トップ3.num2[3]は脱落 3) num2[3] = num[5] (以下略) 4) num[9]まで同様にくりかえし、最後に残ったnum2[0~2]がトップ3 num2のソートには、num2の規模、状態などから挿入ソートが最適でしょう ・numの値に同じものは一つもない場合のみで使える方法 1)最大値max1を取り出す 2) num[i] < max1 となるnum[i]の中から最大値max2を取り出す 2) num[i] < max2 となるnum[i]の中から最大値max3を取り出す

関連するQ&A

  • int rev_int(int num)文  関数の入門

    #include<stdio.h> /*---非負の整数を読み込んでます*/ int scan_uint(void) //関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。 { //この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。 int tmp;//テンプの箱作成 do { printf("非負の整数を入力してください:"); scanf("%d", &tmp); if (tmp < 0) printf("\a負の数を入力しないでください"); } while (tmp < 0); return (tmp); } /* 非負の整数を逆転した値を返す */ int rev_int(int num) { int tmp = 0; if (num > 0){ do { tmp = tmp * 10 + num % 10; num /= 10; }while (num > 0); } return (tmp); } int main(void) { int nx = scan_uint(); printf("反転した値は%dです。\n", rev_int(nx)); return 0; } 教えてください!参考書に書いてあることをまとめて プログラムを読んでるのですが、わからない部分があります。 (1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは 読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。 (2)int scan_uint(void)の文は理解できました。私なりに解釈したのは ここでは正の数を入力しないと次に進まないことと 負の数を入力した場合、負の数を入力しないでくださいと注意がずっと でるという文です。 質問ですが、このあとint rev_int(int num)文に移ると思うのですが ここの int tmp = 0; これはこのint rev_int(int num)文のみの tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で 出てきたtmpとは別個と解釈しました。 そうなると、int rev_int(int num)文を読んでみると tmpの箱を作成。そこは0を代入。 if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??) do文は tmp = tmp*10 + num %10 num /=10 wile(num>0) これを見る限り、numという箱が見えません。全体を見渡しても どこかでnumに値が代入されたのち、このint rev_int(int num) という文を読みこんでいき if num>0のときと宣言されていますが もっと前の段階でnumの値が入力されていない限り このif文は適用されないと思ったのですが、プログラムは動いてます 三つ目の質問です tmp = tmp *10 + num % 10 num /=10 の部分がわかりませんでした。 tmpはまず、int scan_uint(void)で作成したtmpと int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが 正しいのであれば tmpの値はここでは初のはずです。 一体いつ値を入力したのでしょうか? もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが どうしてtmpを10かけるのですか?123450になり、 そのあとnumの値が此処でもまだ不明なのですがnum/10したものと 足すみたいですが、わかりませんでした。。。 まとめると、tmp = tmp*10+num%10がわかりません。 また、numとは何かわかりません、値もどの値がどこで代入されていて while(num>0)が引っかかるのか不明です。 tmpはint scan_uint文内で入力した値(scanfの部分で) 12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか? 参考書はなぜ別個と書いてるのかわかりません。 ごめんなさい>_< とても長くなりました。 どなたか解る方、教えてください、よろしくおねがいします。

  • C言語:配列の最大値

    こんにちは。 プログラミングの講義の課題で、 1.100未満の整数20個からなる配列を作成する 2.for文を使って20個の整数の中で最大値を求める 3.その結果を出力する というC言語の課題が出されました。完成はしたのですが、何度実行してもビルドエラーが発生して正常に作動しません。どうすれば正常に作動しますか? #include <stdio.h> int main(void){ int i; int max=0; int num[20] = {4,83,71,90,7,33,62,51,98,21,18,20,75,49,69,14,80,22,8,50}; for( i=0 ; i < 20 ; i++ ) { if (num[i] > max) max = num[i]; } printf("%d,",max); return (0); }

  • C♯の配列について

    C♯でプログラムを作っているのですが、配列の要素数の最大値と最小値の求め方がわかりません。配列の値の最大値の求め方は調べれば出てくるのですが、要素数の最大値等は調べてもわかりませんでした。 例えば下記のような配列があった場合 int[,,] a =new int[100,100,100] a[2,3,6]=1 a[4,5,9]=1 a[13,46,79]=1 a[8,15,45]=1 a[1,33,68]=1 それぞれの要素数の最小値1、3、6、最大値13、46、79は どのようにプログラムで求めればいいのでしょうか? よろしくお願いします。

  • 配列で最大・最小値を求める

    import java.io.*; class Prog10_2 { public static void main(String args[])throws IOException { System.out.println("10個の整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num[] = new int[10]; for(int i=0; i<num.length; i++){ String str = br.readLine(); int tmp = Integer.parseInt(str); num[i] = tmp; } int max = 0; int min = 0; for(int i=0; i<num.length; i++){ if(max < num[i]){ max = num[i]; } if(min > num[i]){ min = num[i]; } } System.out.println("最大値は"+max+"で、最小値は"+min+"です。"); } }   というコマンドを実行すると、最大値はちゃんと表示されるのですが、 最小値はいつも"0"しか表示されません。どこを修正すればいいのでしょうか? どなたか分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • 配列に好きな個数の整数を格納したい

    配列に好きな個数の整数を格納したい 以下のようにプログラムを組んだのですが、 Ctrl+Zを入力してもEOFと判断されず繰り返しが終了しませんでした。 int vc[100] , no=0; puts("整数を入力してください。"); while(1){ scanf("%d",&vc[no]); if(vc[no]==EOF) break; no++; } 使わないような数9999等にするしかないのでしょうか?

  • char型からint型への変換

    char型からint型への変換 char a[6]=3+2-5; int e[6]; (全て0で初期化済) for(i=0;i<6;i++){ if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){ e[i]=((int)c[i]-'0'); printf("%d",e[i]); }} for(i=0;i<NUM_DATA;i++){ printf("%d",e[i]); } このプログラムでは上のe[]の出力では「325」と出力されますが、 下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。 きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか? C言語で行っています。よろしくお願いします。

  • 配列から最大値・最小値

    int[ ] ten = {10,20,30,40,50} 例えばこの初期化された配列の中から最大値と最小値を表示させるプログラムを作りたい場合はどのようにすればよいのでしょう? public class aaa {  public static void main(String[ ] args){   int[ ] ten = {10,20,30,40,50};   int 最大値 = ten[0];    for (int i = 0; i< ten.length;i++){ if (最大値 < ten[i]){ 最大値 = ten[i]; } } System.out.println("最大値は" + 最大値 + "です。"); } } これで最大値だけは表示させられるのですが、ここから最小値も表示させるにはどのように加えてけばいいか教えてください。お願い致します。

  • 最小・最大・平均

    10個の数字の内、最小・最大・平均を求めるプログラムを教えてください。 for(int i=0; i<NUM_ELEMENTS; i++) これを文章の中に書いたのですが、 0からはじまるってことですか? ifの文ですよね?

  • C言語のプログラミング (基礎)配列の問題ですが。

    次のような問題があって、プログラミングしてみたのですが、 コンパイルすると永久ループになってしまいます。 また、入力されるはずの整数が表示されません。 どうすればよいか教えていただけると助かります。 よろしくお願いします。 整数を順番に入力し、負の数が入力されたら、それまでに入力された非負の整数を、 入力された順番とは逆に全角空白で区切って出力するプログラムを作成しなさい。 自動評価の都合上、上記以外は表示しないこと。なお、入力は最大10回とする。 【0 1 2 3 4 -1 が入力された場合の表示例】 4 3 2 1 0       ************************************** #include <stdio.h> int main(void) { int num[10]; int n; for(n=1;n<11;n++){ printf("整数入力:¥n"); scanf ("%d", &num[n]); if(num[n]<0){ for(n=10;n>0;n--){ printf("%d ",num[n]); } } } }

  • プログラミング 配列 最小値

    プログラミング 配列 最小値 要素数が5の配列にキーボードから整数を入力し、最小値を表示する というプログラムのソースについてなんですが #include <stdio.h> int main(void) { int 1; int min, vc[5]; for(i = 0; i < 5; i++) vc(i) = i+1; ここまで自分で考えたんですが間違ってるでしょうか? 最小値を表示させる文がよくわからないのですが教えていただけないでしょうか