🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Q&A

解決済

7回答

4433閲覧

c言語のfor文の多重ループ

Icchichici

総合スコア5

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

1グッド

0クリップ

投稿2019/11/16 02:16

編集2019/11/18 04:43

前提・実現したいこと

学校のプログラミングの課題で以下のようなものが出ました。

整数を入力してください:4

出力結果 1234
567
89
0

出力結果 123456789
01234567
8901234
567890
12345
6789
012
34
5

一段目に1から入力した数字までを表示して、2段目からは入力した数字を1づつ増やしていきそれを10で割った余りを直角三角形のように表示する、というものです。

これをfor文の多重ループで作れというのですが、全く分かりません。

教えてくださいお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

int main(){ int i, j, len; puts("左上直角二等辺三角形を作ります。"); printf("短辺:"); scanf("%d", &len); for (i = 1; i <= len; i++){ for (j = len; j >= i; j--){ putchar('*'); } puts(""); } return 0; } コード

試したこと

「*」でこの直角三角形を表示することはできるのですが、
数字が1づつ増えていくということを表現できません。

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

ここにより詳細な情報を記載してください。

退会済みユーザー👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/11/16 02:27

https://teratail.com/help/avoid-asking より抜粋 > コードをください・デバッグしてください等の丸投げの質問 > > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。 > 問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。 > まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。
maisumakun

2019/11/16 02:29

> 「*」でこの直角三角形を表示することはできるのですが、 でしたら、できたところとしてまずそのコードを提示しましょう(その時点でforの2重ループになっていませんか?)。
thkana

2019/11/16 07:51

すでに経験されていることと思いますが、プログラムのソースコードは一文字違っても期待しない動作をしたり、またコンパイルすら出来ない(言語の規則に則っていない)ものとなります。 あなたが書いたプログラムに似た、しかし全然違う何かは、今回のQ&Aについて役に立ちません。あなたが実際に動かしてみたもの、あるいは動かそうとしているもの「そのもの」を提示してください。少なくともCのプログラムで、文字/文字列とコメント以外でいわゆる全角文字が登場することはありません。
Icchichici

2019/11/18 04:40

すいません。コードを追記しました。このように*で表現はできるのですが、数字が1ずつ増えていくというのがよく分かりません。
fana

2019/11/18 07:45

・「*」の代わりに数字を表示すればよいだけ ・表示すべき数字は,1文字ごとに変わる(その記述は回答群の中にもある) ここまで材料が揃っていて,現状「何がわからないのか」がわからない.
guest

回答7

0

問題をよく読みましょう。

一段目に1から入力した数字までを表示して、2段目からは入力した数字を1づつ増やしていきそれを10で割った余りを直角三角形のように表示する

表示する数字は、三角形を形作るための二重ループのいわゆるループ変数とは別の動きをしている、ということに気が付かないといけません。つまり、ループの変数にiとかjとかを使ったとして、しかしそれらを加工(計算)した結果のなにかを表示するわけではない、ということです。

*で逆三角形を表示することは出来るのですね。
そのとき、*を表示した個数を数えることは出来ますか? その個数の値はどういう動きをするか、考えてみて下さい。

投稿2019/11/16 07:59

thkana

総合スコア7703

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

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

0

for文を使わない方法であれば、下記のような感じです。

C

1#include <stdio.h> 2 3inline static char next_char(char c) 4{ 5 if (c == '9') return '0'; 6 return c + 1; 7} 8 9inline static char print_char(int n, char c) 10{ 11 if (n == 0) return c; 12 printf("%c", c); 13 return print_char(n - 1, next_char(c)); 14} 15 16inline static void print_line(int n, char c) 17{ 18 if (n == 0) return; 19 c = print_char(n, c); 20 printf("\n"); 21 print_line(n - 1, c); 22} 23 24int main(void) 25{ 26 int n; 27 if (1 != scanf("%d", &n)) return 1; 28 print_line(n, '1'); 29 return 0; 30}

上のコードのprint_char()print_line()は末尾再帰になっていますので、この関数をfor文に書き換えることができます(ほとんどのコンパイラで最適化を有効にすれば、コンパイル後のコードはfor文と同じようなループになります。それと同じことを手動でするという話です)。あとは、関数部分をそのまま手動でインラインにすれば多重for文になります。

