• 締切済み

C言語に詳しい方、お願いします!

二重for文の特長を活かし、次のような表示を行うプログラムを書きなさい。 ※四角形からダイヤ型をくり貫いたような表示。 ただし、キーボード入力で数字を出力し、その数字の数が、横配列の■の最大値となるようにすること(この例の場合、出力した数字は7)。 つまりは、出力した数字に応じて、■とダイヤの大きさが変化する。

みんなの回答

  • bravy
  • ベストアンサー率0% (0/2)
回答No.4

要求に対してシステムがどのような振舞をするかを書いたのがNo2です。 これは要求を分析して、どのようにするとそれが満たされるかを考えたものです。 後は素直にCのコーディングにすれば良いのではないでしょうか? ちなみにy軸は普通の座標と逆と考えます。 下限値をy0として、上限値をy9とすると、(y0<y && y < y9)の時に白抜きになるという事を書けばよいのです。 #include <stdio.h> int main (int argc, char *argv[]) {  int x, y;  int n = (argc > 1) ? atoi (argv[1]) : 7;  for (y = 0; y < n; y++)   {    for (x = 0; x < n; x++) {  int y0, y9;  if (x < (n / 2))   {    y0 = -x + n / 2;    y9 = x + n / 2;   }  else   {    y0 = x - n / 2;    y9 = -x + 3 * n / 2;   }  printf ("%s", (y0 < y && y < y9) ? "□" : "■"); }    printf ("\n");   } } ---- 省略値で7となるようになっています。 ■■■■■■■ ■■■□■■■ ■■□□□■■ ■□□□□□■ ■■□□□□■ ■■■□□■■ ■■■□■■■ このプログラムに20を引数で渡すのこんな風になります。 ■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■□□□□□□□□□□□□□■■■ ■■■□□□□□□□□□□□□□□□■■ ■■□□□□□□□□□□□□□□□□□■ ■□□□□□□□□□□□□□□□□□□□ ■■□□□□□□□□□□□□□□□□□■ ■■■□□□□□□□□□□□□□□□■■ ■■■■□□□□□□□□□□□□□■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ キーボード入力で数字をという要求は満たしていません。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

(「回答」するか、躊躇しました。初めての経験です) >C言語に詳しい方、お願いします!  質問者様は、「この問題は、C言語に詳しくないと、解けない」とお考えですね。  どうして、そんな問題にチャレンジしたのですか?。  なぜ、「困り度」が最高なのですか?。 ☆まず自分で「考える・解決する」という気構えが・・・と思います。 >※四角形からダイヤ型をくり貫いたような表示。  をするには、「出力した数字」の最小は、いくつか?考えてみましたか。  偶数で実現できるかどうかも。  これを考えるのに必要なのは、紙と筆記具だけで、「C言語に詳しい」かどうかは無関係ですよ。    12345    ■■■■■    ■■ ■■    ■   ■    ■■ ■■    ■■■■■  この図が、最も小さい?と思われます。  まわりに1つ追加したものを想定してみると・・(×偶数)。 「ここまで判ったのですが、コード化できません」のような質問・・。 +++++++++++++++++++++++++++++++++++++++++++++ 確かに、難しいですね、・・「詳しくない」からかなぁ?。 で、No.2 さんのをコード化してみました。 ・どうして3が出てくるかは、考えてください。    ヒント:切片 y = x + b #include <stdio.h> #include <stdlib.h> char cZen[ 2 ][ 4 ] = { "■", "□" }; int main( void ) {  int x, y, iGrid[ 32 ][ 32 ] = { { 0 } }, iKazu, iHan, iCode;  scanf( "%d", &iKazu );  if( 0 == ( iKazu % 2 ) ) iKazu++; // 強制奇数化  if( iKazu < 5 ) return( -1 );  if( iKazu > 31 ) return( -1 );  printf( "%d\n", iKazu );  iHan = iKazu / 2;  for( y = 1; y <= iHan; y++ ){   for( x = 1; x < iHan; x++ ){    if( ( iHan - x ) < y ) iGrid[ x ][ y ] = 1;   }   for( x = iHan; x < iKazu; x++ ){    if( ( x - iHan ) < y ) iGrid[ x ][ y ] = 1;   }  }  for( y = iHan; y < iKazu; y++ ){   for( x = 1; x < iHan; x++ ){    if( ( x + iHan ) > y ) iGrid[ x ][ y ] = 1;   }   for( x = iHan; x < iKazu; x++ ){    if( ( 3 * iHan - x ) > y ) iGrid[ x ][ y ] = 1;   }  }  for( y = 0; y < iKazu; y++ ){   for( x = 0; x < iKazu; x++ ){    iCode = iGrid[ x ][ y ];    printf( "%s", cZen[ iCode ] );   }   printf( "\n" );  }  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • bravy
  • ベストアンサー率0% (0/2)
