ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:超初心者の為、教えて下さい) C言語学習2日目の超初心者の質問:for文の動作について 2006/12/17 23:59 このQ&Aのポイント C言語学習2日目の超初心者が、for文で作成したプログラムの動作について質問です。プログラムを実行すると、最後に表示される数字がなぜ3:0になるのか疑問です。また、for文が終わった後のprintfの中身の数字は、最後に処理された数字なのでしょうか。 超初心者の為、教えて下さい c言語学習2日目の超初心者です ご教授下さい。 #include <stdio.h> main ( ) { int i; int j; for(i=0;i<3;i++){ scanf("%d",&j); printf("%d:%d\n" , i ,j); } printf("%d:%d" , i ,j); return 0; } こういったプログラムを作った場合、動かすと 例えば全部jに0を入れると 0 0:0 0 1:0 0 2:0 3:0 となりますが、最後はなぜ3:0になるのでしょうか? iはfor(i=0;i<3;i++)で0、1、2しか入らないと思うのですが。 それとfor文が終わったのちのprintの中身の数字というのは 最後の数字が反映されるものなのでしょうか? 1 0:1 2 1:2 3→-----↓ 2:3 ↓ 3:3←--← 質問の原文を閉じる 質問の原文を表示する みんなの回答 (3) 専門家の回答 質問者が選んだベストアンサー ベストアンサー KnKn9898 ベストアンサー率31% (40/127) 2006/12/18 00:16 回答No.2 jはこの際関係ないので for(i=0;i<3;i++){ printf("%d\n" , i); } printf("%d\n" , i); //※ ということですね。 for(){}がやっていることはiの値を{}の最後にインクリメントして、{}の最初のところで評価するという動作です。したがってiの値は0,1,2,3となったところでi<3の条件に合わなくなってループから抜けます。iはこの関数のどこからでも参照されてしまうので、forループを抜けた後でも変更された値、つまり3を保持しています。なので//※のところのprintfでも3が表示されるのです。 この辺は「変数のスコープ」という話題になります。 なおC++ですともうちょっと別の書き方をしてforループ内だけで有効な変数を定義することもできます。 質問者 お礼 2006/12/18 21:40 >iの値は0,1,2,3となったところでi<3の条件に合わなくなってループから抜けます そういう考えなのですね。 最後の3が出てきたら、forの{}中のprintfは飛ばされて{}から3が抜け出すと考えればいいのですね。 今後ともご教授願います。 ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (2) yshr9442 ベストアンサー率43% (10/23) 2006/12/18 01:44 回答No.3 補足説明をしようと思ったのですが、 No1,No2の回答者様ので十分ですね。 for文の中が実行されているのは、条件が当てはまるときだけですからね。 もしもiが0,1,2しか入らないならば、永久にfor文から抜け出せなくなってしまいます。 iが+1されて条件判定し、i=3になって初めて条件から抜け出し最後のprintfでi=3,j=0が出力されるということです。 質問者 お礼 2006/12/18 22:45 なるほど。とりあえず2を超えて3まで行ってしまうのですね。 そして3が条件と合わないのでループの外に飛び出すという考えなのですね。 ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 mac_res ベストアンサー率36% (568/1571) 2006/12/18 00:12 回答No.1 for文を等価なwhile文に書き換えてみればはっきりします。 #include <stdio.h> int main(void) { int i; int j; i = 0; while ( i < 2 ) { scanf("%d", &j); printf("%d:%d\n", i, j); i++; } printf("%d:%d", i, j); return 0; } ループを抜けてもiのスコープは有効で3になっています。 質問者 お礼 2006/12/18 21:21 ありがとうございます。 whileでも同じなのですね。 iは2未満なので3なんか入るはずがない! と思っていましたが、 理解の仕方が間違っていたんですね。 今後とも是非宜しくお願いします。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A 基礎だと思いますが、教えてください!初心者です。 『0より大きい10個の異なる数字を入力したときに、 大きいものから順番に並び替えて表示する』プログラム の作り方を教えてくださいm(__)m 下に途中までですが、自分なりにやったものを載せておきます。 include <stdio.h> int main() { int input[10],max[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; int i,j; printf("0より大きい10個の異なる数字を入力してください\n"); for(i=1; i<=10; i++)/* 比べるものを10個入力する */ { printf("%d番目の数字を入力してください",i); scanf("%d", &input[i-1]); } for(j=1; j<=10; j++) /* 1つずつ調べている */ { for(i=1; i<=10; i++) { if(max[j-1] < input[i-1]) max[j-1] = input[i-1]; /* 結果をほかの配列に格納している */ input[i-1] = 0; /* 最大となったものを0にしたい,だけどその方法がわからない */ } /* これだと最大値が変わるごとにその値が0になってしまいます */ printf("%2d目の数は%2dです \n",j,max[j-1]); } return(0); } 初心者です。 ループで、どうしてもわからないので、質問します。 1234567890123456789012345 と、いうように表示したいのですが、以下のソースでは、表示されません。教えてください。 ※ 読み込まれた整数値の個数は25とした場合です。 #include <stdio.h> int main(void) { int i = 0; int num; printf("整数を入力してください。:"); scanf("%d",&num); for (i = 0; i < num; i++){ printf("%d", i); if ( i <= 10 ){ i = 0; } } putchar('\n'); return(0); } c言語のプログラミングについて聞きたいのですが 自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) { int i,j; int tensu[10][3]; char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前 点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 配列 /*10個の数字を受け取り,その中に一致する2つの数字があるかどうかを報告するプログラム*/ #include<stdio.h> int main(void) { int i,j,k; int item[9]; printf("10個の数字を入力してください\n"); for(i=0;i<10;i++) scanf("%d",&item[i]); for(j=0;j<10;j++) { for(k=j+1;k<10;k++) { if(item[j]==item[k]) printf("%dが2つ存在します.\n",item[j]); } } return 0; } というプログラムでエラーが出てしまいました. エラー内容は Stack around the variable 'item' was corrupted というものです. 原因を知りたいです.よろしくお願いします. 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 )」と表示されるのですが何でですか? 困ってます↓ pow 「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; } C言語初心者です。書いたプログラムを採点して下さい 入力された0~100までの10個の数値から、 最小値と最大値を表示するプログラムを書きました。 #include <stdio.h> int getmin(int * pvalue); int getmax(int * pvalue); int main(void) { int i,value[10]; int minimum,maximum; printf("0~100の範囲で10個の数値を入力してください:\n"); for(i=0;i<10;i++){ scanf("%d",&value[i]); if(value[i] < 0 || value[i] > 100) { printf("0~100の範囲です:\n"); scanf("%d",&value[i]); } } minimum = getmin(value); maximum = getmax(value); printf("最小値は%d\n",minimum); printf("最大値は%d\n",maximum); return 0; } int getmin(int * pvalue) { int i=0,j; for(j=1;j<10;j++) { while(pvalue[i] > pvalue[j]){i++;} } return pvalue[i]; } int getmax(int * pvalue) { int i=0,j; for(j=1;j<10;j++) { while(pvalue[i] < pvalue[j]){i++;} } return pvalue[i]; } 正常に作動はしましたが、 記述に無駄が多い、分かりづらい などあればご指導いただけますか? よろしくお願いします。 線形探索法のプログラムについて 配列Aに格納されている数字を検索するプログラムより、 Aのプログラムでは配列Aに格納されている数字を検索(scanf("%d" , j)で入力)した にもかかわらず、「該当するデータがありませんでした」と表示されてしまいます。 Bのプログラムでは、配列Bに格納されている数字を検索(scanf("%d" , j)で入力)すると 「該当するデータがありました」と表示されます。 Aのプログラムで、------でかこってある部分に問題があると思われ、 いろいろと試してみましたが、未だにその理由をつかむことができません。 その理由を知りたく、書き込みを致しました。 ご教授の程宜しくお願い致します。 A. main(){ int i , j; int k = 0; int A[5] = {4 , 1 , 3 , 4 , 5}; printf("検索する数値を入力してください > "); scanf("%d" , j); --------------------------------------------------------------- for(i=0 ; i<5 ; i++){ if(A[i] == j){ printf("該当するデータはあります"); k++; } } --------------------------------------------------------------- if(k <= 0){ printf("該当するデータがありませんでした\n"); } return; } B #include<stdio.h> main(){ int i , j , k; int A[5] = {4 , 1 , 3 , 4 , 5}; printf("検索する数値を入力してください > "); scanf("%d" , j); for(i=0 ; i<5 ; i++){ if(A[i] == j){ k++; } } if(k>0){ printf("該当するデータはありました"); }else{ printf("該当するデータはありませんでした"); } return; } 初心者です。 以下のソースの説明ですが、例えばnaに5、nbに4を入れたとき、 実行後の表示として 5+6+7+8=26 となるようにしたいのですが、できません。 教えてください。 #include <stdio.h> int main(void) { int sum = 0; int na,nb; printf("整数A:"); scanf("%d",&na); printf("整数B:"); scanf("%d",&nb); /*nbは回数*/ for ( na; na <= nb ;na++){ sum = sum + na; } printf("%dです。\n",sum); return(0); } C++の問題についてです 5個の数字をキーボードから受け取って、その中に同じ数字があれば、画面にその旨報告する。 というプログラムを作っているのですが、自分で作った結果、 #include "stdafx.h" #include <stdio.h> int main(void) { int i, j, a; i = 0; do{ printf("値を入力してください:"); scanf("%d", &a[i]); for(j=0; j < 5; j++) { if(a == i) { printf("%dは同じ値があります。\n", a[i]); } } i++; } while(i<5); return 0; } となりました。 このプログラムで文法がおかしいというところがあれば教えていただけませんか? 自分で考えてみたものの、全然わかりませんでした。 使用しているソフトはVisual C++2005 Express Edition というソフトです。 どうかよろしくお願いします。 困っています これを三段で実行してみたのですが、うまく表示できません。下のようになります。どこが間違っているか教えてください。お願いします。 * * * #include <stdio.h> int main(void) { int i, j, ln; printf("何段を表示しますか?"); scanf("%d", &ln); for(i=1; i<=ln; i++){ for(j=1; j<=ln-i; j++) putchar(' '); for(j=1; j<=i * 2 - 1; j++); putchar('*'); putchar('\n'); } return(0); } c言語 プログラム ピラミッド プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム forループ #include<stdio.h> int main(int argc, char** argv) { int i; printf("正の整数を入力してください。\n"); scanf("%d",&i); for(;i;i--) { printf("%d\n",i); } return 0; } このプログラムの判定部がiだけなのがわかりません。どうしてこれで1までのカウントダウンがとまるのでしょうか。 プログラム 下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); } getchar()について 教えてください。 visual studio 2010 professinalで以下のソースをデバッグして ”続行するには何かキーを押してください!” で待機させたいのですが getchar()一個だけでは実現しません。 2個重ねるとOKです。どうしてでしょうか。 -------------- 以下のようにscanf関数がなければokということは突き止めたのですが、、、。 ご教授ください。 #include <stdio.h> int main(void) { int i; printf("なにか数字を入力してください。\n"); scanf("%d",&i); printf("今あなたが入力した数字は%dです。\n",i); printf("続行するには何かキーを押してください!"); getchar(); //getchar(); return 0; } ---------------------------------------------------------------- int main(void) { printf("続行するには何かキーを押してください!"); getchar(); return 0; } パスカルのピラミッドを作りたいのですが... */ 入力した段数のパスカルの三角形をつくる */ #include <stdio.h> /*---nCr値を返す---*/ int comb(int n,int r) { if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); for (i = 0; i < ln; i++){ for(j = 0;j < ln - i;j++) putchar(' '); for(j = 0; j < i; j++){ printf("%d",comb(i,j)); printf(" "); } putchar('\n'); } return (0); } と作ったら、うまく 1 1 1 1 2 1 1 3 3 1 とは表示されず、 1 1 2 1 3 3 1 4 6 4 となってしまいます。 どこを直せばよいのでしょうか。教えて下さるとうれしいです。 よろしくお願い致します。 C言語プログラミングで・・・ つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします 最大値を求める 3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; } 変数について(足し算・引き算) #include<stdio.h> main () { int i ; int j ; printf("第1の引数は?\n"); scanf("%d" , &i); printf("%d\n" , i); printf("第2の引数は?\n"); scanf("%d" , &j); printf("%d\n" , j); printf("和は、%d\n" , i+j); printf("差は、%d\n" , i-j); printf("積は、%d\n" , i*j); printf("商は、%d\n" , i/j); return; } これを実行すると(iを20 jを10)としたときに 和は、30 差は、10 積は、200 商は、2 と表示されます。 しかし、このようにプログラミングすると 足し算や、引き算の値が変になります。 #include<stdio.h> main () { int i ; int j ; int tashizann = i + j; int hikizann = i - j; int kakezann = i * j; int warizann = i / j; printf("第1の引数は?\n"); scanf("%d" , &i); printf("%d\n" , i); printf("第2の引数は?\n"); scanf("%d" , &j); printf("%d\n" , j); printf("和は、%d\n" , tashizann); printf("差は、%d\n" , hikizann); printf("積は、%d\n" , kakezann); printf("商は、%d\n" , warizann); return; } これを実行すると(iを20 jを10)としたときに 和は、257 差は、-255 積は、256 商は、0 と表示されます。 変数で足し算や引き算を設定したものを引数として 使うと、値がおかしくなるのかを教えて頂けませんか。 c言語超初心者です。教えてください 基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
>iの値は0,1,2,3となったところでi<3の条件に合わなくなってループから抜けます そういう考えなのですね。 最後の3が出てきたら、forの{}中のprintfは飛ばされて{}から3が抜け出すと考えればいいのですね。 今後ともご教授願います。 ありがとうございました。