ページ 1 / 1
はじめまして
Posted: 2009年1月15日(木) 12:11
by 比奈
大学の授業(序論)で出た問題なのですがまったく手がでないで困ってるんで教えてください。
整数nをコンソール画面から読み込んで、Zの文字を*とスペースを並べて表示する。
って問題です。
nの使い方の説明がなくてよくわかんないのですが、*の数かと思います。
Re:はじめまして
Posted: 2009年1月15日(木) 12:21
by non
>nの使い方の説明がなくてよくわかんないのですが
本人がわからないなら、読んでるこちらは、もっとわかりません。
Zの文字の縦横サイズのことでしょうか?
n=5のとき
*****
___*_
__*__
_*___
*****
こんなふうに?
Re:はじめまして
Posted: 2009年1月15日(木) 12:21
by バグ
問題の意味が分かりません。
整数nの読み込みというのはおそらくscanf関数などでいいのでしょうが…
そのあとの「Zの文字を*とスペースを並べて表示する」という部分と、整数nの読み込みの部分の関連が無いように思うのですが…?
こういう場合は、自分の解釈ではなく、課題の問題文を全て載せた方が話が早いですよ。
Re:はじめまして
Posted: 2009年1月15日(木) 14:23
by Dixq (管理人)
比奈さんこんにちは。
多分nonさんの仰っているようなことだと思います。
#include <stdio.h>
int hantei(int x, int y, int r){
if(x*x+y*y>=r*r && x*x+y*y<(r+2)*(r+2)){
return 1;
}
else{
return 0;
}
}
int main(){
int x,y,n;
scanf("%d",&n);
for(y=-n-2; y<=n+2; y++){
for(x=-n-2; x<=n+2; x++){
if(hantei(x,y,n)==1){
printf("■");
}
else{
printf(" ");
}
}
printf("\n");
}
return 0;
}
実行結果
10
■■■■■■■■■
■■■■■■■■■■■■■
■■■ ■■■
■■■ ■■■
■■ ■■
■■■ ■■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■■ ■■■
■■ ■■
■■■ ■■■
■■■ ■■■
■■■■■■■■■■■■■
■■■■■■■■■
#include <stdio.h>
int hantei(int x, int y, int r){
if( y<=x+1 && y>=x-1 || y<=-x+1 && y>=-x-1 ){
return 1;
}
else{
return 0;
}
}
int main(){
int x,y,n;
scanf("%d",&n);
for(y=-n-2; y<=n+2; y++){
for(x=-n-2; x<=n+2; x++){
if(hantei(x,y,n)==1){
printf("■");
}
else{
printf(" ");
}
}
printf("\n");
}
return 0;
}
実行結果
5
■■ ■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■■■
■■■
■■■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■ ■■
こんな感じですよね?
プログラムを難しいもの、自分にはわからないもの・・と投げ出してはいませんか?
わからない時はわかるところから少しずつ作ってみましょう。
例えばscanfで読み取るだけならできますか?
一直線だけ書くなら出来ますか?
十字型だけならかけますか?
その線を読み取ったnの長さになら出来ますか?
少しずつやってみましょう。
もう「最初からどうせ全然わからない」じゃ全く成長しないです。
一方で、少しずつやれば必ずわかります。
もし、上のプログラムの意味がわからければ、まず解る部分から自分でプログラムを作ってみて下さい。
つまったらその都度グーグルで調べるか、投稿して添削してもらいましょう。
Re:はじめまして
Posted: 2009年1月15日(木) 21:52
by 比奈
皆さん返信ありがとうございます。
nonさんの仰ってる通りn=5の場合5*5だと思います。
バグs
問題が不適切なのかもしれません。
書いた通りに出題されました。
管理人s
すいません、少し他人任せになっていました。
自分なりにやってみようと思います。
因みに直線までしかできないです。十字架にするときのif文の使い方がよくわかりません、
教えて頂けると幸いです。
上の問題の斜めのところのifとprintfの関係もわかりません。
色々とすいませんが、#include<stdio.h>の後にいつも
void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。
注文ばかりですいません。
Re:はじめまして
Posted: 2009年1月15日(木) 22:29
by Dixq (管理人)
まず、方程式を満たしたとき「*」満たさないとき「 」を出力することを考えましょう。
今、長さ10の正方形の領域で、右下がりの直線を描くことを考えてみましょう。
順にxを0から9まで増加させ、yを0から9まで増加させると、合計で格子点は100個になるのはわかりますか?
(0,0),(0,1),(0,2),(0,3)...(0,9)
(1,0),(1,1),(1,2),(1,3)...(1,9)
(2,0),(2,1),(2,2),(2,3)...(2,9)
...
(9,0),(9,1),(9,2),(9,3)...(9,9)
このように100個の点を通りますね?
このうち、y=xを満たす点は斜め右下に向かっているのがわかりますか?
中学か小学のとき、y=xの直線は右上がりになると習ったと思います。
今はyの正の向きが下なのですから、右下がりになるのはわかりますよね。
xを0から9まで変化させ、yも0から9まで変化させ、
条件を満たしたときに「*」を出力、満たさないときに「 」を出力し、
1行調べ終わったら改行すればいいのです。
この通りプログラムを書いてみて下さい。
とりあえず、直線を描くプログラムが出来ているならこれは出来ると思いますが、
初めに作ったプログラムも提示して下さい。
上のプログラムアが出来たら左下がりや、左下がりで途中から右上がりになるようなプログラム、
△を表示するプログラムなどを作って練習してみて下さい。
Zなら簡単に出来るはずです。
あと、いえで使っているコンパイラは何ですか?
それから
>void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。
の意味がよくわかりません。なお、void mainは間違いです。
手元に本などはありますか?
無ければググって見ましょう。
それから、わからないことがあればネット上に参考になるサイトを見て回るくせもつけましょう。
「C言語 入門」で検索すれば参考になるサイトは沢山見つかります。
Re:はじめまして
Posted: 2009年1月16日(金) 08:51
by non
たぶん、課題を出した先生が期待している回答は以下のようなものだと思います。
putcharを使いましたが、printfしか習っていないならそこは書き直してください。
管理人さんのプログラムは、これが理解出来た後の方がいいでしょう。
#include<stdio.h>
int main(void)
{
int i,j,n;
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
putchar('*');
putchar('\n');
for(i=0;i<n-2;i++){
for(j=n-2-i;j>0;j--)
putchar(' ');
putchar('*');
putchar('\n');
}
for(i=0;i<n;i++)
putchar('*');
putchar('\n');
return 0;
}
実行例
n=5
*****
*
*
*
*****