質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

239閲覧

C言語でわからないこと

kakakaaka

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/10/14 17:11

#include <stdio.h>

float calc(char op, float a, float b);

main(){
float number;

number = calc('x',a,b);
printf("二つの合計 = %f",number);
}

float calc(char op, float a, float b){
int x;
printf("二つの数字");
scanf("%f %f ",&a,&b);
printf("1:足し算 2:引き算 3:掛け算 4:割り算\n x=");
scanf("%d", &x);

switch(x){
case 1:
return a+b;
break;
case 2:
return a-b;
break;
case 3:
return a*b;
case 4:
return a/b;
default:
printf("該当なし\n");
}

}
数値を打ち込んで出力したいのですが
main.c:8:21: note: each undeclared identifier is reported only once for each function it appears in
main.c:8:23: error: 'b' undeclared (first use in this function)
number = calc('x',a,b);
このようなものがでます。
これは何を伝えたんでしょうか?
どうか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/10/14 23:43

質問の際にはプログラムコードはコードタグで囲み字下げをしましょう。質問編集画面でコード部分を選択した状態で上の方にある<code>ボタンを押してみてください。
guest

回答3

0

こんにちは

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5 6float calc(int , float , float); 7 8int main(void){ 9 10 char buf[BUFSIZE]; 11 float a; 12 float b; 13 int x; 14 printf("二つの数字\n"); 15 fgets(buf,sizeof(buf),stdin); 16 a = atof(buf); 17 fgets(buf,sizeof(buf),stdin); 18 b = atof(buf); 19 printf("1:足し算 2:引き算 3:掛け算 4:割り算\n x="); 20 fgets(buf,sizeof(buf),stdin); 21 x = atoi(buf); 22 23 printf("二つの合計 = %f",calc(x,a,b)); 24 25 return 0; 26} 27 28float calc(int op, float a, float b) 29{ 30 float answer; 31 32 switch(op){ 33 case 1: 34 answer = a + b; 35 break; 36 case 2: 37 answer = a - b; 38 break; 39 case 3: 40 answer = a * b; 41 break; 42 case 4: 43 answer = a / b; 44 break; 45 default: 46             answer = 0; 47 printf("該当なし"); 48 break; 49 } 50 return answer; 51}

投稿2018/04/04 10:10

編集2018/04/05 04:50
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/04/04 13:21

A.Ichiさんのコードは警告こそありますが、エラーは出ないですよ。 むしろこちらのコードには、入力を整数として処理してしまう論理エラーがあります。 また、入力のエラーチェックを一切していないことも気になります。 これだったらまだ scanf を使った方が簡潔な分ましです。
退会済みユーザー

退会済みユーザー

2018/04/04 23:47

atoiとatofを間違えたことはすみません あとエラーがじゃなくて警告でした。 それを踏まえて疑問点つあります。 入力のエラーチェックについて  ?? calc関数のdefaultで該当なしとしましたがこれじゃなだめですか  それとも、最初の2つの小数のところでしょうか この質問ってエラー入力がある前提ですか  ほかの回答者のコードにも書いてありません
LouiS0616

2018/04/05 04:04

例えば不正に『hoge』と入力された場合、atofは0を返します。 しかも都合が悪いことに、bが0になってしまうと0除算が発生します。 例えば不正に『1,234.567』と入力された場合、atofは1を返します。 例えば不正に『999...999』(255文字)と入力された場合、オーバーフローが発生します。 --- > この質問ってエラー入力がある前提ですか Cの入力のエラー処理を突き詰めると非常に面倒なことになります。 正しく入力される前提ならscanfで問題ないですし(返り値はチェックした方が良いですが)、正しく入力されないことも仮定するならば上記の問題への配慮が足りません。 つまり『scanfを使わない方が良い』と言うに足りるだけの改善が見られません。 --- > calc関数のdefaultで該当なしとしましたがこれじゃなだめですか 強いて言うなら返り値が不定になるのは悩みどころです。
LouiS0616

2018/04/05 04:09

細かい点まで口をはさんでしまってすみません。 こういうオープンな場ですので、気が付いたことは積極的に言うようにしているのです。
退会済みユーザー

退会済みユーザー

2018/04/05 04:49 編集

私こそすみません。 defaultのところはanswer = 0を書いていたつもりでいました。(後で訂正します.)知識不足な私にいろいろご教授くださりありがとうございます。
guest

0

ベストアンサー

ご参考にサンプルのコードを書いてみました。

c

1#include <stdio.h> 2 3float calc(int , float , float ); 4 5main(){ 6 float a; 7 float b; 8 int x; 9 printf("二つの数字:"); 10 scanf("\n%f %f",&a,&b); 11 printf("1:足し算 2:引き算 3:掛け算 4:割り算\n x="); 12 scanf("%d", &x); 13 14 printf("二つの合計 = %f\n",calc(x,a,b)); 15} 16 17float calc(int op, float a, float b){ 18 19 switch(op){ 20 case 1: 21 return a+b; 22 case 2: 23 return a-b; 24 case 3: 25 return a*b; 26 case 4: 27 return a/b; 28 default: 29 printf("該当なし\n"); 30 } 31}

投稿2017/10/15 01:13

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/04 14:04 編集

解決済みになっていますが A.Ichiさん すみませんがmain関数とcalc関数に戻り値がありません これだと警告が起こるのでよくありません。(戻り値を加えるか関数をvoidにする) あと入力でscanfを使うのはよくないのでfgetsがいいと思います。
guest

0

こんにちは。

number = calc('x',a,b);

で、calc関数に実引数aとbを渡してますが、main()関すで変数a, bは定義されていません。
なので、undeclared(未定義)とエラーがでています。

投稿2017/10/14 17:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問