• 締切済み

C言語について

#include_<stdio.h> void_gyouRtn(int_hen,int_ln,int_maxl); int_main(void){ __int___hen;__//_辺の長さ(文字数) __int___ln;___//_出力行番号(1,2,..,maxl) __int___maxl;_//_出力行数 __//_最初の入力 __printf("数字2~9を入力してください:"); __scanf("%d",_&hen); __//_規則外の入力への対応 __while(hen_<_2_||_hen_>_9){ ____printf("※入力エラー!!_2~9を入力してください:"); ____scanf("%d",_&hen); __} __//_計算と出力 __maxl_=_3*hen-2;_____________//_行数=3*辺の桁数-2 __for(ln=1;ln<=maxl;ln++)_{___//_行1から逐一実行 ____gyouRtn(hen,ln,maxl);_____//_行の一括処理出力 __} __//_終了 __return_0; } //_行ごとの出力半巾(桁)を与えます //_中心位置±半巾の位置に●を置く予定 int_maxkRtn(int_hen,int_ln,int_maxl){ __int___maxk;_//_半巾の文字数 __//_垂直辺を無視した巾 __if(ln<=maxl/2)_{__//_上半分のとき ____maxk_=_ln-1;____//_lnと共に増加、最初は0 __}_else_{__________//_下半分のとき ____maxk_=_maxl-ln;_//_lnと共に減少、最後は0 __} __//_垂直辺で切る __if(maxk>hen-1)_maxk_=_hen-1; __//_水平辺の半分を加える __maxk_+=_hen/2;____//_hen_が偶数ならmaxk*2==hen ____________________//_奇数なら_maxk*2_==_hen-1 __return_maxk; } //_行の準備と出力を制御、実行します void_gyouRtn(int_hen,int_ln,int_maxl){ __int_kt;___//_桁(文字)位置 __int_maxk;_//_行lnでの半巾、後に行の右端 __int_mink;_//_行での図形の左端位置 __int_cent;_//_縦の中心軸の位置 __maxk_=_maxkRtn(hen,ln,maxl);_//_この行での半巾 __if(hen==2*(hen/2))_{____//_辺が偶数桁 ____cent_=_maxl/2;________//_左半分の右端 ____mink_=_cent-maxk+1;___//_図形の左端 __}_else_{________________//_辺が奇数桁 ____cent_=_maxl/2+1;______//_左と右の間の1桁 ____mink_=_cent-maxk;_____//_図形の左端 __} __maxk_=_cent+maxk;_______//_図形の右端 __//_出力開始 __kt_=_1; __while(kt_<=_maxk){ ____if(1<ln_&&_ln<maxl)_{_//_上下辺以外 ______if(kt_!=_mink_&&_kt_!=_maxk){_//_図形位置以外 ________printf("□"); ______}else{________________________//_図形位置 ________printf("●"); ______} ____}_else_{______________//_上下辺 ______if(kt<mink)_{_________________//_図形位置以外 ________printf("□"); ______}_else_{______________________//_図形位置 ________printf("●"); ______} ____} ____kt++; __} __printf("\n"); } これは添付画像の八角形を表示するプログラムなのですが、これと同様のプログラムで添付画像の*形を表示するプログラムを教えてください。 (「同様」というのは、これ以上の"機能"を一切使わないという意味です。) mainの部分は上記のプログラムとほぼ同じなので大丈夫なのですが、下部の関数部分がわかりません。 関数部分で今考えているアルゴリズムは…  (1)行ごとの出力桁数を与える(中心線±(n-1)/2)  (2)1行目から中心行の前までは、左端・中心・右端に"●"を出力  (3)中心行には、n個だけ"●"を出力  (4)それ以降の行は、(2)と同じ …という感じです。 もちろん、(1)で出力桁数を与える時には、1行目~(n/2-1)行目までは左右1ずつ幅が減り、(n/2+1)行目~n行目までは左右1ずつ増えるようにします。 このアルゴリズムでプログラムを組みたいのですが、どうも難しくてできません。どうか教えてください。

