【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18486

数字の文字列化について。
投稿者---ととろ(2004/12/02 13:32:28)


私は学校の時間割を自動編成するシステムを開発しようとしています。
そこで、国語なら1、数学なら2といった具合に教科に通し番号を振り、
それを並び代えて理想とする時間割の解を求め、その時間割を通し番号で
txtファイルに出力するプログラムは完成しました。
しかし、出力が数字だと見にくいので、それを文字列に変換して、
txtファイルに出力したいのですが、うまくいきません。
どのようにすればいいでしょうか?

その出力する文字列(国語などの教科)もtxtファイルから読み込みたいと思っています。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:数字の文字列化について。 18487 επιστημη 2004/12/02 13:33:51


No.18487

Re:数字の文字列化について。
投稿者---επιστημη(2004/12/02 13:33:51)


>しかし、出力が数字だと見にくいので、それを文字列に変換して、
>txtファイルに出力したいのですが、うまくいきません。

質問/相談になってない。
なにがどう うまくいかないのですか?



この投稿にコメントする

削除パスワード

No.18488

Re:数字の文字列化について。
投稿者---ととろ(2004/12/02 13:47:44)


>質問/相談になってない。
>なにがどう うまくいかないのですか?

説明不足で申し訳ありません。
fscanfでtxtファイルから文字列を
char型の配列に入れようとしたのですが、
扱いにくくてうまくいきませんでした。
他の方法があるのでしょうか?





この投稿にコメントする

削除パスワード

No.18489

Re:数字の文字列化について。
投稿者---επιστημη(2004/12/02 13:50:13)


>fscanfでtxtファイルから文字列を
>char型の配列に入れようとしたのですが、
>扱いにくくてうまくいきませんでした。

'うまくいかない'を使わずに説明してください。
なにがどう 扱いにくいのですか?
なにがどう うまくいかないのですか?



この投稿にコメントする

削除パスワード

No.18492

Re:数字の文字列化について。
投稿者---ととろ(2004/12/02 14:01:28)



>なにがどう 扱いにくいのですか?
>なにがどう うまくいかないのですか?

申し訳ありません。

他のクラスとの兼ね合いがありますので10クラス同時に
時間割を出力しています。そして、クラスごと学年ごとに
教科が違うのですが、クラスごとに通し番号を1から振った
ため教科の文字列を配列に入れる際、どのように入れていいか
困っています。
全クラスで通し番号を振り直すことも考えたのですが、大幅な
プログラムの変更が予想されるため、何か違う方法でやりたいと
思っています。







この投稿にコメントする

削除パスワード

No.18494

Re:数字の文字列化について。
投稿者---επιστημη(2004/12/02 14:08:47)


>全クラスで通し番号を振り直すことも考えたのですが、大幅な
>プログラムの変更が予想されるため、何か違う方法でやりたいと
>思っています。

つまり、教科コード(数値)と教科名の対応表がクラス毎に異なる、ということですか?

ならば const char* subject_name(int class_id, int subject_id)
のような関数を用意し、クラスIDと教科IDを与えると教科名を返せばいい。

配列でやろうとするから難しくなっているのではありませんか?



この投稿にコメントする

削除パスワード

No.18495

Re:数字の文字列化について。
投稿者---ととろ(2004/12/02 14:18:41)



>つまり、教科コード(数値)と教科名の対応表がクラス毎に異なる、ということですか?
はい、そうです。

>ならば const char* subject_name(int class_id, int subject_id)
>のような関数を用意し、クラスIDと教科IDを与えると教科名を返せばいい。

>配列でやろうとするから難しくなっているのではありませんか?

教科数がクラス毎にたくさんあるため、
配列でやるやり方しか浮かびませんでした。
もう少し、自分で考えてみたいと思います。





この投稿にコメントする

削除パスワード

No.18497

Re:数字の文字列化について。
投稿者---REE(2004/12/02 14:40:27)


>>ならば const char* subject_name(int class_id, int subject_id)
>>のような関数を用意し、クラスIDと教科IDを与えると教科名を返せばいい。
>
>>配列でやろうとするから難しくなっているのではありませんか?
>
>教科数がクラス毎にたくさんあるため、
>配列でやるやり方しか浮かびませんでした。
>もう少し、自分で考えてみたいと思います。

