for if 文

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
buraba

for if 文

#1

投稿記事 by buraba » 14年前

[1] 大きさを入力して半角文字*を使い、アルファベットのXを描く問題が分かりません。大きさとはXの縦と横の半角文字数です。
学校で出された課題なのですが、どうしてもわかりません。
 
#include<stdio.h>

int main(void)
{
int i,j,k,l,scale;


printf("大きさ:"); scanf("%d",&scale);
l=0;
for(i=1;i<=scale;i++){
for(j=1;j<=scale;j++){
if(l==0){
printf("*");
l=1;
}
else{
for(k=scale-2;k>0;k--)
printf(" ");
l=0;
}
}
printf("\n");

}
return 0;
}

と書いたのですが。こうすると、大きさが3ならXが表示されるのですが、5以上になると、*が余分に表示されてXになりません。
if文の使い方からして間違っていると思ったのですが、例えば* *と言うふうに空白を*の間に開けたり
 * * と言うふうに空白*空白*空白 このような処理をどうすれば出せるのかが分かりません。

OSはwindows7 コンパイラはvisual stdio2010
C言語はfor文、if文までしか分かりません。「やさしいC言語」の本で言うところのlesson6までです。

アビゲイル

Re:for if 文

#2

投稿記事 by アビゲイル » 14年前

紙に図示してみたらイメージしやすいと思いますが、
1つの考え方↓

1行には必ず2つ*がある (中心は重なる為1つ)
それぞれ行が進むごとに 1つずつ、右あるいは左に移動している

それぞれの*の位置を変数とすれば、列の変数jと比較して一致すれば'*'を表示し、一致しなければ空白

buraba

Re:for if 文

#3

投稿記事 by buraba » 14年前

>>アビゲイルさん
列の変数jと比較して一致すれば*、一致しなければ空白とは
include<stdio.h>

int main(void)
{

int scale,i,j;

printf("大きさを入力してください:"); scanf("%d",&scale);

for(i=1;i<=scale;i++){
for(j=1;j<=scale;j++){
if(j=i)
printf("*");
else
printf(" ");
printf("\n");
}
}
return 0;

}

ということかなと思い、打ち込んでみましたが
*****


このような実行結果になってしまいました。
何がいけないのでしょうか?
右斜めと左斜めをあわせるというやり方でもないようですし・・・。

NIDA

Re:for if 文

#4

投稿記事 by NIDA » 14年前

buraba さま。

はじめまして。NIDA といいます。

>例えば* *と言うふうに空白を*の間に開けたり
> * * と言うふうに空白*空白*空白 このよ
>うな処理をどうすれば出せるのかが分かりません。

1: int main(int argc, char* argv[/url]){
2:
3: int i;
4: char base[100], buf[100];
5:
6: for(i=0; i<5; i++)base = ' '; // 空白文字で埋める。
7: base = '\0'; // 終端マーク。
8:
9: // "* *"
10: strcpy(buf, base);
11: buf[0] = '*';
12: buf[4] = '*';
13: printf("%s\n", buf);
14:
15: // " * * "
16: strcpy(buf, base);
17: buf[1] = '*';
18: buf[3] = '*';
19: printf("%s\n", buf);
20:
21: return 1;
22: };
23:

■ WinXP SP3, GCC v3.3.3

アビゲイル

Re:for if 文

#5

投稿記事 by アビゲイル » 14年前

言葉足らずでしたね。
これはコピペしたものじゃないですよね?
コメント部分を修正してみてください。
for(i=1;i<=scale;i++){
  for(j=1;j<=scale;j++){
   if(j=i) //if(j == i)
     printf("*");
   else if(j == ???)//②
     printf("*");
   else
     printf(" ");
  } //①
  printf("\n");
} //削除 して①の箇所に移動
}
 
これで右下がりの線が引けます。

>それぞれ行が進むごとに 1つずつ、右あるいは左に移動している
そこでもう一つ、左に移動する*というのがXの右上がりの線になります
②の??部分に scaleが5 なら 5 4 3 2 1とカウントダウンする値を入れればいいです

buraba

Re:for if 文

#6

投稿記事 by buraba » 14年前

>>NIDAさん
お答えありがとうございます。
配列はまだ習っていなかったので、このような書き方は思いもしませんでした。ありがとうございます。参考にさせていただきます。

>>アビゲイルさん
二度目のお答えありがとうございます。
コピペではありません。あれから、一度すべて消去して書きなおした結果です。紛らわしいことをして申し訳ないです。
今少しやってみたらなんとかなりそうです。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る