学校の課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mals
記事: 6
登録日時: 10年前

学校の課題

#1

投稿記事 by mals » 10年前

以下のプログラムを作ってみたのですがコンパイルで失敗しますどうすればよいのでしょうか?
コンパイルはcygwinでやってます

[問題文]
乱数を利用した8ケタの文字列を作成せよ.仕様は以下のとおり.
(16進数0~9,A,b,C,d,F)
発生した8ケタの文字列を5行3列のデジタル文字でスクリーンに1度に5パターン表示させる.
スクリーンに表示された5つの文字列を同じくデジタル文字でファイル名「date.txt」に書き出す.
<デジタル文字の説明>
① 5 行3 列でデジタル文字のパターンを表し,それを文字数分用意した3 次元配列
num[表示する数値][文字パターンの行][文字パターンの列]
で表現
② 3 次元配列には全角スペース(“_”)で表示する部分には0,黒(“●”)で表示する部分には1を格納
③ デジタル文字のパターンのイメージ(2 の場合)は,次のとおり
num[2][0][0] = 1,num[2][0][1] = 1,num[2][0][2] = 0
num[2][1][0] = 0,num[2][1][1] = 0,num[2][1][2] = 1
num[2][2][0] = 1,num[2][2][1] = 1,num[2][2][2] = 1
num[2][3][0] = 1,num[2][3][1] = 0,num[2][3][2] = 0
num[2][4][0] = 1,num[2][4][1] = 1,num[2][4][2] = 1
3.デジタル文字パターンは用意された「moji.txt」を読み込み使用する.
4.関数が使われている
moji.txtの中身
1 1 1
1 0 1
1 0 1
1 0 1
1 1 1 などの0~9、A,b,C,d,Eの5行×3列のデジタル文字が書き込まれてます

コード:

#include <stdio.h>

#include <stdlib.h>

 

 

int main()

{

    const int base = 15;

    const int height = 5;

    const int width = 3;

    const int outlength = 8;

    const int pattern_max = 5;

    int num[base][height][width], *p = num, c;

 

    // デジタル文字パターン「moji.txt」をopenする。

    FILE *fpi, *fpo;

    fpi = fopen("moji.txt", "r");

    if (!fpi)

    {

        printf("moji.txtをopen出来ません。\n");

        exit(-1);

    }

 

    // デジタル文字パターンを「moji.txt」から読み込む。

    while ((c = fgetc(fpi)) != EOF)

    {

        switch (c)

        {

        case '0':

            *p++ = 0;

            break;

        case '1':

            *p++ = 1;

            break;

        default:

            break;

        }

    }

 

    // 出力ファイルをopenする。

    fpo = fopen("date.txt", "w");

    if (!fpo)

    {

        printf("date.txtをopen出来ません。\n");

        exit(-1);

    }

 

    // 5パターン出力する。

    for (int p = 0; p < pattern_max; ++p)

    {

        // 乱数を利用した8ケタの文字列を作成

        int buf[outlength];

        for (int i = 0; i < outlength; ++i)

            buf[i] = rand() % base;

        for (int h = 0; h < height; ++h)

        {

            for (int b = 0; b < outlength; ++b)

            {

                for (int w = 0; w < width; ++w)

                {

                    if (num[buf[b]][h][w])

                        fprintf(fpo, "●");

                    else

                        fprintf(fpo, " ");

                }

                fprintf(fpo, " "); // 文字間を1バイト開ける。

            }

            fprintf(fpo, "\n"); // 1行の終わり。
        }

        fprintf(fpo, "\n"); // 1パターンの終わり。

    }

    fclose(fpi);

    fclose(fpo);

 

    // ファイル出力内容を画面表示する。

    {

        char buf[1000];

        fpi = fopen("date.txt", "r");

        while (fgets(buf, 100, fpi))

            printf("%s", buf);

    }

    return 0;

}

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 学校の課題

#2

