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

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

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

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

Q&A

解決済

3回答

1812閲覧

整長方形の最小値 コンパイルエラー

YuhiKUROIWA

総合スコア9

C

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

0グッド

0クリップ

投稿2020/06/07 12:30

編集2020/06/07 12:32

高さhと幅wがともに整数である長方形を整長方形と呼ぶ.
横長整長方形 (w> h) の大小関係を次のように定める.

 ・対角線の長さが短いほうが小さい.
・対角線の長さが同じならば,高さの低いほうが小さい.

与えられた横長整長方形に対し,それより大きい最小の横長整長方形を求めるプログラムを作れ.

出力
各データセットに対し,それに記述されている横長整長方形より大きい最小の横長整長方形の高さhと幅w (> h) とを,整数でひとつの空白文字で区切って1行に出力せよ.また,各行の末尾には改行を出力すること.なお,この問題の入力で与えられる横長整長方形に対しては,それより大きい最小の横長整長方形の高さと幅はともに150を超えないことが分かっている.

が問題です。以下にソースコードを貼っています。コンパイルすると
break statement not within loop or switch
と表示されてしまいます原因は何でしょうか。教えていただけると助かります。
よろしくお願いします。

コード#include <stdio.h> int main(void){ int h; int w; scanf("%d %d", &h, &w); if(h==0&&w==0){ break; } while(1){ int dia=h*h+w*w; int i; int j; int H; int W; for(i=1;i<=100;i++){ for(j=1;j<=100;j++){ int newdia=i*i+j*j; if(dia>newdia||(dia==newdia&&i<h)){ continue; }else{ H=i; W=j; break; } } } printf("%d %d\n", H, W); break; } return 0; }

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

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

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

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

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

ozwk

2020/06/07 12:36

break statement not within loop or switch だからです。 これを踏まえて何がわかりませんか?
YuhiKUROIWA

2020/06/07 12:59

わかりました。ありがとうございます。 下記にもあるように実行結果が上手くいきません。どこが原因でしょうか。
guest

回答3

0

ベストアンサー

C

1#include <stdio.h> 2 3int main(void) { 4 int h; 5 int w; 6 while (1) { 7 scanf("%d %d", &h, &w); 8 if (h==0 && w==0){ 9 break; 10 } 11 int dia = h*h + w*w; 12 int i; 13 int j; 14 int H; 15 int W; 16 int mindia = 150*150 + 150*150; // ★ 追加 17 for (i = 1; i <= 150; i++) { // ★ 100 ではなく 150 18 for (j = i + 1; j <= 150; j++) { // ★ j = i + 1 に変更 19 int newdia = i*i + j*j; 20 if (dia>newdia || (dia==newdia && i<=h)) { // ★ i<=h に変更 21 continue; 22 } 23 if (newdia < mindia) { // ★ else { から変更 24 H = i; 25 W = j; 26 mindia = newdia; // ★ 追加 27 break; 28 } 29 } 30 } 31 printf("%d %d\n", H, W); 32 //break; ★ 削除 33 } 34 return 0; 35}

どこが分からないのかを質問してください。

追記
150 まで全部調べるのは無駄ですから、次の r までとします。

C

1#include <math.h> // sqrt 2 3 int r = sqrt(dia) + 1; // ★ 追加 4 int mindia = r*r + r*r; // ★ 追加 5 for (i = 1; i <= r; i++) { // ★ 100 ではなく r に変更 6 for (j = i + 1; j <= r; j++) { // ★ j = i + 1 に変更

追記2
dia は与えられた長方形の対角線(diagonal)の長さの 2乗です。
newdia は、比較対象の長方形の対角線の長さの 2乗です。
複数の newdia のうち dia より小さいものは不要なので continue でループを継続します。
mindia は、複数の newdia のうち最小のものを保持していて、より小さいものに更新します。

投稿2020/06/07 18:53

編集2020/06/09 00:34
kazuma-s

総合スコア8224

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

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

YuhiKUROIWA

2020/06/08 01:15

ありがとうございます。試みてみます。
YuhiKUROIWA

2020/06/08 09:26

遅くなりすみません。2点ほど質問があります。 一つ目はルートの定義が未定義となってしまいます。調べてみたのですが原因がわかりませんでした。<math.h>はincludeしました。 二つ目はmindia=newdiaとする理由です。なしで実行してみるとうまくいかなかったのでいるということだけはわかりますが、、、 以上2点回答いただけると嬉しいです。
YuhiKUROIWA

2020/06/08 09:41

一つ目の質問なんですが提出サイトの使用かもしれません。他の問題でpow関数を使用した際にも同様のことが起きたのでこちら側の問題かもしれません。すみません。
kazuma-s

2020/06/09 00:21

コンパイラは gcc ですね。sqrt や pow など <math.h> の関数を使うときは -lmオプションを後ろにつけて明示的にライブラリをリンクしないといけません。
YuhiKUROIWA

2020/06/09 04:49

diaの件はわかりました。ありがとうございます。 学校の提出サイトに投稿して採点されるのでコンパイル時点でコードしか貼れないので-lmを付けることさえできません。今学校に問い合わせている状況です。とりあえずr=150で提出したので大丈夫です。大変お世話になりました。ありがとうございました。
guest

0

if(h==0&&w==0){ break; }

break statement not within loop or switch

「繰り返し あるいは switch 内にない break文」

メッセージの言うとおり。

投稿2020/06/07 12:36

episteme

総合スコア16612

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

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

YuhiKUROIWA

2020/06/07 12:57

ありがとうございます。 変更した結果コンパイルはできたのですが、標準入力を以下のようにすると 1 2 1 3 2 3 1 4 2 4 5 6 1 8 4 7 98 100 99 100 0 0 実行結果は1 3 2 3 1 4 2 4 3 4 1 8 4 7 2 8 3 140 89 109 となるはずが100 1になってしまいます。どうしてでしょうか。
kazuma-s

2020/06/07 17:19

> 変更した結果コンパイルはできたのですが どのように変更したのかを質問に追記してください。 入力が 1 2 の時、実行結果は 1 3 になってほしいのに 100 1 となるといいうことですか? 1 2 の対角線の長さは√5 で 2.236。 1 3 の対角線の長さは √10 で 3.162。 2 2 の対角線の長さは√8 で 2.828。 1 3 は最小ではありませんよね。
kazuma-s

2020/06/07 17:47

すみません。2 2 は横長整長方形ではありませんね。
YuhiKUROIWA

2020/06/08 01:15

そういうことです。 13にするにはどうしたらいいですか。
guest

0

break;while文等のループの中もしくはswitch文の中にしか書けないので、一番上のifの中のbreak;return;に変えればいいです。

投稿2020/06/07 12:35

kuuote

総合スコア705

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

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

YuhiKUROIWA

2020/06/07 12:51

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問