• ベストアンサー

画素数の計算について

現在BMPで640×480の画像の左右両端の80画素ずつ切り取り480×480の画像を作って さらに、8×8のブロックに分けて各ブロックごとの光の強度をだすプログラミングをつくっているのですが、 (各ブロックはそれぞれ[1][1]~[8][8]となづけています) [1][8]、[2][8]、[3][8]…と8がつくブロックの強度がすべて0になってしまいます。 いろいろと考えてみたのですが、どうにもうまくいかずに悩んでおります。 助けていただけませんでしょうか? よろしくおねがいします。 おそらく、ここらへんがおかしいと思う部分をのせておきます。 /* 640側の左右80ずつ切り取り、480×480の正方形の画像にする */ int bunkatsu(BMP *rp,RESULT *res){ int x,y; int a=0; for(y = 0;y < rp->Bmpi.biHeight; y++){ for(x = 80;x < rp->Bmpi.biWidth - 80; x++){ res->data[a] = rp->blue[y * rp->Bmpi.biWidth + x] + rp->green[y * rp->Bmpi.biWidth + x] + rp->red[y * rp->Bmpi.biWidth + x]; a++; } } return 0; } /* 480×480を8×8のブロックに分け(60×60が64ブロック) 、各ブロックの明るさを計算する */ int keisan(BMP *rp,RESULT *res){ int b,c; int i=0,j=0; int x,y; for(y = 0;(y+60) < rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) < (rp->Bmpi.biWidth - 160);x+=60){ for(b = 0;b < 60;b++){ for(c = 0; c < 60;c++){ res->akarusa[i][j]+=res->data[(y + b) * rp->Bmpi.biWidth +(x + c)]; } } j++; } j=0; i++; } max(res); return 0; } /* 一番明るいブロックの特定 */ RESULT *max(RESULT *res){ int MAX1=0; int MAX2=0; int i=0; int j=0; for(i = 0;i < 8;i++){ for(j = 0;j < 8;j++){ printf("[%d][%d]=%d ",i+1,j+1,res->akarusa[i][j]); if(MAX1 < res->akarusa[i][j]){ MAX1 = res->akarusa[i][j]; res->maxi=i; res->maxj=j; } } printf("\n"); } printf("一番明るいブロックは[%d][%d]です\n",res->maxi + 1,res->maxj + 1); return 0; } です。よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★自分のソースと下のソースを全面的に比較してみて下さい。 ・コメント、解説、アドバイスなどを注意深く読んで下さい。 /* 640側の左右80ずつ切り取り、480×480の正方形の画像にする */ int bunkatsu( BMP *rp, RESULT *res ) {  int a = 0; ←分かりやすく pos の名前がよいのでは  int x, y;  int ofs; ←追加    for ( y = 0 ; y < rp->Bmpi.biHeight ; y++ ){   for ( x = 80 ; x < (rp->Bmpi.biWidth - 80 * 2) ; x++ ){ ←(1)    ofs = (y * rp->Bmpi.biWidth + x); ←追加    res->data[ a ] = rp->blue[ofs] + rp->green[ofs] + rp->red[ofs]; ←これで良いのか?    a++;   }  }  return 0; } ●80 ではなく 160 でしょう。 間違い⇒rp->Bmpi.biWidth - 80 正しい⇒(rp->Bmpi.biWidth - 80 * 2) ※res->data[a] の行はすべてを足して代入してよいのですか?  つまり、blue[]、green[]、red[] と分けなくてよいのか。 /* 480×480を8×8のブロックに分け(60×60が64ブロック) 、各ブロックの明るさを計算する */ int keisan( BMP *rp, RESULT *res ) {  int x, y;  int i, j;  int ofs; ←追加    for ( y = 0 ; y < (480 / 8) ; y++ ){   for ( x = 0 ; x < (480 / 8) ; x++ ){    res->akarusa[ y ][ x ] = 0; ←安全対策(初期化)        for ( j = 0 ; j < 8 ; j++ ){     for ( i = 0 ; i < 8 ; i++ ){      ofs = (y * 8 + j) + (x * 8 + i);      res->akarusa[ y ][ x ] += res->data[ ofs ];     }    }   }  }  max( res );  return 0; } ●解説 ・x, y の for 文で 8×8 のブロックを制御しています。 ・i, j の for 文で 8×8 のブロック1つの領域(64)の明るさを加算しています。 /* 一番明るいブロックの特定 */ RESULT *max( RESULT *res ) {  int MAX1 = 0;  int MAX2 = 0; ←これ必要か?  int i, j;    for ( j = 0 ; j < 8 ; j++ ){   for ( i = 0 ; i < 8 ; i++ ){    printf( "[%d][%d]=%d ", (j + 1), (i + 1), res->akarusa[j][i] );        if ( res->akarusa[j][i] > MAX1 ){ ←判定方向を変えた方が分かりやすい     MAX1 = res->akarusa[ j ][ i ];     res->maxi = i;     res->maxj = j;    }   }   printf( "\n" );  }  printf( "一番明るいブロックは[%d][%d]です\n", (res->maxj + 1), (res->maxi + 1) );  return 0; } ●アドバイス ・宣言部の i, j 変数は初期化しないてよい。→理由:for 文で初期化しているから。 ・あと習慣的に内側のループに i、外側に j カウンタを使ってみる。  res->maxi、res->maxj の意味が逆になるため注意!→printf 文の引数を見よ。 ・変数 MAX2 って使っていないでしょ。必要なの?

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★VTClient さん、ご指摘有り難う。 ・8×8 ブロックを 8×8 ピクセルと思い違いをしてしまいました。  8×8 ブロックなら 60×60 ピクセルにすべきでしたね。恥ずかしいです。 ・質問者さんへ。回答 No.3 の keisan() 関数に思い違いをしていたため、見なかったことに  して下さい。お詫びに修正版を載せます。→大幅に間違っているので関数すべてを載せます。 修正版: /* 480×480を8×8のブロックに分け(60×60が64ブロック) 、各ブロックの明るさを計算する */ int keisan( BMP *rp, RESULT *res ) {  int x, y;  int i, j;  int ofs; ←追加    for ( y = 0 ; y < 8 ; y++ ){   for ( x = 0 ; x < 8 ; x++ ){    res->akarusa[ y ][ x ] = 0; ←安全対策(初期化)        for ( j = 0 ; j < (480 / 8) ; j++ ){     for ( i = 0 ; i < (480 / 8) ; i++ ){      ofs = (y * (480 / 8) + j);      ofs += (x * (480 / 8) + i);      res->akarusa[ y ][ x ] += res->data[ ofs ];     }    }   }  }  max( res );  return 0; } ●解説 ・x, y の for 文で 8×8 のブロックを制御しています。 ・i, j の for 文で 60×60 のピクセル領域の明るさを加算しています。 ★VTClientさんへ。回答 No.4 についても間違っていました。 ・仰るとおりです。気のせいではありません。私の間違いです。  質問者さんへ。bunkatsu() 関数に1行だけ間違っていました。修正します。 ・修正前⇒for ( x = 80 ; x < (rp->Bmpi.biWidth - 80 * 2) ; x++ ){ ←(1)  修正後⇒for ( x = 80 ; x < (rp->Bmpi.biWidth - 80) ; x++ ){ ←(1)  です。この間違いから 80~(rp->Bmpi.biWidth - 80)をループするより、  0~479 をループして +80 のオフセット値を加算した方が分かりやすいですね。  この考えを元に bunkatsu() 関数の全体を見直してみました。  それが下です。 /* 640側の左右80ずつ切り取り、480×480の正方形の画像にする */ int bunkatsu( BMP *rp, RESULT *res ) {  int a = 0;  int x, y;  int ofs;    for ( y = 0 ; y < 480 ; y++ ){ ←分かりやすく 480 にしました。   for ( x = 0 ; x < 480 ; x++ ){ ←分かりやすく 480 にしました。    ofs = ((y * rp->Bmpi.biWidth) + (x + 80));    res->data[ a ] = rp->blue[ofs] + rp->green[ofs] + rp->red[ofs];    a++;   }  }  return 0; } 最後に: ・VTClient さん、ご指摘、本当に有り難うございました。 ・以上。

oniku029
質問者

お礼

回答ありがとうございました。 お蔭様で無事に作り上げることができました。 ソースまで載せていただき大変感謝しております。 誠にありがとうございました。

noname#50176
noname#50176
回答No.5

#1,#2,#4 の者です。 (Oh-Orangeさん、“さん”を付け忘れました、すみません。) <説明追記> for(y = 0;(y+60) < rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) < (rp->Bmpi.biWidth - 160);x+=60) が for(y = 0;(y+60) <= rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) <= (rp->Bmpi.biWidth - 160);x+=60) と言うのは、1ベースを基に[8]の1次側、2次側共に、 たとえば、x=420,y=420 いずれの場合、(x で説明します。) x+60=480 となり、rp->Bmpi.biWidth-160=480 なのですから 480<480 が偽となり、8番目がスルーするのではないかと、 思うのです。 思い違いでしたらすみません。

oniku029
質問者

お礼

回答ありがとうございました。 非常にわかりやすく書いていただき大変ためになりました。 本当にありがとうございました。

noname#50176
noname#50176
回答No.4

>●80 ではなく 160 でしょう。 >間違い⇒rp->Bmpi.biWidth - 80 >正しい⇒(rp->Bmpi.biWidth - 80 * 2) Oh-Orange の仰るとおりかもしれません。 が、気にかかることがあります。 for ( x = 80 ; x < (rp->Bmpi.biWidth - 80 * 2) ; x++ ) x は初期値が80なのですから、これでは80ピクセル分のデータ をスルーさせてしませんか? 気のせいかもしれませんが・・・。

noname#50176
noname#50176
回答No.2

勘違いでした、すみません。 for(y = 0;(y+60) < rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) < (rp->Bmpi.biWidth - 160);x+=60) が for(y = 0;(y+60) <= rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) <= (rp->Bmpi.biWidth - 160);x+=60) だと思いますよ。