回答No.2

キーボードから入力された数字をnとする。 [0<=x && x<=n/2]の時 下限値 y=-x+n/2 上限値 y=x+n/2 [n/2<x && x<=n]の時 下限値 y=x-n/2 上限値 y=-x+3*n/2 こんな座標を考えてみてはどうでしょう。 座標の原点とか向きは少し考える必要があると思います。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

#include <stdio.h> int main(void) { char* c[7]={ "■■■■■■■", "■■■ ■■■", "■■   ■■", "■     ■", "■■   ■■", "■■■ ■■■", "■■■■■■■" }; for(int i=0;i<7;i++){ printf("%s\n", c[i]); for(int j=0;j<7;j++); } return(0); }

関連するQ&A

  • C言語初心者です。

    C言語初めて壁にぶち当たりました。下の問題がとけません。よろしくお願いします。 標準入力から整数値を4個,int型の配列へ読み込んで,これかの値を大きい順に配列上で並び替え,出力するプログラムを作成してください。ただし,for文の2重ループを必ず使用してください。

  • C言語の問題

    配列の問題 1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する) 2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。 この問題が解けなくて困ってます。どうか知恵をかしてください。

  • c++について

    プログラム超初心者です。 int型の配列に空白と1を代入して、for文でループして内容が1のときは"■"を表示するというプログラムを作りたいのですが、大量の数字が出てうまくいきません。例を作っていただけませんか?

  • C言語課題!C言語初心者です。お願いします。

    キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま表示。 1ならば数字と並びを逆に表示。 2ならばその数字と逆に並べた数字の差の絶対値を表示。 その際に差が0ならば入力した数字をそのまま表示するプログラム。 どの文を使ってどの道筋でかけばよろしいでしょうか? ほんとに困っています。よろしくお願いします。

  • 【C言語を教えてください!】2次元配列について

    【C言語を教えてください!】2次元配列について 2次元配列を用いて、コンソール画面(ターミナル)の中央付近に*を表示させるプログラムを作りたいのですがさっぱり分かりません。 画面の大きさは半角で横80 縦25です。 25は奇数ですので40×12に表示したいと思います。 2重ループでなら出来たのですが配列でのやり方がわかりません。 #include<stdio.h> main() { int i,j; for(i=0;i<25;i++){ for(j=0;j<80;j++){ if(i==12&j==39){ putchar('*'); }else{ putchar(' '); } } } return 0; } 回答お願いします!

  • c言語がわかりません

    (1)5人のテストの点数をキーボードから配列に入力し、70点以上の人をカウントし、結果を表示するプログラムを作る。 (2)2つの配列(aとb)の中身を交換するプログラムを作成する。2つの配列は交換前と交換後を表示する。

  • プログラムの課題で分からない問題があるので、ヒントを教えていただきたい

    プログラムの課題で分からない問題があるので、ヒントを教えていただきたいです。 ちなみにfor文、if文、配列などを応用して(勿論ぜんぶ使わなくても良いです)プログラムをつくるものなのですが、配列をうまく理解してないので、どういう風に配列に代入して出力するかアドバイスお願いします。 ・1~5の数字をキーボードから入力し、それに対応した英語を表示。ただし単語は配列に初期化しておくこと(※swich-caseを使わずに) ・キーボードから英語の大文字を1文字入力して、その文字がアルファベットの何文字目にあたるかを表示する ・キーボードからアルファベットの小文字を1文字入力→大文字に変換して表示する 多くてすみません。

  • C言語の課題

    1、整数型の変数を2個だけ使い、キーボードから5個の整数を読み込み負の整数のみの和を表示プログラムを作れ 2、1、の問題について使える変数を3個に増やしたうえでwhile文を使ったプログラムを作れ 3、1、の問題について使える変数を3個に増やしたうえfor文を使ったプログラムを作れ 1を作ろうとするとかなり長くなってしまうのです… ヒントでもいいので教えてください。

  • 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言語のプログラミングですが、 255文字以内の文字列をキーボードから入力して、下記の各処理を行うプログラム(※入力した文字データは配列に入力)はどのようにしたらいいでしょうか?(入力例:acFNkeexFFg) ・入力した文字列の最後の文字を出力 ・入力した文字列⇒逆に並べ替えて出力 ・入力した文字列⇒縦に出力(1文字ずつ) ・入力した文字列の中に「F」が何個あるか ただし、使えるのはfor文・配列・if文ぐらいでそれ以上レベルの高いものは使わないで下さい。 … char str[255]; int i,n,na,nb,nc; printf("Input Strings= "); scanf("%s",str); for(i=0;str[i]!='¥0';i++){ n=i; } printf("The last character= %c",str[n]); くらいまでしか分かりません…

専門家に質問してみよう