プログラムの意味について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
よーすけ

プログラムの意味について

#1

投稿記事 by よーすけ » 13年前

学校で出た課題がわからず某所でソースをもらったのですが類似していたら課題の評価が最低になるそうです。
それに貰ったのはいいのですが、その中身を理解しきれていないので提出する気もありません。理解したうえで提出したいです。
ヒントだけでもよいので、教えていただけないでしょうか。C言語は構造体まで学習しましたが理解度は低いです。

以下はもらったソースです。

コード:

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define SIZE_X 2000
#define SIZE_Y 2000


char map[SIZE_Y][SIZE_X];
int l, t, r, b;


void map_clear()
{
	memset(map, '-', sizeof(map));
	l=SIZE_X;
	r=-1;
	t=SIZE_Y;
	b=-1;
}


void map_print()
{
	int y;

	for(y=t;y<=b;y++)
	{
		printf("%.*s\n", r-l+1, map[y]+l);
	}
}


void mark(int x, int y)
{
	if(x<0 || SIZE_X<=x || y<0 || SIZE_Y<=y)
	{
		printf("Out of range. x=%d y=%d\n", x, y);
		exit(1);
	}
	map[y][x]='#';
	if(l>x) l=x;
	if(r<x) r=x;
	if(t>y) t=y;
	if(b<y) b=y;
}


int main()
{
	int x, y, vx, vy, i, num;
	char dir[2];

	map_clear();
	x=SIZE_X/2;
	y=SIZE_Y/2;
	while(scanf("%1s%d", dir, &num)==2)
	{
		vx=vy=0;
		switch(dir[0])
		{
			case 'a': vx=1; break;
			case 'c': vx=-1; break;
			case 'b': vy=1; break;
			case 'd': vy=-1; break;
		}
		for(i=0;i<num;i++)
		{
			x+=vx;
			y+=vy;
			mark(x, y);
		}
		map_print();
	}
	return 0;
}

自分なりにわかったところもあるのですが、まだわかっていない部分がほとんどです。
それを以下に挙げておきます。
・19~22行目までの定義する意味
・32,39,41,45~48行目の意味
・58,59行目で/2をしている理由
・74,76行目でなぜまたmark()とmap_print()がでてきたのか
長々とすみません。
これを学習範囲内で書き直したいと思うのですがやはり考えが甘いでしょうか…。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#2

投稿記事 by non » 13年前

どんな課題か説明せずに解析しろっていうのですか?
non

jay
記事: 314
登録日時: 14年前
住所: 大阪市
連絡を取る:

Re: プログラムの意味について

#3

投稿記事 by jay » 13年前

素晴らしいくらいコード内にコメントがない・・・(苦笑)

とりあえずこのプログラムは”何をするプログラムなのか”を具体的に説明して貰えますか?
ある程度は読み解いてそこから推測することもできなくはないですが
やはりそれを教えてもらった方が解説する側としてもやりやすいですので。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

よーすけ

Re: プログラムの意味について

#4

投稿記事 by よーすけ » 13年前

いろいろと抜かりがあったみたいですみません…。

四方向(a右 b下 c左 d上)に移動したときの軌跡を#で表してそれ以外を-で表すもので、
移動したときの軌跡を必要最低限の矩形で表し、配列を使うのですが、10*10で良いらしいです。
a4と入力したら右に4進む、といったプログラムです。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#5

投稿記事 by non » 13年前

で、このプログラムでどこがわからないのか説明してください。
non

よーすけ

Re: プログラムの意味について

#6

投稿記事 by よーすけ » 13年前

non さんが書きました:で、このプログラムでどこがわからないのか説明してください。

よーすけ

Re: プログラムの意味について

#7

投稿記事 by よーすけ » 13年前

non さんが書きました:で、このプログラムでどこがわからないのか説明してください。
すごく多くなりますがお許しください…。

#defineを使わなくても配列で代用できるかどうか
map_clear内でl~bまでどうして定義しているのか
map_print内の動作の意味、理由
main関数内で
 map_print();
 x=SIZE_X/2; y=SIZE_Y/2;とされている理由
 vx=vy=0;とする理解
 再びmark(x,y)とmap_print()がでてきたこと

です。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#8

投稿記事 by non » 13年前

よーすけ さんが書きました: #defineを使わなくても配列で代用できるかどうか
配列で代用できるという意味はわかりませんが、
#define は使わなくても、直接10を入れればいいです。
でも、大きさが簡単に変更できるように
#define SIZE_X 10
このように定義した方がいいでしょう。
よーすけ さんが書きました: map_clear内でl~bまでどうして定義しているのか
定義ではなくて、初期値を入れているです。
よーすけ さんが書きました: map_print内の動作の意味、理由
最小限の四角の範囲を表示しています。
よーすけ さんが書きました: main関数内で
 map_print();
 x=SIZE_X/2; y=SIZE_Y/2;とされている理由
mapを初期化する関数を呼び出して、
x,yは最初の場所です。課題に指示されたのでは?
よーすけ さんが書きました:  vx=vy=0;とする理解
理由?ですか?
動かさない方向は0です。
よーすけ さんが書きました:  再びmark(x,y)とmap_print()がでてきたこと
です。
関数を呼び出しています。
non

よーすけ

Re: プログラムの意味について

#9

投稿記事 by よーすけ » 13年前

non さんが書きました: 配列で代用できるという意味はわかりませんが、
#define は使わなくても、直接10を入れればいいです。
でも、大きさが簡単に変更できるように
#define SIZE_X 10
このように定義した方がいいでしょう。
なるほど。これはわかりました!
non さんが書きました: 定義ではなくて、初期値を入れているです。
lとtはまだいいですが、なぜrとbの初期値が-1なのですか?
non さんが書きました: 最小限の四角の範囲を表示しています。
printf内の%.*s\nは全く表示されない、ということでいいでしょうか。
non さんが書きました: mapを初期化する関数を呼び出して、
x,yは最初の場所です。課題に指示されたのでは?
x,yの最初の場所はどこでもいいらしいので詰んでます。
non さんが書きました: 理由?ですか?
動かさない方向は0です。
誤字でした、失礼しました。
ということは、その次のvx=1などは動かす方向が1ということでしょうか?
non さんが書きました: 関数を呼び出しています。
ここもわかりました!ありがとうございます。

また抜かってたようなので良ければ説明をお願いします。
mark内のif文はx,yの範囲(で合ってるでしょうか)で、
その次のprintf("out of range. x=%d y=%d\n")は何を表しているのでしょうか。
範囲外だったとき何も表示しない、という意味でしょうか?

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#10

投稿記事 by non » 13年前

よーすけ さんが書きました:
non さんが書きました: 定義ではなくて、初期値を入れているです。
lとtはまだいいですが、なぜrとbの初期値が-1なのですか?
mapの範囲は0~SIZE_X-1です。
最大値を求める時の初期値として-1にしてあるようです。
しかし、x,yの初期値が
x=SIZE_X/2;
y=SIZE_Y/2;
なので、これを最大、最小の初期値にしてもよいでしょう。
よーすけ さんが書きました:
non さんが書きました: 最小限の四角の範囲を表示しています。
printf内の%.*s\nは全く表示されない、ということでいいでしょうか。
printfの書式指定子として、%dや%sは知ってますか?
ここでも読んで勉強してください。
http://www.tamasoft.co.jp/lc/hlp/F056.html
よーすけ さんが書きました:
non さんが書きました: 理由?ですか?
動かさない方向は0です。
誤字でした、失礼しました。
ということは、その次のvx=1などは動かす方向が1ということでしょうか?
x方向に動かすという意味ですね。
よーすけ さんが書きました: また抜かってたようなので良ければ説明をお願いします。
mark内のif文はx,yの範囲(で合ってるでしょうか)で、
範囲外に移動しようとしたら強制終了です。
よーすけ さんが書きました: その次のprintf("out of range. x=%d y=%d\n")は何を表しているのでしょうか。
範囲外だったとき何も表示しない、という意味でしょうか?
範囲外になったときのメッセージです。
non

