C言語関係掲示板

過去ログ

No.487.入力コマンドでテーブルを作成

[戻る] [ホームページ]
No.3566

文字とテーブルの与え方(C言語)
投稿者---あもるふぁす(2002/11/25 02:08:23)


はじめまして。
今、アルゴリズムを組んでるんですが、行き詰まってどうしてもわからなく
なったので投稿させてもらいました。

アルゴリズムなんですが、テーブルAをコマンドで入力し、
入力文字にしたがって結果を出力する物です。
具体的に言えば
--|a |b
q1|q1|q2
q2|q1|q1∪q2
というテーブルを与えて、(q1,q2)とbを与えたら(q1,q1∪q2)と出力する
アルゴリズムです。

どうぞよろしくお願いします

No.3571

Re:文字とテーブルの与え方(C言語)
投稿者---ともじ(2002/11/25 17:48:22)


こんばんは。

>アルゴリズムなんですが、テーブルAをコマンドで入力し、
>入力文字にしたがって結果を出力する物です。
>具体的に言えば
>--|a |b
>q1|q1|q2
>q2|q1|q1∪q2
>というテーブルを与えて、(q1,q2)とbを与えたら(q1,q1∪q2)と出力する
>アルゴリズムです。

要は、q1とbでq2、q2とbでq1∪q2が得られればよいのですね。
#include <stdio.h>
#include <string.h>

#define M 6 /* 文字数 */
#define W 3 /* 横要素数 */
#define H 3 /* 縦要素数 */

int main(void)
{
	char	tbl[H][W][M] = {{"",   "a",  "b"},
			       {"q1", "q1", "q2"},
			       {"q2", "q1", "q1∪q2"} };
	char 	buf1[20], buf2[20];
	int		i, h, w;
	
	printf("縦項目:");	scanf("%19s", buf1);
	printf("横項目:");	scanf("%19s", buf2);
	
	for (i = 1; i < H; i++) {
		if (strcmp(tbl[i][0], buf1) == 0) {
			h = i;
			break;
		}
	}
	if (i == H) {
		printf("該当なし\n");
		return (0);
	}
	
	for (i = 1; i < W; i++) {
		if (strcmp(tbl[0][i], buf2) == 0) {
			w = i;
			break;
		}
	}
	if (i == W) {
		printf("該当なし\n");
		return (0);
	}

	printf("該当項目[%d][%d]=%s\n", h, w, tbl[h][w]);
	
	return (0);
}	




No.3573

さらによろしいでしょうか
投稿者---あもるふぁす(2002/11/25 23:40:15)


ご返事ありがとうございます。
で、誠に申し訳ないんですが、更に質問よろしいでしょうか。

>>アルゴリズムなんですが、テーブルAをコマンドで入力し、
>>入力文字にしたがって結果を出力する物です。
>>具体的に言えば
>>--|a |b
>>q1|q1|q2
>>q2|q1|q1∪q2
>>というテーブルを与えて、(q1,q2)とbを与えたら(q1,q1∪q2)と出力する
>>アルゴリズムです。
>
>要は、q1とbでq2、q2とbでq1∪q2が得られればよいのですね。

ここで言っているテーブルAは、コマンドを実行する度に変更できるもので
テーブルでの要素も(q1,..,qn),a...a(m個)です。
そして計算式も毎回違います。
テーブルAはアルゴリズムの中で定義しないで、コマンドで定義します。
その場合はどうすればよいのでしょう?

今考えてるのは、上のテーブルを入力する場合は
(q1,a)=q1,(q1,b)=q2,(q2,a)=q1,(q2,b)=q1∪q2
というのを、コマンドで入力したいんですが、さっぱりで・・・

私の前回の文章での「具体的に〜」の部分を間違った為に、ご迷惑をおかけしました。
申し訳ありません。

No.3580

Re:さらによろしいでしょうか
投稿者---ともじ(2002/11/26 16:48:11)


こんばんは。

>今考えてるのは、上のテーブルを入力する場合は
>(q1,a)=q1,(q1,b)=q2,(q2,a)=q1,(q2,b)=q1∪q2
>というのを、コマンドで入力したいんですが、さっぱりで・・・

こういうことですか?

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

#define M 10 /* 文字数 */
#define W 5 /* 横要素数 */
#define H 5 /* 縦要素数 */

int main(int argc, char *argv[])
{
	char	tbl[H][W][M] = {0};
	char 	*p;
	int	i, h, w;
	
	if (argc < 2) {
		printf("引数が足りません\n");
		return (0);
	}
	
	p = argv[1];
	while (*p != '\0') {
		if (strncmp(p, "(q", 2) == 0) {
			p += 2;
			h = *p - '0';
			if (h < 1 || h > H) {
				printf("コマンド入力エラー1\n");
				return (0);
			}
			p += 2;
			w = *p - 'a' + 1;
			if (w < 1 || w > W) {
				printf("コマンド入力エラー2\n");
				return (0);
			}
			p += 3;
			i = 0;
			while ((i < M - 1) && (*p != ',') && (*p != '\0')) {
				tbl[h][w][i] = *p;
				i++;
				p++;
			}
			tbl[h][w][i] = '\0';
			if (*p != '\0')
				p++;
		}
		else {
			printf("コマンド入力エラー3\n");
			return (0);
		}
	}

	printf("%s\n", argv[1]);
	printf("   ");
	for (w = 1; w < W; w++)
		printf("%c          ", 'a' + w - 1);
	printf("\n");

	for (h = 1; h < H; h++) {
		printf("q%d:", h);
		for (w = 1; w < W; w++)
			printf("%-10s ", tbl[h][w]);
		printf("\n");
	}

	return (0);
}	

実行結果
(q1,a)=q1,(q1,b)=q2,(q2,a)=q1,(q2,b)=q1∪q2
   a          b          c          d          
q1:q1         q2                               
q2:q1         q1∪q2                           
q3:                                            
q4:                                            


No.3592

ありがとうございます
投稿者---あもるふぁす(2002/11/27 03:54:16)


どうもありがとうございました。
教えて頂いたものを基にじっくり考えてみます。
また来るかもしれませんが、その時はよろしくお願いします。