うん、よくわからないですね。私も自分で言っていてよくわかっていません。Cをマスターしたとか言っている人達(私はぺーぺーなので違いますが)にとっては、単純作業で多重for文に直してくれるでしょう。それが質問者さんにできるのか、できないのか、私にはわかりません。なぜなら「全くわかりません」というのがどれぐらいなのか、さっぱり想像が付かないからです。

もし、これで理解できなかったら、質問者さんの習得度合いや「何がわからない」のかわかるように、質問文に「うまくいかないが自分で書いたコード」、「自分の考え方」、「より具体的なわからない部分」を追加してください。

例えば、「数字の出し方がわからない」というのであれば、

  • 数値では無く数字という文字として扱えば良い。
  • 数値の出力はprintf()で"%d%を使うと良い。

等といった回答ができるのですが、今の質問では、何を答えて良いのかわからず、見当違いな回答しかできません。

投稿2019/11/16 03:47

raccy

総合スコア21737

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

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

Icchichici

2019/11/16 05:02

コード載せてみました。形はこれなのですが、条件式などがわかりません。
guest

0

ベストアンサー

すみません、私、今、頭が回っていないので理解していないです。
(それ以前に算数苦手...)

2段目からは入力した数字を1づつ増やしていきそれを10で割った余りを直角三角形のように表示する

の、"それを10で割った余りを..." の部分が理解できていないです。

最初の入力値 n を段数として、逆三角形を織りなすように、数字をつなげていく ( 1,2,3,4,...9,0,1... ) ということでしょうか。

それだとしても、最初の

整数を入力してください:4

と三段落目に当たる

出力結果 123456789

が一致しませんよ?

私が思った内容でいいなら。


まず、質問者さんは「プログラミングは置いといて」、「現実世界ではどのようにやりますか」?

つまり、手書きで今回のような問題があった場合、(例えば算数や数学みたいなテストとかで)

どのようにしますか?

私なら、

一段目は 1 から n までを書き、
二段目は その n の次から開始し、逆三角形になるように考える
三段目は 二段目の最後の数字 + 1 した値からはじめて...

とやります。

段数は n ÷ 10 した値っぽい(ただし妄想)ので、n / 10 した値が段数になるように行う。

そして、一段目から二段目に行くときは、「一段目で、最後に出てきた値」を覚えておく。
二段目はその値 +1 した値から始める。

ただし、9 の後は常に 0 に戻るとしているので、そのままだと 1,2,3...,9,10,11,... となってしまうので、修正するためのロジックを考える。

値が9なら( +1すると 10になるので修正するために ) 0 に初期化しておく。

という風に。

これをコード化すればいいのでは?


[追記1]

(返信にて)

ということは変数を宣言して...

そうだと思います。

人間だと脳で記憶できますが、機械はそれができません。(出来るにはできるが、変数を使ったりするし...)

なので変数かなんかで最後の値を確保して、そこから始める必要があります。

そして、9の直後は0 ...っていうのをやるのは面倒(毎回書くと思うから)なので、関数化します。

例えば、

C

