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

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

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

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

431閲覧

h,m,sについてのコンパイルエラーを直したい。

hirosann15

総合スコア18

C

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2020/07/10 16:13

編集2020/07/10 16:17

hms2secという関数自分で作り、この関数を使ったプログラムをしたいと考えています。ifを使ってh,m,sが0<=h<60,0<=m<60,0<=s<60でない時、-1となるようにしたいです。(0<h<60,0<m<60,0<s<60の時は、秒数を表す。)一応組んではみたのですが、h,m,sが宣言されていないと出てしまいました。どのように改善すれば下記のようにコンパイルの結果が出るのでしょうか。お答えお待ちしております。

c

1#include <stdio.h> 2int hms2sec(int h,int m,int s){ 3int x; 4x=h*3600+m*60+s; 5 6return x; 7} 8 9int main(){ 10 11 if(0<=h<60,0<=m<60,0<=s<60){ 12 int n; 13 n= hms2sec(0,0,10); 14 printf("%d秒\n",n); 15 int l; 16 l=hms2sec(2,33,51); 17 printf("%d秒\n",l); 18 int o; 19 o=hms2sec(24,0,0); 20 printf("%d秒\n",o); 21 int p; 22 p=hms2sec(-1,23,45); 23 printf("%d秒\n",p); 24 int q; 25 q=hms2sec(23,45,67); 26 printf("%d秒\n"); 27 int r; 28 r=hms2sec(1,-3,0); 29 printf("%d秒\n"); 30 } 31 else 32 printf("-1秒\n"); 33 34 35} 36

コンパイルの結果↓

 clang-7 -pthread -lm -o main main.c main.c:11:8: error: use of undeclared identifier 'h' if(0<=h<=60,0<=m<=60,0<=s<=60){ ^ main.c:11:17: error: use of undeclared identifier 'm' if(0<=h<=60,0<=m<=60,0<=s<=60){ ^ main.c:11:26: error: use of undeclared identifier 's' if(0<=h<=60,0<=m<=60,0<=s<=60){ ^ compiler exit status 1 main.c:26:12: warning: more '%' conversions than data arguments [-Wformat] printf("%d秒\n"); ~^ main.c:29:12: warning: more '%' conversions than data arguments [-Wformat] printf("%d秒\n"); ~^ 2 warnings and 3 errors generated.

理想のコンパイル結果↓

10秒 9231秒 86400秒 -1秒 -1秒 -1秒

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

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

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

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

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

guest

回答2

0

ベストアンサー

h,m,sの変数が宣言されているのは、hms2sec関数の中であり、main関数内には居ません。
よって「定義されていない」とエラーが出るのです。
また、hms2secの機能として範囲外のデータが入力された場合は-1を返すのであれば、if文もhms2secの中に必要です。

if文に複数条件を設定する際は、論理演算子(&&,||)が必要です。
","でつなげただけの場合は、一番最後の条件だけ評価され、それ以外の判定結果は捨てられます。
S < x < L の形の条件式は正しく評価されません。
演算子の優先順位により(S<X)<Lとなり{true|false}<Lの評価をすることになります。

これらをふまえると

C

1int hms2sec(int h,int m,int s){ 2 if(( 0<=h && h<60 ) && ( 0<=m && m<60 ) && ( 0<=s && s<60 )){ 3 int x; 4 x=h*3600+m*60+s; 5 return x; 6 }else{ 7 return -1; 8 } 9} 10 11int main(){ 12 int n; 13 n= hms2sec(0,0,10); 14 printf("%d秒\n",n); //10秒 15 16 int r; 17 r=hms2sec(1,-3,0); 18 printf("%d秒\n",r); //-1秒 19}

投稿2020/07/10 16:38

Kaleidoscope

総合スコア257

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

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

0

  • 範囲チェックはhms2secで行なう。
  • 0 <= h <= 60 みたいな比較はC言語ではできないので、分けて書いて&&で接続する。以下のコードでは範囲外のチェックをしているので||で接続している
  • ,演算子では末尾の条件式のみ使われることになるので、hに関する条件、mに関する条件、sに関する条件を&&や||で接続する。以下のコードでは範囲外のチェックをしているので||で接続している

C

1#include <stdio.h> 2 3int hms2sec(int h, int m, int s){ 4 if (h < 0 || h >= 60 || 5 m < 0 || m >= 60 || 6 s < 0 || s >= 60) { 7 return -1; 8 } 9 return h * 3600 + m * 60 + s; 10} 11 12int main(void) 13{ 14 printf("%d秒\n", hms2sec(0, 0, 10)); 15 printf("%d秒\n", hms2sec(2, 33, 51)); 16 printf("%d秒\n", hms2sec(24, 0, 0)); 17 printf("%d秒\n", hms2sec(-1, 23, 45)); 18 printf("%d秒\n", hms2sec(23, 45, 67)); 19 printf("%d秒\n", hms2sec(1, -3, 0)); 20 21 return 0; 22}

投稿2020/07/10 16:35

編集2020/07/10 16:50
Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問