みんなの回答

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.2

既に解決しているようなので参考までに・・・ ●を書く条件を次の様にわけて考えて  1.左上から右下  2.右上から左下  3.真ん中の列  4.真ん中の行  5.1~4の条件が一致しても,中心でかつ入力が偶数の場合は●を書かない #include <stdio.h> void gyouRtn2(int hen,int ln,int maxl); int main(void){ int hen; // 辺の長さ(文字数) int ln; // 出力行番号(1,2,..,maxl) int maxl; // 出力行数 // 最初の入力 printf("数字2~9を入力してください:"); scanf("%d", &hen); // 規則外の入力への対応 while(hen < 2 || hen > 9){ printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &hen); } // 計算と出力 maxl = (hen / 2 + 1) * 2 - 1;// 偶数も奇数同じサイズになるように計算 for(ln=1;ln<=maxl;ln++) { // 行1から逐一実行 gyouRtn2(hen,ln,maxl); // 行の一括処理出力 } // 終了 return 0; } // 行の準備と出力を制御、実行します void gyouRtn2(int hen,int ln,int maxl){ int kt; // 桁(文字)位置 int maxk; // 行lnでの半巾、後に行の右端 int cent; // 縦の中心軸の位置 cent = hen / 2 + 1; // 中心軸を求める if( cent == ln ){ // 中心軸 == 行の場合は最大値を設定 maxk = maxl; } else if ( maxl - ln + 1 > ln ) { // ●を表示される位置で大きい方を選ぶ maxk = maxl - ln + 1; }else{ maxk = ln; } // 出力開始 kt = 1; while( kt <= maxk ){ // ●の条件を全てOR(||)を使って列挙,●は左上から右下,右上から左下,kt=真ん中,ln=真ん中 if(( cent == ln) || (cent == kt) || (ln == kt) || ( maxl - ln + 1 == kt)) { if ( (cent == ln) && (cent == kt) && (0 == hen%2) ) { // 中心点の時にhenが偶数なら□ printf("□"); }else{ printf("●"); } }else{ printf("□"); } kt++; } printf("\n"); }

noname#157743
noname#157743
回答No.1

アルゴリズムをもっと深く考えて数式化してみてください。 まず、この図形を描くための入力と行数の関係です。奇数が入力された場合は「行数=入力」です。偶数が入力された場合は「行数=入力+1」です。ということは、まず最初の段階で入力が奇数か偶数かの判定と分岐が必要だということです。 次に、各行の中の●の位置です。まず、行数が5行の時を考えます。●の位置は、 1行め:1,3,5 → 1,(行数+1)/2,行数-(1-1) 2行め:2,3,4 → 2,(行数+1)/2,行数-(2-1) 3行め:  入力が奇数なら:1,2,3,4,5 → 全部●  入力が偶数なら:1,2,4,5 → (行数+1)/2以外全部● 4行め:2,3,4 → 4,(行数+1)/2,行数-(4-1) 5行め:1,3,5 → 5,(行数+1)/2,行数-(5-1) 同様に行数が7行の時も考えれば、一般的に全体の行数がN行の時、n行めの●の位置は以下のように求められることがわかるはずです。 n=(N+1)/2以外の時  n,(N+1)/2,N-(n-1) n=N/2+1の時  入力が奇数の時   for(i=1; i<=N; i++){ この条件全て }  入力が偶数の時   for(i=1; i<=N; i++){ if(i != (N+1)/2){ この条件全て }} ここまで整理できれば、あとはこれをC言語の文法で書くだけです。

speedy-boy
質問者

お礼

すごく解りやすいです。ありがとうございましたッ!! …で、プログラムを作ってみたは良いのですが、何分、C言語初心者の為、上手くいきませんでした…。 修正箇所をお教えいただけると嬉しいです。 よろしくお願いいたします。 http://okwave.jp/qa5241790.html