投稿記事 by Tatu » 10年前

pはint型のポインタなのでint型のポインタを入れましょう。
今回は最初の要素num[0][0][0]へのポインタを入れればよいと思います。

16進数であるならば
0,1,2,3
4,5,6,7
8,9,A,B
C,D,E,F
の16文字です。
baseは15ではなく、16でしょう。

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

Re: 学校の課題

#3

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

ポインタを使うことは課題の問題文で指示されているのですか?
ポインタを使わず、素直にnumの要素を添え字で指定して入力してはいけないのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mals
記事: 6
登録日時: 10年前

Re: 学校の課題

#4

投稿記事 by mals » 10年前

ポインタの使用も指示されています

mals
記事: 6
登録日時: 10年前

Re: 学校の課題

#5

投稿記事 by mals » 10年前

最初の要素num[0][0][0]へのポインタを入れるというところがいまいち理解できません.
どのように入れればよいのでしょうか

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

Re: 学校の課題

#6

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

mals さんが書きました:最初の要素num[0][0][0]へのポインタを入れるというところがいまいち理解できません.
どのように入れればよいのでしょうか

コード:

int num[base][height][width];

int *p = &num[0][0][0];

int c;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mals
記事: 6
登録日時: 10年前

Re: 学校の課題

#7

投稿記事 by mals » 10年前

moji.txtの中身を書いておきます

コード:

1 1 1
1 0 1
1 0 1
1 0 1
1 1 1

0 0 1
0 1 1
0 0 1
0 0 1
0 0 1

1 1 0
0 0 1
1 1 1
1 0 0
1 1 1

1 1 1
0 0 1
1 1 1
0 0 1
1 1 1

1 0 1
1 0 1
1 1 1
0 0 1
0 0 1

1 1 1
1 0 0
1 1 1
0 0 1
1 1 1

1 1 1
1 0 0
1 1 1
1 0 1
1 1 1

1 1 1
0 0 1
0 1 0
0 1 0
0 1 0

1 1 1
1 0 1
1 1 1
1 0 1
1 1 1

1 1 1
1 0 1
1 1 1
0 0 1
1 1 1

0 1 0
1 0 1
1 0 1
1 1 1
1 0 1

1 0 0
1 0 0
1 1 1
1 0 1
1 1 1

1 1 1
1 0 0
1 0 0
1 0 0
1 1 1

0 0 1
0 0 1
1 1 1
1 0 1
1 1 1

1 1 1
1 0 0
1 1 1
1 0 0
1 1 1

1 1 1
1 0 0
1 1 1
1 0 0
1 0 0
どうしても無限ループになってしまい動きません.不躾なお願いですがどなたかソースコードを書き直してもらえないでしょうか?
期日が迫ってしまいとても焦っています.文章が変ですいません.

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

Re: 学校の課題

#8

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

mals さんが書きました:どうしても無限ループになってしまい動きません.不躾なお願いですがどなたかソースコードを書き直してもらえないでしょうか?
コンパイルは通るのですか?
ソースコードを修正したならば、現状のソースコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mals
記事: 6
登録日時: 10年前

Re: 学校の課題

#9

投稿記事 by mals » 10年前

コード:

#include <stdio.h>

#include <stdlib.h>

 

 

int main()

