2次元配列の使い方

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

2次元配列の使い方

#1

投稿記事 by GR » 17年前

はじめまして。初めて登校させていただきます。
現在、宿題で2次元配列・ポインタ関数を使って、
入力年月日の前日・翌日を表示させるプログラムを製作しています。
ところが、2次元配列を使って各月の日数を格納させたいのですが、
配列の要素値が全て0のままです。
以下のやり方では無理なのでしょうか?
解説を加えてくださると非常にありがたいです。
(現在の作業はカレンダーを配列に格納するのみです。
また曜日は気にしなくて良いとの事なので、曜日は導入しておりません)
宜しくお願いいたします。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void yesterday(int *a,int *y,int *m,int *d);
void tomorrow(int *a,int *y,int *m,int *d);
void uruudosi(int *a,int *y);

int main(void){
int b[13][33]={0};
int y;
int m;
int d;
int a;

for(m=1; m<13; m++)
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
for(d=0; d<32; d++)
{
b[m][d]=d;
}break;
case 2:
for(d=0; d<30; d++)
{
b[m][d]=d;
}break;
case 4:
case 6:
case 9:
case 11:
for(d=0; d<31; d++)
{
b[m][d]=d;
}break;
}
printf("%d",b[11][4]);//ここが0なので、格納されてないのかなと。
scanf("%d",&y);
scanf("%d",&m);
scanf("%d",&d);
printf("入力された年月日は%d年%d%月%d日",y,m,b[m][d]);
return 0;
}

フリオ

Re:2次元配列の使い方

#2

投稿記事 by フリオ » 17年前

 見やすいように、ソースは、"pre"タグで字下げしてほしい。


 とりあえずこれで、当方の環境(Win2000 SP4、Borland C++ 5.82 for Win32)
では問題なくコンパイル、実行できました。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void yesterday(int *a, int *y, int *m, int *d);
void tomorrow(int *a, int *y, int *m, int *d);
void uruudosi(int *a, int *y);

int main(void)
{
	int b[13][33] = {0};
	int y;
	int m;
	int d;
	int a;
	
	for(m = 1; m < 13; m ++)
	{
		switch(m)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
			for(d = 0; d < 32; d ++)
			{
				b[m][d] = d;
			}break;
			case 2:
			for(d = 0; d < 30; d ++)
			{
				b[m][d] = d;
			}break;
			case 4:
			case 6:
			case 9:
			case 11:
			for(d = 0; d < 31; d ++)
			{
				b[m][d] = d;
			}break;
		} /* 修正 */
	}
	printf("%d", b[11][4]);//ここが0なので、格納されてないのかなと。
	scanf("%d", &y);
	scanf("%d", &m);
	scanf("%d", &d);
	printf("入力された年月日は%d年%d月%d日", y, m, b[m][d]); /* 修正 */
	return 0;
}
 
 
> 入力年月日の前日・翌日を表示させるプログラムを製作しています
 なら、一年の全ての日付を準備しなくでも、
一次元配列で、各月の日数だけわかれば十分です。
12月31日の翌日は翌年の1月1日、1月1日の前日は前年の12月31日、
それ以外の各月の、末日の翌日は翌月の1日、1日の前日は前月の末日。
それ以外は、日付を +1 または -1 するだけです。
 

GR

Re:2次元配列の使い方

#3

投稿記事 by GR » 17年前

なるほど、switchの中括弧が抜けてたのですね。
どうもご迷惑をおかけしました。

当初フリオさんが仰ってた通り、1次元配列でやろうと思っていたのですが
向こうから2次元配列とポインタ関数を使うように釘を刺されておりましてw
そんなわけで、ポインタ関数を使った式もやってみたのですが・・。
エラーは無いのに動かない、最悪の事態になりました(汗)
ソースは以下の通りです。
おそらくポインタ関数の所がおかしいのでしょうが・・。
御指摘宜しくお願いいたします(汗)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void yesterday(int *a, int *y, int *m, int *d, int b);
void tomorrow(int *a, int *y, int *m, int *d, int b);
void uruudosi(int *a, int *y);

int main(void)
{
int b[13][33] = {0};
int y;
int m;
int d;
int a;

for(m = 1; m < 13; m ++)
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
for(d = 0; d < 32; d ++)
{
b[m][d] = d;
}break;
case 2:
for(d = 0; d < 30; d ++)
{
b[m][d] = d;
}break;
case 4:
case 6:
case 9:
case 11:
for(d = 0; d < 31; d ++)
{
b[m][d] = d;
}break;
}
}
//

printf("年を入力してください\n");
scanf("%d", &y);

uruudosi(&y,&a);//

printf("月を入力してください\n");
scanf("%d", &m);
printf("日を入力してください\n");
scanf("%d", &d);

