• 締切済み

バブルソートについて質問です。

キーボード入力で10個好きな数字を入れてもらい入力した数字を小さい順に並び替えさらに入力した数を合計して小さい順の入力値と合計値を表示させ0は表示させないというプログラムを作りたいのですが途中から意味が分からなくなってしまいました。 ここを直したらいいなどのアドバイスをお願いします。 #include <stdio.h> void swap (int *,int *); void printdata(int *); main() { int a[10]; int n=10; int i,j; for(i=0;i<=9;i++) scanf("%d\n",a[i]); int kekka; kekka=a+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]; return kekka; printdata(a); for(j=n-1;j>=0;j--){ for(i=0;i<j;i++){ if(a[i]>a[i+1]){ swap(a+i,a+i+1); printf("[%d]と[%d]を入れ替え\n",i,i+1); printdata(a); } } } } void swap(int *y,int *z) { int t; t= *y; *y=*z; *z=t; } void printdata(int *a) { int i; for(i=0;i<=9;i++) printf("%4d",a[i]); printf("\n"); }

noname#58788
noname#58788

みんなの回答

  • tig33
  • ベストアンサー率50% (6/12)
回答No.8

No.3 No.5 No.6の回答者です。 No.7 のご指摘、 >if( i>0 ) i-1; とんでもない記述ミスですね。 正解は、書いた方が良いかな~~ 宿題にしておきますか。 がんばってください!! >トビ主(質問者様)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

No.4 です。 ( No.6 さんの回答に関連して、「回答」への裏側を・・) ★「バブル」にしなかった理由  ・ソース(レベル)を見て、それには「早い」と思ったからです。   (そうは書けない。といって今書いてるけど・・残念)  ・とはいえ、「質問」どおりに「回答」も判らない訳ではありません。 ★「キーボード入力で」・・を省略した理由。  scanf( "%d\n", &a[i] ); と書くようでは、    質問主旨に行き着くのは、・・と考え省略しました。  (気づきにくいミスですよね、実行しても・・)  でも、これ位は自力で・・。 ☆ところで、  質問者様は、No.3 さんへの補足の中程にある、    if( i>0 ) i-1;  は、何をする命令か、理解されて書かれたのでしょうか。  (私の環境では、無視されるコードです)

  • tig33
  • ベストアンサー率50% (6/12)
回答No.6

蛇足ながら、A4さんのソートは逐次比較方式と行って、バブルソートではありません。 書籍によっては、私の記述した方法ではなく、隣り合わせを比較して、入れ替えが行われなくなったら、終了というソートを、バブルソートとしていることもあるようです。 (例) int i,doswap; do {  doswap=0;  for(i=0; i<n-1; i++) {   if(a[i]>a[i+1]) {    my_swap(&a[i],&a[i+1]);    doswap=1;   }  } } while(doswap);      

  • tig33
  • ベストアンサー率50% (6/12)
回答No.5

