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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

3回答

9428閲覧

c言語 while文で直角三角形を*で描く

yumikom

総合スコア11

C

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2015/06/10 21:03

###前提・実現したいこと
c言語のwhile文(for文はダメ)で*アスタリスクで5行の直角三角形を表示したいです。使わないといけないのが#define ROWS 5 が必須です(学校のアサイメントです)

ゴールは

***
*****
*******
*********

###発生している問題・エラーメッセージ
while文をどのようにループさせると階差数列がうまく表示出来るのかが分かりません。正直いろいろ試してみてギブアップ状態です。何かヒントを下さるとうれしいです。

###ソースコード
#include <stdio.h>
#define ROWS 5

int main( ) {
int r=0, c=0, m=0;
do{
printf("*");

while(r<=ROWS && r>=1){ printf("*"); while(m<c){ printf("*"); m++; } printf("\n"); r++; c=2r-1; }

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

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

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

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

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

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

jun68ykt

2015/06/10 22:02

こんにちは。 ご質問の「ゴールは」で示されている三角形のアスタリスクの個数は 1行目:1個、2行目:3個、3行目:5個、4行目:7個、5行目:9個 となっていて、n 行目のアスタリスクの個数を a(n) とすると  漸化式:a(n+1) = a(n) + 2  初項:a(1) = 1 という等差数列になっていますが、ご質問にある  発生している問題・エラーメッセージ には > while文をどのようにループさせると階差数列がうまく表示出来るのかが分かりません。 のように「階差数列」とあります。 実現したいことは、  ・何らかの階差数列の要素をループで生成すること なのか、それとも  ・「ゴールは」で描かれているアスタリスクの図形を表示すること なのか、追記して頂けますでしょうか。 よろしくお願いいたします。
yumikom

2015/06/11 02:22

ゴールを目指してました。scanfなどは使わず5行のみの表示です。無事作成できました!ありがとうございます。
guest

回答3

0

もうベストアンサーが出てますのでコードを短くしたかったらのお話です
whileでやるならこんな感じでしょうか

lang

1int row = 0; 2int pos; 3while(row++ < ROW){ 4 pos = 0; 5 while(pos++ < [階差数列の式])printf("*"); 6 printf("\n"); 7} 8

処理速度も気するならpos=0;前か後ろあたりで階差数列で出す星の数を計算しておいた方がよいです

投稿2015/06/11 05:06

kutsulog

総合スコア985

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

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

0

ベストアンサー

#include <stdio.h>
#define ROWS 5

int main( ) {
int r=0, c=0, m=0;
do{
printf("*");

while(r<=ROWS && r>=1){ printf("*"); while(m<c){ printf("*"); m++; } printf("\n"); r++; c=2r-1; }

変数が何を意味しているのか考えるとよいですよ。
int r はなにで
int c はなにで
int m はなにか

つづいて取りうる値を考える
do{文のすぐ下にprintf("*");があるので、どんな条件でも*を1つ表示する
見た感じ、Rがループ回数を意味してるとすると
while(r<=5 && r>=1)
r=0 通らない
r=1 1回
r=2 2回
rはループカウントと縦列の数ですね。0だと1行 1だと2行

while(m<c)これが横列の数を表している

整理すると。

int r = 0; 縦のループ回数(行)
int m = 0; 横のループ回数(列)
int ROWS = 1; 表示したい行数

while( r < ROWS ) // 縦ループ
{
while( m < r+1) // 横ループ
{
}
}
こんな感じですかね。

投稿2015/06/10 22:31

MasaakiIrie

総合スコア1021

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

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

MasaakiIrie

2015/06/10 22:34

追伸:問題の法則を見るとよいですよ。 1行目以外は★の数が1つ多いだけです。
MasaakiIrie

2015/06/10 22:39

すみません、よく見たら (x+1)*2-1 ですね。
yumikom

2015/06/11 02:21

プログラミングの勉強を始めたばかりで、よくわからないままやってました。 が、Masaakilrieさんの変数の説明で少し分かってきました。 変数には意味を与えないといけないんですね。。。 学校が海外なので先生の説明を理解してないようです。。。
guest

0

下記に場合ROWSと*の数の関係は?
r= 0;
while( r < ROWS ){
// ここに何を入れるか?
}

※関数を作っていいなら指定した数だけを表示する関数を作ったほうがいいと思います
void putAsterisk(int cnt)
{
for( int i= 0; i < cnt; i++ ){
putchar('
');
}
putchar('\n');
}
とか

投稿2015/06/10 22:05

cateye

総合スコア6851

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

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

cateye

2015/06/10 22:15

追加ですがゴールのような表示の場合 *の数は、1+ r * 2になってますね・・・
cateye

2015/06/11 10:12

早とちりしたようで、for分を使ったりmm 朝投稿した後、気になったので作ってみました。 ~/test ./a.out * *** ***** ******* ********* ~/test cat tst4.c #include <stdio.h> #define ROWS 5 int main() { int r= 0; while( r < ROWS ){ int c= 0; while( c < (1+r*2)){ putchar('*'); c++; } putchar('\n'); r++; } return 0; } ~/test
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問