よーすけ

Re: プログラムの意味について

#11

投稿記事 by よーすけ » 13年前

なんとなくですが、理解できてきました!

どうしても、というわけではないのですが、配列で
int array[10][10];
int x,y;
として、最初に挙げたものと同じようにプログラミングすることは可能でしょうか?
またその際に使うものとして、
while scanf if printf(思いつくものを挙げてみましたが…)以外にも必要なものがありますか?

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#12

投稿記事 by non » 13年前

よーすけ さんが書きました: どうしても、というわけではないのですが、配列で
int array[10][10];
int x,y;
として、最初に挙げたものと同じようにプログラミングすることは可能でしょうか?
mapをarrayに置き換えるのは簡単なことでしょう。
int x,y;というのはどういう意味なのでしょうか?
よーすけ さんが書きました:
またその際に使うものとして、
while scanf if printf(思いつくものを挙げてみましたが…)以外にも必要なものがありますか?
これも何がいいたいのか意味がわかりません。
すでにプログラムがあるのだからわかるでしょう。
non

よーすけ

Re: プログラムの意味について

#13

投稿記事 by よーすけ » 13年前

non さんが書きました: mapをarrayに置き換えるのは簡単なことでしょう。
int x,y;というのはどういう意味なのでしょうか?

これも何がいいたいのか意味がわかりません。
すでにプログラムがあるのだからわかるでしょう。
array[10][10]をarray[x][y]としなくてもいいのですか?

int array[10][10]としてプログラムを組み立てるときにmap_clearなどの関数抜きでwhileなどを使って書き直すことができるかどうか、という意味です。
プログラムを見ながら自分なりに組み立ててみたのですが、上手くいかなくて…。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#14

投稿記事 by beatle » 13年前

よーすけ さんが書きました: array[10][10]をarray[x][y]としなくてもいいのですか?
例えばこんな風に書いたらエラーです.

コード:

int array[x][y];
int x, y;

よーすけ

Re: プログラムの意味について

#15

投稿記事 by よーすけ » 13年前

beatle さんが書きました: 例えばこんな風に書いたらエラーです.

コード:

int array[x][y];
int x, y;
これがエラーなのはまだわかります。

コード:

#include <stdio.h>

