[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までです。
for if 文
Re:for if 文
紙に図示してみたらイメージしやすいと思いますが、
1つの考え方↓
1行には必ず2つ*がある (中心は重なる為1つ)
それぞれ行が進むごとに 1つずつ、右あるいは左に移動している
それぞれの*の位置を変数とすれば、列の変数jと比較して一致すれば'*'を表示し、一致しなければ空白
1つの考え方↓
1行には必ず2つ*がある (中心は重なる為1つ)
それぞれ行が進むごとに 1つずつ、右あるいは左に移動している
それぞれの*の位置を変数とすれば、列の変数jと比較して一致すれば'*'を表示し、一致しなければ空白
Re:for if 文
>>アビゲイルさん
列の変数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;
}
ということかなと思い、打ち込んでみましたが
*****
このような実行結果になってしまいました。
何がいけないのでしょうか?
右斜めと左斜めをあわせるというやり方でもないようですし・・・。
列の変数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;
}
ということかなと思い、打ち込んでみましたが
*****
このような実行結果になってしまいました。
何がいけないのでしょうか?
右斜めと左斜めをあわせるというやり方でもないようですし・・・。
Re:for if 文
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
はじめまして。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 文
言葉足らずでしたね。
これはコピペしたものじゃないですよね?
コメント部分を修正してみてください。
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とカウントダウンする値を入れればいいです
これはコピペしたものじゃないですよね?
コメント部分を修正してみてください。
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とカウントダウンする値を入れればいいです
Re:for if 文
>>NIDAさん
お答えありがとうございます。
配列はまだ習っていなかったので、このような書き方は思いもしませんでした。ありがとうございます。参考にさせていただきます。
>>アビゲイルさん
二度目のお答えありがとうございます。
コピペではありません。あれから、一度すべて消去して書きなおした結果です。紛らわしいことをして申し訳ないです。
今少しやってみたらなんとかなりそうです。ありがとうございました。
お答えありがとうございます。
配列はまだ習っていなかったので、このような書き方は思いもしませんでした。ありがとうございます。参考にさせていただきます。
>>アビゲイルさん
二度目のお答えありがとうございます。
コピペではありません。あれから、一度すべて消去して書きなおした結果です。紛らわしいことをして申し訳ないです。
今少しやってみたらなんとかなりそうです。ありがとうございました。