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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

1874閲覧

初心者です。ループを使うのでしょうか…?

azukipaste

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/12/25 01:10

編集2022/01/12 10:55

###前提・実現したいこと
整数の組(a,b,c)(1<=a<=100,1<=b<=100,1<=c<=100)において
a^2+b^2=c^2を満たす整数の式を見つけてその組と個数を求める
さらにその中でもa<b<cを満たす組と個数をみつけるプログラムを作りたいです。

###発生している問題・エラーメッセージ
ループを使うということは分かったのですが、C言語を扱ったのが
3日目なのもあり、基本的事項もわからぬままで
そのあとのイメージがまったくつきません。
ヒントだけでもいただけたら幸いなのですが、ドドド初心者にもわかるよう説明してほしいです。よろしくお願いします。

もう一つ、質問したプログラムの類題がありますので
そちらも今回の回答を参考にして作りたいと思います。
可能であれば応用できるように、考え方まで教えていただけるととてもうれしいです

###ソースコード

C言語

1ここにご自身が実行したソースコードを書いてください

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

guest

回答4

0

ドドド初心者レベルなら、まずはループのネストですね。
http://www9.plala.or.jp/sgwr-t/c/sec06-6.html

fot (a = 1; a <= 100; a++) { // この中ではaの値が+1されながら100回ループします。 for (b = 1; b <= 100; b++) { // この中ではbの値が+1されながら100回ループします。 // この辺にcのループを作ってみましょう。 } }

投稿2015/12/25 01:59

miyabi-sun

総合スコア21158

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

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

azukipaste

2015/12/25 02:08

ありがとうございます。 cのループをつけたしてみました。 forの意味が少しわかったように思います。(使い方はぴんときてませんが…) fot (a = 1; a <= 100; a++) { // この中ではaの値が+1されながら100回ループします。 for (b = 1; b <= 100; b++) { // この中ではbの値が+1されながら100回ループします。 // この辺にcのループを作ってみましょう。 for(c=1;b<=100;c++){ } } これであっていますでしょうか
miyabi-sun

2015/12/25 02:13

for文は「;(セミコロン)」で括られた3要素で成り立ってます。 ・初期値:c = 1 ・継続条件:b <= 100 ・1ループ毎に行う作業:c++ (これは変数cの値を1増加させる「インクリメント」と呼ばれる魔法) この中の真ん中の継続条件が「b <= 100」ですが、「c++」と別の変数の数値を増やし続けるので、 一生継続条件を満たし続けるのでループが終了しなくなります。 コレは無限ループと呼ばれるバグなので注意しましょう!
azukipaste

2015/12/25 02:21

あ!ほんとですね 真ん中のものをまちがえてしまいました。 fot (a = 1; a <= 100; a++) { // この中ではaの値が+1されながら100回ループします。 for (b = 1; b <= 100; b++) { // この中ではbの値が+1されながら100回ループします。 // この辺にcのループを作ってみましょう。 for(c=1;c<=100;c++){ } } にするべきなんですね なにを;で並べているか理解できました。 ありがとうございます。
guest

0

ドドド初心者にもいろいろなレベルがあるので実際どういうレベルなのかお聞きしながらになるかと思います。

変数aで1から100までなめるコードは書けますか?

投稿2015/12/25 01:24

yuba

総合スコア5568

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

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

azukipaste

2015/12/25 01:53

ありがとうございます。 情けないですが、基礎の基礎からわかっていません 説明の進み具合が非常にはやく、ついていけていません・・・ それぞれの単語(?)がどういった作用をもっているのか あまり説明されておらず…手さぐり状態です for(a=1;a<=100) というものは使いますでしょうか…?
yuba

2015/12/25 02:00

> for(a=1;a<=100) ちょっと違います。for(a=1;a<=100; ++a) です。 > 説明の進み具合が非常にはやく、ついていけていません・・・ 進み具合というのは、学校の授業かもしくは社内研修かでしょうか。
azukipaste

2015/12/25 02:05

>ちょっと違います。for(a=1;a<=100; ++a) です。 ありがとうございます ++aというのは、aとなにかを足すのでしょうか…? >進み具合というのは、学校の授業かもしくは社内研修かでしょうか。  おっしゃる通りです。学校の授業です 最終課題が授業の評価になるのですが、それにとりかかるまでになんとかかじりつける程度までには理解したくで…
yuba

2015/12/25 02:14

> ++aというのは、aとなにかを足すのでしょうか…? a=a+1 の略記だと思ってください。 for(a=1;a<=100; ++a) も次のコードの略記です。 a=1; while(a<=100) { a = a+1; } これならわかりますか?
azukipaste

2015/12/25 02:20

aが100になるまで、公差1の数列を…といった感じでしょうか a++2なら 1,3,5…と並べていくようになりますか?
yuba

2015/12/25 02:22

> aが100になるまで、公差1の数列を…といった感じでしょうか これは正しいですが > a++2なら >1,3,5…と並べていくようになりますか? そういう書き方はないです。aの値を2増やしたいときは a=a+2; と書きます(別の略記がありますが割愛します)。
azukipaste

2015/12/25 02:40

なるほど、ありがとうございます。 ほかの回答者の方のなかで、大きな枠組みを作ってくださった方がいらっしゃったので いちど、それをつかって考えてみたいと思います。 それも出来上がったら見ていただいてもいいでしょうか…?
yuba

2015/12/25 03:51

teratailの回答者陣ほんとに優しいのでこうして他の方からも詳しい解説がついていますが、本当はこうしたQ&Aサイトでなく先生に質問されるべき内容です。 理由は二つ。 ・「早すぎてついて行けない」という大事な情報が先生に伝わりません。先生は自分の授業の組み立て方を見直すチャンスがありません。それで最終課題だけちゃんと解かれて提出されたら、適切な授業計画だったと思って来年も後輩達が同じような授業を受けることになります。 ・このレベルからこの課題が解けるようになるまでご指導するのは授業料をいただけるレベルのお仕事です。でしたら、すでに授業料を受け取っている学校の先生こそ指導する義務があるのです。
azukipaste

2015/12/25 04:36

おっしゃる通りです。 申し訳ありません。 課題について、担当教師に質問はするのですが 「私は説明した」ととりあってもらえません。 「先生の説明で ここまでの内容はなんとなくでも理解した。そこから先が説明されていないし理解できていない。」という旨を伝えても 先ほどの一言で片づけられてしまいます… 初心者向けの授業にしてある。と教師は言いますが また、細かい用語であるとか、基礎知識(たとえば%dは何を指すのかのような)の説明が一切なく、みんな推測している状態です… 教師にこれ以上言っても、理不尽に単位を落とされるのが怖いので 授業の内容については事務局に一度相談してみようとおもいます。
yuba

2015/12/25 08:41

それはちょっとひどすぎますね。それはそれで、言っていくべきだと思います。
cateye

2015/12/27 09:50

ちょっと気になったので・・・ 今の学生さんには、1から10まで教えないとならないのでしょうか? >基礎知識(たとえば%dは何を指すのかのような) これなんかはprintf()やscanf()の仕様を読めば分かる事のように思いますが?
guest

0

簡単のために1<=A<=5,1<=B<=5,1<=C<=5のバリエーションで説明します

全部のパターンを挙げると
A<B<Cなので
A=1

B=2(1,2,3),(1,2,4),(1,2,5)
B=3(1,3,4),(1,3,5)
B=4(1,4,5)
A=2

B=3(2,3,4),(2,3,5)
B=4(2,4,5)
A=3

B=4(3,4,5)

となります

ここで注目したいのは

  • Aは1から1つずつ5-2までカウントアップしている
  • BはA+1から1つずつ5-1までカウントアップしている
  • CはB+1から1つずつ5までカウントアップしている

ループの中にループを書くとこれらのパターンを作ることができます。

全てのパターンを作れたら
あとは条件判定(if文)を使ってA,B,CがA^2+B^2=C^2になるか判定します
A^2+B^2=C^2の場合だけこの時のA,B,Cを表示して個数を数えるカウンターに1を足します

全てのループが終わった後にカウンターで数えた結果を表示すれば出来上がりです。

投稿2015/12/25 02:21

kutsulog

総合スコア985

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

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

0

こんにちは。

力で解くなら問題をそのままC言語へ翻訳できれば解けますね。
まずは言語の文法の勉強と思いますので、力で解いてみましょう。

整数の組(a,b,c)(1<=a<=100,1<=b<=100,1<=c<=100)において

ここがまずループですね。a, b, cについて1~100の各値を発生させるとよいです。

for (aについて1~100) { for (bについて1~100) { for (cについて1~100) { // ここはa, b, cそれぞれについて1~100まで変化させた時の // 全ての組み合わせで実行されます。 } } }

a^2+b^2=c^2を満たす整数の式を見つけてその組と個数を求める

ここはif文と表示文ですね。

if (その条件を満たせばtrueとなる式) { その組の表示 個数Aを+1 }

そして、ループを全部回った後、個数Aを表示。
なお、個数Aはループを回り始める前に用意する必要が有ります。(定義と0で初期化)

さらにその中でもa<b<cを満たす組と個数をみつけるプログラムを作りたいです。

上記if文のthen節の中に更に下記を入れるイメージです。

if (a<b<cとなればtrueとなる式) { その組の表示 個数Bを+1 }

最後にループを全部回った後、個数Bを表示。
なお、個数Bもループを回り始める前に用意する必要が有ります。(定義と0で初期化)


このヒントにてある程度コードを書けるのではないかと期待します。

書けるところまで書いて見て下さい。
そして、コンバイルするとエラーが出ると思います。そのエラーをなくすよう頑張ってみて下さい。

エラーがなくなれば実行できますので、実行してみて下さい。
結果が正しければ問題ないですが、一発で正しい結果がでることは99%ないです。
出た結果と正しい結果を見比べてデバッグしてみて下さい。

どうしても分からないことが出てくるかも知れません。
その時、書かれたコードとどこでどんなエラーが出ているかを示し、何がどのように分からないのか再度質問されれば、回答してくれる人がきっといると思います。

投稿2015/12/25 02:09

Chironian

総合スコア23272

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

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

azukipaste

2015/12/25 02:57

とりあえず、最初のif文まではひねりだしてみました。 countの使い方は見よう見まねですので、とんちんかんだとおもいます。 #include<stdio.h> int main(void) { int a,b,c; int k; int count; k = count+=1; for (a = 1; a <= 100; a++) { // この中ではaの値が+1されながら100回ループします。 for (b = 1; b <= 100; b++) { // この中ではbの値が+1されながら100回ループします。 // この辺にcのループを作ってみましょう。 for(c=1;c<=100;c++){ if(a*a+b*b=c*c){ printf("式を満たす整数の組は%d\n"); ----------------------------------------------------------- >そして、ループを全部回った後、個数Aを表示。 なお、個数Aはループを回り始める前に用意する必要が有ります。(定義と0で初期化) ここの(定義と0で初期化)ということがちょっとよくわかりません… 詳しく教えていただけますでしょうか
Chironian

2015/12/25 03:11

> int count; これが定義です。 でも値を設定していないので、何が入っているか分かりません。ですので何か値を設定するべきです。その設定することを初期化と呼びます。 因みに今回の場合はカウンタですので初期値は0にするべきですね。 他にあれこれ間違っていますが、まずはコンパイルしてからですね。 なお、全ての文はazukipasteさんからのコンピュータへの指示です。どんな指示をしているのかきちんと考えましょう。そして、コメントにてその指示の内容を日本語で書いて見て下さい。コメントが書けない文は削除した方が良いです。 C++言語でどのように記述したら良いか分からない時はコメントだけ書くのも手です。
azukipaste

2015/12/25 04:25

#include<stdio.h> int main(void) { int a,b,c; int ka,kb;//個数a 個数b int counta=0;//カウントの定義(a^2+b^2=c^2)① int countb=0;//カウントの定義(a<b<c)② int ca,cb;//組a 組b ka = counta+=1;//①の名前付け kb = countb+=1;//②の名前付け ca =a*a+b*b=c*c; cb = a<b<c; for (a = 1; a <= 100; a++) { // この中ではaの値が+1されながら100回ループします。 for (b = 1; b <= 100; b++) { // この中ではbの値が+1されながら100回ループします。 for(c=1;c<=100;c++){ //この中でcの値が+1されながら100回ループします。 //式 a^2+b^2=c^2が成り立ったとき… if( a*a+b*b=c*c ){ //式を満たす整数の式を表示させる printf("式を満たす整数の組は%d\n",ca); //個数を表示させる printf("整数の組数は %d \n" ,ka); //式a<b<cがなりたつとき if(a<b<c){ //a<b<cがなりたつ組と個数を表示 printf("さらに、その中でもa<b<cが成り立つ組は%d\n",cb ); printf("その組数は %d \n",kb); } } }}}} -------------------------------------------------------------------------- ここまでとりあえずつくってみました。 コンパイルというのは、動作の確認のことでよかったでしょうか ca =a*a+b*b=c*c;  ここと if( a*a+b*b=c*c ){  ここで 一番頭のaにチェックが入り 「式は変更可能な左辺値である必要があります」とでます。 なにがどうエラーなのでしょうか…
cateye

2015/12/25 07:23

茶々を入れるようで申し訳ないですが、if(a*a+b*b=c*c){・・・は、if((a*a+b*b)==(c*c)){ の間違いですね?
Chironian

2015/12/25 08:12

> コンパイルというのは、動作の確認のことでよかったでしょうか ソースをコンピュータが実行できる形式へ変換することですね。 その時、文法違反等あれば、コンパイラがエラーを表示してくれます。 ↓こんなやつですね。 > 一番頭のaにチェックが入り > 「式は変更可能な左辺値である必要があります」とでます。 > なにがどうエラーなのでしょうか… うひゃっ、ちょっと待って下さいな。 > ka = counta+=1;//①の名前付け > ca =a*a+b*b=c*c; > printf("式を満たす整数の組は%d\n",ca); > printf("整数の組数は %d \n" ,ka); (以下略) う~ん、豪快ですね。 整数の組の表示はちょっと難しいので一旦保留して下さい。 また「さらにその中でもa<b<cを満たす組と個数をみつけるプログラムを作りたいです。」も一旦保留しましょう。混乱しますので。 「a^2+b^2=c^2を満たす整数の式を見つけてその組と個数を求める 」のうちの個数を求めるだけに集中しましょう。これが解けた後なら残りは比較的簡単です。 ただし、C言語の文法はご自分で勉強して下さい。何をしたい時にどう書くかについてちゃんと書かれた資料は持ってますね? それを参照して下さい。cateyeさんのアドバイスも参考になります。 さて、「個数」はどの変数で数えるのですか? これが混乱しています。きちんと決めましょう。kaですか? countaですか? また、変数の値を+1する方法は分かってますか? 簡単ですので調べて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問