• ベストアンサー

このプログラム見てもらえますか?

問題は十進数二桁の正整数をgetchar()を用いて文字型の変数xとyから元の10進二桁の正整数を復元して整数型変数zに格納せよ zをprintf()で出力し正しく格納されていることを格納せよ。です #include<stdio.h> int main(void) { char x[256],y[256]; int z; printf("整数を一文字入力して下さい。\n"); x=getchar(); printf("整数を一文字入力して下さい。\n"); y=getchar(); z=x*10+y; printf("%d\n",z); return(0); } これをコンパイルすると kadai5-5.c: In function `main': kadai5-5.c:9: incompatible types in assignment kadai5-5.c:11: incompatible types in assignment kadai5-5.c:12: `zyuu' undeclared (first use in this function) kadai5-5.c:12: (Each undeclared identifier is reported only once kadai5-5.c:12: for each function it appears in.) kadai5-5.c:13: `iti' undeclared (first use in this function) kadai5-5.c:14: invalid operands to binary + こう表示されます。 C言語の参考書片手に試行錯誤してるんですがなかなかできません。 よろしくおねがいします。

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

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.4

行番号つきでひとつずつ確認しましょう。 1: #include<stdio.h> 2: #include<stdlib.h> 3: int main(void); 4: int main(void) 5: { 6: char x[256],y[256]; 7: int z; 8: printf("整数を一文字入力して下さい。\n"); 9: x=getchar(); 10: printf("整数を一文字入力して下さい。\n"); 11: y=getchar(); 12: zyuu=atoi(x); 13: iti=atoi(y); 14: z=x+y; 15: printf("%d\n",z); 16: return(0); 17: } > kadai5-5.c: In function `main': > kadai5-5.c:9: incompatible types in assignment getcharの仮宣言は、int getchar(void )です。 xはchar x[100]と宣言されています。 この場合、xは配列の先頭アドレス(すなわち&(x[0]))です。であるため、x[0]に値を代入したい場合、x[0]としなければなりません。または、宣言をchar xとしてください。これなら、xは変数そのものになります。 > kadai5-5.c:11: incompatible types in assignment 上記xの問題と同じことをyでやってます。 > kadai5-5.c:12: `zyuu' undeclared (first use in this function) zyuuが宣言されていません。zyuuを使う場合は int zyuu;として宣言してください。 > kadai5-5.c:12: (Each undeclared identifier is reported only once > kadai5-5.c:12: for each function it appears in.) このエラーは上記のエラーの続きなので直せば一緒に消えます。 > kadai5-5.c:13: `iti' undeclared (first use in this function) itiが宣言されていません。 > kadai5-5.c:14: invalid operands to binary + せっかく計算したzyuuとitiを足すべきです。 これはタダの書き間違いですね? このプログラム、2つの方式が混ざってしまっています。 まずはzyuu,itiの変数宣言を追加してください。 次の方向は二つ。 1.atoiを使わない場合はx,yの宣言は配列をやめ、次のようにする。 zyuu=x-'0'; iti=y-'0'; とする。 2.atoiを使いたい場合、文字列として扱わなければならないため、x,yの宣言はそのままでよい。 9行目、11行目を次のようにする。 x[0]=getchar();x[1]='\0'; y[0]=getchar();y[1]='\0'; char配列を文字列として扱いたい場合、文字終端を正しくセットしておかなければなりません。 注意: getcharをはじめとするGETC系関数は、文字列ではなく文字そのものを取得します。文字配列に値を格納したい場合は、添え字([]演算子)を用意する必要があります。 fgetsとgetsのFGETS系関数は文字列を取得します。 この場合は、文字配列のアドレスを渡してそこにデータが格納されます。

newcolleger
質問者

お礼

大変わかりやすく、すぐに理解できました。 ここでつまづくと後の授業ついていけなくなるんで助かりました~ 本当にありがとうございました~(TдT)

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

1つの例 #include<stdio.h> #include<stdlib.h> int main(void){ char x,y; int z; printf("正整数を2文字入力して下さい。\n"); x=getchar();y=getchar(); z=(x-'0')*10+(y-'0'); printf("%d\n",z); return(0); }

newcolleger
質問者

お礼

この回答みるまで問題の意味間違ってました^^; ありがとうございました。 でも、z=(x-'0')*10+(y-'0'); ここの-0の意味がよくわかりません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

気の付いたところを… int main(void);<いらない char x[256],y[256];<配列にする必要なし x=getchar();<バッファリングされてるかも・ zyuu=atoi(x);<atoiの引数はchar* z=x+y;<x*10してやらないといけない

  • rits416
  • ベストアンサー率0% (0/1)
回答No.1

質問者です プログラムの部分が間違ってました。 #include<stdio.h> #include<stdlib.h> int main(void); int main(void) { char x[256],y[256]; int z; printf("整数を一文字入力して下さい。\n"); x=getchar(); printf("整数を一文字入力して下さい。\n"); y=getchar(); zyuu=atoi(x); iti=atoi(y); z=x+y; printf("%d\n",z); return(0); } です すみませんでした

