• 締切済み

配列のソート(昇順)

最大で30個の整数データを入力し、それを大きい順に並べ替えるプログラムを1次元配列と繰り返し・if文を使って作成しなさい。 という問題で #include<stdio.h> main() { int a[30],x,y,z; printf("Seisu wo 30 ko Nyuryoku \n"); for(x=0;x<=29;x++) scanf("%d",&a[x]); printf("before sort...\n"); for(x=0;x<=29;x++) printf("%d ",a[x]); for(x=0;x<=28;x++) for(y=0;y<=28-x;y++) if(a[y]<a[y+1]) { z=a[y];a[y]=a[y+1];a[y+1]=z; } printf("\n after sort...\n"); for(x=0;x<=29;x++) printf("%d ",a[x]); } ここまで出来たのですが最大で30個ということなので(例)「10個の整数を入力して Z を入力したら終了」 としたいのですがどこをどのようにすればいいですか?

みんなの回答

  • fines
  • ベストアンサー率11% (6/51)
回答No.2

プログラムをじっくり読んだワケではないですがfor文の条件式に「||」(または)を使って「a[y+1]!=z」(入力がzじゃない間)を追加するみたいにすればいいんじゃないですかね。 質問の意図に合っているといいんですが。

  • xyz37005
  • ベストアンサー率51% (362/706)
回答No.1

入力をchar型でさせて入力文字がZか判別。 Zなら入力終了、Zでないならatoiでint型に変換。 ------------------------------------------------------------ #include<stdio.h> #include <stdlib.h> main() { int a[ 30 ] , x , y , z , i ; char str[ 100 ] ; printf( "Seisu wo 30 ko Nyuryoku \n" ); for( i = 0 ; i <= 29 ; i++ ){ scanf( "%s" , str ) ; if( str[ 0 ] == 'z' || str[ 0 ] == 'Z' ){ i = i - 1 ; break ; } a[ i ] = atoi( str ) ; } printf("before sort...\n"); for(x=0;x<=i;x++) printf("%d ",a[x]); for(x=0;x<=i-1;x++) for(y=0;y<=i-1-x;y++) if(a[y]<a[y+1]) { z=a[y];a[y]=a[y+1];a[y+1]=z; } printf("\n after sort...\n"); for(x=0;x<=i;x++) printf("%d ",a[x]); }

