• ベストアンサー

C言語

演算がうまくできなくてこまっています。 int hogeと定義した変数があります。 プログラムの途中で色々代入をし終えた結果、 printf(%d,hoge)とすると「49」と表示、 printf(%c,hoge)とすると「1」と表示されます。 %dは10進法のはずなのになぜか49となります。 今このhogeを用いて計算をしたいのです 例えば、hoge = hoge*5+1のように純粋に10進法で計算したのですが、 このままだと49*5+1=...となってしまします。 どうすれば改善出来ますか?

  • omkm
  • お礼率33% (108/325)

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

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.6

アスキーコード表を見ると理解が早いのではないかと思います。 http://e-words.jp/p/r-ascii.html この表の10進で49のところは、文字が1となっています。 ですから、%cで1が出力されるのです。

その他の回答 (5)

回答No.5

int hogeの中身を見ればわかります。 コンピュータ内部では1と0の2進法であることはご存知とおもいます。 中身は「0110001」となっています。 これを数字(十進)とみると49になります。(1+16+32=49) これを文字とみると「1」と決められています。 int で定義したものは終始数字として使用するのが普通です。 printf(%c,hoge)は意味がないといえます。49が本来の意味です。

  • digitalian
  • ベストアンサー率29% (323/1104)
回答No.4

hoge==49 は正しい結果を返しています。 アスキーコードの '1' が49番です。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

>printf(%c,hoge)とすると「1」と表示されます。 ということは、hoge = '1'; と書いたんですね。 hoge = 1; でなく。 hoge = '1'; は、 hoge = 49; と同じ意味ですよ。 hoge = buffer[i]; とかしたのであれば、isdigit(hoge) で数字かどうか調べて、数字なら num -= '0'; で文字が値になります。

  • mainPC
  • ベストアンサー率21% (62/287)
回答No.2

49にならない予定のコードでしたら、printfに行く前にバグがあります。 hogeに入っている値は0x31(49)になっているようですので。 ※49は文字コードでは0x31('1')になります 今一度、色々代入をする処理の見直しをしてみては如何でしょうか。 ※よくあるバグは、変数hogeに初期値を入れてないってのがありますが。。。

  • f272
  • ベストアンサー率46% (8021/17145)
回答No.1

どのように改善したいの? hogeに49という値が代入されているんでしょうから,当たり前の挙動のようにしか見えませんが...