関連するQ&A

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }

  • 初心者です。C言語でクイズを作っています。

    下のようなプログラムを作ってみたのですが、 コンパイルエラーがでます。 どうか教えて頂けないでしょうか? これは、コンパイルエラーの文です。 $ gcc -o quiz2.exe quiz2.c quiz2.c: In function `main': quiz2.c:10: `y' undeclared (first use in this function) quiz2.c:10: (Each undeclared identifier is reported only once quiz2.c:10: for each function it appears in.) quiz2.c:29: parse error before `}' quiz2.c:39: parse error before `}' quiz2.c:46: parse error at end of input そして、このようなソースを作りました。 #include <stdio.h> main() { char ans, ans3; int ans2; printf("クイズを出題します。 y/n -->"); ans = getchar(); if(ans==y) { printf("目*花*歯があるのに口がないのなに?"); printf("1:包丁 2:植物 3:ロボット"); scanf("%d",&ans2); if(ans2==2) { printf("正解"); } if(ans2==1||ans2==3) { printf("ハズレ もう一度する? y/n"); ans3 = getchar(); if(ans3==y) { return(1) } else { printf("ゲームを終了"); } } else { printf("半角数字の1~3を入力して"); return(1) } } else { printf("またチャレンジしてね"); } } /*尚、環境はcygwinのgccを使っています。*/ 文字数が足りないので、printfの中などは少し省いてあります。

  • このプログラム見てほしいです!!

    #include <stdio.h> int gcd2(int a, int b) { if (!b) return a; return gcd2(b, a%b); } int main() { int a, b, c; printf("2つの任意の整数を入力せよ:"); scanf("%d %d",&a,&b); c=gcd2(a,b); printf("最小公倍数は%d\n",a*b/c); printf("最大公約数は%d\n",c); return 0; } で、最小公約数を出すことはできたのですが、全ての公約数を表示させたいんです!!どうやったらいいのでしょうか??プログラミングまだ初心者なので、ちょっと行き詰ってしまいました。。。 お時間があればでいいのですが、もう一つわからないプログラムがあります。 自然数nを入力し、x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるのかを出力するプログラムなのですが、全くわからず行き詰っています。。どなたかお時間があれば教えて頂きたいです。 色々と申し訳ありません。お願いします(__)

  • 学校の課題で2次方程式のプログラムを作ってみたのですが、足りない部分ががあるらしいのでお教えてください

    キーボードからある整数の値を入力して、2次方程式を解くというプログラムを作ったのですが、解の方程式のところでどこかが足りないらしいのですが教えてください。 #include<math.h> #include<stdio.h> int quadraticEquation(double a, double b, double c){ int x,y,l,k,j; double z; x=b*b; y=4*a*c; z=x-y; if(z>=0){ l=sqrt((double)z); } else printf("ERROR!!\n"); k=(-b)+l; j=k/2*a; return j; } int main(void){ int n1,n2,n3; printf("input three integer!\n"); printf("intger1:"); scanf("%d",&n1); printf("intger2:"); scanf("%d",&n2); printf("intger3:"); scanf("%d",&n3); printf("kotaeha %d %d desu\n",quadraticEquation(n1, n2, n3),quadraticEquation(n1, n2, n3)); return 0; } が自分が作ったプログラムです。 後、解が2つある場合の出力方法がこれであっているかどうかも教えてください。 よろしくお願いします。

  • 分数の足し算をさせるプログラムが分かりません。どなたか分かりませんか?

    分数の足し算をさせるプログラムが分かりません。 C言語の問題で分数の足し算までは一応できるんですが、答えがでたときに整数で出すやり方と約分して表す方法が分かりません。 どなたか知恵を貸してくれませんか? ユーザから4つの整数を入力し、はじめに入力された2個の整数と後に入力された2個の整数を分数と考え、その分数の和を表示するプログラムを作成せよ。 例えば、「3」「4」「5」「6」と入力されたときは、3/4 + 5/6を計算する。 そのプログラム内では分数の和を計算する関数を作成する。 さらに、 約分を行う関数を 再帰呼び出しを利用して作成する。 void yakubun(int *a1, int *a2) 例えば、以下の場合1/2と表示される。 int i=10,j=20; yakubun(&i,&j); printf(“%d / %d”, i, j); ちなみにここまでできました↓ #include<stdio.h> void bunsu_tasizan(int a1,int a2,int b1,int b2, int *c1,int *c2 ) { *c1=(a1*b2)+(b1*a2); *c2=(a2*b2); } int main() { int x1,x2,y1,y2,z1,z2; printf("整数を入力してください"); scanf("%d",&x1); scanf("%d",&x2); scanf("%d",&y1); scanf("%d",&y2); if(x2==0||y2==0||x2==0&&y2==0) printf("0以外を入力してください"); else{ bunsu_tasizan(x1,x2,y1,y2,&z1,&z2); printf("%d/%d",z1,z2);} return (0); }

  • このプログラムの実行結果についてお助け下さい2

    //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px2; Y=y-Py2; Z=z-Pz2; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx15=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy15=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz15=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==0){ Hdx16=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy16=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz16=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx17=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy17=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz17=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==1){ Hdx18=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy18=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz18=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L=-1&&M==0&&N==-1){ Hdx19=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy19=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz19=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else{ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); THDX22=THDX22+Hdx; THDY22=THDY22+Hdy; THDZ22=THDZ22+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx20=Hdx15+Hdx16+Hdx17+Hdx18+Hdx19; Hdy20=Hdy15+Hdy16+Hdy17+Hdy18+Hdy19; Hdz20=Hdz15+Hdz16+Hdz17+Hdz18+Hdz19; printf("ここまでがlowerのU2の時のL,M,N、それぞれの値\n"); printf("THDX11は%eです。\n",THDX11); printf("THDY11は%eです。\n",THDY11); printf("THDZ11は%eです。\n",THDZ11); printf("THDX12は%eです。\n",THDX12); printf("THDY12は%eです。\n",THDY12); printf("THDZ12は%eです。\n",THDZ12); printf("THDX21は%eです。\n",THDX21); printf("THDY21は%eです。\n",THDY21); printf("THDZ21は%eです。\n",THDZ21); printf("THDX22は%eです。\n",THDX22); printf("THDY22は%eです。\n",THDY22); printf("THDZ22は%eです。\n",THDZ22); printf("\n"); Hdx21=THDX11+THDX12; Hdy21=THDY11+THDY12; Hdz21=THDZ11+THDZ12; Hdx22=THDX21+THDX22; Hdy22=THDY21+THDY22; Hdz22=THDZ21+THDZ22; printf("Hdx21は%eです。\n",Hdx21); printf("Hdy21は%eです。\n",Hdy21); printf("Hdz21は%eです。\n",Hdz21); printf("Hdx22は%eです。\n",Hdx22); printf("Hdy22は%eです。\n",Hdy22); printf("Hdz22は%eです。\n",Hdz22); Hdip1=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)); Hdip2=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)); printf("Hdip1は%eです。\n",Hdip1); printf("Hdip2は%eです。\n",Hdip2); upper=Hdip1*gamma; lower=Hdip2*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); upper=0; lower=0; Hdip3=sqrt((Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip4=sqrt((Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); printf("抜き出した8個の原子の総合の磁場は、upperの方のHdip3は、%lf、\nlowerの方のHdip4は%lfです。\n",Hdip3,Hdip4); printf("これらを、また元の結晶に戻した時、\n"); upper=0;lower=0; Hdip5=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)+(Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip6=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)+(Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); upper=Hdip5*gamma; lower=Hdip6*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); 以上です・・・。

  • 関数のプログラムについて

    任意の二次方程式ax^2+bx+c=0をとくプログラムの作成です 引数をa,b,cとして、解の大きい方を返すというものなのですが、 僕は以下のようにして組んだのですが、うまくいきません。 と、いうより、関数の作り方がいまいちわからないです。 どこが駄目なのか教えてください。 作ってみたやつ↓ #include<math.h> #include<stdio.h> int a,b,c; double d; double x,y,z; int main(void) { a=1; b=2; c=1; printf("ax^2+bx+c=0\n "); d=b^2-4*a*c; if (d<0){printf("kyosuukai\n)} else if(d>=0) { x=(b+sqrt(b^2-4*a*c))/2*a; y=(b-sqrt(b^2-4*a*c))/2*a; if(x>=y){z=x} else if(x<y){z=y} printf("x= %f\n",z); } }

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

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • VSC 2015 電卓プログラムに関して

    Visual studio community 2015の C++をやっているのですが、電卓プログラムを作ろうと思い、 http://saeki-ce.xsrv.jp/C_src/dentaku01.html よりプログラムを引っ張ってきて、それを繰り返せるようにしたいのですが、上手くいきません。 一応プログラムを張っておくと(これは試行錯誤中のものです)(所々敬行がおかしくなっているかもしれませんが、コピペをした時に起ってしまったものです) #include <stdio.h> #include <stdlib.h> void main() { int b; while( b== 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); gets_s(c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); } } こんな風にしてみたのですが、2回目以降が、計算式を入力していないのに1回分が終わってしまいます。(画像のような無限ループをしてしまいます。) 上の状態だと、エラーで、「初期化されていないローカル変数’b’が使用されます」と出てしまいます。 どう改善すればいいでしょうか? 教えてください

  • プログラムに詳しい方教えてください!

    #include<stdio.h> void fxl(int x,int y); int main(void) { int a,b,m,n; printf("整数aの値を入力\n"); scanf("%d",&b); printf("整数bの値を入力\n"); scanf("%d",&b); m=a; n=b; fxl(m,n); printf("a=%dとb=%dを加算した値は%d\n",ab,m); printf("a=%dからb=%dを減算した値は%d\n",ab,n); return 0; } void fxl(int x,int y) { int j,k; j=x; k=y; x=j+k; y=j-k; } このプログラムを作ってみたのはいいのですが、参照渡しを使って正常に足し算、引き算をするにはどうすればよいのでしょうか。

専門家に質問してみよう