アスタリスクでダイヤ型を作る

このQ&Aのポイント
  • アスタリスクを使用してダイヤ型の形を出力するプログラムを作成したが、実行例と比較して形が異なる。
  • 関数をif文で作成したが、for文やwhile文で実行するためにはどのように修正すれば良いか。
  • プログラムの実行データの画像を添付しました。
回答を見る
  • ベストアンサー

アスタリスクでダイヤ型を作る

アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが 実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか? 実行例と私が作ったプログラムの実行データを画像に添付しました。 #include <stdio.h> int daiya( int i, int j, int Num ){ if( j<= i+Num && j<=-i+Num && j>= i-Num && j>=-i-Num ){ return 1; } } int main(){ int i, j, n; do{ puts("数字を入力:"); scanf( "%d", &n ); if(n<2||n>9){ printf("入力エラーです。もう一度入力して下さい\n"); } }while(n<2||n>9); for( j=-n/2; j<=n/2; j++ ){ for( i=-n/2; i<=n/2; i++ ){ if( daiya( i, j, n/2 ) == 1 ){ putchar('*'); } else { putchar(' '); } } putchar('\n'); } return 0; }

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

#include <stdio.h> int daiya(int x, int y, int n) { return y <= x + n - 1 && y <= -x + n - 1 && y >= x - n + 1 && y >= -x - n + 1; } int main(void) { int n, x, y; printf("段数:"); scanf("%d", &n); for (x = -n + 1; x <= n - 1; x++) { for (y = -n + 1; y <= n - 1; y++) { putchar(daiya(x, y, n) ? '*' : ' '); } putchar('\n'); } return 0; }

その他の回答 (2)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

実行例を見た感じだと、こんなのとか: #include <stdio.h> #include <string.h> #define NMAX 9 #define BUFMAX (NMAX*2) #define SPC ' ' #define STAR '*' char Buf[ BUFMAX + 1 ]; void dia( int n ){ int i, k, l; for ( i = -n + 1; i < n; i++ ){ k = n + (i > 0 ? - i : i ); l = k * 2 - 1; memset( Buf + NMAX - k, STAR, l ); puts( Buf ); memset( Buf + NMAX - k, SPC, l ); } } int main( int argc, char *argv[] ){ int n; memset( Buf, SPC, BUFMAX ); Buf[ BUFMAX ] = '\0'; for ( n = 1; n <= NMAX; n++ ){ printf( "N=%d\n", n ); dia( n ); } }

参考URL:
http://www.ideone.com/l2asA
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

・n/2にしたのはなぜ? ・int daiya~ でifが不成立の時には、そのまま関数の終りになってしまっています。 ちゃんとreturn 0等と明示的に値を返すようにしましょう。 今はたまたま1以外が返っていて正常に動いているように見えますが、思わぬ不具合の元です。 ・>関数をif文で作ったのですがそれをfor文while文で実行できる形にする の意味がわかりません。 まずは、daiya関数の仕様を決めることです。 「大きさNumのダイヤ型を書く際に、i列j行に*を描画するなら1を返す」という仕様なら、今のままです。(returnが足りない点を除いて) そうでないなら、daiya関数が具体的に「何を受けとって」「何をするのか」「何を返すのか」を決めてください 実際にどうするか考えるのはその後です。

