アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語のfor文問題で・・・

わからない問題がありまして・・・

アスタリスクを表示させる問題なのですが・・・

わかる方いたら、ソースコードだけでいいので、教えてくだい、お願いします

ただし、printfで、全てのアスタリスクを表示させるのはNGで、配列も使ってはいけません。

main関数以外の関数は使わないように、お願いします。

(1)

    1段目に*が1つで、 (三角旗型のアスタリスク)  
    2段目に*が2つで、
    3段目に*が3つで、
    4段目に*が2つで、
    5段目に*が1つ。

(2)


  1段目に*が1つで、  
    2段目に*が3つで、
    3段目に*が5つで、    (ダイヤ型のアスタリスク)
    4段目に*が3つで、
    5段目に*が1つ。    


(3)
      1段目に*が2つで、   (六角形型のアスタリスク)
      2段目に*が4つで、
      3段目に*が2つ。
   


以上3問です。

A 回答 (8件)

「ソースコードだけ」っていうじゃなーい、でもそれ「代わりに回答してくれ」って意味ですから、残念。


#我ながら古い。

という訳で方針だけ説明しますが、要は「*の位置決めをどうするか」という話ですね。
ANSIエスケープシーケンスなんて手もなくはないですが、まぁ普通に空白で左から埋めていけばいいでしょう。
「関数」を封じられると#1でも言われているように打つ手なしですが、まぁ本意は「関数を作るな、main()内で完結しろ」って意味でしょうから普通にfor()とputchar()でケースに応じて空白か*を出力するだけです。
一行終わったら改行を出力して次の行、の繰り返し。
配列がNGなのは先に文字列パターンを作って出力するだけ、という手を封じるのが目的でしょうか。
ベタにやってもいいですが、増減値にパターンがあるので各行の空白の数、*の数は計算でも出せなくはありません。
    • good
    • 0

たぶんですね、いろいろ条件がついてるのを見て、パニックになってるだけだと思うんですよ。


まずは、冷静に考えること。

条件がなければ、こんなプログラムをまず考えますよね?
/* 問題(2) */
int main(){
printf("__*\n"); /* スペースを_だ代用 */
printf("_***\n");
printf("*****\n");
printf("_***\n");
printf("__*\n");
return 0;
}

「配列も使ってはいけません」等と言われなければ、配列使うことなんか考えもしないでしょう。
「main関数以外の関数は使わないように」等と言われなれば、関数を定義することなんか考えもしないでしょう。

自分で思いつけるプログラムを作ってから、条件に合せて変更していけばいいのです。
printfがだめなら、代替方法がないか、調べてみましょう。マニュアルを読めば、printf以外にも出力関数がいっぱいあることがわかります、printfと同じ機能でなくても、今回の目的を十分果せる関数が見つかります。
forは所定回数繰り返すのに使用します。問題を見れば「*がX個」といかにも「forで繰り返してくれ」と言わんばかりのものがあるじゃないですか。

プログラムの書き方は一つじゃないです。
ここで「解答」待ってる時間があるなら、自分で考えて、とりあえず実行してみましょうよ。



/* 問題(2)別解 */
#include <stdio.h>
#define S putchar('*');
#define s putchar(' ');
#define E putchar('\n');
int main(){
s s S s s E
s S S S s E
S S S S S E
s S S S s E
s s S s s E
for(;0;) ;
return 0;
}
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

お礼日時:2010/07/19 16:27

どうすればいいか、自分で考えたコードはかけらも無いんでしょうか?


そういったものを提示して、助言を求めれば前向きな回答も付くのですが。


さて、直前の方達に便乗して私も…
インデントの調整に全角スペース使用しています。

#include<stdio.h>

int main(void)
{
 int yline, pattern, mask;

 for(yline = 0; yline < 5;yline++) {
  pattern = 0;
  switch(yline) {
   case 2:
    pattern |= 0x20;
   case 1:
   case 3:
    pattern |= 0x40;
   case 0:
   case 4:
    pattern |= 0x80;
  }
  for(mask = 0x80;mask;mask >>= 1) {
   if(pattern & mask) {
    putchar('*');
   } else {
    putchar(' ');
   }
  }
  putchar('\n');
 }

 return 0;
}



#include<stdio.h>

int main(void)
{
 int yline, pattern, mask;

 for(yline = 0; yline < 5;yline++) {
  pattern = 0;
  switch(yline) {
   case 2:
    pattern |= 0x88;
   case 1:
   case 3:
    pattern |= 0x50;
   case 0:
   case 4:
    pattern |= 0x20;
  }
  for(mask = 0x80;mask;mask >>= 1) {
   if(pattern & mask) {
    putchar('*');
   } else {
    putchar(' ');
   }
  }
  putchar('\n');
 }

 return 0;
}
    • good
    • 0
この回答へのお礼

非常に参考になりました、ありがとうございます。

お礼日時:2010/07/19 16:32

#5に続いて実現はしてるけど問題の意図には沿わない手法。



#include<stdio.h>
int main(void)
{
const char *pattern=" *\n ***\n*****\n ***\n *\n";
int i;
for(i = 0; pattern[i] != '\0' ; i++)
{
putchar(pattern[i]);
}
}
    • good
    • 0
この回答へのお礼

とんでもないです、かなり参考になりました。

お礼日時:2010/07/19 19:33

あえて問題の答えにはならない方法を書いてみる:


#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("*\n**\n***\n**\n"); puts("*");
return EXIT_SUCCESS;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。これを元に、プログラムを組んでみます。

お礼日時:2010/07/19 19:40

方針1




for(i = 0; i < 10; i++) putchar(' ');
for(i = 0; i < 10; i++) putchar('*');
putchar('\n');

for(i = 0; i < 10; i++) putchar(' ');
for(i = 0; i < 10; i++) putchar('*');
putchar('\n');

for(i = 0; i < 10; i++) putchar(' ');
for(i = 0; i < 10; i++) putchar('*');
putchar('\n');

for(i = 0; i < 10; i++) putchar(' ');
for(i = 0; i < 10; i++) putchar('*');
putchar('\n');

for(i = 0; i < 10; i++) putchar(' ');
for(i = 0; i < 10; i++) putchar('*');
putchar('\n');

が動かせるように考える。

方針2
表示された図形を見て、いじれそうな数字をいじって、どう変化するか眺めてみる。

方針3
その組み合わせで、一応図形はかける。
    • good
    • 0
この回答へのお礼

とても為になるヒントありがとうございます。

お礼日時:2010/07/19 20:00

そうかそうか…。


外部のテキストファイルに書いておいて、
それを読みだして表示するのはアリ?

この回答への補足

おねがいします、C言語のソースコードだけ書いてください。

この問題が終わると、夏休みに入るので、そこからは自分で解けるようにします。

期限は刻々と迫っていて、

とにかく今は考えてる時間がないので・・・

どうか今回だけは、本当にお願いします。

補足日時:2010/07/16 14:37
    • good
    • 0

あなたは「ここに載ったソースコード」を課題への回答として出せなくなるのですが, それでいいんですか?


ま, いずれにしても私には「main関数以外の関数は使わない」で出力する方法が思いつきませんが. すべての標準関数を封じられたら手も足も出ない.

この回答への補足

失礼しました、それだったら、何も出来ませんよね。

どんな標準関数を使っても、いいので、ソースコードを書いてください。

とにかく時間がないので、すいません。

補足日時:2010/07/16 13:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!