• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一つのプログラムを自由に操りためには)

C言語でプログラムを自由に操る方法と質問箇所の修正

このQ&Aのポイント
  • C言語でプログラムを自由に操るためには、自分で課題を考えて一つのプログラムを作ることが効果的です。
  • しかし、同じものばかりやっているとつまずくことがあります。
  • 質問のコードでは、データAとデータBをシャッフルして表示する際の条件に誤りがあります。修正が必要です。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

逆に聞いてみよう. 「上記のコードではどこが違っているのかしりたいです」と書いているということは, 「このプログラムは何かがおかしい」と思ったわけですよね? いったいどのような事実を根拠として「このプログラムは何かがおかしい」と思ったのですか? それ以前に, 最後の「たとえば」の例は明らかにおかしいです. 「5 11 36 78 109」という 5つの「合計」は 239 であり, これは「5つの合計が70-データA(この場合5)~150-データA(この場合5)の範囲内として」の条件にあてはまっていません. つまり, そもそもの問題として「あなた自身が問題を理解できていない」のではありませんか?

okikayo
質問者

お礼

あんたらは、日本語わからねーのかよ!

okikayo
質問者

補足

たとえばの数字は思いつきで書いたものであって根拠はないです。データ入力は超えないすうじがはいります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

>たとえばの数字は思いつきで書いたものであって根拠はないです。データ入力は超えないすうじがはいります。 例えば、以下のような質問があったとします。 >複数の数字を入力してその合計を出力するには、どのようなコードを書けばいいですか。 >例) 1 2 3 を入力したら合計として 456 が出力される。 これ作れますか? こういう場合大抵、問題が間違ってるのか例が間違ってるのか悩むことになります。 なので例をあげるならあげるで適切な例をあげないと意味ないですよ。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