1int progressNumber( int num ){ 2 if( num == 9 ) return 0; // 9の次は常に0にするため 3// それ以外なら num + 1 した値を返す 4return (num + 1); 5}

としておけば、

C

1int main( void ){ 2 int n; // 段の最後の値を確保するための変数 3 // for文かなんかで 4 // ここで一行分の数列表示 5 // n に 最後の値を入れる 6 n = progressNumber( n ); 7 // forなんかの終了のアレ 8}

みたいに書ける。

答え書いてもいいですが、それをやっちゃうと、質問者さんが窮地に陥る可能性がある(例えば出題者にバレるとか)ので、あえて伏せています。

投稿2019/11/18 05:21

編集2019/11/18 06:25
BeatStar

総合スコア4962

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

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

Icchichici

2019/11/18 06:11

ということは変数を宣言してそこに代入していく、という感じになるのでしょうか?
BeatStar

2019/11/18 06:16

>> ということは変数を宣言して... 多分そうだと思います。何かしらの形で、その段の最後の数字を記憶しておく必要があると思います。 一応追記します。
Icchichici

2019/11/18 07:17

すいません。関数はまだ習ってません…
BeatStar

2019/11/20 01:30

>> すいません。関数はまだ習ってません… それなら関数にせずに直接書くしかないです。
guest

0

「*」でこの直角三角形を表示することはできるのですが、

数字が1づつ増えていくということを表現できません。

その * で直角三角形を表示するコードを質問に追加してください。そうすれば修正方法をアドバイスします。

編集結果を送信するとき、コードの部分をマウスで選択して <code> をクリックしてください。「ここに言語を入力」と出ますから、「C」に書き換えてください。

追記

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i, j, len, n = 0; 6 7 puts("左上直角二等辺三角形を作ります。"); 8 printf("短辺:"); 9 scanf("%d", &len); 10 11 for (i = 1; i <= len; i++) { 12 for (j = len; j >= i; j--) { 13 printf("%d", n % 10); 14 n++; 15 } 16 puts(""); 17 } 18 return 0; 19}

int n = 0; の代わりに char c = '0'; として、

C

1 putchar(c); 2 if (++c > '9') c = '0';

としても良いでしょう。

追記2
0 ではなく 1 から始まるんですね。
int n = 1; または char c = '1'; とするか、あるいは
n や c を表示する前に 1つ進めるようにしてください。

投稿2019/11/18 02:32

編集2019/11/18 05:32
kazuma-s

総合スコア8224

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

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

Icchichici

2019/11/18 04:39

追記しました。数字が1ずつ増えていくというのがよく分かりません。
Icchichici

2019/11/18 06:13

charっていうのはまだ使えません。
kazuma-s

2019/11/18 06:42

では、int n のほうは理解したんですか?
guest

0

処理内容としてはこんな感じだと思うので,
課題の指定(forの多重ループとかいうの)を満たす形にてきとーに書けばよいのではないでしょうか.

C

1void Func( int n ) 2{ 3 char C = '1'; 4 int count=0; 5 while( n>0 ) 6 { 7 printf( "%c", C ); 8 C = ( C=='9' ? '0' : C+1 ); 9 if( ++count == n ) 10 { 11 count = 0; 12 --n; 13 printf( "\n" ); 14 } 15 } 16}

投稿2019/11/18 02:14

fana

総合スコア11990

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

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

0

まずは数字をふやしながら出力するのをforループで書きましょう
書けたら、そのコードをこの質問に追記してみてください。

そうすれば優しいオッサン連中回答者たちが寄ってたかってどーにかしてくれることでしょう

投稿2019/11/16 02:26

y_waiwai

総合スコア88040

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

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

Icchichici

2019/11/16 05:02

載せてみました。形はこれなのですが、条件式などがわかりません
guest

0

未解決のままですね。質問者は解決したいですか?
解決したいなら、何かレスポンスを下さい。

今できているのは

  • 「*」を表示すること
  • 直角二等辺三角形の格好に表示すること

その二重 for ループで直角二等辺三角形を作れるわけで、この形はそのまま利用できますよ。要するに、「*」を表示する代りに、数字を表示すればよいのです。

数字を表示する時 printf("%d", num); みたいなやり方を学んだはずです。それには関数の先頭で int num = 0; とでもして変数定義すれば良いです。
こうなります。

C

1#include <stdio.h> 2int main() { 3 int i, j, len; 4 int num = 0; // num 変数を作った 5 6 puts("左上直角二等辺三角形を作ります。"); 7 printf("短辺:"); scanf("%d", &len); 8 9 for (i = 1; i <= len; i++) { 10 for (j = len; j >= i; j--) { 11 printf("%d", num); // ここで数字を表示する 12 } 13 puts(""); 14 } 15 return 0; 16}

これをコンパイルして、実行すると、こんな結果になります。

左上直角二等辺三角形を作ります。 短辺:4 0000 000 00 0

0しか表示されませんね。その理由は次のようにまとめられます。

  • num の変数定義で 0 に初期化したから
  • 初期化した後、num の値を変化させていないから

です。質問者も、少なくともここまでやってみてほしい。やってみて、他の方の回答も読んでみて、何かアイディアが湧けば結構です。或いは、新たな疑問が出てくるかもしれません。
いかがですか?

投稿2019/11/21 10:46

rubato6809

総合スコア1382

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問