- 締切済み
C言語に詳しい方、お願いします!
二重for文の特長を活かし、次のような表示を行うプログラムを書きなさい。 ※四角形からダイヤ型をくり貫いたような表示。 ただし、キーボード入力で数字を出力し、その数字の数が、横配列の■の最大値となるようにすること(この例の場合、出力した数字は7)。 つまりは、出力した数字に応じて、■とダイヤの大きさが変化する。
- taka_alice
- お礼率23% (6/26)
- C・C++・C#
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bravy
- ベストアンサー率0% (0/2)
要求に対してシステムがどのような振舞をするかを書いたのが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)
(「回答」するか、躊躇しました。初めての経験です) >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)
キーボードから入力された数字を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)
#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言語の問題
配列の問題 1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する) 2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。 この問題が解けなくて困ってます。どうか知恵をかしてください。
- ベストアンサー
- C・C++・C#
- C言語課題!C言語初心者です。お願いします。
キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま表示。 1ならば数字と並びを逆に表示。 2ならばその数字と逆に並べた数字の差の絶対値を表示。 その際に差が0ならば入力した数字をそのまま表示するプログラム。 どの文を使ってどの道筋でかけばよろしいでしょうか? ほんとに困っています。よろしくお願いします。
- 締切済み
- C・C++・C#
- 【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・C++・C#
- c言語がわかりません
(1)5人のテストの点数をキーボードから配列に入力し、70点以上の人をカウントし、結果を表示するプログラムを作る。 (2)2つの配列(aとb)の中身を交換するプログラムを作成する。2つの配列は交換前と交換後を表示する。
- ベストアンサー
- C・C++・C#
- プログラムの課題で分からない問題があるので、ヒントを教えていただきたい
プログラムの課題で分からない問題があるので、ヒントを教えていただきたいです。 ちなみにfor文、if文、配列などを応用して(勿論ぜんぶ使わなくても良いです)プログラムをつくるものなのですが、配列をうまく理解してないので、どういう風に配列に代入して出力するかアドバイスお願いします。 ・1~5の数字をキーボードから入力し、それに対応した英語を表示。ただし単語は配列に初期化しておくこと(※swich-caseを使わずに) ・キーボードから英語の大文字を1文字入力して、その文字がアルファベットの何文字目にあたるかを表示する ・キーボードからアルファベットの小文字を1文字入力→大文字に変換して表示する 多くてすみません。
- ベストアンサー
- C・C++・C#
- 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++・C#
- 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]); くらいまでしか分かりません…
- ベストアンサー
- C・C++・C#