大学の授業(序論)で出た問題なのですがまったく手がでないで困ってるんで教えてください。
整数nをコンソール画面から読み込んで、Zの文字を*とスペースを並べて表示する。
って問題です。
nの使い方の説明がなくてよくわかんないのですが、*の数かと思います。
はじめまして
-
Dixq (管理人)
Re:はじめまして
比奈さんこんにちは。
多分nonさんの仰っているようなことだと思います。
こんな感じですよね?
プログラムを難しいもの、自分にはわからないもの・・と投げ出してはいませんか?
わからない時はわかるところから少しずつ作ってみましょう。
例えばscanfで読み取るだけならできますか?
一直線だけ書くなら出来ますか?
十字型だけならかけますか?
その線を読み取ったnの長さになら出来ますか?
少しずつやってみましょう。
もう「最初からどうせ全然わからない」じゃ全く成長しないです。
一方で、少しずつやれば必ずわかります。
もし、上のプログラムの意味がわからければ、まず解る部分から自分でプログラムを作ってみて下さい。
つまったらその都度グーグルで調べるか、投稿して添削してもらいましょう。
多分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:はじめまして
皆さん返信ありがとうございます。
nonさんの仰ってる通りn=5の場合5*5だと思います。
バグs
問題が不適切なのかもしれません。
書いた通りに出題されました。
管理人s
すいません、少し他人任せになっていました。
自分なりにやってみようと思います。
因みに直線までしかできないです。十字架にするときのif文の使い方がよくわかりません、
教えて頂けると幸いです。
上の問題の斜めのところのifとprintfの関係もわかりません。
色々とすいませんが、#include<stdio.h>の後にいつも
void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。
注文ばかりですいません。
nonさんの仰ってる通りn=5の場合5*5だと思います。
バグs
問題が不適切なのかもしれません。
書いた通りに出題されました。
管理人s
すいません、少し他人任せになっていました。
自分なりにやってみようと思います。
因みに直線までしかできないです。十字架にするときのif文の使い方がよくわかりません、
教えて頂けると幸いです。
上の問題の斜めのところのifとprintfの関係もわかりません。
色々とすいませんが、#include<stdio.h>の後にいつも
void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。
注文ばかりですいません。
-
Dixq (管理人)
Re:はじめまして
まず、方程式を満たしたとき「*」満たさないとき「 」を出力することを考えましょう。 今、長さ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言語 入門」で検索すれば参考になるサイトは沢山見つかります。
-
non
Re:はじめまして
たぶん、課題を出した先生が期待している回答は以下のようなものだと思います。
putcharを使いましたが、printfしか習っていないならそこは書き直してください。
管理人さんのプログラムは、これが理解出来た後の方がいいでしょう。
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
*****
*
*
*
*****