関連するQ&A

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • 助けてください(C言語)

    初心者です。 足し算と引き算をするプログラムを作りましたが コンパイルまではとおっていますが、実行し、 5+3= とうつと、804399520 804399524 804399528[1] Done とでます。 どこがいけないのか?ご教授いただければと思います。 回答でなくても良いのでヒントを下さい。 #include<stdio.h> /* 演算を実行し,値を返す関数を設ける */ int tashizan(int keyInpInt1,int keyInpInt2); int hikizan(int keyInpInt1,int keyInpInt2); tashizan(int keyInpInt1,int keyInpInt2) /* 加算 */{ return(keyInpInt1 + keyInpInt2); } hikizan(int keyInpInt1,int keyInpInt2) /* 減算 */{ return(keyInpInt1 - keyInpInt2); } void main(void) { /*入力用と,出力用の変数を定義*/ int keyInpInt1,keyInpInt2,x; char F,tougou; /* 計算式の入力受付 */ printf("式-->"); scanf("%d %c %d %c",&keyInpInt1,&F,&keyInpInt2,&tougou); switch(F){ case '+' :x = tashizan(keyInpInt1,keyInpInt2); break; case '-' :x = hikizan(keyInpInt1,keyInpInt2); break; } /* 演算結果を出力 */ printf("%d %c %d %c %d",&keyInpInt1,&F,&keyInpInt2,&tougou,&x); }

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • C言語のプログラムについて。

    #include <stdio.h> int main(void) {   int hoge,piyo;   printf("数値を入力せよ。:");   scanf("%d",&hoge);   piyo = hoge % 2;   if (piyo == 0) {     printf("%dは、偶数。\n",hoge);   } else {     printf("%dは、奇数。\n",hoge);   };   return 0; } という、プログラムが、実行できません。 といって、エラーメッセージがでてくれないので、困っています。 ひょっとして、非常に初歩的なミスという気もするのですが。 これはよかった!という、C言語に関する書籍、また、コンピュータのシステムに関する書籍がありましたら、合わせてご教授ください。

  • C言語について

    「条件演算子(a?b:c)を使って、三つの整数値を読み込んで、その最小値を求めて表示するプログラムを作成せよ」という問題を初心者なりに自分で以下のように解いてみたのですが、もっと簡単に表示できるプログラムがあれば教えてください。 #include<stdio.h> int main(void) { int na,nb,nc,min; printf("整数1:"); scanf("%d",&na); printf("整数2:"); scanf("%d",&nb); printf("整数3:"); scanf("%d",&nc); (na<nb)?min=na:min=nb; printf("最小値は%dです。\n",(nc<min)?min=nc:min); return 0; }

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y+++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。

  • C言語の基本的な質問ですが、関数へのポインタの宣言

    関数へのポインタの質問です。 下のように、関数へのポインタを使ったプログラムを書きました。 (関数へのポインタを理解するためのものなので、実用的な意味はありません。(*^_^*) また、このプログラムはコンパイルもリンクも実行も問題なく出来ます。) #include <stdio.h> int add_func(int,int); (*func_p0) (int,int); int main(void) { int (*func_p1) (int,int); int (*func_p2) ( ); int hoge0,hoge1,hoge2; func_p0=add_func; hoge0=func_p0(3,5); printf("0 : 3+5は%d\n",hoge0); func_p1=add_func; hoge1=func_p1(3,5); printf("1 : 3+5は%d\n",hoge1); func_p2=add_func; hoge2=func_p2(3,5); printf("2 : 3+5は%d\n",hoge2); return(0); } int add_func(int x, int y) { return(x+y); } func_p0のように戻り値の型を書かない場合と、func_p1やfunc_p2のように戻り値の型を書くのとでは何が違うのでしょうか。 func_p0は外部変数ですが、自動変数にする(main関数の中で同様に宣言。)とコンパイルエラーになります。 それはなぜですか。 func_p1のように引数の型が書いてあるのと、func_p2のように引数の型が書いていないのでは何が違うのでしょうか。 int (*func_p2) ( );というのは、int (*func_p2) (void);とは違うんですよね?

  • C言語 宣言した変数になにも代入しなかった場合

    int a;  で整数の変数 a を宣言したとします。 ここで a になにも操作を加えなかったら、aは空っぽのままですよね? a の中身が空っぽかどうかを調べるにはどのようにすればよいのでしょうか? 例えば、整数aの中身を調べて、何か代入されていればそれを表示し、なにもない空っぽであればエラーを表示し終了するプログラムを書こうと思えばどのようにかけばよろしいのでしょうか? main() { int a; ・・・・ if (■■) { printf("Error!\n"); exit(1); } printf("a = %d\n",a); この if の■■に書くべきことを教えてください。

  • c言語プログラム

    加減乗除および剰余の演算記号(+-* / %)と2つの整数を入力し、入力した2つの整数に対して入力した演算を施して表示するプログラムをif文ではなくswitch文を用いて作成しなさいなお、演算記号入力の際に間違った記号(+ - * / % 以外)を入力した場合は+を入力したものとして計算するものとしなさい。 ヒントで 変数としては入力演算記号に対応する変数op、入力する2つの整数に対応する変数m,n、答えに対応する変数ansを使うとよいでしょう宣言についてはopは記号なのでcharで宣言しますが、あとはすべて整数ですのでintで宣言 まずやることは演算記号以外の場合に+であることを表示するプログラムを組むと思うんですけど どうしたらいいのかわかりません力を御貸しください