{

    const int base = 16;

    const int height = 5;

    const int width = 3;

    const int outlength = 8;

    const int pattern_max = 5;

    int num[base][height][width];
 
    int *p = &num[0][0][0];
 
    int c;


 

    // デジタル文字パターン「moji.txt」をopenする。

    FILE *fpi, *fpo;

    fpi = fopen("moji.txt", "r");

    if (!fpi)

    {

        printf("moji.txtをopen出来ません。\n");

        exit(-1);

    }

 

    // デジタル文字パターンを「moji.txt」から読み込む。

    while ((c = fgetc(fpi)) != EOF)

    {

        switch (c)

        {

        case '0':

            *p++ = 0;

            break;

        case '1':

            *p++ = 1;

            break;

        default:

            break;

        }

    }

 

    // 出力ファイルをopenする。

    fpo = fopen("date.txt", "w");

    if (!fpo)

    {

        printf("date.txtをopen出来ません。\n");

        exit(-1);

    }

 

    // 5パターン出力する。

    for (int p = 0; p < pattern_max; ++p)

    {

        // 乱数を利用した8ケタの文字列を作成

        int buf[outlength];

        for (int i = 0; i < outlength; ++i)

            buf[i] = rand() % base;

        for (int h = 0; h < height; ++h)

        {

            for (int b = 0; b < outlength; ++b)

            {

                for (int w = 0; w < width; ++w)

                {

                    if (num[buf[b]][h][w])

                        fprintf(fpo, "●");

                    else

                        fprintf(fpo, " ");

                }

                fprintf(fpo, " "); // 文字間を1バイト開ける。

            }

            fprintf(fpo, "\n"); // 1行の終わり。
        }

        fprintf(fpo, "\n"); // 1パターンの終わり。

    }

    fclose(fpi);

    fclose(fpo);

 

    // ファイル出力内容を画面表示する。

    {

        char buf[1000];

        fpi = fopen("date.txt", "r");

        while (fgets(buf, 100, fpi))

            printf("%s", buf);

    }

    return 0;

}



mals
記事: 6
登録日時: 10年前

Re: 学校の課題

#10

投稿記事 by mals » 10年前

明日までです

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: 学校の課題

#11

投稿記事 by milfeulle » 10年前

コンパイルは通り、無限ループにも陥っていないようですがどこが問題なのでしょうか?
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

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

Re: 学校の課題

#12

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

milfeulle さんが書きました:コンパイルは通り、無限ループにも陥っていないようですがどこが問題なのでしょうか?
mals さんが書きました:[問題文]
乱数を利用した8ケタの文字列を作成せよ.仕様は以下のとおり.
(16進数0~9,A,b,C,d,F)
発生した8ケタの文字列を5行3列のデジタル文字でスクリーンに1度に5パターン表示させる.
スクリーンに表示された5つの文字列を同じくデジタル文字でファイル名「date.txt」に書き出す.
仕様に無い文字Eが出力に含まれてしまう可能性があります。
また、「スクリーンに表示させてそれをファイルに書き出す」ではなく、
「ファイルに書き出してそれをスクリーンに表示させる」という動作になっています。
(課題はファイルに書き出すのではなく「ファイル名に書き出す」という聞きなれない操作のようなので、これで正しいのかもしれませんが)
mals さんが書きました:② 3 次元配列には全角スペース(“_”)で表示する部分には0,黒(“●”)で表示する部分には1を格納
moji.txtで0が書かれている場所は全角スペースを表示する(現在の実装)のが正しいのですか?
それとも_を表示するのが正しいのですか?
_はFULLWIDTH LOW LINEという文字で、全角スペースではないとおもいます。

いちおうこちらの環境での実行結果を貼っておきます。

コード:

YUKI.N>md5sum moji.txt raw9.cpp
e8616c72aa00cdee819cfb75c9572e74 *moji.txt
2c0c66a90ca8975fd6a10464c9f0aa1b *raw9.cpp

YUKI.N>g++ -Wall -Wextra -s -static -o raw9 raw9.cpp

YUKI.N>raw9
●●● ●●● ●●● ● ●   ● ●●● ●●● ●●●
● ●   ● ●   ● ●  ●● ●   ●   ●  
●●● ●●● ●●● ●●●   ● ●   ●●● ●●●
  ●   ● ●     ●   ● ●   ● ● ●  
●●● ●●● ●●●   ●   ● ●●● ●●● ●●●

●●  ●●● ●●●   ●   ● ●   ●●● ●  
  ● ● ● ● ●  ●●  ●● ●   ● ● ●  