配列でも同様に以下のような感じでいいのでは?
char subject_name[class_id][subject_id][教科名の最大長+1]
もしくは
char subject_name[grade_id][class_id][subject_id][教科名の最大長+1]



この投稿にコメントする

削除パスワード

No.18498

Re:数字の文字列化について。
投稿者---επιστημη(2004/12/02 14:52:11)


>配列でも同様に以下のような感じでいいのでは?
>char subject_name[class_id][subject_id][教科名の最大長+1]
>もしくは
>char subject_name[grade_id][class_id][subject_id][教科名の最大長+1]

んー…僕はこれをやってて'ぐちゃぐちゃ'になっちまったんじゃないかと思う (^^
# 配列は抽象化レベルが低すぎるし、飛び番があると無駄が多すぎ。



この投稿にコメントする

削除パスワード

No.18490

Re:数字の文字列化について。
投稿者---επιστημη(2004/12/02 13:53:12)


>扱いにくくてうまくいきませんでした。
>他の方法があるのでしょうか?

Cでなくてはいけませんか?
C++なら文字列を(char配列など使わずに)そのまま扱えます。



この投稿にコメントする

削除パスワード

No.18493

Re:数字の文字列化について。
投稿者---ととろ(2004/12/02 14:04:34)


>Cでなくてはいけませんか?
>C++なら文字列を(char配列など使わずに)そのまま扱えます。

Cで始まってしまったためCでやりたいです。
それとC++の知識をまったく持ち合わせてないですので。






この投稿にコメントする

削除パスワード

No.18491

Re:数字の文字列化について。
投稿者---かずま(2004/12/02 13:57:48)


> しかし、出力が数字だと見にくいので、それを文字列に変換して、
> txtファイルに出力したいのですが、うまくいきません。
> どのようにすればいいでしょうか?

具体例として、現在の出力をまずここに書いてください。
次に、望むべき出力を書いてください。


> その出力する文字列(国語などの教科)もtxtファイルから読み込みたいと思っています。

そのファイルの内容を書いてください。


> fscanfでtxtファイルから文字列を
> char型の配列に入れようとしたのですが、
> 扱いにくくてうまくいきませんでした。

そのプログラムをここに挙げてください。



この投稿にコメントする

削除パスワード

No.18499

Re:数字の文字列化について。
投稿者---かずま(2004/12/02 21:48:34)


> 具体例として、現在の出力をまずここに書いてください。
> 次に、望むべき出力を書いてください。

>> その出力する文字列(国語などの教科)もtxtファイルから読み込みたいと思っています。
>
> そのファイルの内容を書いてください。

データの形式を示してくれないので、適当に決めました。
-------- timetable.txt --------
1-A
  月  3  1  4  2
  火  5  2  3  1
1-B
  月  5  4  3  2
  火  1  3  2  4
1-C
  月  1  2  5  3
  火  2  1  4  5
--------------------------------

-------- subject.txt -----------
1-A 英語 数学 国語 理科 社会
1-B 社会 英語 数学 国語 理科
1-C 数学 英語 理科 社会 国語
--------------------------------

-------- 出力結果 -----------------
1-A
  月   国語    英語    理科    数学    
  火   社会    数学    国語    英語    
1-B
  月   理科    国語    数学    英語    
  火   社会    数学    英語    国語    
1-C
  月   数学    英語    国語    理科    
  火   英語    数学    社会    国語    
-----------------------------------

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

#define N_CLASS    3  /* 10 */
#define N_PERIOD   4
#define N_DAYS     2  /* 5: 月、火、水、木、金 */
#define N_SUBJECT  5  /* 英語、数学、国語、理科、社会 */

int main(void)
{
    int i, j, k, c;
    char buf[256], subject[N_SUBJECT+1][16];

    FILE *fp = fopen("timetable.txt", "r");
    FILE *fp2 = fopen("subject.txt", "r");
    if (!fp || !fp2) puts("can't open files"), exit(1);

    for (i = 0; i < N_CLASS; i++) {
        for (j = 0; j <= N_SUBJECT; j++) fscanf(fp2, "%s", subject[j]);
        fscanf(fp, "%s", buf), puts(buf);  /* クラス名 */
        for (j = 0; j < N_DAYS; j++) {
            fscanf(fp, "%s", buf), printf("  %s   ", buf); /* 曜日 */
            for (k = 0; k < N_PERIOD; k++)
                if (fscanf(fp, "%d", &c) == 1 && c > 0 && c <= N_SUBJECT)
                    printf("%-8s", subject[c]);
                else printf("--      ");
            printf("\n");
        }
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.18500

Re:数字の文字列化について。
投稿者---かずま(2004/12/03 10:30:11)


科目数を可変にしてみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_CLASS    4  /* 10: 1-ABC, 2-ABC, 3-ABCD */
#define N_PERIOD   4
#define N_DAYS     2  /* 5: 月、火、水、木、金 */
#define N_SUBJECT 10  /* 最大 */

int main(void)
{
    int i, j, k, n, c;
    char buf[256], sbuf[256], *s, *p, *subject[N_SUBJECT+1];

    FILE *fp = fopen("timetable.txt", "r");
    FILE *fp2 = fopen("subject.txt", "r");
    if (!fp || !fp2) puts("can't open files"), exit(1);

    for (i = 0; i < N_CLASS; i++) {
        fgets(sbuf, sizeof buf, fp2);
        for (n = 0, s = sbuf; (p = strtok(s, " \t\n")); s = NULL) {
            if (n == N_SUBJECT+1) puts("too many subjects"), exit(1);
            subject[n++] = p;
        }
        fscanf(fp, "%s", buf), puts(buf);  /* クラス名 */
        for (j = 0; j < N_DAYS; j++) {
            fscanf(fp, "%s", buf), printf("  %s   ", buf); /* 曜日 */
            for (k = 0; k < N_PERIOD; k++) {
                if (fscanf(fp, "%d", &c) != 1) puts("error"), exit(1);
                printf("%-8s", (c > 0 && c < n) ? subject[c] : "--");
            }
            printf("\n");
        }
    }
    return 0;
}

/*
-------- timetable.txt --------
1-A
  月  3  1  4  2
  火  5  2  3  1
1-B
  月  5  4  3  2
  火  1  3  2  4
1-C
  月  1  2  5  3
  火  2  1  4  5
2-A
  月  1  2  3  4
  火  5  4  6  1
--------------------------------

-------- subject.txt --------------
1-A 英語 数学 国語 理科 社会
1-B 社会 英語 数学 国語 理科
1-C 数学 英語 理科 社会 国語
2-A 英語 数学A 数学B 国語 理科 社会
-----------------------------------

-------- 出力結果 -----------------
1-A
  月   国語    英語    理科    数学    
  火   社会    数学    国語    英語    
1-B
  月   理科    国語    数学    英語    
  火   社会    数学    英語    国語    
1-C
  月   数学    英語    国語    理科    
  火   英語    数学    社会    国語    
2-A
  月   英語    数学A   数学B   国語    
  火   理科    国語    社会    英語    
-----------------------------------
*/



この投稿にコメントする

削除パスワード

No.18496

Re:数字の文字列化について。
投稿者---monkey(2004/12/02 14:40:23)


> fscanfでtxtファイルから文字列を
> char型の配列に入れようとしたのですが、
> 扱いにくくてうまくいきませんでした。

// ご参考:
#include <stdio.h>

#define SUBJECTS  5 // 科目数
#define LENGTH   32 // 科目名の最大文字数

int main()
{
    FILE* fp;
    char subjects[SUBJECTS][LENGTH];
    int i;

    if( ( fp = fopen( "subjects.txt", "r" ) ) == NULL ){
        puts( "file open error" );
        return 1;
    }
    for( i = 0; i < SUBJECTS; i++ ){
        fscanf( fp, "%s", subjects[i] );
    }
    fclose( fp );

    for( i = 0; i < SUBJECTS; i++ ){
        printf( "%2d : %s\n", i, subjects[i] );
    }
    return 0;
}

/* "subjects.txt"ファイル(空白文字で区切った科目名の列挙)
国語 数学 英語 理科 社会
*/

/* 実行結果:
 0 : 国語
 1 : 数学
 2 : 英語
 3 : 理科
 4 : 社会
*/



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