C言語のfor文問題でセンセーショナルなタイトルを生成してください

このQ&Aのポイント
  • C言語のfor文問題で三角旗型のアスタリスクを表示させる方法を教えてください。
  • C言語のfor文問題でダイヤ型のアスタリスクを表示させる方法を教えてください。
  • C言語のfor文問題で六角形型のアスタリスクを表示させる方法を教えてください。
回答を見る
  • ベストアンサー

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

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問です。

  • dokbc
  • お礼率38% (8/21)

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

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

その他の回答 (7)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.8

たぶんですね、いろいろ条件がついてるのを見て、パニックになってるだけだと思うんですよ。 まずは、冷静に考えること。 条件がなければ、こんなプログラムをまず考えますよね? /* 問題(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; }

dokbc
質問者

お礼

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.7

どうすればいいか、自分で考えたコードはかけらも無いんでしょうか? そういったものを提示して、助言を求めれば前向きな回答も付くのですが。 さて、直前の方達に便乗して私も… インデントの調整に全角スペース使用しています。 #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; }

dokbc
質問者

お礼

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

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.6

#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]); } }

dokbc
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

あえて問題の答えにはならない方法を書いてみる: #include <stdio.h> #include <stdlib.h> int main() { printf("*\n**\n***\n**\n"); puts("*"); return EXIT_SUCCESS; }

dokbc
質問者

お礼

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

回答No.4

方針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 その組み合わせで、一応図形はかける。

dokbc
質問者

お礼

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

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

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

dokbc
質問者

補足

おねがいします、C言語のソースコードだけ書いてください。 この問題が終わると、夏休みに入るので、そこからは自分で解けるようにします。 期限は刻々と迫っていて、 とにかく今は考えてる時間がないので・・・ どうか今回だけは、本当にお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あなたは「ここに載ったソースコード」を課題への回答として出せなくなるのですが, それでいいんですか? ま, いずれにしても私には「main関数以外の関数は使わない」で出力する方法が思いつきませんが. すべての標準関数を封じられたら手も足も出ない.

dokbc
質問者

補足

失礼しました、それだったら、何も出来ませんよね。 どんな標準関数を使っても、いいので、ソースコードを書いてください。 とにかく時間がないので、すいません。

関連するQ&A

  • C言語の問題です。よろしくお願いいたします。

    C言語の問題です.。10個の整数を入力し配列に保存した後、入力された数字の中に5の倍数が含まれているかを調べ、 含まれていた時には「5の倍数が含まれています」含まれていない時に「5の倍数が含まれていません」と表示させるプログラムを作りなさい。 自分なりに考えて作ったのですが、以下の通りでよろしいのでしょうか? #include <stdio.h> main() { int i; double c[10]; for (i = 0; i < 10; i++) { printf("整数を10個入力してください.(%d つ目) : ", i+1); scanf("%lf", &c[i]); } if(c[i] % 5 == 0){ printf("5の倍数が含まれています\n"); } else{ printf("5の倍数が含まれていません\n"); } return 0; }

  • C言語のプログラミング配列・forを使った検索

    C言語のプログラミングで、配列とforを使った検索の表し方がわかりません。 numにはキーボードから任意の数字を入力し、 1ならば25、2ならば30、、、といったように 対応する数字を表示させ、1行目にない数字が入力された時は 「NoData」と表示させたいのですが、上手くいきません; 本当はもっと配列が多いのですが4つでやってみると #include <stdio.h> main() { int data[2][4]{{1,2,3,4},{25,30,45,50}} , num , i ; printf("num?"); scanf(&num); for(i=0; i>4;i++) if(num== data[0][i]){ printf("number is \n",data[1][i]);} else {printf("NoData\n"); } return0 ; } こうかと思ったのですが上手くいきません、、、 どなたかお願いします!

  • どなたか、教えていただけませんでしょうか(C言語)?

    皆様のお知恵を拝借したく思いまして 投稿させていただきました C言語についての質問なのですが (1)文字配列の引数を一度mainからプロトタイプ関数へ渡し 関数で宣言して表示。 (2)さらにその関数内で、値を変更して mainで表示する 方法を教えていただきたく思いますので、宜しくお願い致します

  • C言語のfor文について

    C言語のfor文について C言語初心者です。質問させていただきます。 output.datというバイナリファイルに値を書き込みたい(100~149)のですが、どうもうまくいきません。 値が半分だけ正常に入って、あとの半分はおかしな値が入ります。 どなたか分かる方教えていただけないでしょうか。 ソース(一部分)↓ int main(){ int i,j; char output[456]; //ファイルに値を入れる for(i=0,j=100;i<456,j<556;i++,j++){ output[i]=j; } //バイナリ書き込みモードでファイルをオープン if((fp = fopen("output.dat","wb")) == NULL) { printf("<output.dat> file open error\n"); exit(1); } //値をファイルに書き込む fwrite(output,456,1,fp); fclose(fp); exit(0); }

  • C言語 for文を使った一例について

    #include<stdio.h> main () { int i ; int j ; for(i = 0 ; i<5 ; i++){ /*行数の制御部*/ for(j = 0; j<(i+1) ; j++){ /* *の制御部*/ printf("*"); } printf("\n"); } return; } このプログラムを実行すると * ** *** **** ***** が表示されます。 for(j = 0; j<(i+1) ; j++){ ↑    printf("*");} ↑ 「*」の制御部となりますが、 何故「*」が1行目で1個表示されているのに 2行目では2個表示されているのですか? 行数と「*」は同じになると思われますが。 上記の質問の回答の程宜しくお願いします。

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語の2次配列

    4行5列の配列を用意し、その配列の要素をtij(i=1~4, j=1~5)とするとき、tij=i×j となるように配列に値を入れ、 それを表の形で画面に表示するプログラムを作りなさい。  という問題なんですが、自分は下の様に組みましたがうまく動きません。どこが悪いのか教えてください。よろしくお願いします。あまりC言語を理解していないので申し訳ないですが、なるべく簡単に教えて頂ければ幸いです。 #include<stdio.h> int main(void) { int i,j; int t[4][5]; for(i=0;i<=3;i++) { for(j=0;j<=4;j++) t=i*j; printf("%5d",t); printf("\n"); } return 0; }

  • C言語 ポインタ 関数

    キーボードから文字列”abcdefg”を入力し、main関数で配列aryに格納する。 main関数から配列aryの先頭アドレスを副関数に引き渡す。 副関数で配列aryの最後尾の要素の内容を';'に変更する。 main関数で配列aryの内容を表示する。 この問題が解けません... #include <stdio.h> int main (void) { char ary[]="abcdef"; int *p; int i,x; p=&ary[0]; func(&i); for (x=0;x<=7;x++){ printf("%s",ary[x]); void func (int i) if(i==\0) i=';' else i++ } return 0 } とりあえずこんな感じなんですけど、出来ませんでした...

  • C言語の問題です!!

    C言語の問題です。次の問題でプログラムを作ってみたのですがどうでしょうか?もし小さな間違いであったら訂正をお願いします。全然違う場合はそのように回答してください。初心者なものでよろしくお願いします。 ・1~100までの整数値を画面に表示せよ. ただし,数値を10個表示するごとに改行すること. #include<stdio.h> int main(void){ int i,j; for(i=1;i<=100;i++){    for(j=1;j<=9;j++) printf("%3d",i+j); i=i+9; putchar("\n"); } return(0); }

  • c言語で、繰り返し文の中で、0.01づつ増やすには?

    c言語で、繰り返し文の中で、0.01づつ増やすには? c言語で、繰り返し文の中で、0.01づつ増やすにはどうすればよいのでしょうか? 関数F(x)=x3+2x-1 の値でx=0から5まで0.01刻みで増やし、出力させる プログラムを作成せよ。という問題です。 #include <stdio.h> int main() { double i; for(i=0;i<=5;i+=0.01){ printf("%lf",i*i*i+2*i-1); putchar('\n'); } return(0); } で、はじめにi=0なので、はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。これを0.1刻みで i+=0.1 とすると正常に作動するのですがどうでしょうか? お願いします。

専門家に質問してみよう