printf("入力された年月日は%d年%d月%d日", y, m, b[m][d]);
yesterday(&a,&y,&m,&d,b[13][33]);//

return 0;
}

void uruudosi(int *a, int *y)
{
if(*y % 4 == 0 && *y % 100 != 0)
{
*a = 1;
}
else
{
if(*y % 400 == 0)
{
*a = 1;
}
else
{
*a = 0;
}
}
}

void yesterday(int *a, int *y, int *m, int *d,int b[13][33])
{
*d = *d -1;
if(b[*m][*d] == 0)
{
*m = *m - 1;
if(*m == 0)
{
*y = *y - 1;
*m = 12;
}
else
{}
}
else
{}
for(*d = 1; *d < 32; *d++)
{
if(b[*m][*d] == 0)break;
}
*d = *d - 1;
if(*m == 2 && *d == 29)
{
if(*a < 1)
{
*d = *d - 1;
}
else
{}
}
else
{}
}

void tomorrow(int *a, int *y, int *m, int *d, int b[13][33])
{
int s;
for(s = 0; s < 1; s++)
{
*d = *d + 1;
if(b[*m][*d] != 0)
{
if(*m == 2 && *d == 29)
{
if(*a < 1)
{
*m = 3;
*d = 1;
}
else
{}

}
else
{}
}
else
{
*m = *m + 1;
*d = 1;
if(b[*m][*d] == 0)
{
*y = *y + 1;
*m = 1;
}
else
{}
}
}
}

GR

Re:2次元配列の使い方

#4

投稿記事 by GR » 17年前

あれ?タグを押したのですが出来てないですね。
スイマセン、preタグってどうするのでしょうか(汗)

組木紙織

Re:2次元配列の使い方

#5

投稿記事 by 組木紙織 » 17年前

"<"pre">" "<"/pre">" : "(半角文字)"であるとする。

で挟めば使えます。

とすぐ上のコードは宣言と定義の型が異なるのでコンパイル不可能です。

一言だけ書いておきます。

GR

Re:2次元配列の使い方

#6

投稿記事 by GR » 17年前

宣言と定義で型が異なる?
void型宣言がいけない、って事でしょうか?

フリオ

Re:2次元配列の使い方

#7

投稿記事 by フリオ » 17年前

 組木紙織さんも書いておられますが、
提示された2つのソースは、どちらも当方の環境では、
エラーが出てコンパイルできませんでした。
GRさんは、本当にコンパイルできたのでしょうか。

それから、"ポインタ関数"とはどのようなものでしょうか。
 

GR

Re:2次元配列の使い方

#8

投稿記事 by GR » 17年前

フリオさんが御指摘下さった所を修正した際に、格納は出来てましたよ~。
ちなみに、当方はvosual studio C++を使ってます。
で、ソースの問題はそこから関数が無理だったようで・・。

ポインタ関数はメインで使用している複数の変数のアドレスを関数に渡し、
関数で処理した後、メインに戻った際に関数内で処理した値になる・・はず。

組木紙織

Re:2次元配列の使い方

#9

投稿記事 by 組木紙織 » 17年前

私はポインタ関数という言葉を初めて聞きましたが、書き込みを見ると
ポインタ関数は引数にポインタ変数を持つ関数であるとGRさんは認識しているようです。
(ポインタ変数を返す関数を同様に呼ぶかどうかは不明です)

上の方に書いてある
void yesterday(int *a, int *y, int *m, int *d, int b);

中の方に書いてある
void yesterday(int *a, int *y, int *m, int *d,int b[13][33])
{
・・・
}
の関数が
名前は同じで引数の型が異なっているのでコンパイルエラーになります。
もう少し詳しく言うと
上側の(宣言時)の引数bはint型を表しているが、
下側の(定義時)の引数bはint型の2次元配列を表しています。

この部分が解消できたとしても、まだ完成するまでに多くの問題があります。
(コードの書き方から、アルゴリズムまで)
宿題ということなので詳しくは言いませんが、ひとつだけ、
C言語の演算子の優先順位を気をつけたことがありますか?

GR

Re:2次元配列の使い方

#10

投稿記事 by GR » 17年前

演算子の優先順位ですか?
・・上から順番に見ていって、*や/があったらそれが優先的に
計算される、ってぐらいなら・・。
これとは違いますかね?
だとしたらちょっとわかんないです(汗)<!--1

テルル

新項目(プロジェクト)の追加

#11

投稿記事 by テルル » 17年前

新しい項目(プロジェクト)を追加して別のシートにWinMainを書きたいのですけど、コンパイラが、
ファイル '.\Debug\test1.sbr'を開けませんといって作業をサボります。どうすれば良いですか。

閉鎖

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