初心者な質問:プログラム中の変数の値と実行回数について

このQ&Aのポイント
  • 上記プログラム中で変数a[j]とa[j+1]の値は?
  • 上記3命令の終了までの実行回数は?
  • 初心者な質問:プログラム中の変数の値と実行回数について
回答を見る
  • ベストアンサー

初心者な質問その1

************************************ main(){ int i,j,a[5]={1,-4,3,2,-5}; for(i=1,k=4;i==1;k--) { for(i=j=0;j<4;j++) { if(a[j]>a[j+1])continue; a[j]=a[j]-a[j+1]; a[j+1]=a[j]+a[j+1]; a[j]=a[j+1]-a[j]; i=1; } printf("a[%d]=%d\n",k,a[k]); } } ************************************ 上のプログラム中で、 (1)a[j]=a[j]-a[j+1]; a[j+1]=a[j]+a[j+1]; a[j]=a[j+1]-a[j];  を行ったときの変数a[j],a[j+1]のそれぞれの値 (2)上記3命令の終了までの実行回数 についてお願いします。 あと、出力結果を教えて下されば幸いです。  (家のパソコンがウイルスでやられたもので・・・(泣)) 初心者な質問で申し訳ありませんが宜しくお願いします。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

(1)a[j]の値がc,a[j+1]の値がdであるとして、 この処理を実行してみます。 実行前:a[j]=c,a[j+1]=d 1行目実行後:a[j]=c-d,a[j+1]=d 2行目実行後:a[j]=c-d,a[j+1]=c 3行目実行後:a[j]=d,a[j+1]=c すなわち、処理実行前と実行後とでは値が入れ替わっていることがわかります。 (2)4回です。出力結果は a[4]=-5 a[3]=-4 a[2]=1 a[1]=2 a[0]=3 となります。 あと、アドバイスとして。 値の交換は、メモリに余裕が無い場合を除き、交換専用の変数を用意し、それを使って行ったほうがいいですよ。 たとえば、 temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; という具合に。 それから、このくらいのプログラムならば紙にa[]の内容を書いて処理を追っていくというのもいい経験だ…とは言えんな、(1)の処理があるから(^_^;。

rokkaku
質問者

お礼

丁寧な回答とアドバイス、本当にありがとうございました。 まだ始めて一ヶ月なもので、、、 これから日々精進します(^^;

関連するQ&A

  • 初心者な質問その2

    ********************************** main(){ int i,j,a[5]={1,-4,3,2,-5}; for(i=0;i<4;i++) { for(j=i+1;j<5;j++) { if(a[i]>=a[j])continue; a[i]=a[i]-a[j]; a[j]=a[i]+a[j]; a[i]=a[j]-a[i]; } printf("a[%d]=%d\n",i,a[i]); } } ********************************** 上のプログラム中で、 (1)a[i]=a[i]-a[j]; a[j]=a[i]+a[j]; a[i]=a[j]-a[i]; を行ったときの変数a[i],a[j]のそれぞれの値 (2)上記3命令の終了までの実行回数 (3)画面に表示される結果 についてお願いします。その1と似たような問題ですが 初心者でさっぱりわからないもので(^^; 宜しくお願いします。

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

    以前も同じ質問したのですがもう一度お願いします プログラミングで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; }

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

    #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); } これを改良して偶数と奇数に分けてソートするプログラムがわかればいいのですが。。まだ慣れないものですいませんでした。

  • C言語を用いた45×45の逆行列の表示について・・・・。。

    次のプログラムを動かすと逆行列を求めることができます。 10×10の計算までは、スムーズに計算する事ができたのですが、 私が知りたい45×45の行列の計算になるとなぜかうまくいきません。 そこでみなさんにお聞きしたいのは、計算がうまくいかない理由がプログラムにあるのか、単にPCの限界なのか、それ以外なのか。みなさんからアドバイスをいただけないでしょうか? ※下のプログラム、見づらくてすいません。 #include <stdio.h> #define N 10 /* 元の数 */ #define N2 2*N /* プロトタイプ宣言 */ void Print(int k); /* 大域変数 */ double a[N][N2]= {/* 行列 Aおよび単位行列 */ { ここに45×45の正則行列&45×45の単位行列を入れます・・・。。 }; int main(void) { double d; int i,j,k; for (k=0;k<=N-1;k++) { Print(k); for(i=0;i<=N-1;i++) { if(i!=k) { d=a[i][k]/a[k][k]; for (j=k+1;j<=N2-1;j++) a[i][j]=a[i][j]-a[k][j]*d; a[i][k] = 0.0; } } d=a[k][k]; for (j=k;j<=N2-1;j++) a[k][j]=a[k][j]/d; } Print(N); } void Print(int k) { int i,j; printf("\n ステップ %d \n",k); /* 小見出し */ for(i=0;i<=N-1;i++) { /* 第i行を印刷 */ for(j=0;j<=N-1;j++) printf("%6.4f,",a[i][j]); printf(" : "); for(j=N;j<=N2-1;j++) printf("%6.4f,",a[i][j]); printf("\n"); } }

  • C言語の問題を教えてください。初心者です。

    1000以下の整数を入力して、それ以下の素数を出力するプログラムをつくっています。 一応自分でやってみたのですが、どうもうまくできません。自分ではどこが間違っているのかさっぱりなので間違い箇所を指摘し、どうすれば良いのかを教えていただきたいです。ほかに効率的なやりかたがあったらあわせてお願いします。 初心者なので易しく説明していただけるとありがたいです。 <自分でやってみた> #include <stdio.h> int main(){ int i,j,N; int a[1000]; for (i=2; i<=1000; i++) { a[i]=1; } for (i=2; i<=1000; i++) { for (j=i++; j<=1000; j++) { if (a[j]=1 && j%i==0) { a[j]=0; } } } printf("2以上1000以下の整数を入力してください\n"); scanf("%d",&N); printf("%d以下の素数は\n",N); for (i=2; i<=N; i++) { if (a[i]=1) { printf("%d\n",i); } } } よろしくお願いしますm(_ _)m

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\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言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • 行列をべき乗させるプログラム

    2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・ 何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。 <プログラム> #include <stdio.h> #define N 2 int A[N][N]; int A_NEW[N][N]; int A_5[N][N]; /* 行列Aを5乗したもの */ int main() { int i,j,k,l; /* 2行2列の係数行列Aの成分を入力 */ printf("係数行列Aを%d行%d列で入力してください\n", N, N); for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("A[%d][%d]=", i+1, j+1); scanf("%d", &A[i][j]); } } for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_NEW[i][j] += A[i][k] * A[k][j]; } } } for(l=0; l<3; l++) { for(i=0; i<N; i++) /* A_5の計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_5[i][j] += A_NEW[i][k] * A[k][j]; } } } for(i=0; i<N; i++) { for(j=0; j<N; j++) { A_NEW[i][j] = A_5[i][j]; } } } printf("A_5=\n"); /* 出力 */ for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("%d ", A_5[i][j]); } printf("\n"); } } <入力例> A= 1 3 2 1 <期待する結果> A= 241 303 202 241 <このプログラムの結果> 406 498 332 406

  • ガウスの消去法のプログラムについて

    ガウスの消去法のプログラムについて #include <stdio.h> #define N 3 void main(void) { static double a[N][N+1]={{3.0, 1.0, 1.0, 8.0}, {6.0, 2.0, 3.0, 4.0}, {9.0, 4.0, 5.0, 12.0}}; double d; int i,j,k; for (k=0;k<N-1;k++){ for (i=k+1;i<N;i++){ d=a[i][k]/a[k][k]; for (j=k+1;j<=N;j++) a[i][j]=a[i][j]-a[k][j]*d; } } for (i=N-1;i>=0;i++){ d=a[i][N]; for (j=i+1;j<N;j++){ d=d-a[i][j]*a[j][N]; a[i][N]=d/a[i][i]; } } for (k=0;k<N;k++){ printf("x%d=%f\n",k+1,a[k][N]); } } というプログラムを実行したら 8-5.c: In function `main': 8-5.c:4: warning: return type of `main' is not `int' と出たのですがどこを直せばよいのでしょうか?><

専門家に質問してみよう