まず命題を整理すると、 (1)キーボード入力で10個好きな数字を入れてもらい (2)入力した数字を小さい順に並び替え (3)さらに入力した数を合計して (4)小さい順の入力値と合計値を表示させ0は表示させない で、プログラムを添削しました。 インデントは全角空白を使用しています。 #include <stdio.h> //↓記述方法は合っていますが、10個の数ということを引数にする必要があります。 void printdata(int *,int ); void PrintAllData(int *val, int cnt, int sum) {  int ct;    //小さい順番に表示(0は表示しない)  for(ct=0; ct<cnt; ct++) {   if(*val != 0 ) {    printf("%4d\n", *val);   }   val++;  }    //合計の表示  printf("合計 = %d\n", sum); } //数値の入れ替え void my_swap(int *a, int *b) {  int w;    w = *a;  *a = *b;  *b = w; } //メインプログラム(関数) main() {  int a[10];  int n=10;  int t;  int i,j;  int kekka=0;    //(1)キーボード入力で10個好きな数字を入れてもらい  //入力すると同時に、合計を計算する  for(i=0;i<n;i++){   printf("%d番目の数字を入力して下さい。\n",i+1);   scanf("%d\n",&a[i]);   kekka += a[i]; //←合計を計算します  }    //printdata(a,kekka); //←これは命題には無いので不要  //小さい順に並べ替え  for(i=0;i<n-1;i++){   for(j=0;j<n-1-i;j++){    if( a[i] > a[i+1] ) {     my_swap( &a[i], &a[i+1] );     for(j=i; j>1; j--) {      if(a[j] < a[j-1]) {       my_swap(&a[j],&a[j-1]);      } else {       break;      }     }     if( i>0 ) i-1;    }   }  }    //全データの表示  PrintAllData(a, n, kekka); } //↓ここから以下は意味不明・・・? // t=a[j]; // a[j]=a[j+1]; // a[j+1]=t; // // printf("[%d]と[%d]を入れ替え\n",i,i+1); // printdata(a,kekka); // } // } // } // } //void printdata(int a,int kekka)  //←プロトタイプ宣言と違っています void printdata(int *a,int kekka) {  int i;  int n;  //←初期化されていません n=10;が必要  for(i=0;i<n;i++){   if(a[i]!=0){    printf("%4d",a[i]);   }  }  printf("合計 = %d\n",kekka); }

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>どこを直したらいいか教えて下さい。  ・kekka は、int の宣言時に初期化されて以後、    左辺にありませんが・・。  ・void printdata(int *,int); とのプロトタイプと    関数本体が異なりますが・・。  ・お判りとは思いますが、ソート部分はメチャクチャです。 --------------------------------------- ソート(入れ替え)については、 ★身の回りのものに置き換えて考えると・・。  ・2個のコップがあって、    1つにビール、    もう1つに日本酒 が入っている。        これらを入れ替えたいとき、      空の一時待避用の『容器1つ』が必要ですよね。      その容器に一旦、ビールを入れて、    空いたコップに、日本酒を入れる。    空いたコップに、待避したビールを入れる(◆)。 --------------------------------------- >途中から意味が分からなくなってしまいました。  あれも、これもですと・・・。 「データ入力」と「0は表示させない」は、件名とは、  直接関係しませんよね。「ソート」が理解された後で、  付加されれば、と思います。 (「合計値を表示」は、冒頭の kekka 云々から付加) ★サンプルソースでアドバイスします。 ・参考にして頂けましたら、幸いです。 #include <stdio.h> #define CNT 10 void PrintData( int iVal[] ) {  int i, iTotal = 0;  for( i = 0; i < CNT; i++ ){   iTotal += iVal[i];   printf( "%4d", iVal[i] );  }  printf( " 合計 = %d\n", iTotal ); } void SortData( int iVal[] ) {  int i, j, iDum;  for( i = 0; i < CNT; i++ ){   for( j = i; j < CNT; j++ ){    if( iVal[i] < iVal[j] ) continue;    iDum = iVal[i]; iVal[i] = iVal[j]; iVal[j] = iDum; //(◆)   }  } } void main() {  int iVal[10] = { 991, 2, 3, 454, 155, 236, 557, 98, 9, 60 };  PrintData( iVal );  SortData( iVal );  PrintData( iVal ); } 注:インデントに全角空白を用いています。   タブに一括変換してお試し下さい。

  • tig33
  • ベストアンサー率50% (6/12)
回答No.3

バブルソートと書いてあったので、ソートしているところを拝見しましたが、これではソート結果が正しく出力されないと思います。 バブルソートの意味を良く理解してください。 与えられたテーブルの各要素を縦に並べて小さい順に並べ替えるとき、上から順に2個を比べて、小さい物が見つかると、入れ替え作業が起きます。 そのとき、入れ替えた要素が更に上と比べて小さいとまた入れ替えが起きる。 この繰り返しが、泡が昇っていくようになるので、バブルソートと言うのだったと思います。 で、 ANo.1さんの指摘を反映して、プログラムしてみました。 for(i=0; i<(n-1); i++) {  if( a[i] > a[i+1] ) {   my_swap( &a[i], &a[i+1] );   for(j=i; j>1; j--) {    if(a[j] < a[j-1]) {     my_swap(&a[j],&a[j-1]);    } else {     break;    }   }   if( i>0 ) i-1;  } } いかがでしょうか?

noname#58788
質問者

補足

回答ありがとうございます。 参考にしてやってみたのですが、うまくできません。 どこを直したらいいか教えて下さい。 #include <stdio.h> void printdata(int *,int); main() { int a[10]; int n=10; int t; int i,j; int kekka=0; for(i=0;i<n;i++){ printf("%d番目の数字を入力して下さい。\n",i+1); scanf("%d\n",&a[i]); } printdata(a,kekka); for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if( a[i] > a[i+1] ) { my_swap( &a[i], &a[i+1] ); for(j=i; j>1; j--) { if(a[j] < a[j-1]) { my_swap(&a[j],&a[j-1]); } else { break; } } if( i>0 ) i-1; } } t=a[j]; a[j]=a[j+1]; a[j+1]=t; printf("[%d]と[%d]を入れ替え\n",i,i+1); printdata(a,kekka); } } } } void printdata(int a,int kekka) { int i; int n; for(i=0;i<n;i++){ if(a[i]!=0){ printf("%4d",a[i]); } } printf("合計 = %d\n",kekka); }

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

