C言語のプログラミング課題でのscanfとbreakの使用について
- C言語のプログラミング課題で、最初に入力した数字に合計が一致した場合に作業を終了するプログラムを作成したが、上手く動作しない。
- 作成したプログラムでは、最初の数字を入力した後、ランダムに数字を入力するが、合計が一致した場合に終了しない。
- プログラムの修正方法について教えてください。
- ベストアンサー
プログラミング(scanf,break)
C言語のプログラミングの課題の中で、 6 2 1 3 のように最初に数字(6)を入力し、 そのあとに続く数字をランダムに入力したとき、 2行め以降の合計が2+1+3=6というように最初の数字となったときに作業を終了する というものをつくりたいです。(説明が下手ですみません;) 自分で以下のようにしてみたのですが、上手く動作しません。 (合計が最初の数字になったあと、1を入力しないと終わらないようです;) int main() { int n,m,j=0; scanf("%d\n",&n); for(;;){ scanf("%d\n",&m); j=j+m; if(j==n)break; } return 0; } 初心者なもので、どこが間違っているのか、どのように直せば上手く動作するのか教えていただきたいです。 ちなみに、2行目以降の数字を2、1、4のように最初の数字ちょうどにならないように入力する場合のものは考えなくてもいいようです。 よろしくお願いします。
- eight-seven
- お礼率100% (1/1)
- C・C++・C#
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
意図的に改行と比較させたいので、scanfに\nは不要です。
関連するQ&A
- scanf()関数の使い方について
はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。
- ベストアンサー
- C・C++・C#
- C++ scanfで止まらない
いつもお世話になっております。 最近C++を勉強し始めたばかりで、初心者丸出しの質問になってしまうと思うのですがひとつよろしくお願いします。 本を見ながらじゃんけんゲームを作っていて、サンプルとは別に自分で考えて作ってみたのですが、scanfの挙動がどうも思い通りにいきません。 以下がソースです。 int testJanken() { int player=0; int computer; printf("【じゃんけんゲーム】\n"); printf("じゃんけん・・・(グー:1 チョキ:2 パー:3 終了:9)>"); scanf("%d",&player); //入力受付 while(player!=9) { if(0<player&&player<=3) { printf("\nあなたは:"); showTe(player); srand(time(NULL)); computer=rand()%3+1; printf("コンピューターは:"); showTe(computer); showShouhai(player,computer); } else { printf("\n----------1~3,または9の値を入れてください!---------\n"); } printf("\nじゃんけん・・・(グー:1 チョキ:2 パー:3 終了:0)>"); player=0; scanf("%d",&player); //入力受付 } printf("\nバイバイー!!"); return 0; } //勝敗決定表示 int showShouhai(int player, int computer) { if(player==computer) { printf("あいこ!\n"); return 0; } else if((player+1==computer)||(player-2==computer)) { printf("あなたの勝ち!\n"); return 1; } else { printf("コンピューターの勝ち・・・\n"); return 2; } } //入力値からグーチョキパーを文字列で表示させる int showTe(int su) { switch(su) { case 1: printf("グー!\n"); break; case 2: printf("チョキ!\n"); break; case 3: printf("パー!\n"); break; default: printf("???\n"); break; } return 0; } 【実現したい仕様はこちら】 1)じゃんけんの手(1,2,3のどれか)を入れれば通常通りじゃんけんが行われ、結果が表示される。 2)9が入力されたら終了 3)1,2,3,9以外が入力されたらメッセージの表示 この3がうまくいきません。 制御できないのは文字を入力した場合なのですが、例えばaと入力するとそれ以降永久ループとなり抜け出せなくなってしまいます・・・ ネットであちこち原因を調べてみたのですが、探し方が悪いのか解決策がわかりません・・・ 今後の勉強のためにも原因と解決策を詳しく教えて頂けると嬉しいです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語のプログラミング (基礎)教えてください。
以下のような問題があります。 プログラムを作ってみたのですが、 コンパイルすると無限ループになったり、 正しく結果が出ません。 どのように直せば良いか教えていただけると助かります。 よろしくお願いします。 整数が入力される度に今までの合計を出力するプログラムを作成しなさい。なお、0 が入力されたら終了するものとする。 ただし、繰り返しの命令は while 文を使用し、条件は常に真 ( 1 ) とし、break 文を使うこと。 ▼実行例 整数:1 合計:1 整数:2 合計:3 整数:3 合計:6 整数:0 ******************************** #include<stdio.h> int main(void) { int n,sum; sum=0; while(1){ printf("¥n整数:"); scanf ("%d", &n); sum=sum+n; printf("¥n 合計:%d", sum); scanf ("%d", &sum); if(n==0){ break; } } }
- ベストアンサー
- C・C++・C#
- C言語のwhile文はネストできますか?
「*」を使用して、n列、m行の四角を表示させるプログラムを考えました。 --------------------------------------------------------------------------------------------- #include<stdio.h> int main(void) { int i=0,j=0,n,m; printf("n入力:"); scanf("%d",&n); printf("\nm入力:"); scanf("%d",&m); printf("\n"); while(i<m){ while(j<n){ printf("*"); j++; } printf("\n"); i++; } return 0; } --------------------------------------------------------------------------------------------- しかし、1行分しか表示されません。 n=2、m=2の場合 ----------------- n入力: m入力: ** ----------------- としか表示されません。 whileのネストが悪いのでしょうか? それとも、初歩的なミスがあるのでしょうか?
- ベストアンサー
- C・C++・C#
- C言語 プログラミング 行列演算
下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }
- ベストアンサー
- C・C++・C#
- scanfに文字が入力されたときにエラー表示させる
こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }
- ベストアンサー
- C・C++・C#
- scanf関数のプログラムをgetchar関数で
scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }
- 締切済み
- C・C++・C#
- scanf関数について
scanfで数字を入力し「CTRL+D」で入力終了となるプログラムを考えています. 調べてみると以下の様なプログラムでは入力終了となります. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); if ( scanf("%d", &a[i]) == EOF || i > 255) { break; } i++; } return 0; } しかし,次の様にすると「CTRL+D」では終了しません. #include <stdio.h> int main(void) { int a[256]; int i = 0; while(1) { printf("Input%d = ", i); scanf("%d", &a[i]); <-----追加 if ( a[i] == EOF || i > 255) { <-----変更 break; } i++; } return 0; } この場合は,環境がUNIXのため「-1」と入力すると終了します. 2種類の違いが分かりません. 教えてもらえないでしょうか?
- ベストアンサー
- C・C++・C#
- プログラミング 実数 合計
3つの実数を読み込んで合計を表示するというプログラムなんですが、プログラムをコンパイルして3つの実数を入力してくださいと表示させて実数1に1.5、実数2に0.8、実数3に1.0, 合計は3.3です表示させたいのですが #include <stdio.h> int main(void) { double n1,n2,n3; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%lf", &n1); printf("実数:"); scanf("%lf", &n2); printf("実数:"); scanf("%lf", &n3); printf("合計は%5.lfです。\n",(double)(n1 + n2 + n3)); return (0); } でコンパイルしようとすると1つしか実数を入力する所が出てこなくて 数字を入れると合計は.lfですと出てきて実行できないのですが、上のソースのどこか間違ってる所があったら教えてくれませんか?
- 締切済み
- C・C++・C#
- ループ中でのscanfおよびcin
あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください
- 締切済み
- C・C++・C#
お礼
ありがとうございます! \nを取り除いたところ、上手く動作しました。 改行はいらないのですね>< 素早い回答、助かりました。