関連するQ&A

  • C言語について。

    今、C言語に関する問題をやっているんですが、いまいちわかりません。 その問題というのは↓ ≪問題5 (繰り返し) 例題をもとに、次のような九九の表を出力するプログラムを作成しなさい。  1 2 3 4  5  6  7  8  9  2 4 6 8 10 12 14 16 18  ~(略)                                               ≫ という問題です。それで、その例題というのは↓ ≪例題4 (for文、do while文)  次のプログラムは、入力された整数を一辺とする正方形を出力するプログラムである。動作確認をしなさい。  4       (←入力)  ****  (←出力)  ****  ****  **** /* 正方形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9);     for( i = 1 ; i <= hen ; i++)     {         for( j = 1 ; j <= hen ; j++)           printf("*");         putchar('\n');    } }  ≫ ≪例題5 (for文、do while文) 次のプログラムは、入力された整数を一辺とする二等辺三角形を出力するプログラムである。動作確認しなさい。  4      (←入力)  *     (←出力)  **  ***  **** /* 二等辺三角形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9 );     for( i = 1 ; i <= hen ; i++ )     {            for( j = 1 ; j <= i ; j++ )              printf("*");          putchar('\n');     } }  ≫ 以上の二つが例題です。 わかりづらかったらすみませんm(_ _)m わかる方(問題5を)教えてくださるとありがたいです。

  • C言語プログラムが理解できなくて…

    C言語で中抜きの正方形を作れという問題だったのですが 解答を見ても解説は無く ちんぷんかんぷんで どこでどういう処理をして、こういった解答になるのかが分からないのです 特に教えていただきたいのが何故この文で白抜きの部分ができるのかという事です 初歩的な所だと思うのですがお恥ずかしながら質問させていただきます ちなみに解答はこうありました #include<stdio.h> void main() { int hen,i,j; do { printf("2~9の数字を入力"); scanf("%d",&hen); if(hen<2||hen>9) printf("エラー\n"); } while(hen<2||hen>9); for(i=1;i<=hen;i++) { for(j=1;j<=hen;j++) { if(i==1||i==hen) putchar('*'); else { if(j==1||j==hen) putchar('*'); else putchar(' '); } } putchar('\n'); } }

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • C言語

    以下の出力結果はどうなりますか? 教えてください。 #include <stdio.h> #include <stdib.h> int main (void){ int n,f; n=792; f=2; while(f*f<=n){ while(n%f==0){ printf("%d",f); n=n/f; } f++; } if(n !=1) printf("%d",n); printf("\n"); return 0; }

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語のプログラムについて

    三角形を判定するプログラムを作ったのですが直角三角形ができるはずがないのに直角三角形の判定が出てしまいます。簡単なことなのかもしれませんが自分ではわからなくなってしまったのでご指摘してもらいたいです。 #include<stdio.h> void tri(int x,int y,int z) { if((x*x==y*y+z*z)||(y*y==x*x+z*z)||(z*z==x*x+y*y)) { printf("これは直角三角形です。"); printf("これは三角形です。"); }else if((x+y>=z)||(x+z>=y)||(y+z>=x)) { printf("これは三角形ではありません。"); }else{ printf("これは三角形です。"); } } int main(void) { int e1,e2,e3; printf("3辺を入力してください"); scanf("%f,%f,%f",&e1,&e2,&e3); tri(e1,e2,e3); return(0); }

  • C言語の質問です

    下記の素数か素数でないか調べるコードで、 (1)変数名にis_primeとありますが、isは何を意味しているのですか? (2)is_prime = 1;とするのがわかりません。 (3)以下、return 0; まで、どういう流れかわかりません よろしければコメント以下から1行ずつ教えてもらえるとうれしいです。 #include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください: "); scanf("%d", &num); /* 約数があるかどうか調べる */ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1 && num > 1) printf("素数です"); else if (num > 1) printf("素数ではありません"); return 0; }

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・