> scanf("%d\n",a[i]); scanf()のマニュアルを見直そう。第二引数。これじゃ数値が入らない。 > kekka=a+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]; > return kekka; これは何?デバッグ用の処理? あと、たぶん[0]が抜けてる。しかもここでプログラムが終わっちゃう。 > swap(a+i,a+i+1); 間違っちゃいないが、ここは swap(&a[i],&a[i+1]);とする。その方が意味が通りやすい。 > printf("[%d]と[%d]を入れ替え\n",i,i+1); printf("[%2d:%4d]と[%2d:%4d]を入れ替え\n",i,a[i],i+1,a[i+1]); とすれば入れ替えている様子が値を含めて見える。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

これを動作させると どう思った通りになってくれないのかを記述してくれないと答えてあげられないよ。 (判らないからじゃなくて そういう約束になっている)

noname#58788
質問者

補足

キーボード入力した数値をバブルソートできれいに並べることができません。

関連するQ&A

  • 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 <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • c言語 select sort

    最大値検索法のプログラムコードです。 どこがおかしいのでしょうか? 分かる方、教えてください。 よろしくおねがいします。 swapのプログラムコード #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); return 0; } int i,a[100]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); /* コマンド $cc sort.c swap.c */ for(j=0;j<9;j++){ printf("%d\n",j); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; } //最大データと探索範囲最後のデータとの入れ替え: //void swap(int *px, int *py){ int n,*px,*py; n = *px; *px = *py; *py = n; // } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d",a[i]); } fclose(fp); } } sort.cのプログラムコード #include<stdio.h> void swap (int *px,int *py); int main(void) { int a[0],b,maxi,j,max; max=a[0],maxi=0; printf("input \"a\" as integer = "); scanf("%d",&a); printf("input \"b\" as integer = "); scanf("%d",&b); printf("Before swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); // swap(&px,&py); swap(&a[maxi],&a[9-j]); printf("After swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); return 0; } void swap (int *px,int *py) { int n; n = *px; *px = *py; *py = n; } 実行結果 /tmp/ccBGIpCi.o(.text+0x0): In function `main': : multiple definition of `main' /tmp/ccMCttJd.o(.text+0x0): first defined here /usr/bin/ld: Warning: size of symbol `main' changed from 304 in /tmp/ccMCttJd.o to 641 in /tmp/ccBGIpCi.o collect2: ld はステータス 1 で終了

  • selection

    /*単純選択ソート*/ #include <stdio.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; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) if (a[j] < a[min]) min = j; swap(int, a[i], a[min]); } } int main(void) { int i; int x[7]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を入力せよ。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d] : ", i); scanf("%d", &x[i]); } selection(x, nx); /* 配列xを単純選択ソート */ puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); } をswapなしで書き換えるにはどこを書き換えればいいですか?

  • ソートプログラム

    ファイルから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 %

  • if文について

    ソートのプログラムにおいて昇順・降順を選択して表示させるプログラムを書いてるのですが 下記のように記述するとエラーが出てしまいます。 よく調べたのですがエラー表示もよくわからないものなのでした。 どのようにすればうまく動くようになるのでしょうか? #include <stdio.h> #define swap(type, x, y) do {type t = x; x = y; y = t; } while (0) void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] > a[j]) swap(int, a[j - 1], a[j]); } } void bubble2(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] < a[j]) swap(int, a[j - 1], a[j]); } } int main(void) { int i; int x[7]; int nx = sizeof(x) / sizeof(x[0]); int select; printf("%d個の整数を入力せよ。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d] : ", i); scanf("%d", &x[i]); } printf("昇順ですか降順ですか? 0:昇順/1:降順 >"); scanf("%d",&select); if (select == 0) bubble(x, nx); puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); else bubble2(x, nx); puts("降順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); 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回でした。 と表示させたいのですがうまくいきません。 どなたかご指導よろしくお願いします

  • 情報処理のバブルソートの問題について質問します。

    情報処理のバブルソートの問題について質問します。 #include <stdio.h> int main(void) { double x[5]={6.0, 9.0, 2.0, 10.0, 8.0}; int i,j; int n=5; double temp; /* 初期状態の表示 */ printf("並べ替え前の並びは以下の通り:\n"); for (i=0; i<n; i++) { printf("%f,\t",x[i]); } printf("\n"); for (i=0; i<n-1; i++) { for (j=i+1; j<n; j++) { if (x[j] > x[i]) { temp = x[i]; x[i]=x[j]; x[j]=temp; } } } printf("大きい順に並べ替えた結果は以下の通り:\n"); for (i=0; i<n; i++) { printf("%f,\t",x[i]); } printf("\n"); return 0; } というプログラムを用いて行ってみたのですが、 これは王様ソートというプログラムだと言われました。 どのように換えればバブルソートになるのでしょうか?

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

    以前も同じ質問したのですがもう一度お願いします プログラミングで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言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ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]); } }

専門家に質問してみよう