main(){
int array[10][10];
int x,y;
for(x=0; x<10; x++){
for(y=0; y<10; y++){
…と書いているなかでのx,yなのですが、ひょっとしてx,yとせずに書くことができるんでしょうか。

よーすけ

Re: プログラムの意味について

#16

投稿記事 by よーすけ » 13年前

途中までもらったものを見ながら自分なりに書いてみたのですが実行結果が
1
1
-#--------
と#が[1]に表示されただけになってしまいました。
繰り返し文はforよりwhileのほうが適切でしょうか。
おかしな点があれば、なぜおかしいのか説明をしてほしいです。

コード:

#include <stdio.h>
main(){
int array[10][10];
int i;

scanf("%d",&i);
printf("%d\n");

for(i=0; i<10; i++){
if(i==1){
printf("#");
}else{
printf("-");
}
}
return 0;
}

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#17

投稿記事 by non » 13年前

どんな、プログラムを作っているのか説明してもらわなければ、わかりません。
もう少し、自分の考えややりたいことを他人に説明するということを学ぶ必要が
あなたにはありそうです。これでは、社会でてから、仕事ができませんよ。

scanfで読み込んでいる変数がiなのに、9行のカウンタ変数もiにしているので、
折角読み込んだ値が消えてしまいます。
non

よーすけ

Re: プログラムの意味について

#18

投稿記事 by よーすけ » 13年前

non さんが書きました:どんな、プログラムを作っているのか説明してもらわなければ、わかりません。
もう少し、自分の考えややりたいことを他人に説明するということを学ぶ必要が
あなたにはありそうです。これでは、社会でてから、仕事ができませんよ。

scanfで読み込んでいる変数がiなのに、9行のカウンタ変数もiにしているので、
折角読み込んだ値が消えてしまいます。
上下左右の方向をa,b,c,dと決めたときに
b6
と入力するとb方向に6進みその軌跡をwそれ以外をoで表すプログラムを作っています。
書きはじめを以下のように決めて作ろうとしています。

コード:

#include <stdio.h>
main(){
int array[10][10];

最初に挙げたプログラムはほかの人が提示してくれたもので、意味を聞く前にそのスレが落ちたので聞けずじまいでしたが、
ここを見つけ、その人が書いたプログラムを理解し、自分が学校で学習した範囲内で新たに書いてみようと思っていました。
その際に多くの書き抜かりや、どうしたいかをはっきり示さずnonさんほか皆様に不快感を抱かせてしまいました。本当にすみません…。
よければ、もう少しの間、ご教授願いたいのですがかまいませんでしょうか…。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#19

投稿記事 by non » 13年前

non さんが書きました:どんな、プログラムを作っているのか説明してもらわなければ、わかりません。
これは、No16のスレッドへの質問です。
いきなり、うまくいってないと言われても、あなたがどのようなプログラムをこのNo16で作ろうとしているかわからないと
答えようがありません。実行結果は、作られているプログラム通りに動いていますし。
よーすけ さんが書きました: ここを見つけ、その人が書いたプログラムを理解し、自分が学校で学習した範囲内で新たに書いてみようと思っていました。
たいへんいいことです。もっと早い段階から、そうすればもっとよかったとは思いますが、勉強に手遅れということはありません。
よーすけ さんが書きました: nonさんほか皆様に不快感を抱かせてしまいました。
別に、不快感は感じておりません。大丈夫です。
よーすけ さんが書きました: 上下左右の方向をa,b,c,dと決めたときに
b6
と入力すると
一番最初のプログラムでは b 6 と 間にスペースを入れなくてはいけません。
スペースを入れるのか、入れないのかというような決められている仕様は、先に
言ってもらわないと困ります。
non

よーすけ

Re: プログラムの意味について

#20

投稿記事 by よーすけ » 13年前

途中までですが、プログラムを書いてみました。
入力した数だけ表示できるようになりましたが、左にしか移動していないようで
続けて入力していると直角三角形のようなかたちで実行結果としてあらわれました。

コード:


#include <stdio.h>

main(){
	int array[10][10];
	int i,j;
	
	scanf("%c",&i);/方向の入力/
	while(scanf("%d",&j) !=EOF){/移動させたい数の入力/
		
		scanf("%c",&i);/方向の入力/
	while(j-->0 && j<10) printf("w",j);
	}
}
まだここまでしかできていないですが、ここからiが入力した方向へ動くためにはどうすればよいでしょうか。

yo

Re: プログラムの意味について

#21

投稿記事 by yo » 13年前

行き違いになってすみません…。
課題の締切も近いので頑張りたいと思います!
non さんが書きました: 一番最初のプログラムでは b 6 と 間にスペースを入れなくてはいけません。
スペースを入れるのか、入れないのかというような決められている仕様は、先に
言ってもらわないと困ります。
それについては
b
6
と改行される仕様になっています。あと、移動する空間は10*10でじゅうぶんで、
その軌跡を表す時は必要最低限の大きさで、と言われました。

yo

Re: プログラムの意味について

#22

投稿記事 by yo » 13年前

行き違いになってすみません…。
課題の締切も近いので頑張りたいと思います!
non さんが書きました: 一番最初のプログラムでは b 6 と 間にスペースを入れなくてはいけません。
スペースを入れるのか、入れないのかというような決められている仕様は、先に
言ってもらわないと困ります。
それについては
b
6
と改行される仕様になっています。あと、移動する空間は10*10でじゅうぶんで、
その軌跡を表す時は必要最低限の大きさで、と言われました。

よーすけ

Re: プログラムの意味について

#23

投稿記事 by よーすけ » 13年前

yo さんが書きました:行き違いになってすみません…。
課題の締切も近いので頑張りたいと思います!
non さんが書きました: 一番最初のプログラムでは b 6 と 間にスペースを入れなくてはいけません。
スペースを入れるのか、入れないのかというような決められている仕様は、先に
言ってもらわないと困ります。
それについては
b
6
と改行される仕様になっています。あと、移動する空間は10*10でじゅうぶんで、
その軌跡を表す時は必要最低限の大きさで、と言われました。
何度もすみません。上は自分が書きました。名前の入力ミスです。

よーすけ

Re: プログラムの意味について

#24

投稿記事 by よーすけ » 13年前

コード:


#include <stdio.h>

main(){
	int array[10][10];
	int i;
	
		while(scanf("%d",&i) !=EOF){
			
			while(i-->0 && i<10){
				if(i<=5){
					printf("w");
				}else{
					printf("o");
				}
			}
		}
		return 0;
}
お手上げです。
実行結果は数値を10まで入力すると以下のようになりました。
1
w2
ww3
www4
wwww5
wwwww6
wwwwww7
owwwwww8
oowwwwww9
ooowwwwww10
oooowwwwww
このwを向きと数を入力したらその方向へその数だけ移動するにはどこを直せばよいでしょうか。
希望の実行結果としては
1
3
と入力したら
www
2
3と入力したとき
www
oow
oow
oow
というようにしたいです。よろしくおねがいします。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: プログラムの意味について

#25

投稿記事 by takumi@0832080.com » 13年前

よーすけ さんが書きました:

コード:


#include <stdio.h>

main(){
	int array[10][10];
	int i;
	
		while(scanf("%d",&i) !=EOF){
			
			while(i-->0 && i<10){
				if(i<=5){
					printf("w");
				}else{
					printf("o");
				}
			}
		}
		return 0;
}
お手上げです。
実行結果は数値を10まで入力すると以下のようになりました。
1
w2
ww3
www4
wwww5
wwwww6
wwwwww7
owwwwww8
oowwwwww9
ooowwwwww10
oooowwwwww
このwを向きと数を入力したらその方向へその数だけ移動するにはどこを直せばよいでしょうか。
希望の実行結果としては
1
3
と入力したら
www
2
3と入力したとき
www
oow
oow
oow
というようにしたいです。よろしくおねがいします。
はじめましてここ以外あまり読んでないですが,とりあえず二次元配列arrayの中身は全て'o'で初期化する必要があると思います.

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: プログラムの意味について

#26

投稿記事 by takumi@0832080.com » 13年前

例えば仕様はこんな感じで書いていけばよいと思います.仕様が詳しく分からないので抜けてることがあるかもしれません.

コード:

#include <stdio.h>
#include <stdlib.h>
main(){
    int Width = 10;//空間の横幅
    int Height = 10; //空間の縦幅
    int startX = 0;//初期のx座標
    int startY = 0;//初期のy座標
    char vecter = '0';//方向を持つ文字 abcdのどれかが入る.
    int   distance = 0;//移動する距離0~10の数字
    char *array;//10*10の空間ポインタ
    array = (char *)malloc(sizeof(char)*Width*Height);//メモリ取得
    memset(array,'o',sizeof(array));//oで初期化
    //***********************************************ここに処理を書く

     //***********************************************
    free(array);//開放
    return 0;
} 
最後に編集したユーザー takumi@0832080.com on 2012年1月15日(日) 18:33 [ 編集 1 回目 ]

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#27

投稿記事 by non » 13年前

添付したプログラムで本当に課題が動くと思って作っているなら、この課題を作るのは
あなたの現在の実力では無理です。

理由
1 配列arrayが全く使われていない。
2 方向を入力するscanfがない。

何のために、最初に他人が作ったプログラムの説明をしたのでしょうか?
提案ですが・・・
最初から作るのではなく、あれをもとに作って(変更して)みたらどうですか?

1 まず、arrayに変えてみる。#defineもやめる。(やめない方がいいのだけど)
2 グローバル変数をローカル変数に変更する。同時にわかりやすい変数名に変える。
3 出力する関数で printf("%.*s\n", r-l+1, map[y]+l);
  の使い方がされているが、もっと、わかりやすい形に変更する。
4 入力する部分 while(scanf("%1s%d", dir, &num)==2)
  を、自分のわかりやすい方法に変えてみる。
5 memsetを使わずに、arrayを初期化する。

という順番でいかがですか?
この辺まで変えれば、先生に受け取ってもらえると思います。
non

よーすけ

Re: プログラムの意味について

#28

投稿記事 by よーすけ » 13年前

takumi@0832080.com さんが書きました:例えば仕様はこんな感じで書いていけばよいと思います.仕様が詳しく分からないので抜けてることがあるかもしれません.

コード:

#include <stdio.h>
#include <stdlib.h>
main(){
    int Width = 10;//空間の横幅
    int Height = 10; //空間の縦幅
    int startX = 0;//初期のx座標
    int startY = 0;//初期のy座標
    char vecter = '0';//方向を持つ文字 abcdのどれかが入る.
    int   distance = 0;//移動する距離0~10の数字
    char *array;//10*10の空間ポインタ
    array = (char *)malloc(sizeof(char)*Width*Height);//メモリ取得
    memset(array,'o',sizeof(array));//oで初期化
    //***********************************************ここに処理を書く

     //***********************************************
    free(array);//開放
    return 0;
} 
わざわざ書いていただきありがとうございます。このようにしても書き直すことができるのですね。
書いていただいたなかにはまだ学習していないものがあるようなので、調べながら理解したいとおもいます。

よーすけ

Re: プログラムの意味について

#29

投稿記事 by よーすけ » 13年前

non さんが書きました:添付したプログラムで本当に課題が動くと思って作っているなら、この課題を作るのは
あなたの現在の実力では無理です。
添付したもので動くとは全く思っていません。自分でもプログラムに不足部分があることは感じています。
自分で書いたものを見ていただいて悪いところを指摘してもらおうと思って添付していました。
non さんが書きました: 理由
1 配列arrayが全く使われていない。
2 方向を入力するscanfがない。

何のために、最初に他人が作ったプログラムの説明をしたのでしょうか?
提案ですが・・・
最初から作るのではなく、あれをもとに作って(変更して)みたらどうですか?
最初はもとに作ってみようと試みたのですが中身がわからなくて…。
ここで聞いて最初から作り直そうと思っていたのですが、そうしたほうが良さそうですね。
説明は本当にわかりやすかったです!ありがとうございました!
non さんが書きました: 1 まず、arrayに変えてみる。#defineもやめる。(やめない方がいいのだけど)
2 グローバル変数をローカル変数に変更する。同時にわかりやすい変数名に変える。
3 出力する関数で printf("%.*s\n", r-l+1, map[y]+l);
  の使い方がされているが、もっと、わかりやすい形に変更する。
4 入力する部分 while(scanf("%1s%d", dir, &num)==2)
  を、自分のわかりやすい方法に変えてみる。
5 memsetを使わずに、arrayを初期化する。

という順番でいかがですか?
この辺まで変えれば、先生に受け取ってもらえると思います。
ご指摘ありがとうございます。
3は出力される関数はarrayで良いですか?あとはなんとかしてみたいと思います。
解決するまでもう少しかかると思いますが、よろしくお願いします。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: プログラムの意味について

#30

投稿記事 by takumi@0832080.com » 13年前

どういたしてまして,時間さえあれば,作るのは苦ではないですので気にしないでください.
例文(プログラム)書いといて,アレなんですが・・・時間が限られているなら,NO27さんの案がとても名案だと思います.
1~5までを一つずつエラーが無いか確かめながら変更していけば.いけそうな気がします.
もし1~5までをクリアして,時間が許すなら+αの変更などを考えるのもアリでしょう.

( 学習範囲内のことが完璧出ない限り,学習範囲内で解くのは簡単ではないですよ.)

よーすけ

Re: プログラムの意味について

#31

投稿記事 by よーすけ » 13年前

takumi@0832080.com さんが書きました:どういたしてまして,時間さえあれば,作るのは苦ではないですので気にしないでください.
例文(プログラム)書いといて,アレなんですが・・・時間が限られているなら,NO27さんの案がとても名案だと思います.
1~5までを一つずつエラーが無いか確かめながら変更していけば.いけそうな気がします.
もし1~5までをクリアして,時間が許すなら+αの変更などを考えるのもアリでしょう.
今週の水曜あたりに完成できれば、と思っていますが、ひとつずつのほうが確実ぽいでしょうか。
地道にやっていきたいとおもいます。
takumi@0832080.com さんが書きました: ( 学習範囲内のことが完璧出ない限り,学習範囲内で解くのは簡単ではないですよ.)
今回、そのことを痛感しました…。試験が終わればじっくりC言語を学びたいと思います。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#32

投稿記事 by non » 13年前

よーすけ さんが書きました: 3は出力される関数はarrayで良いですか?
関数名がarrayなのか、出力したいデータがarrayという配列なのか?
この日本語からはわからないです。全く知らない人が読めば、arrayという名前の関数を
出力するという意味に捉えます。

で、arrayという配列を、動いた最小の四角形の範囲で出力しなさいというのが課題なんでしょ。

たぶん、上の提案で、一度には無理だと思いますので、
一つずつできたら、プログラムを添付してください。
non

よーすけ

Re: プログラムの意味について

#33

投稿記事 by よーすけ » 13年前

non さんが書きました:
よーすけ さんが書きました: 3は出力される関数はarrayで良いですか?
関数名がarrayなのか、出力したいデータがarrayという配列なのか?
この日本語からはわからないです。全く知らない人が読めば、arrayという名前の関数を
出力するという意味に捉えます。
出力したいデータがarrayという配列、という意味でした。
non さんが書きました: で、arrayという配列を、動いた最小の四角形の範囲で出力しなさいというのが課題なんでしょ。
そうです!最初からそう言えば良かったのですね…。
申し訳ないです。
non さんが書きました: たぶん、上の提案で、一度には無理だと思いますので、
一つずつできたら、プログラムを添付してください。
まず1から…。こういうことで良いのでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char array[10][10]; //arrayに変更//
int l, t, r, b;


void map_clear()
{
	memset(array, '-', sizeof(array)); //arrayに変更//
	l=10;
	r=-1;
	t=10;
	b=-1;
}


void map_print()
{
	int y;

	for(y=t;y<=b;y++)
	{
		printf("%.*s\n", r-l+1, array[y]+l); //arrayに変更//
	}
}


void mark(int x, int y)
{
	if(x<0 || 10<=x || y<0 || 10<=y)
	{
		printf("Out of range. x=%d y=%d\n", x, y);
		exit(1);
	}
	array[y][x]='#'; //arrayに変更//
	if(l>x) l=x;
	if(r<x) r=x;
	if(t>y) t=y;
	if(b<y) b=y;
}


int main()
{
	int x, y, vx, vy, i, num;
	char dir[2];

	map_clear();
	x=10/2;
	y=10/2;
	while(scanf("%1s%d", dir, &num)==2)
	{
		vx=vy=0;
		switch(dir[0])
		{
			case 'a': vx=1; break;
			case 'c': vx=-1; break;
			case 'b': vy=1; break;
			case 'd': vy=-1; break;
		}
		for(i=0;i<num;i++)
		{
			x+=vx;
			y+=vy;
			mark(x, y);
		}
		map_print();
	}
	return 0;
}

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#34

投稿記事 by non » 13年前

1段階目はいいでしょう。
では2段階

char array[10][10]; //arrayに変更//
int l, t, r, b;
これをローカル変数として、main内で宣言しましょう。
変数名はl、t、r、bでは短すぎてわかりません。
takumi@0832080.com さんのプログラムを参考にしてください。
また、l,t,r,bはmap_clearに渡さず、mainでクリアーしてかまいません。
non

よーすけ

Re: プログラムの意味について

#35

投稿記事 by よーすけ » 13年前

2段階目ですが…上手く書けた気が全くしません。
とりあえずはこういう形でいいのでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void map_clear(){
	memset(array, '-', sizeof(array)); //arrayに変更//
}
 
 
void map_print(){
	int y;
	for(y=t;y<=b;y++){
		printf("%.*s\n", r-l+1, array[y]+l); //arrayに変更//
		}
}
 
 
void mark(int x, int y){
	if(x<0 || 10<=x || y<0 || 10<=y){
		printf("Out of range. x=%d y=%d\n", x, y);
		exit(1);
		}
		array[y][x]='#'; //arrayに変更//
		if(l>x) l=x;
		if(r<x) r=x;
		if(t>y) t=y;
		if(b<y) b=y;
}


int main(){
	char array[10][10];
	int wide=10; //lをwideに変更//
	int high=10; //tをhighに変更//
	int X=0; //rをXに変更//
	int Y=0; //bをYに変更//
	
	int x, y, vx, vy, i, num;
	char dir[2];
	
	map_clear();
	x=10/2;
	y=10/2;
	while(scanf("%1s%d", dir, &num)==2){
	vx=vy=0;
	switch(dir[0]){
		case 'a': vx=1; break;
		case 'c': vx=-1; break;
		case 'b': vy=1; break;
		case 'd': vy=-1; break;
		}
		for(i=0;i<num;i++){
		x+=vx;
		y+=vy;
		mark(x, y);
		}
		map_print();
		}
		return 0;
}

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#36

投稿記事 by beatle » 13年前

プログラム上達したいと思いますか?思うならインデントをしっかりした方が良いと思いますよ!
詳しくはこちらインデントを揃えよう

よーすけ

Re: プログラムの意味について

#37

投稿記事 by よーすけ » 13年前

beatle さんが書きました:プログラム上達したいと思いますか?思うならインデントをしっかりした方が良いと思いますよ!
詳しくはこちらインデントを揃えよう
ありがとうございます!
次の段階に進むときには意識してプログラムを書こうと思います!

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#38

投稿記事 by non » 13年前

うまくいかないことは、実行したらわかるでしょ。
自分で試すことは大事です。

ローカル変数を関数に渡すということは、引数で渡すでしょ。
わからなければ、少し調べてください。

それから、変数名がまだわかりにくいです。
何のために使われている変数名か、見ただけでわかりません。
non

よーすけ

Re: プログラムの意味について

#39

投稿記事 by よーすけ » 13年前

non さんが書きました: ローカル変数を関数に渡すということは、引数で渡すでしょ。
わからなければ、少し調べてください。
調べて自分なりにやってみたのですが、上手くいきません…。
以下のプログラムだとif(int x>i) x=i;の部分にidentifierの付け忘れだとエラーが出ました。
遅くまですみません…。

コード:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char array[10][10];


void shokichi(int x, int y, int xx, int yy);


void map_clear()
{
	memset(array, '-', sizeof(array)); //arrayに変更//
}


void map_print()
{
    int n;
    for(n=0;n<=10;n++)
	{
	    printf("%.*s\n", 10-0+1, array[n]+0); //arrayに変更//
	}
}
 
 
void mark(int i, int j)
{
	if(i<0 || 10<=i || j<0 || 10<=j)
	{
		printf("Out of range. i=%d j=%d\n", i, j);
		exit(1);
	}
	    array[i][j]='#'; //arrayに変更//
		if(int x>i)   int x=i;
		if(int xx<i) int xx=i;
		if(int y>j)   int y=j;
		if(int yy<j) int yy=j;
}


int main(int x, y, xx, yy)
{
	char array[10][10];
	
	
	
	
	
	int p,q, r,s,t, num;
	char dir[2];
	
	map_clear();
	x=10/2;
	y=10/2;
	while(scanf("%1s%d", dir, &num)==2)
	{
	    r=s=0;
	    switch(dir[0])
	    {
		    case 'a': r=1; break;
		    case 'c':  r=-1; break;
		    case 'b': s=1; break;
		    case 'd': s=-1; break;
		}
		    for(t=0;t<num;t++)
		{
		    p+=r;
		    q+=s;
		    mark(x,y);
		}
		    map_print();
	}
		    return 0;
}

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#40

投稿記事 by beatle » 13年前

int x;という書き方は変数宣言のことですよね.それをif文の中でやろうとしているから怒られています.
もしかして,関数とif文を混同しているのではないでしょうか?

コード:

void func(int i); // 関数プロトタイプ宣言

void func(int i) // 関数定義
{
    // 何か処理
}

if (i > 0) // if文
{
    // 何か処理
}
if文は,ifの後に()が付くため関数と形は似ていますが,ifは関数ではありません.

関数と思いがちな関数ではないものリスト
  • return
    return (hoge); と書いている人を見ると,関数だと思っているのではないかと疑ってしまう.
    return hoge;でOK
  • if, while, switchなど
    これらは後ろに必ず()を伴うため,関数だと思う人がいるらしい.まったく違う.

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#41

投稿記事 by non » 13年前

7行目 char array[10][10];
ローカル(main)で宣言していますのでこれは削除。

10行目 void shokichi(int x, int y, int xx, int yy);
これは、プロトタイプですね。
プロトタイプを書くことは良いことですが、実際の関数はないのに、プロトタイプだけ
あっても意味がないです。これから作ろうというのでしょうか?

13行目 void map_clear()
19行目 void map_print()
arrayを引数で関数に渡します。

29行目 void mark(int i, int j)
引数が2個ですが、この関数で必要な引数は7個です。
最初のプログラムのl, t, r, b,arrayも引数で渡さなくてはいけません。
前にもいいましたが、変数名をわかりやすい意味のある名前に変えてください。

37行目 if(int x>i) int x=i;
こんなところで定義できません。まして、引数で渡しますから。

44行目 int main(int x, y, xx, yy)
main関数でこんな引数は渡しません。

52行目 int p,q, r,s,t, num;
変数名を意味のある名前に変えてください

55行目 map_clear();
72行目 mark(x,y);
74行目 map_print();
引数が増えますから、その引数を与えます。

全体的に、関数について全く理解されていません。
テキストや教科書を読んで、勉強してください。
ここで、すべてを説明するのは無理ですから。
また、インデントについても既に注意されましたよね。まだ、不完全です。
non

よーすけ

Re: プログラムの意味について

#42

投稿記事 by よーすけ » 13年前

言い訳がましいですがC言語を初めてそれほど経ってません。
しかし一日で理解して課題を終わらせた人もいたので、自分の理解度の低さにがっかりしてます…。
なんとかして19日16時までに終わらせて提出したいです!
皆さんが思っているほど理解していないです。授業用ページに書いてあることがなんとなくわかる程度です…。
なので、というとおかしいかもしれませんが、例を表示しながら解説していただくと非常にありがたいです。
ここまできて、と思われても仕方ないですが…よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


                    /* lをx tをy rをxx bをyyに変更*/
int size( int x , int y , int xx , int yy )
{
    return x , y , xx , yy;
}


void map_clear( char array1 )
{
    memset( array1 , '-' , sizeof ( array1 ) );
}


void map_print( char array1 )
{
    int k;
    for( k=0; k=10; k++ );
    {
        printf( "%.*s\n" , 10 , array1[ k ] );
    }
}


void mark( int size_x , int size_y , int width_x , int height_y , char vecter , int ditance , int mark )
{
    if( size_x < 0 || 10 <= size_x || size_y < 0 || 10 <= size_y )
    if( width_x < 0 || 10 <= width_x || height_y < 0 || 10 <= height_y)
    {
    {
         printf( " 範囲外 n=%d m=%d\n" , n , m );
      	 exit ( 1 );
      	 }
             array[ size_x ][ size_y ] = ' # ';
}


int main()
{
    char array[10][10];
    
      int x = 10;
      int y = 10;
      int xx = 0;
      int yy = 0;
      x = size ( x );
      y = size ( y );
      xx = size ( xx );
      yy = size ( yy );
      
      int shokichi = ' - ';
      shokichi = map_clear (  array );
      
      int shikaku = array[10][10];
      sikaku = map_print ();
      
      
      int size_X , size_Y , width_X , height_Y , range , direction;
      char dir[2];
      
      map_clear ( char array1 );
      size_X = 10/2;
      size_Y = 10/2;
      while ( scanf ( " %1s%d " , dir , &direction ) == 2 )
      {
      	    width_X = height_Y = 0;
      	    switch ( dir [0] )
      	    {
      	          case ' a ' : width_X = 1; break;
      	          case ' b ' : width_X = -1; break;
      	          case ' c ' : height_Y = 1; break;
      	          case 'd ' : height_Y = -1; break;
      	    }
      	        for( range = 0; range < height_Y ; range++ )
      	        {
      	            size_X+ = width_X;
      	            size_Y+ = height_Y;
      	            mark ( size_X , size_Y );
      	        }
      	        map_print( char array1 );
      }
      return 0;
}

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#43

投稿記事 by beatle » 13年前

ではインデントについて例を示しましょう.よーすけさんのソースコードを機械的にインデントしてみたのがこちら.

コード:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/* lをx tをy rをxx bをyyに変更*/
int size( int x , int y , int xx , int yy )
{
    return x , y , xx , yy;
}


void map_clear( char array1 )
{
    memset( array1 , '-' , sizeof ( array1 ) );
}


void map_print( char array1 )
{
    int k;
    for( k=0; k=10; k++ );
    {
        printf( "%.*s\n" , 10 , array1[ k ] );
    }
}


void mark( int size_x , int size_y , int width_x , int height_y , char vecter , int ditance , int mark )
{
    if( size_x < 0 || 10 <= size_x || size_y < 0 || 10 <= size_y )
        if( width_x < 0 || 10 <= width_x || height_y < 0 || 10 <= height_y)
        {
            {
                printf( " 範囲外 n=%d m=%d\n" , n , m );
                exit ( 1 );
            }
            array[ size_x ][ size_y ] = ' # ';
        }


    int main()
    {
        char array[10][10];

        int x = 10;
        int y = 10;
        int xx = 0;
        int yy = 0;
        x = size ( x );
        y = size ( y );
        xx = size ( xx );
        yy = size ( yy );

        int shokichi = ' - ';
        shokichi = map_clear (  array );

        int shikaku = array[10][10];
        sikaku = map_print ();


        int size_X , size_Y , width_X , height_Y , range , direction;
        char dir[2];

        map_clear ( char array1 );
        size_X = 10/2;
        size_Y = 10/2;
        while ( scanf ( " %1s%d " , dir , &direction ) == 2 )
        {
            width_X = height_Y = 0;
            switch ( dir [0] )
            {
                case ' a ' : width_X = 1; break;
                case ' b ' : width_X = -1; break;
                case ' c ' : height_Y = 1; break;
                case 'd ' : height_Y = -1; break;
            }
            for( range = 0; range < height_Y ; range++ )
            {
                size_X+ = width_X;
                size_Y+ = height_Y;
                mark ( size_X , size_Y );
            }
            map_print( char array1 );
        }
        return 0;
    }
インデントをちゃんとやれば,関数定義の中に関数定義を書くようなミスはしないと思います.(markの中にmain)

変数名についてですが「lをx tをy rをxx bをyyに変更」したところで,依然として変数の名前の意味が分かりません.ちゃんとした英単語で名前をつけて下さい.例えば配列の要素数を表す変数は「num_array」にするとか,プレイヤーの現在地は「player_x」「player_y」にするとか.
変数名だけをみて,その変数名の役目が分かるのが理想です.

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#44

投稿記事 by non » 13年前

私に言い訳されても知りません。
前より、プログラムが出鱈目になっているし、自分である程度調べてもらわないと、今日は忙しいので
つきあってられません。
とりあえず、2段階目までの解答例です。
変数名は、まだいいかげんです。もうちょっと工夫した名前にしたいけど、面倒だったので。時間もないし。
少し、これを見ながら勉強してください。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
void map_clear(char map[][10])
{
    memset(map, '-', 100);
}
 
 
void map_print(char map[][10],int max_X,int min_X,int max_Y,int min_Y)
{
    int y;
 
    for(y=min_Y;y<=max_Y;y++)
    {
        printf("%.*s\n", max_X-min_X+1, map[y]+min_X);
    }
}
 
 
void mark(int x, int y,char map[][10],int *max_X,int *min_X,int *max_Y,int *min_Y)
{
    if(x<0 || 10<=x || y<0 || 10<=y)
    {
        printf("Out of range. x=%d y=%d\n", x, y);
        exit(1);
    }
    map[y][x]='#';
    if(*min_X>x) *min_X=x;
    if(*max_X<x) *max_X=x;
    if(*min_Y>y) *min_Y=y;
    if(*max_Y<y) *max_Y=y;
}
 
 
int main(void)
{
	char array[10][10];
	int max_x,min_x;
	int max_y,min_y;
	int now_x,now_y;
    int i, num,vx,vy;
    char dir[2];
 
    now_x=5;
	max_x=-1;
	min_x=10;
    now_y=5;
	max_y=-1;
	min_y=10;
	map_clear(array);

    while(scanf("%1s%d", dir, &num)==2)
    {
        vx=vy=0;
        switch(dir[0])
        {
            case 'a': vx=1; break;
            case 'c': vx=-1; break;
            case 'b': vy=1; break;
            case 'd': vy=-1; break;
        }
        for(i=0;i<num;i++)
        {
            now_x+=vx;
            now_y+=vy;
            mark(now_x, now_y, array, &max_x, &min_x, &max_y, &min_y);
        }
        map_print(array, max_x, min_x, max_y, min_y);
    }
    return 0;
}
non

よーすけ

Re: プログラムの意味について

#45

投稿記事 by よーすけ » 13年前

三段階目の
『printf("%.*s\n", max_X-min_X+1, map[y]+min_X)をわかりやすい形に』
というのは、
プログラムを見た人側からということはわかりますが、
""の中にある.の役割は配列をきちんと正方形にすることで
*をつかうことで変数の読み飛ばしを行っている…と
それぞれの役割を考えていたら書き換えようがない気がしてきたのですが…。

四段階目の
『while(scanf("%1s%d", dir, &num)==2)を自分の分かるように』
これは、授業で習ったので理解できました!
scanfを二回繰り返すためにwhile(()==2) で合ってるでしょうか。

よーすけ

Re: プログラムの意味について

#46

投稿記事 by よーすけ » 13年前

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
void map_clear(char map[][10])
{
    memset(map, '-', 100);
}
 
 
void map_print(char map[][10],int max_X,int min_X,int max_Y,int min_Y)
{
    int y;
    int X;
    X=max_X-min_X+1;  /*printf内を見やすくするためにXを用意*/
    for(y=min_Y;y<=max_Y;y++)
    {
        printf( "%.*s\n" , X , map[y]+min_X );
    }
}
 
 
void mark(int x, int y,char map[][10],int *max_X,int *min_X,int *max_Y,int *min_Y)
{
    if(x<0 || 10<=x || y<0 || 10<=y)
    {
        printf("Out of range. x=%d y=%d\n", x, y);
        exit(1);
    }
    map[y][x]='#';
    if(*min_X>x) *min_X=x;
    if(*max_X<x) *max_X=x;
    if(*min_Y>y) *min_Y=y;
    if(*max_Y<y) *max_Y=y;
}
 
 
int main(void)
{
    char array[10][10];
    int max_x,min_x;
    int max_y,min_y;
    int now_x,now_y;
    int i, num,vx,vy;
    char dir[2];
 
    now_x=5;
    max_x=-1;
    min_x=10;
    now_y=5;
    max_y=-1;
    min_y=10;
    map_clear(array);
 
    while(scanf("%1s%d", dir, &num)==2)
    {
        vx=vy=0;
        switch(dir[0])
        {
            case 'a': vx=1; break;
            case 'c': vx=-1; break;
            case 'b': vy=1; break;
            case 'd': vy=-1; break;
        }
        for(i=0;i<num;i++)
        {
            now_x+=vx;
            now_y+=vy;
            mark(now_x, now_y, array, &max_x, &min_x, &max_y, &min_y);
        }
        map_print(array, max_x, min_x, max_y, min_y);
    }
    return 0;
}
map[y]+min_Xも同じようにしようと思い、
X=max_X-min_X+1
map[y]+=min_Xとしてもエラーが出てしまいました…。
他に何かないか考えてみます。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#47

投稿記事 by non » 13年前

よーすけ さんが書きました:三段階目の
『printf("%.*s\n", max_X-min_X+1, map[y]+min_X)をわかりやすい形に』
というのは、
プログラムを見た人側からということはわかりますが、
""の中にある.の役割は配列をきちんと正方形にすることで
*をつかうことで変数の読み飛ばしを行っている…と
それぞれの役割を考えていたら書き換えようがない気がしてきたのですが…。

printfの書式指定子として、"%.*s\n" の書き方をあなたは授業で習いましたか?
ドットとかアスターの部分ですよ。単純な%s\nではなく。
習ったのならこのままでいいでしょう。
でも、もし習っていいないのなら、先生が自分で考えたのかと疑うことになりますよ。
ですから、わかりやすい形というのは、あなたが学校で習った範囲のレベルにすることです。
non

よーすけ

Re: プログラムの意味について

#48

投稿記事 by よーすけ » 13年前

演算子については学習しましたが、ここまではまだ習っていません。
それぞれの意味は調べてわかりましたが…。
.の代わりにfgetsという関数を使えば良さそうだと知り書いてみましたがエラーが出ました。
*の代わりが思い浮かびませんでした…。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
void map_clear(char map[][10])
{
    memset(map, '-', 100);
}
 
 
void map_print(char *map[][10],int max_X,int min_X,int max_Y,int min_Y)
{
    int y;
    
    int X;
    X=max_X-min_X+1;
    
    for(y=min_Y;y<=max_Y;y++)
    {
    	if(fgets(*map=>0 || *map<=100)
    	{
            printf("%.s\n", X, map[y]+min_X);
    	}
    }
}
 
 
void mark(int x, int y,char map[][10],int *max_X,int *min_X,int *max_Y,int *min_Y)
{
    if(x<0 || 10<=x || y<0 || 10<=y)
    {
        printf("Out of range. x=%d y=%d\n", x, y);
        exit(1);
    }
    map[y][x]='#';
    if(*min_X>x) *min_X=x;
    if(*max_X<x) *max_X=x;
    if(*min_Y>y) *min_Y=y;
    if(*max_Y<y) *max_Y=y;
}
 
 
int main(void)
{
    char array[10][10];
    int max_x,min_x;
    int max_y,min_y;
    int now_x,now_y;
    int i, num,vx,vy;
    char dir[2];
 
    now_x=5;
    max_x=-1;
    min_x=10;
    now_y=5;
    max_y=-1;
    min_y=10;
    map_clear(array);
 
    while(scanf("%1s%d", dir, &num)==2)
    {
        vx=vy=0;
        switch(dir[0])
        {
            case 'a': vx=1; break;
            case 'c': vx=-1; break;
            case 'b': vy=1; break;
            case 'd': vy=-1; break;
        }
        for(i=0;i<num;i++)
        {
            now_x+=vx;
            now_y+=vy;
            mark(now_x, now_y, array, &max_x, &min_x, &max_y, &min_y);
        }
        map_print(array, max_x, min_x, max_y, min_y);
    }
    return 0;
}

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#49

投稿記事 by non » 13年前

fgetsというのは標準入力から行単位で読み込む関数ですよ。
標準出力に出力するプログラムを作ろうとしているのに・・・・

今日も私は忙しいので夜までもうお付き合いできません。
ヒントです。

void map_print(char *map[][10],int max_X,int min_X,int max_Y,int min_Y) は
forの2重ループを使って、mapの配列を、縦はmin_Yからmax_Yまで、
横はmin_Xからmax_Xまで表示しましょう。
配列に格納されている文字を表示するには、putchara(map[y][x])を使います。
改行は putchar('\n');です。
non

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの意味について

#50

投稿記事 by みけCAT » 13年前

non さんが書きました:fgetsというのは標準入力から行単位で読み込む関数ですよ。
違ったと思います。fgetsは(任意の)ファイル(ポインタ)から行単位で読み込む関数です。
[ fgets ]
関数型 : char *fgets(char *s, int n, FILE *fp);
引数  : 文字列を格納するバッファ、バッファサイズ、ファイルポインタ
戻り値 : 引数で指定したバッファ。失敗したか終わりに到達した場合はNULL。
機能  : ファイルから1行読み出す。結果に改行を含む。
苦Cより引用
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#51

投稿記事 by non » 13年前

みけCAT さんが書きました:
non さんが書きました:fgetsというのは標準入力から行単位で読み込む関数ですよ。
違ったと思います。fgetsは(任意の)ファイル(ポインタ)から行単位で読み込む関数です。
ああ、そうですね。頭の中ではgetsでした。
non

よーすけ

Re: プログラムの意味について

#52

投稿記事 by よーすけ » 13年前

今朝出たヒントをもとに組み立てていますが、エラーが…。
途中しか載せていませんが…。

コード:

void map_print(char map[][10], int max_X, int min_X, int max_Y, int min_Y)
{
    int x,y;
    for(y=min_y; y<=max_Y; y++)
    {
         for(x=min_X; x<=max_X; x++)
         {
             putchar("%s\n",map[y][x]);
         }
     }
         putchar("\n");
}
putcharの用法が掲載されているページを見ながら打ち込んでもエラーが出ました…。
まだ解答は出さなくて構わないので、どこがどうおかしいのか指摘をお願いします。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#53

投稿記事 by beatle » 13年前

putchar("%s\n",map[y][x]);
putchar("\n");
引数の個数が違うのがおかしいと思いませんか.

追記:ちなみにputcharの用法が書かれているサイトとはどこのことでしょうか.

よーすけ

Re: プログラムの意味について

#54

投稿記事 by よーすけ » 13年前

beatle さんが書きました: 追記:ちなみにputcharの用法が書かれているサイトとはどこのことでしょうか.
C言語関数辞典、というところです。
自分の理解の仕方が誤っているのでうまく進んでいない気がします…。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: プログラムの意味について

#55

投稿記事 by beatle » 13年前

というとhttp://www.c-tipsref.com/reference/stdio/putchar.htmlのことですね.
サンプルプログラムの中に
putchar('\n');
という行がありますね.ご自分の書いた
putchar("\n");
との違いをしっかり理解しましょう.

よーすけ

Re: プログラムの意味について

#56

投稿記事 by よーすけ » 13年前

お恥ずかしい限りです…。
さっきのミスを直すとエラーが一気に減りました。ありがとうございます。
あとは引数の個数についてですが、今夜中には何とかしたいと思います。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#57

投稿記事 by non » 13年前

いよいよ明日が提出日ですから、先に行きましょう。
残りは2項目。

4 入力する部分 while(scanf("%1s%d", dir, &num)==2)
  を、自分のわかりやすい方法に変えてみる。
5 memsetを使わずに、arrayを初期化する。

4ですが、入力の仕様を確認しましょう。
yo さんが書きました:
non さんが書きました: 一番最初のプログラムでは b 6 と 間にスペースを入れなくてはいけません。
スペースを入れるのか、入れないのかというような決められている仕様は、先に
言ってもらわないと困ります。
それについては
b
6
と改行される仕様になっています。あと、移動する空間は10*10でじゅうぶんで、
その軌跡を表す時は必要最低限の大きさで、と言われました。
abcdの方向を入れて、改行。進む数を入れて改行ですね。
それで、終わる場合の仕様はどうなっているのでしょうか?

また、5ですが、こちらの方はmemsetを恐らく習っていないでしょうから、こちらは他の
方法にしないとマズイです。
map[10][10]の配列に全部 '-' を代入すればいいのですから、forの2重ループを作ればOKです。
non

よーすけ

Re: プログラムの意味について

#58

投稿記事 by よーすけ » 13年前

non さんが書きました: それで、終わる場合の仕様はどうなっているのでしょうか?
終わる場合の仕様は指定されていません。Ctl+Dだったか何かで終わらせる方法でも良かったと思います。
課題ではどのような軌跡を描いたかがヒントで図示されています。その通りに動けば問題ありません。
non さんが書きました: また、5ですが、こちらの方はmemsetを恐らく習っていないでしょうから、こちらは他の
方法にしないとマズイです。
map[10][10]の配列に全部 '-' を代入すればいいのですから、forの2重ループを作ればOKです。
こちらもforで表すことができるんですね!すごいです!
てっきり、arrray[10][10]={'-'}とやればいいと思ってました。

よーすけ

Re: プログラムの意味について

#59

投稿記事 by よーすけ » 13年前

連続投稿すみません。5ができたような気がするので見ていただきたいです。

コード:

void map_clear(char map[][10])
{
    int width_x, height_y;
    for(width_x=0; width_x<10; width_x++)
    {
    	for(height_y=0; height_y<10; height_y++)
    	{
    		printf("-");
    	}
    }
}
エラーは出たんですが、3についてのエラーだったので大丈夫だと勝手に思ってますが…。

non
記事: 1097
登録日時: 14年前

Re: プログラムの意味について

#60

投稿記事 by non » 13年前

しっかり、私のヒントを読んでおくれ。何で、printf?
よーすけ さんが書きました:エラーは出たんですが、3についてのエラーだったので大丈夫だと勝手に思ってますが…。
何のエラー?
non

よーすけ

Re: プログラムの意味について

#61

投稿記事 by よーすけ » 13年前

non さんが書きました: しっかり、私のヒントを読んでおくれ。何で、printf?
今気付きました。すっかり落ち着きがなくなっているようです。自分でもびっくりしました。
きちんと訂正してきました。
non さんが書きました: 何のエラー?

コード:


void map_print(char map[][10],int max_X,int min_X,int max_Y,int min_Y)
{
    int x,y;
    for(y=min_Y;y<=max_Y;y++)
    {
    	for(x=min_X; x<=max_X; x++)
    	{
            putchar("%s\n", map[y][x]);
    	}
    	    putchar('\n');
    }
}
9行目について
『配列の初期化が間違っています。』
『関数呼び出しに指定されているパラメータ数が多いです。
呼び出している関数の引数の数を再確認してください。』
と表示されました。
引数の個数が違っている、と指摘を受けてからずっとどう表せばいいのか悩んでます…。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: プログラムの意味について

#62

投稿記事 by takumi@0832080.com » 13年前

putcharは引数1個だよ.putchar(map[x][y]);とか出来ないっけ・・・?

よーすけ

Re: プログラムの意味について

#63

投稿記事 by よーすけ » 13年前

takumi@0832080.com さんが書きました:putcharは引数1個だよ.putchar(map[x][y]);とか出来ないっけ・・・?
あ、なるほど、そういうことだったんですね!
使い方を見ても、%s\nなんてない…と思ってたら…勘違いしてました。

初期化は map[10][10]='-'; で合ってると思ってたのですが実行結果に-が反映されなくなってしまいました。
というか、移動するとほかに文字化けしてあらわれたり…。
プログラムはNo59のままで、printf("-");をmap[10][10];に変更しただけです。

ru-pu

Re: プログラムの意味について

#64

投稿記事 by ru-pu » 13年前

配列とfor文を理解されていますか?
関数map_clearをmemsetも使わずfor文も使わずに実装するとこうなります

コード:

void map_clear(char map[][10])
{
    map[0][0]='-';
    map[0][1]='-';
    map[0][2]='-';
    map[0][3]='-';
    map[0][4]='-';
    map[0][5]='-';
    map[0][6]='-';
    map[0][7]='-';
    map[0][8]='-';
    map[0][9]='-';
    map[1][0]='-';
    map[1][1]='-';
    map[1][2]='-';
    map[1][3]='-';
    map[1][4]='-';
    map[1][5]='-';
    map[1][6]='-';
    map[1][7]='-';
    map[1][8]='-';
    map[1][9]='-';
    map[2][0]='-';
    map[2][1]='-';
    map[2][2]='-';
    map[2][3]='-';
    map[2][4]='-';
    map[2][5]='-';
    map[2][6]='-';
    map[2][7]='-';
    map[2][8]='-';
    map[2][9]='-';
    map[3][0]='-';
    map[3][1]='-';
    map[3][2]='-';
    map[3][3]='-';
    map[3][4]='-';
    map[3][5]='-';
    map[3][6]='-';
    map[3][7]='-';
    map[3][8]='-';
    map[3][9]='-';
    map[4][0]='-';
    map[4][1]='-';
    map[4][2]='-';
    map[4][3]='-';
    map[4][4]='-';
    map[4][5]='-';
    map[4][6]='-';
    map[4][7]='-';
    map[4][8]='-';
    map[4][9]='-';
    map[5][0]='-';
    map[5][1]='-';
    map[5][2]='-';
    map[5][3]='-';
    map[5][4]='-';
    map[5][5]='-';
    map[5][6]='-';
    map[5][7]='-';
    map[5][8]='-';
    map[5][9]='-';
    map[6][0]='-';
    map[6][1]='-';
    map[6][2]='-';
    map[6][3]='-';
    map[6][4]='-';
    map[6][5]='-';
    map[6][6]='-';
    map[6][7]='-';
    map[6][8]='-';
    map[6][9]='-';
    map[7][0]='-';
    map[7][1]='-';
    map[7][2]='-';
    map[7][3]='-';
    map[7][4]='-';
    map[7][5]='-';
    map[7][6]='-';
    map[7][7]='-';
    map[7][8]='-';
    map[7][9]='-';
    map[8][0]='-';
    map[8][1]='-';
    map[8][2]='-';
    map[8][3]='-';
    map[8][4]='-';
    map[8][5]='-';
    map[8][6]='-';
    map[8][7]='-';
    map[8][8]='-';
    map[8][9]='-';
    map[9][0]='-';
    map[9][1]='-';
    map[9][2]='-';
    map[9][3]='-';
    map[9][4]='-';
    map[9][5]='-';
    map[9][6]='-';
    map[9][7]='-';
    map[9][8]='-';
    map[9][9]='-';
}
for文を一つ使うとこうなります

コード:

void map_clear(char map[][10])
{
    int y;
    for( y = 0; y < 10; y++ )
    {
        map[y][0]='-';
        map[y][1]='-';
        map[y][2]='-';
        map[y][3]='-';
        map[y][4]='-';
        map[y][5]='-';
        map[y][6]='-';
        map[y][7]='-';
        map[y][8]='-';
        map[y][9]='-';
    }
}
for文を二重に使ったらどうなるかわかりますか?
考えてみてください

よーすけ

Re: プログラムの意味について

#65

投稿記事 by よーすけ » 13年前

ru-pu さんが書きました: for文を二重に使ったらどうなるかわかりますか?
考えてみてください
ヒントありがとうございます!
できました!提出になんとか間に合いそうです!

nonさん、jayさん、takumi@0832080.comさん、beatleさん、みけCATさん、ru-puさん。
ご協力、本当にありがとうございました!
後は課題のアルゴリズムや何やらを記述して提出するだけです。ここで勉強したことや教えてもらったことも書こうと思ってます。
来年はJAVAというものを学ぶらしく、春休みあたりに予習とC言語の復習をしようと考えています。

特にnonさん、最後まで見放さずに、ご教授してくださり本当にありがとうございます。
ここまでできたのも皆さんのおかげです。
プログラミングで悩んだときはまたお世話になりたいです。

『解決!』にチェックを入れてここを締めたいと思います。
本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る