関連するQ&A

  • 教えてください

    このソースのbunpu[tensu[i] / 10]++;がよく分からないので詳しく教えてください。 あと、 printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n');についても何を示しているのかわかりません。そこも詳しく教えてください。宜しくお願いします。 #include <stdio.h> #define NUMBER 80 int main(void) { int i, j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください:"); do{ scanf("%d", &num); if(num < 1 || num > NUMBER) printf("\a要 [1以上%d以下] :", NUMBER); }while (num < 1 || num > NUMBER); puts("点数を入力してください。"); for(i=0; i < num; i++) { printf("%2d番:", i+1); do{ scanf("%d", &tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 [0以上100以下] :"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布グラフ "); printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n'); for (i=9; i >=0; i--) { printf("%3d-%3d:", i*10, i*10+9); for (j =0; j < bunpu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

  • アスタリスクで正方形

    アスタリスク(*)で正方形を作るプログラムをC言語で書いているのですが関数で描画部分を作ることが出来ません。動かす方法を教えて頂けないでしょうか #include <stdio.h> void seihoukei(void); int no,i,j,cnt; int main(void) { int cnt,i,j; do{ printf("数字(2-9)を入力して下さい:"); scanf("%d",&cnt); if(cnt<2||cnt>9){ printf("入力エラーです。もう一度入力して下さい"); } }while(cnt<2||cnt>9); for(i=1;i<cnt;i++){ for(j=1;j<=cnt;j++){ seihoukei(); } } return 0; } void seihoukei(void) { j = 1; while(j <= j){ putchar('*'); j=j+1; } putchar('\n'); }

  • 困っています

    このプログラムを以下に示す所を関数化し、該当する部分を関数呼び出すようにします。  1 非負の整数が入力されたかチェックする関数(非負は0、負は1を返す) 2非負の整数を読み込む関数 3渡された整数の1の位を返す関数 4アスタリスクを表示する関数 です。 自分では、1は、 int isNotMinus(int n){ return (n < 0) ? 1 : 0 ; } だと思うのですが、2,3,4が分かりません。この 作った関数をmain関数で呼ぶときどうやるかも教えてください。宜しくお願いします。 int main(void) { int i; int num,kansu[10]; printf("整数を入力してください。"); scanf("%d", &num); for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); for (i=0; i <10; i++) { printf("%d",i); for (j =0; j < kazu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

  • C言語の問題-配列について

    今、独学でC言語をやっているんですが本にのっている問題に解答がなくわかりません。 問題はbunpu[tensu[i] / 10]++;はどういう意味を表すかです。 do-while分の繰り返しがおわった後にbumpuに++があるので+1をすればいいのでしょうか?よくわかりません・・・ 学生10人の点数の分布を10点ごとに分布グラフとして表示します。 #include <stdio.h> #define NUMBER 80 int main (void) { int i,j,num; int tensu[NUMBER]; int bunpu[11] = {0}; puts("点数を入力してください"); for("i =0; i < num; i++"){ printf("%2d番",i + 1); do{ scanf("%d",&tensu[i]); if(tensu[i] < 0 || tensu[i] > 100) printf("0以上100以下"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布ぐらふ "); printf(" 100:"); for (j = 0;j < bumpu[10];j++) putchar('*') putchar('\n') for(i = 9; i>=0; i--) { printf("%3d - %3d:",i*10,i*10+9); for (j=0; j< bunpu[i];j++) putchar('*'); putchar('\n'); } return(o); }

  • パスカルのピラミッドを作りたいのですが...

    */ 入力した段数のパスカルの三角形をつくる */ #include <stdio.h> /*---nCr値を返す---*/ int comb(int n,int r) { if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); if (r == 0 || r == n) return (1); else if (r == 1) return (n); else return (comb(n - 1,r-1) + comb(n - 1,r)); } int main(void) { int ln; int i,j; do{ printf(" 段数を入力して下さい:"); scanf("%d",&ln); }while (ln < 1); for (i = 0; i < ln; i++){ for(j = 0;j < ln - i;j++) putchar(' '); for(j = 0; j < i; j++){ printf("%d",comb(i,j)); printf(" "); } putchar('\n'); } return (0); } と作ったら、うまく 1 1 1 1 2 1 1 3 3 1 とは表示されず、 1 1 2 1 3 3 1 4 6 4 となってしまいます。 どこを直せばよいのでしょうか。教えて下さるとうれしいです。 よろしくお願い致します。

  • 困っています

    このプログラムを以下に示す所を関数化し、該当する部分を関数呼び出すようにします。  1 非負の整数が入力されたかチェックする関数(非負は0、負は1を返す) 2非負の整数を読み込む関数 3渡された整数の1の位を返す関数 4アスタリスクを表示する関数 です。 全然分からないので詳しく教えてください。 お願いします。 int main(void) { int i; int num,kansu[10]; printf("整数を入力してください。"); scanf("%d", &num); for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); for (i=0; i <10; i++) { printf("%d",i); for (j =0; j < kazu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

  • 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'); } }

  • 構造体

    下記プログラムの2次元配列を構造体の配列に作り変え,構造体を利用して生年月日の項目を追加し,形式は日を除いたYYYY/MMで持ち,生年月日の入出力は,YYYY/MM形式で行い,西暦が数字4桁で,西暦と月の間に'/'があり,月が01~12の範囲の数字の2桁になっている7文字の入力のみ受け付け,正しく入力されるまでそれ以外は再入力させたい。あとdo-while文をつかっている箇所をwhile文に直したいです.自力でやったのですが,わかりませんでした. どのようにしたらよいか教えてください. お願いします. include <stdio.h> #define BUFFERSIZE 11 #define MAX_PERSON 10 #define MAX_CHARS 10 int main(void) { char name[10][BUFFERSIZE]; int c; int count = 0; int i; int j; for (i = 0; i < MAX_PERSON; i++) { printf("氏名入力 : "); j = 0; /* 氏名の1文字目が'0'なら入力を終了 */ if ((c= getchar()) == '0'){ break; } if (c == '\n') { /* 改行のみの入力は再入力 */ do { printf( "再入力\n" ); /*再入力*/ printf("氏名入力 : "); } while ((c = getchar()) == '\n'); } name[i][j++] = c; /*1文字目を格納*/ if (name[i][0] == '0') { break; } while ((c = getchar()) != '\n' && c != EOF) { if (j < BUFFERSIZE - 1) { name[i][j++] = c; } } name[i][j] = '\0'; count++; /* 実際に入力した人数を記録*/ printf("累計 : %d \n", count); } /* 氏名と生年月日を出力したいです */ for (i = 0; i < count; i++) { for (j = 0; j < MAX_CHARS; j++) { if (name[i][j] == '\0'){ break; } putchar(name[i][j]); } putchar('\n'); } return 0; }

  • エラーは出ませんが、実行結果ができません。

    このプログラムなんですが、エラーは出ませんが結果が 0群の項目1の正解率は0.000000です 1群の項目1の正解率は0.000000です 2群の項目1の正解率は0.000000です… この様になり、正解率がでません… 初心者で、わからないので困っています。 お願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 //#define M 50//サブコンテンツの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void gunwake(int y[],int start,int N,int gunnum); void passege(int y[],int div[],int N,int num[],int u[][J],int n); static int y[I]; int div[K-1]; int divyouso=0; void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; static int num[I]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_1.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); gunwake(y,0,N,K); passege(y,div,N,num,u,n); fclose(fp); } void sum(int u[][J],int N,int n) { //static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } } void gunwake(int y[],int start,int N,int gunnum){ int tmp; int i,up,down,real; if(gunnum>1){ tmp=N/gunnum+start; //printf("tmp:%d\n",tmp); for(i=tmp;y[tmp]==y[i];i--){ } down = i + 1; //printf("down:%d\n",down); for(i=tmp;y[tmp]==y[i];i++){ } up =i; //printf("up:%d/n",up); if(tmp-down > up-tmp) real=up; else real=down; div[divyouso]=real; divyouso++; printf("%d\n",real); gunwake(y,real,N-real,gunnum-1); } } void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; int pp[I][J]; div2[0]=0; div2[K]=n; for(i=0;i<K-1;i++){ div2[i+1]=div[i]; } for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; for(i=div2[k];i<div2[k+1];i++){ pp[k][j]=pp[k][j]+u[num[i]][j]; } } } //確認 putchar('\n'); for(j=1;j<=n;j++){ for(k=0;k<K;k++){ printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); } } }

  • c言語 ファイル出力について

    このようなプログラムを作成しました。 エクセルでファイルを出力したいのですが… ファイルは作成できたものの、内容が書かれていません。 とても困っています↓ 自分の力不足なのでしょうがどなたかお願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void group(int num[],int u[][J],int N,int n); void passege(int groupm[][J],int groupn,int u[][J],int n,int N); void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_3.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); fclose(fp); } void sum(int u[][J],int N,int n) { static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } group(num,u,N,n); } void group(int num[],int u[][J],int N,int n) { int groupn,i,j,k=1; //groupn:グループの人数 static int groupm[K][I]; //groupm:グループのメンバー groupn=N/K; for(i=0;i<K;i++){ for(j=0;j<groupn;j++){ groupm[i][j]=num[k]; k+=1; } } passege(groupm,groupn,u,n,N); } void passege(int groupm[][J],int groupn,int u[][J],int n,int N) { FILE *f; int i,j,k=0,l,tt; static int t[I]; //各グループの正解率 double p[K][J],pp=0.0; //初期化 for(i=0;i<K;i++){ for(j=0;j<J;j++){ p[i][j]=0; t[i]=0; } } for(i=0;i<K;i++){ for(j=0;j<groupn;j++){ t[k]=groupm[i][j]; k+=1; } } k=0; for(i=0;i<K;i++){ for(j=1;j<=n;j++){ for(l=0;l<groupn;l++){ tt=t[k]; pp=pp+u[tt][j]; k+=1; } p[i][j]=pp/groupn; pp=0.0; if(i==0) k=0; else k=groupn*i; } k=groupn*(i+1); } //ファイル出力 f=fopen("test1.csv","w"); //確認 putchar('\n'); for(i=0;i<K;i++){ for(j=1;j<=n;j++){ printf("%d群の項目%dの正解率は%fです\n",i,j,p[i][j]); } } //ファイルを閉じる fclose(f); }