「間違い」の基準をはっきりさせてください。 極端な話し、「『エラーが出てコンパイルできない』プログラム」を作ろうとして、「エラーが出てコンパイルできない」なら、目的通りの「正しいプログラム」です。 まずは、何が「正しい状態」なのかを、説明してください。 一つ例示されただけでは、それ以外はどうするのか、がはっきりしません。 「こういうことをしたいから、こういう方法を使って、こうする。」 「そうしようとしたけど、こうなってしまう。だから、ここをこうしよう」 こういうことは、ベテランでも、ちゃんと考えないと正しいプログラムは作れません。 > 最初の5はデータAより 入力したデータAのどの値もプログラムで使われていません。(入力直後の一覧表示を除いて) s_number[s] がどうなるか、理解できていますか? > 5つの合計 > 5つの数字の割合が奇数2:偶数3か奇数3:偶数2 どちらも、そのようになっていません。 変数 sum が何の合計になっているか、変数pumが何の数になっているか、もう一度プログラムの動作を確認してください。 あなたが「5つの合計」のつもりでいても、プログラムはそうは動いてくれません。 > 5つの合計が70-データA(この場合5)~150-データA(この場合5)の範囲内 既に指摘があるように、入力したデータ次第では該当する組合せが無く、無限ループになります。 「該当する組合せが無い場合は無限ループする」というのが「正しい動作」ならこのままでいいですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • CでBAモデルを作りたいのですが

    複雑ネットワークの勉強をしている者です。 Cでバラバシモデルの作成を行っておりますが、Pajekを使いCで書いたプログラムを動かしたいのです。 しかし、最終頂点数が20を超えると動かなかったり、クラスター係数が出なくなったりします。 原因は、 (1)i,jの値が重なっている (2)同じ組み合わせが出現する ことだと思われます。 (1)(2)が出なくなるプログラムにする方法を教えてください。 #include <stdio.h> #include <stdlib.h> #include <time.h> void ba_model(int N, int m0, int m); int sum(int *data, int n); int main(int argc, char *argv[]) { int N; int m0=atoi(argv[1]); int m=atoi(argv[2]); char filename[18]="ba_model.net"; FILE *fp; if(argc == NULL) exit(0); printf("Input Vertex Size: "); scanf("%d", &N); printf("Vertex Size: %d\n",N); printf("Initial Vertex: %d\n",m0); printf("Edge Number: %d\n",m); fp=fopen(filename, "w"); fprintf(fp, "*Vertices %d\n", N); fprintf(fp, "*Edges\n"); fclose(fp); ba_model(N, m0, m); return 0; } void ba_model(int N, int m0, int m) { int i, j, n; int output_degree[100]; int edge_number; double p; char filename[18]="bamodel.net"; FILE *fp; fp=fopen(filename, "a"); if(fp==NULL) { printf("Error FileOpen\n"); } else { printf("FileOpen OK:%s\n",filename); } srand(time(NULL)); printf("乱数初期化OK\n"); printf("N=%d, m0=%d, m=%d\n",N,m0,m); for(i=0; i<N; i++) { edge_number=0; for(j=m0; j<N; j++) { p=(double)(output_degree[j]+1)/(double)sum(output_degree, i); printf("p(%d)=%lf\n",j,p); if(p > (double)rand()/RAND_MAX) { output_degree[i]++; output_degree[j]++; edge_number++; if((i+1)!=(j+1)) { printf("%d %d 1\n", i+1, j+1); }else{ break; } } if( m < edge_number ) break; } } fclose(fp); } int sum(int *data, int n) { int k; int sum=0; printf("In Sum: n=%d\n",n); if(n==0) { sum = 1; } for(k=0; k<n; k++) { printf("k=0 n=0\n"); sum = sum + data[k] + 1; } return sum; }

  • 途中経過も表示するプログラム

    以下のプログラムで途中経過(例えば i=3の時 44 52 22 41 81 i=2の時 44 22 41 52 81 i=1の時 22 41 44 52 81 のように途中経過を表示するにはどうしたらいいんですか? 解る方がいらっしゃいましたら教えてください。 #include <stdio.h> int main(void) { int i,j; int n; /* データ数 */ int data[100]; /* データ用 */ int tmp; /* 交換用 */ printf("データ数="); scanf("%d",&n); for(i=0;i<n;i++){ /*データ入力*/ printf("data[%d]=",i); scanf("%d",&data[i]); } for(i=n-2;i>=0; i--){ for(j=0; j<=i; j++){ if(data[j]>data[j+1]) { tmp=data[j]; /* 隣あうデータ */ data[j]=data[j+1]; /* の交換 */ data[j+1]=tmp; } } } printf("ソート結果\n"); for(i=0;i<n;i++){ printf("data[%d]=%d\n",i,data[i]); } }

  • プログラムについて質問です。

    プログラム初心者なのですが最短経路を探すプログラムを書きました。実行もできるのですが時間がかなりかかるので時間を短縮したいのですがどうすればいいでしょうか。環境はvisualC++2008を使ってます。 #include<stdio.h> #include<limits.h> #include<stdlib.h> #include<time.h> #define N 1000 #define E 3998 int e[N+1][N+1]; int w[N+1][N+1]; int s, sink; int minLen;//始点sからどの点に移るか決める int j; int m; int u[N+1];//距離 int f[N+1]={0}; int prev[N+1];//通ったノード int start = 1; int goal = 4; void tansaku(int start) { for ( j=0 ; j<=N ; j++ ){ u[j] = 1000; } //始点s=0とする s = start; f[s] = 1; u[s] = 0; for( m=1 ; m<=N ; m++ ){ printf("現在位置[%d]\n", s); //点sは最短経路決定 for( j=1 ; j<=N ; j++ ){ printf("e[%d][%d]=%d \nw[%d][%d]=%d\n\n", s, j, e[s][j], s, j, w[s][j]); if( e[s][j] != 1 ){ //printf("[%d]には繋がってない\n", j); //printf("-----------------------------------------\n"); continue; //枝(s,j)が存在しなければ以下の処理をスキップする } printf("[%d]に繋がってる→", j); if( u[s]+w[s][j] < u[j] ){ printf("重み更新!\n"); u[j]=u[s]+w[s][j]; prev[j]=s; //点jへの経路長を更新、最短経路規定の点は除外 printf("u[%d] = %d\n", j, u[j]); printf("prev[%d] = %d\n", j, prev[j]); }else{ printf("重み更新なし...\n"); } printf("-----------------------------------------\n"); } /***************** 点sからどの点に移るか決める工程*******************/ minLen = 1000; for( j=1 ; j<=N ; j++ ){ if( f[j] == 1 ){ printf("%dは通過済み\n", j); continue; } printf("u[%d] = %d\n", j, u[j]); if( u[j] < minLen ){ //点sは経路長が最短 minLen = u[j]; f[j] = 1; s = j; } //ヒープを使う } if(s == goal){ printf("到着!!!!!\n"); minLen = 0; printf("[経路]:"); while(s != start){ printf("%d ←", s); s = prev[s]; } printf("%d\n距離=%d\n", start, u[goal]); exit(1); } printf("次は%dです。\n", s); } printf("%d\n", prev[N]); } int main(void) { FILE *fp; fopen_s(&fp, "text2.txt","r"); while ((fscanf_s(fp, "%d %d %d", &s, &j, &minLen)) != EOF){ printf("read\n"); e[s][j] = 1; //以下は1→2と2→1を同一に見なす w[s][j] = minLen; e[j][s] = 1; w[j][s] = minLen; } fclose(fp); tansaku(1); return 0; }

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • プログラム作成が出来ません

    プログラム作成の課題でエラーが出て進めません (1)~(3)までだけなら作成できるのですがどうしても(4) を表示させることができません^^; (1)3~99までの奇数を7*7の2次元配列に読み込み表示 (2)(1)の配列の行と列を入れ替えたものを表示 (3)全要素の平均 (4)要素の中から9の倍数を選び出し表示 添削よろしくお願いします。 #include <stdio.h> main() { int a[7][7]; int i,j,ave,sum; int c; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { a[i][j] =3+(j*2)+(i*14); } } for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { for(c=0; c<49; ++c) { if((3+(j*2)+(i*14))%9==0) { c=3+(j*2)+(i*14); } } } } sum=0; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { sum=sum+a[i][j]; } } ave=sum/7/7; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[i][j] ); } printf( "\n" ); } printf("\n"); for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[j][i] ); } printf( "\n" ); } printf("\n"); printf("average=%d\n",ave); printf("\n"); for(c=0; c<49; ++c) { printf("%d",c); } } 長々と失礼しました・・・

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。1問だけでも構いませんのでよろしくお願いします。