• 締切済み

すいません。。改めて質問!!

#include<stdio.h> #define NMAX 200 int n; int a[NMAX], x[NMAX]; void yomikomi() { for(n=0; scanf("%d%d",&a[n],&x[n])!=EOF;n++); return; } void hyouzi() { int i; for(i=0;i<n;i++) printf("%5d %5d\n",a[i],x[I]); return; } void seiretu() { int i,j,max,k,w; for(i=0;i<n-1;i++){ max=x[i];k=i; for(j=i+1;j<n;j++) if(x[j]>max){ max=x[j];k=j; } w=a[k];a=[k]=a[i];a[i]=w; x[k]=x[i]; x[i]=max; } return; } main() { printf("sorting\n"); yomikomi(); printf(\nInput data\n"); hyouzi(); seiretu(); printf(\nSorted data\n); hyouzi(); return(0); } これを改良して偶数と奇数に分けてソートするプログラムがわかればいいのですが。。まだ慣れないものですいませんでした。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

せめて、コンパイルが通るものでないと 「改良」以前の問題だと思います。 現在の仕様だと、 x[]の値で降順にソートするプログラムですよね。 偶数奇数に分けてソートするというのがよくわからないのですが 例えば x[]= 1 4 3 5 3 2 5 6 7 の様な内容を 6 4 2 7 5 5 3 3 1 の様に並べるということでしょうか? 奇数偶数の判定は 奇数:x[n]%2==1 偶数:x[n]%2==0 で判定できますので、 とりあえず、 x[]の中身を 偶数部分の中身 奇数部分の中身 の様に並び替えて 現在のプログラムと似たような形で並び替えできます。 偶数部分または奇数部分がいくつあるかを並び替えるときに数えておいて、 その範囲がわかっていれば、 現在のプログラムと同じように その範囲のソートができると 思います。

hyokkorri
質問者

お礼

コンパイルのできないプログラムを載せてしまって本当に申し訳ないです。。 BLUEPIXYさんのコメントから偶数奇数の判定の仕様は多分理解したと思いますのでもう一度挑戦してみたいと思います。 どうもありがとうございました。

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.2

ちょっときつめな書き方になりますが、 1つめの質問とこの質問を見ましたが、仕様が曖昧なため、どう答えていいのやら・・・っという状態ですね。 いきなりプログラムを載せられても(しかもコンパイルが通らない)仕様自体があなたの頭の中にしかないので動きが正常なのかすらわかりません。 そこで、現在の仕様と改良の仕様の確認ですが 現在の仕様> 1.データを2つ1組で入力させ、各々別々の配列に保管する。 2.入力されたデータ1つめと2つめの配列を表示。 3.入力されたデータ1つめと2つめの配列を降順ソート。 4.ソートされたデータ1つめと2つめの配列を表示。 っという形でいいのでしょうか? 改良の仕様> 1.データを1つずつ入力させ奇数・偶数別に配列に保管する? 2.保管した奇数・偶数配列を表示? 3.保管した奇数・偶数配列を降順ソート? 4.ソートした奇数・偶数配列を表示? を希望するのでしょうか? また、現在のプログラムでは、scanfで2つのデータ(数)を入力するようになっていますが、これは、1つめが奇数、2つめが偶数という規定があるのでしょうか? 一応この2つの入力を別々の配列に保管し、最後に降順ソートを行おうとしているようですが(バグっているので上手くいきません)ソートは降順のみなのでしょうか? 以上のようなことが皆さんにわかれば、あなたの求める答えも出てくるかと思います。

hyokkorri
質問者

お礼

本当に申し訳ないです…とゆうか恥ずかしいです…。 プログラムがうまく機能しないまま載せてしまってすいません。もう一度挑戦してみます!!

回答No.1

偶数,奇数の見分けは「2で割ったときの余りが0か1かで判断」します. もし,余りが「0」なら偶数,「1」なら奇数として,偶数の中でソート,奇数の中でソートしたらどうですか? 余りって演算子「%」でしたっけ?