関連するQ&A

  • [C言語] 整数を昇順でソートする

    このサイト(http://www.kusa.ac.jp/~kajiura/c/hairetsu/newpage3.htm)で、整数を昇順でソートするソースコードが示されています。しかし、for文の中にfor文、その中にif文を用いた箇所が何を実行しているのか全く理解できません。どのような思考を持てばこのようなソースコードに到るのだろう、と困惑しています。自力で書いてみるつもりでしたが、2時間くらい考えて書けませんでした。もっと簡単な方法はないのでしょうか。 #include <stdio.h> #define SIZE 5 main() { int j, k, temp, x[SIZE]; printf("5個の整数を入力してください\n"); printf("昇順に並べ替えて出力します\n"); /* 入力 */ for(j = 0 ; j < SIZE ; j++) { printf("deta = "); scanf("%d", &x[j]); } /* 並べ替え */ for(j = 0 ; j < SIZE - 1; j++) for(k = j + 1; k < SIZE ; k++) if(x[j] > x[k]) { temp = x[j]; x[j] = x[k]; x[k] = temp; } /* 出力 */ for(j = 0; j < SIZE ; j++) printf("%d\n", x[j]); }

  • 配列の中身を入れ替える方法を教えてください

    配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。 特に・・・↓↓ void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } 上の部分でなぜfor文を2回使うのか?2回目のfor文のところはなぜ y=xなのか?0ではいけないのか?よくわかりません。一番最後の入れ替え作業のところは納得できたんですが、for文のところがよくわからないのでどなたか分かる方教えてください! #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } int main(int argc, char* argv[]) { int a[10],b,c; srand((unsigned)time(NULL)); for(b=0;b<10;b++) { a[b]=rand(); c=a[b]; printf("a[%d]=%d\n",b,a[b]); } sort(a); for(b=0;b<10;b++) { printf("小さい順a[%d]=%d\n",b,a[b]); } return 0; }

  • わかりません・・・。

    100個以下の整数を読み込んで、読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムをつくりたいのですが、わかりません。 教えてください!! 実行例 整数は何個ですか:5 1 個目:65 2 個目:30 3 個目:98 4 個目:10 5 個目:54 入力された整数は 5 個で, 65 30 98 10 54 です. 最大値は 98 です. 二番目に大きい値は 65 です. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include<stdio.h> #define number 100 int main (void) { int i; int seisu[number]; int max; puts("整数を入力してください。"); for(i=0, i<number, i++){ printf("%2d番",i+1); scanf("%d",&seisu[i]); } max=seisu[0] for(i=1, i<number, i++){ if (seisu[i]>max) max=seisu[i]; } printf("最高点:%d\n",max); return(0); } までしかわかりません。 2番目に大きい値と‘整数は何個ですか: ‘と‘入力された整数は 個で です。‘の部分はどうすればいいのでしょうか??

  • ブラックジャック

    朝からブラックジャックに似たゲームでプログラムを作っています。 朝もこのページの方々にお世話になりました。 ありがとうございます。 そして終盤のにちかづき、〔プレーヤー〕が1と0以外の数字を 入力したときに、〔もう一度入力してください。〕と表示し、また 入力画面が表示されるようにしましたが、コンパイルのときに エラーがでます。 こちらがソースです。 本当に困っています。助けてください。 お願いします!! #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); int dice3(void); int dice4(void); int dice5(void); main() { do{ int x=0,y=0,z=0,v=0,point=0,nyuryoku1,w=0,point2=0,point3=0,nyuryoku2=0; printf("ゲームを開始します。\n"); printf("\n"); printf("カードを配ります。\n"); /*関数代入*/ srand(time(NULL)); x=dice(); y=dice2(); z=dice3(); w=dice4(); srand(time(NULL)); v=dice5(); point=y+z; printf("デイーラー>カードは%d と??です。\n",x); printf("プレーヤー>カードは%d と%d です。ポイントは%dです。\n",y, z,point); printf("\n"); printf("プレーヤーの番です。\n"); /*プレーヤー*/ while(point<=21){ srand(time(NULL)); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point);} if(nyuryoku1==0){break;} else{ while(nyuryoku1!=90){ printf("入力が正しくありません。もう一度入力してください。\n"); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point); break;} if(nyuryoku1==0)break; }} if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n"); } /*デイーラー*/ printf("デイーラーの番です。\n"); point2=x+w; printf("デイーラー> カードは%d と%d です。ポイントは%dです。\n",x, w,point2); while(point2<17){ point2=point2+v; printf("デイーラー>カードは%d ポイントは%d\n",v,point2); } printf("プレーヤーのポイントは%d、デイーラーのポイントは%d。\n", point,point2); /*結果判定*/ if(point>point2){ printf("プレーヤーの勝ちです。\n"); } if(point<point2){ printf("デイーラーの勝ちです。\n"); } if(point==point2){ printf("引き分けです。\n"); } /*ゲームを続けるか?*/ printf("ゲームを続けますか?[続行=1:終了=0]\n"); scanf("%d",&nyuryoku2); if(nyuryoku2==0){printf("ゲームを終了しました。\n"); break;} }while(nyuryoku2==1); return 0; } /*関数定義*/ int dice(void){ return 1+(rand() % 10); } int dice2(void){ return 1+(rand() % 10); } int dice3(void){ return 1+(rand() % 10); } int dice4(void){ return 1+(rand() % 10); } int dice5(void){ return 1+(rand() % 10); }

  • ソートプログラム

    ファイルから10個の整数が 29 45 11 2 86 91 33 62 77 59 のように一行に1個の形式で格納されている。このファイルから10個の整数を読み込み、選択法でソートし、この数字を小さい順に表示するプログラムを作成したのですが、ソート部分がうまくできません。どなたかどうすれば改善できるか教えてください。 <プログラム> #include<stdio.h> #include<stdlib.h> #define MAXN 100 int A[MAXN]; main() { _inputdata(); _selectionsort(1,10); _printdata(); } selectionsort(p,q) ___int p, q; { _int i, j, cmin, temp; _for(j = p; j <= q; j++){ __cmin = j; /* A[cmin]が現在の最小値 */ __for(i = j+1; i <= q; i++) ___if(A[cmin] > A[i]) cmin = i; __/* A[j]とA[cmin]との入れ換え操作 */ __swap(j, cmin); _} } swap(int x, int y) { _int temp; _temp = x; _x = y; _y = temp; } inputdata() { _FILE *fp; _if((fp=fopen("integers10.dat", "r"))==NULL) { __printf("ファイルが見つかりません: integers10.dat\n"); __exit(EXIT_FAILURE); _} _printf("データを入力\n"); _while(fscanf(fp, "%s", A)!=EOF) { ____printf("%s\n",A); _} _fclose(fp); } <コンパイル→実行> % gcc -o sort1 sort1.c % ./sort1 データを入力 29 45 11 2 86 91 33 62 77 59 ソート済みデータ 0 0 0 0 0 0 0 0 0 0 %

  • 初級プログラミングCです

    -11x+97y=1 という関数を満たす整数(x、y)を求めるプログラムなんですが 自力で考えると #include<studio.h> void main() { int x,y,a; for(x=1;;x++){ for(y=1;;y++){ a=-11*x+97*y+1 if (a==o) printf("(%d,%d)\n",x,y); if (a=!0) break } for(y=0;;y--){ a=-11*x+97*y+1 if (a==o) printf("(%d,%d)\n",x,y); if (a=!0) break } } for(x=1;;x--){ for(y=1;;y++){ a=-11*x+97*y+1 if (a==o) printf("(%d,%d)\n",x,y); if (a=!0) break } for(y=0;;y--){ a=-11*x+97*y+1 if (a==o) printf("(%d,%d)\n",x,y); if (a=!0) break } } } こうなりました xもyも上限がないのでこれでは無限ループであたいがでないとおもいます 実行するにもソフトがないのでわかりませんが たぶん間違えています どこが違いますかね? 根本的に違ったりしますか? 回答お待ちしています

  • 配列

    このプログラムを #include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("(%d %d) \n)",x,y); RUL(n); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)\n",x,y); RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); URD(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1); } 実行結果は (0 0) (0 1) ・ ・ ・ (0 254) (0 255) になります。これを2次元配列で表したのですがどのようにいじればいいでしょうか?おねがいします。

  • 既約分数の表示プログラム

    (1)キーボードから,分子,分母に相当する整数2つを入力し,その既約分数を表示せよ。 (2)分母が1の時には,分子のみを表示する。 (3)分子と分母の符号が異なるときにのみ,-符号を表示する。 (4)分母がゼロの入力エラーに対しては、再入力するように促す。 (5)分子と分母の最大公約数も求めて表示する。 (6)また、正しく計算できる最大規約分数を示せ。 #include <stdio.h> int main(void) { int a,b,i=1,x,y,z; printf("分子=");/*分子の入力*/ scanf("%d",&a); printf("分母=");/*分母の入力*/ scanf("%d",&b); if(b==0) { printf("分母が0です。入力が誤っています。\n"); return 0; } if(b==1) { printf("既約分数は %d\n",a); return 0; } while((i<=a)&&(i<=b)) { if((a%i==0)&&(b%i==0)) { x=i;i=i+1; /*xを上書きしていく*/ } else { i=i+1; } } printf("分子と分母の最大公約数=%d より\n",x); y=a/x; z=b/x; printf("既約分数は %d/%d\n",y,z); return 0; } 大学の課題で出されたものです。(1)(2)(4)(5)はできたのですが、(3)と(6)の部分のやり方がいまいちよくわからなかったので質問しました。 どなたかご教授お願いできないでしょうか・・・。

  • 空Enterの扱い方

    3つの整数を入力し、最大値を出力するプログラムを作りました。 最大値をさがすステップに入る前に、 「最大値を出力しますか?(y/n)」と聞いてy+Enterで実行するようになっています。この部分を、 y+Enter もしくは 空Enter で実行するにはどのように変更すればよいのでしょうか?大変お手数ですが、教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,max,max_no,a[3]; char YN[2]; printf("整数を3つ入力してください。\n"); for(i=0;i<3;i++){ printf("%d番目の整数: ",i+1); scanf("%d",&a[i]); } printf("最大値を出力しますか?(y/n):"); scanf("%s",YN); if(YN[0]=='y'){ printf("最大値をさがします。\n"); } else{ exit(0); } max_no=0; max=a[max_no]; for(i=1;i<3;i++){ if(a[i]>max){ max=a[i]; max_no=i; } } printf("最大値は %d 番目のデータ %d です。\n",max_no+1,max); return 0; }

  • n個の要素を持つ配列xをシェルソートで昇順に整列

    穴埋め問題ですが、for文の j -= k の考えで立ち止まります。 #include <stdio.h> #define swap(X, Y) 【 1 】 ← X ^= Y, Y ^= X, X ^= Y void shell(int x[ ], int n); void main() {     int x[12] = {23, 67, 54, 82, 13, 28, 55, 61, 50, 32, 29, 44};     int n = 12, i ;     printf("配列(整列前)x => ");     for( i = 0; i < n - 1; i++ )         printf("%d, ",x[ i ]);     printf("%d\n",x[ i ]);       shell(x, n);     printf("配列(整列後)x => ");     for( i = 0; i < n - 1; i++ )         printf("%d, ",x[ i ]);     printf("%d\n",x[ i ]); } void shell(int x[ ], int n) {     int i, j, k = n ;     while( 【 2 】 ){ ← k > 0         【 3 】 ← k /= 2;         for( i = 0; 【 4 】; i++)             for( j = i; 【 5 】; j -= k)               swap(x[j], x[j + k]);     } } 【 1 】【 2 】は自信があるのですが【 3 】はあまり自信がないです。 【 4 】と【 5 】はどうすれば出来ますか教えてください。お願いします。

専門家に質問してみよう