●●● ● ● ●●●   ●   ● ●●● ●●● ●●●
●   ● ●   ●   ●   ● ● ●   ● ● ●
●●● ●●● ●●●   ●   ● ●●● ●●● ●●●

●●● ●●● ●   ●●● ●●● ●●● ●●● ●●●
  ● ●   ●   ●     ● ●   ●   ● ●
●●● ●●● ●●● ●    ●  ●   ●●● ●●●
  ● ● ● ● ● ●    ●  ●   ●     ●
●●● ●●● ●●● ●●●  ●  ●●● ●●● ●●●

● ● ●●●   ● ●●● ●●● ●●● ●●● ●●●
● ● ●     ● ●   ●     ●   ● ●  
●●● ●●● ●●● ●   ●●●  ●   ●  ●●●
  ● ●   ● ● ●   ● ●  ●   ●  ●  
  ● ●●● ●●● ●●● ●●●  ●   ●  ●●●

●●● ●●    ● ●●● ●●● ●   ●   ●●●
  ●   ●   ● ● ●   ● ●   ●   ●  
●●● ●●● ●●● ●●● ●●● ●●● ●●● ●●●
  ● ●   ● ● ● ●   ● ● ● ● ● ● ●
●●● ●●● ●●● ●●● ●●● ●●● ●●● ●●●


YUKI.N>g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


YUKI.N>
添付ファイル
gakkounokadai.zip
実験に使用したソースとバイナリ
(10.15 KiB) ダウンロード数: 140 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校の課題

#13

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

mals さんが書きました:[問題文]
乱数を利用した8ケタの文字列を作成せよ.仕様は以下のとおり.
(16進数0~9,A,b,C,d,F)

(中略)

moji.txtの中身
1 1 1
1 0 1
1 0 1
1 0 1
1 1 1 などの0~9、A,b,C,d,Eの5行×3列のデジタル文字が書き込まれてます
なぜ使う文字は0~9,A,b,C,d,Fなのに、moji.txtの中身は0~9、A,b,C,d,Eなのですか?
FをEというフォントで表示しろ、ということですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: 学校の課題

#14

投稿記事 by milfeulle » 10年前

もう期限を過ぎてしまったので来られることはないかもしれませんが、そこを考えて欲しくて質問しただけです;
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

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

Re: 学校の課題

#15

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

milfeulle さんが書きました:もう期限を過ぎてしまったので来られることはないかもしれませんが、そこを考えて欲しくて質問しただけです;
ごめんなさい。
質問者の発言と勘違いして返答してしまいました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

答えるよ

Re: 学校の課題

#16

投稿記事 by 答えるよ » 10年前

無限ループに陥ってると言っていましたが、まずポインタ変数pへのポインタ代入の時点でnumを代入すること自体間違いです。ですから、whileも正しく動きません。
pはint型へのポインタです。またnum[15][5][3]という定義からもわかるように、numというのは、int (*)[5][3]型であり、無理やりに日本語に直したならば、配列の配列へのポインタ型です。
気の毒ですが、きっと大学の教師がポインタを丁寧に教えるのをさぼったのでしょうね。マジでそういう教師はどうかと思いますが......。
例えば、int num[15][4]と書いた場合はメモリの上ではint num[4]という配列が15コ並んでいるということです。よく考えてください、int num[5]という配列であれば、int型の変数が
5コ並んだものです。つまり、int num[15][5][3]であれば、int num[5][3]が15個並んでいる状態がメモリ上では実現されているわけです。
さすがに、int num[5]においてnumとして描いた場合にはnumはint型へのポインタであることはわかりますよね?つまり、配列において最初の名前の部分だけであらわされるのは、先頭要素へのポインタです。
だから、num[15][5][3]であれば、num[5][3]が15個並んだ配列なので、numとした場合、int num[5][3]へのポインタです。

閉鎖

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