関連するQ&A

  • このプログラムを改良して…

    #include<stdio.h> #define NMAX 200 int n; int a[NMAX], x[NMAX]; void yomikomi() { for(n=0; scanf("%d %d",&a[n],&x[n])!=0;n++); return; } void hyouzi() { int i; for(i=0;i<n;i++) printf("%5d %5d\n",a[i],x[i]); return; } void seiretu() { int i,j,max,k,w; for(i=0;i<n-1;i++){ max=x[i];k=i; for(j=i+1;j<n;j++) if(x[j]>max){ max=x[j];k=j; } w=a[k];a[k]=a[i];a[i]=w; x[k]=x[i]; x[i]=max; } return; } main() { printf("Sorting\n"); yomikomi(); printf("\nInput data\n"); hyouzi(); seiretu(); printf("\nSorted data\n"); hyouzi(); return(0); } 以上のプログラムは、 Sorting 1 87 2 91 3 76 4 84 5 61 6 100 7 93 \n\n と入力しますと、 Input data 1 87 2 91 3 76 4 84 5 61 6 100 7 93 Sorted data 6 100 7 93 2 91 1 87 4 84 3 76 5 61 Press any key to continue という結果(左が番号として右が点数とした場合、点数が上位のものから番号を並びかえる)が出るプログラムです。このプログラムを改良して、上の結果を例として、 Input data 1 87 2 91 3 76 4 84 5 61 6 100 7 93 Guusuu   3 76 4 84 6 100 Kisuu 2 91 3 76 5 61 7 93 という風に右側の数が偶数か奇数かでわけて結果を出すことは可能でしょうか?可能であれば教えてください。お願いします。

  • 以前も同じ質問したのですがもう一度お願いします

    以前も同じ質問したのですがもう一度お願いします プログラミングで3行3列の行列Aに対しAの2乗、Aの3乗を求めるプログラムを作成したいのですが下記のプログラムでは3行3列まで表示できません どこが間違えているのか修正していただけないでしょうか? #include <stdio.h> int main(){ int z[3][3]; int w[3][3]; int x[3][3]={1,2,3,4,5,6,7,8,9}; int n,m; int i,j,k; printf("z[3][3] : \n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) {printf("z[%d][%d] = ",i,j); scanf ("%d",&z[i][j]); } } printf("m for [z]^m ="); scanf ("%d",&m); for(n=0;n<m;n++) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { w[i][j] = 0; for(k=0;k<3;k++) { w[i][j] += x[i][k]*z[k][j]; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { x[i][j] = w[i][j]; } } printf("[z]^%d\n",n+1); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf(" %9d",x[i][j]); }printf("\n"); }printf("\n"); } return 0; }

  • C++についての質問です

    プログラミング初心者です 以下の通りに正方行列の積を求めるプログラムを作成したのですが、うまくいきません。 #include<stdio.h> #define DTM 20 void InputMatrix(double[][DTM], int, char); void PrintMatrix(double[][DTM], int, char); void MatrixMulti(double[][DTM], double[][DTM], double[][DTM], int); int main(void) { double matrixA[DTM][DTM]; double matrixB[DTM][DTM]; double matrixC[DTM][DTM]; int n; printf("正方行列の積を求めるプログラムです\n"); printf("正方行列の次元を入れてください(<=20):"); scanf_s("%d", &n); InputMatrix(matrixA, n, 'A'); InputMatrix(matrixB, n, 'B'); MatrixMulti(matrixA, matrixB, matrixC, n); printf("\n行列 C =A×B\n"); PrintMatrix(matrixC, n, 'C'); return 0; } void InputMatrix(double a[][DTM], int n, char ch) { int i, j; printf("行列 %cの入力\n", ch); for (i = 0; i < n;i++) { for (j = 0;j < n;j++) { printf("%c[%d][%d] =", ch, i + 1, j + 1); scanf_s("%lf", &a[i][j]); } } } void PrintMatrix(double a[][DTM], int n, char ch) { int i, j; printf("行列 %c の出力\n", ch); for (i = 0;i < n;i++) { for (j = 0;j < n;j++) { printf("%5.2f\t", a[i][j]); } printf("\n"); } } void MatrixMulti(double a[][DTM], double b[][DTM], double c[][DTM], int n) { int i, j, k; for (i = 0;i < n;i++) { for (j = 0;j < n;j++) { c[i][j] = 0; for (k = 0;k < n;k++) { c[i][j] =a[i][k] * b[k][j]; } printf("%5.2f\t",c[i][j]); } printf("\n"); } }

  • C言語 多重配列に関して

    以下のプログラムについての質問です。 10行目 for i = 0 の時、13行目 for j = 0 で scanf("%lf", &a[0][0])に10と代入します。 この時のドス画面は input 1-th line element:10 です。ここまではいいのですが、この次がよくわかりません。私の考えでは、10行目 i = 0 の時 13行目 j = 1 となって j がNMAXまでやったら、10行目のiが1になってまた同じように動いて、10行目の i がNMAXになったら、for文が終わると考えたのですが、このプログラムの実行結果(一番下にあります)を見てみると自分の考えが間違っていることに気がつきました。 3行3列のプログラムなので、a[0][0] a[0][1] a[0][2] a[1][0].......となると考え、scanfでドス画面に9回数字を打ち込むかと思ったのですが実際は3回でした。このプログラムはどのように読んだら良いのでしょうか?? 回答宜しくお願い致します。 1  #include <stdio.h> 2  #define NMAX 3 3 4  main() 5  { 6   double a[NMAX] [NMAX], b[NMAX] [NMAX], c[NMAX] [NMAX]; 7   int i,j,k; 8 9   printf("matrix 1:\n"); 10   for(i=0; i< NMAX; i++) 11   { 12   printf("input %d-th line element:", i+1); 13   for(j=0; j< NMAX; j++); 14   { 15   scanf("%lf", &a[i][j]); 16   } 17   } 18   printf("matrix 2:\n"); 19   for(i=0; i<NMAX; i++) 20   { 21   printf("input %d-th line element:", i+1); 22   for(j=0; j< NMAX; j++); 23   { 24   scanf("%lf", &b[i] [j]); 25   } 26   } 27  for(i=0; i<NMAX; i++) 28   { 29   for(j=0; j<NMAX; j++) 30   { 31   c[i][j] = 0; 32   for(k=0; k <NMAX; k++) 33   { 34   c[i][j] += a[i][k] * b[k][j]; 35   } 36   } 37   } 38 39  printf("matrix 1 * matrix2 = :\n"); 40  for(i=0; i<NMAX; i++) 41   { 42   printf("["); 43   for(j=0;j<NMAX; j++) 44   { 45   printf("%f", c[i][j]); 46   } 47   printf("]\n"); 48   } 49  }

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • printfの挿入箇所

    #include <stdio.h> #include <stdlib.h> #define N 500 void bubblesort(int h, int k, int *A); void swap(int i, int j, int *A); int main(void) { int A[N]; int n, i; FILE *file; file=fopen("sortdata", "r"); /* データの読込み */ fscanf(file, "%d", &n); if(n>N) { printf("Illegal array size n = %d for N = %d\n", n, N); exit(1); } for(i=0; i<n; i++) fscanf(file, "%d", &A[i]); /**/ printf("A = "); /**/ printf("\n"); bubblesort(0, n-1, A); /* 配列A[0]からA[n-1]の整列 */ return(0); } /* A[k],...,A[h]の要素をバブルソートによって整列 */ void bubblesort(int h, int k, int *A) { int i, j, p; int no; int test; /* test==1; すでに整列済み */ for(i=h; i<k; i++) /* バブル操作の反復 */ { test=1; for(j=k; j>=i+1; j--) { for(no=0; no<j; no++) printf(" %d",A[no]); if(A[j]<A[j-1]) { printf(" > %d ",A[j]); swap(j, j-1, A); test=0; } else { printf(" < %d ",A[j]); } for(no=j+1; no<=k; no++) printf(" %d ",A[no]); printf("\n"); } printf("\n"); if(test==1) return; } return; } /* Swap A[i] and A[j]. */ void swap(int i, int j, int *A) { int temp; temp=A[i]; A[i]=A[j]; A[j]=temp; return; } 以上のプログラムを A = パス1: 7 5 1 2 8 > 3 7 5 1 2 < 3 8 7 5 1 < 2 3 8 7 5 > 1 2 3 8 7 > 1 5 2 3 8 1 7 5 2 3 8 パス2: 1 7 5 2 3 < 8 1 7 5 2 < 3 8 1 7 5 > 2 3 8 1 7 > 2 5 3 8 1 2 7 5 3 8 パス3: 1 2 7 5 3 < 8 1 2 7 5 > 3 8 1 2 7 > 3 5 8 1 2 3 7 5 8 パス4: 1 2 3 7 5 < 8 1 2 3 7 > 5 8 1 2 3 5 5 8 パス5: 1 2 3 5 7 < 8 1 2 3 5 7 8 比較は15回でした。 交換は8回でした。 と表示させたいのですがうまくいきません。 どなたかご指導よろしくお願いします

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{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 】はどうすれば出来ますか教えてください。お願いします。

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • C言語

    以下を出力するとどのような結果が得られますか? #include <stdio.h> const int N=10; void subroutine(int k, int x[ ]); int main (void){ inta[11],b[11]; int i,k; for (i=1; i<=N); i++){ a[i]=i; b[i]=0; } for(k=1; k<=N; k++){ subroutine(k,a); printf("k=%2d,%5d\n",k,a[k]); } return 0; } void subroutine(int k, int x[ ]){ int i,s; i=0; s=0; while(++i<=k) s=s+x[i]; x[k]=s; return; }

専門家に質問してみよう