noname#50176
noname#50176
回答No.1

res->akarusa[i][j]+=res->data[(y + b) * rp->Bmpi.biWidth +(x + c)]; } } j++; } j=0; i++; } は、 res->akarusa[i][j]+=res->data[(y + b) * rp->Bmpi.biWidth +(x + c)]; j++; } j=0; i++; } } } じゃないですか?

関連するQ&A

  • debugエラーについて

    VisualC++初心者です。 力を貸してください。 内容はDEBUG ERRORで Stack around the variable "rp" was corrupted Stack around the variable "res" was corrupted とでてしまいます。 構造体等は省略しました。 #include <stdio.h> #include <stdlib.h> #define N 8 typedef struct{ int maxi,maxj,akarusa[N][N]; unsigned char *data; }RESULT; int bunkatsu(BMP *rp,BMP *wp); int keisan(BMP *rp,BMP *wp); RESULT *max(RESULT *res); /* 画像の取込 */ int ReadHeader(BMP *p,FILE *fp){ unsigned int size; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); fread(&p->Bmpf.bfType, sizeof(unsigned short), 1, fp); fclose(fp); exit(1); } fread(省略) return 0; } int ReadBmp(BMP *p,FILE *fp){ int dummy, byte, i, j, pixel; unsigned char *ReadBody=0; ReadHeader(p,fp); byte = p->Bmpi.biBitCount/8; dummy = (p->Bmpi.biWidth%4)?(4-(p->Bmpi.biWidth*byte)%4) : 0; pixel = ((p->Bmpi.biWidth)*byte+dummy)*p->Bmpi.biHeight; ReadBody = (unsigned char*)calloc(pixel,sizeof(char)); p->body = (unsigned char*)calloc(pixel,sizeof(char)); p->blue = (unsigned char*)calloc((pixel/byte),sizeof(char)); p->green = (unsigned char*)calloc((pixel/byte),sizeof(char)); p->red = (unsigned char*)calloc((pixel/byte),sizeof(char)); fread(ReadBody,1,pixel,fp); if(p->Bmpi.biBitCount == 8){ printf("\n"); for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->blue[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbBlue; p->green[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbGreen; p->red[(p->Bmpi.biWidth+dummy)*j+i] =p->Rgbq[ReadBody[(p->Bmpi.biWidth+dummy)*j+i]].rgbRed; } } for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->body[(p->Bmpi.biWidth+dummy)*j+i]=ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)+i]; } } } else if(p->Bmpi.biBitCount == 24 || p->Bmpi.biBitCount == 32){ for(j=0;j<p->Bmpi.biHeight;j++){ for(i=0;i<p->Bmpi.biWidth;i++){ p->blue[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte]; p->green[(p->Bmpi.biWidth+dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+1]; p->red[(p->Bmpi.biWidth + dummy)*j+i] = ReadBody[(p->Bmpi.biWidth+dummy)*(p->Bmpi.biHeight-1-j)*byte+i*byte+2]; } } } else{ printf("失敗\n"); exit(1); } free(ReadBody); return 0; } /* 480×480にする */ int bunkatsu(BMP *rp,RESULT *res){ int x,y,a=0; for(y=0;y<rp->Bmpi.biHeight;y++){ for(x=79;x<rp->Bmpi.biWidth-80;x++){ res->data[a] = rp->blue[y*rp->Bmpi.biWidth+x]+rp->green[y* rp->Bmpi.biWidth+x]+rp->red[y*rp->Bmpi.biWidth+x]; a++; } } return 0; } /* ブロック分けして各ブロックの明るさを計算する */ int keisan(BMP *rp,RESULT *res){ int b,c,x,y,i=0,j=0; for(y=0;(y+60)<rp->Bmpi.biHeight;y+=60){ for(x=0;(x+60)<(rp->Bmpi.biWidth-160);x+=60){ for(b=0;b<60;b++){ for(c=0;c<60;c++){ res->akarusa[i][j]+=res->data[(y+b)*rp->Bmpi.biWidth+(x+c)]; } } j++; } i++; } max(res); return 0; } /* 一番明るいブロックの特定 */ RESULT *max(RESULT *res){ int MAX1=0,MAX2=0,i=0,j=0; for(i=0;i<8;i++){ for(j=0;j<8;j++){ printf("[%d][%d]=%d",i+1,j+1,res->akarusa[i][j]); if(MAX1<res->akarusa[i][j]){ MAX1=res->akarusa[i][j]; res->maxi=i; res->maxj=j; } } printf("\n"); } printf("一番明るいブロックは[%d][%d]です\n",res->maxi+1,res->maxj+1); return 0; } int main(void){ BMP rp={0}; RESULT res={0}; FILE *fp; /* 画像の取り込み */ fp=fopen("LED1.bmp","rb"); ReadBmp(&rp,fp); res.data = (unsigned char*)calloc(rp.Bmpi.biWidth*rp.Bmpi.biHeight,sizeof(char)); fclose(fp); fp=0; bunkatsu(&rp,&res); keisan(&rp,&res); return 0; } です。よろしくお願いします。

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • 線形補間法プログラム(C++)

    C++言語で線形補間法のプログラムを組んで実行しているのですが、どしてもうまくいきません。ただ2倍の画像を作っているだけなのですが・・・。 以下プログラムを載せます、おおよその場所はわかるのですがどうすれば通るのかわかりません。どう直したらよいのか分かる方がいましたらご教授お願いします。 ※bmp[0]:現画像 pic:bmp[0]の縦横2倍の画像 // 線形補間法 // int zx = 2; int zy = 2; int i,j,m,n; float x,y,p,q; int xs = bmp[0]->Width/2; int ys = bmp[0]->Height/2; int d; for(i = -ys; i < ys; i++){ for(j = -xs; j < xs; j++){ y = i/zy; x = j/zx; if(y > 0){ m = (int)y; }else{ m = (int)(y-1);} if(x > 0){ n = (int)x; }else{ n = (int)(x-1);} q = y - m; p = x - n; if(q == 1){q = 0; m = m + 1;} if(p == 1){p = 0; n = n + 1;} if((m >= -ys)&&(m < ys)&&(n >= -xs)&&(n < xs)){ d = (int)((1.0 - q) * (1.0 - p) * (bmp[0]->GetPixel( m + ys, n + xs)) //おそらくこの辺に問題があるかと思われます。 + p * (bmp[0]->GetPixel( m +ys, n + xs)) + q * (1.0 - p) * (bmp[0]->GetPixel(m + 1 + ys, n + xs)) + p * (bmp[0]->GetPixel(m + 1 + ys, n + 1 + xs))); }else{ d = 0; } if(d < 0){d = 0;} if(d > 255){d = 255;} pic->SetPixel(i + ys, j + xs) = d; } } pictureBox2->Image = pic; }

  • 行列の積を関数を使って求める・・?

    2つの行列の行と列を入力し、積を計算するプログラムを関数を使って書きたいのですが、上手く行きません。どこをどのように直したらよいか教えてください!お願いします!! 以下が私が書いたプログラムです。 #include<stdio.h> #define NUMBER 10 int first(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; do{ printf("2つの行列の行と列を入力してください\n"); scanf("%d", &x1); scanf("%d", &x2); scanf("%d", &y1); scanf("%d", &y2); if(x1 != y2){ printf("行列の積は計算できません\n"); } }while(x1 != y2); printf("行列Aの要素を入力してください\n"); for(i=0; i<x1; i++){ for(j=0; j<x2; j++) scanf("%d", &a[i][j]); } printf("行列Bの要素を入力してください\n"); for(j=0; j<y1; j++){ for(k=0; k<y2; k++) scanf("%d", &b[j][k]); } } int second(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; for(i=0; i<x1; i++){ for(k=0; k<y2; k++){ for(j=0; j<x2; j++) c[i][k] = c[i][k] + a[i][j]*b[j][k]; } } for(i=0; i<x2; i++){ for(k=0; k<y2; k++) printf("%3d", c[i][k]); printf("\n"); } } int main(void) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; printf("行列の積を計算します\n %d\n", first(x1,x2,y1,y2,i,j,k)); printf("行列Aと行Bの積は\n %3d",second(x1,x2,y1,y2,i,j,k)); }

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • 桁数が増えると正しく計算されません。

    今、Perlで作成したモジュールをCに移しています。 Perlではうまく動いているのですが、Cで作った以下のプログラムでは、 nを13以上にすると、値が正しく計算されなくなります。 ユーザ関数をdoubleにしたりすると、全て0になったりコンパイルできません。 せめてdouble型の最大値くらいまでは計算したいと考えています。 また、下のプログラムでC言語ならではの修正すべき点があれば教えてください。 よろしくお願いします。 #-----------------------------------------------------------# #include <stdio.h> int factorial(int j); int main(void) { /* 試行回数n回 */ int i, j, n, r, x; int combination; //printf("試行回数は?"); //scanf("%d", &n); n=13; for (i=1; i<=n; i++){ for (r=0; r<=i; r++){ combination = factorial(i) / (factorial(r) * factorial(i - r)); printf("%5d",combination); } printf("\n"); } } int factorial(int j){ int i; int x; x = 1; for (i = 1; i <= j; i++){ x *= i; } return x; } #-----------------------------------------------------------#

  • 2進数の加算の繰り上がり

    2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } 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言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

  • C言語、行列の積を求めるプログラムについて

    「次に示す行列x,yの積を求めるプログラムを作成せよ。   x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」 という問題です。自分ではとりあえず、 #include<stdio.h> int main(void) { int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int y[3][2]={{1,5},{5,3},{8,1}}; int xy[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) xy[i][j]=x[i][j]*y[i][j]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",xy[i][j]); putchar('\n'); } return 0; } というプログラムを作ってみましたが、ダメでした。 ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?