初心者ですが質問です。

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

初心者ですが質問です。

#1

投稿記事 by あっしゅ » 8年前

学校でC言語を習いたての初心者なのです。
課題でサンプル問題を関数化するという課題が出たのですが、完全に行き詰ってしまって困っています。教えてください宜しくお願いします。

コード:

#include <stdio.h>
main()
{
 int num[3][5][3];
 int i, j, k, suu = 0;
 /* 初期化 */
 for (i = 0; i < 3; i++)
 for (j = 0; j < 5; j++)
 for (k = 0; k < 3; k++)
 num[i][j][k] = 0;
 /* パターン1の設定 */
 for (j = 0; j < 5; j++)
 num[0][j][2] = 1 ;
 /* パターン2の設定 */
 for (k = 0; k < 3; k++) {
 num[1][0][k] = 1;
 num[1][2][k] = 1;
 num[1][4][k] = 1;
 }
 num[1][1][2] = 1;
 num[1][3][0] = 1;
 /* パターン3の設定 */
 for (k = 0; k < 3; k++) {
 num[2][0][k] = 1;
 num[2][2][k] = 1;
 num[2][4][k] = 1;
 }
 num[2][1][2] = 1;
 num[2][3][2] = 1 ;

 do {
 printf("数値を入力して下さい(1~3,終了=0):");
 scanf("%d", &suu);
 if (suu > 0 && suu <= 3) {
 for (j = 0; j < 5; j++) {
 for (k = 0; k < 3; k++)
 if (num[suu - 1][j][k] == 1)
 printf("■");
 else
 printf("□");
 printf("\n");
 }
 }
 } while (suu != 0);
 printf("プログラム終了");
} 



この例文の

・初期化の関数
・1の文字を作成する関数
・2の文字を作成する関数
・3の文字を作成する関数

ネットで関数の部分を調べているのですが、この例文を関数化するやりかたがわかりません。
アドバイスしていただきたいです。よろしくお願いします。

かずま

Re: 初心者ですが質問です。

#2

投稿記事 by かずま » 8年前

あっしゅ さんが書きました:ネットで関数の部分を調べているのですが、この例文を関数化するやりかたがわかりません。
3次元配列を関数に引数として渡す方法が分からないのでしょう。

まず宣言は次のようになります。

コード:

void set1(int (*num)[5][3]) または void set1(int num[][5][3])
呼び出すほうは、

コード:

    set1(num);
参考となるプログラムです。

コード:

#include <stdio.h>

void set4(int num[][5][3])
{
    for (int j = 3; j < 5; j++)
        num[0][j][0] = num[0][j][1] = 1;
    num[0][0][1] = num[0][1][1] = 1;
}

void set5(int num[][5][3])
{
    num[1][1][1] = num[1][1][2] = num[1][3][0] = num[1][3][1] = 1;
}

void set6(int num[][5][3])
{
    num[2][1][1] = num[2][1][2] = num[2][3][1] = 1;
}

int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;

    set4(num);
    set5(num);
    set6(num);

    do {
        printf("数値を入力して下さい(4~6,終了=0):");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 4 && suu <= 6) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 4][j][k] == 0)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}
いろいろいじっているので、このままでは解答になりません。
あくまでも「参考」です。
特にやってほしいことが、インデント(字下げ)です。
do文、if文、for文の始まりと終わりが一目でわかるようになっています。
中の文は一段(ここではスペース4つ)字下げされていることに注意。

プログラムが完成したら、それを貼り付けて、
解決にチェックを入れて返信してください。
わからないことがあれば、遠慮なく質問してください。

あっしゅ

Re: 初心者ですが質問です。

#3

投稿記事 by あっしゅ » 8年前

お返事ありがとうございます。

教えていただいたのは4~6の場合の時に表示させるやり方ですよね?(■と□を反転させている)

自分なりに1~3の表示の方に直してみたのですが、エラーが発生してしまいました。

どこがおかしいのか教えていただけますでしょうか。

コード:

#include <stdio.h>
 
void set1(int num[][5][3])
{
    for (int j = 0; j < 5; j++)
        num[0][j][2] = 1;
}
 
void set2(int num[][5][3])
{
  for (int k = 0; k < 5; j++){
        num[1][0][k] = num[1][2][k] = num[1][4][k] = 1;
	}
	num[1][1][2] = num[1][3][0] = 1;
}
 
void set3(int num[][5][3])
{
  for (k = 0; k < 3; k++){
	num[2][0][k] = num[2][2][k] = num[2][4][k] = 1;
	}
	num[2][1][2] = num[2][3][2] = 1 ;
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    set1(num);
    set2(num);
    set3(num);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 1][j][k] == 0)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}

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

Re: 初心者ですが質問です。

#4

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

あっしゅ さんが書きました:自分なりに1~3の表示の方に直してみたのですが、エラーが発生してしまいました。

どこがおかしいのか教えていただけますでしょうか。
  • 11行目と19行目に全角スペースがある
  • 11行目で定義されていないjが使われている(kの間違い?)
  • 19行目で定義されていないkが使われている(定義が抜けているようである)
  • 11行目のjをkに修正した場合、範囲外であるnum[1][0][3]、num[1][0][4]などに書き込んでしまう
という間違いがありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 初心者ですが質問です。

#5

投稿記事 by かずま » 8年前

あっしゅ さんが書きました:どこがおかしいのか教えていただけますでしょうか。
  • 解決していないのに、解決にチェックを入れている。
  • タイトルがおかしい。「初期化を関数にする」とか「配列を関数に渡す方法」などにしてほしかった。
  • ■と□が反対と分かっているのに直していない。
問題から外れますが、こういうのは、実行時に初期化するのではなく、
最初から初期値を持っていたほうが良いでしょう。

コード:

#include <stdio.h>

enum { _, O };

char pattern[10][5][3] = {
    O,O,O,
    O,_,O,
    O,_,O,
    O,_,O,
    O,O,O,

    _,_,O,
    _,_,O,
    _,_,O,
    _,_,O,
    _,_,O,
    
    O,O,O,
    _,_,O,
    O,O,O,
    O,_,_,
    O,O,O,
    
    O,O,O,
    _,_,O,
    O,O,O,
    _,_,O,
    O,O,O,

    O,_,O,
    O,_,O,
    O,O,O,
    _,_,O,
    _,_,O,
    
    O,O,O,
    O,_,_,
    O,O,O,
    _,_,O,
    O,O,O,
    
    O,O,O,
    O,_,_,
    O,O,O,
    O,_,O,
    O,O,O,

    O,O,O,
    O,_,O,
    _,_,O,
    _,_,O,
    _,_,O,
    
    O,O,O,
    O,_,O,
    O,O,O,
    O,_,O,
    O,O,O,
    
    O,O,O,
    O,_,O,
    O,O,O,
    _,_,O,
    O,O,O,
};

int main(void)
{
    int n;
    while (printf("数値を入力して下さい(0~9,終了=0~9以外):"),
            scanf("%d", &n) == 1 && n >= 0 && n <= 9)
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++)
                printf(pattern[n][i][j] ? "■" : "□");
            putchar('\n');
        }
    return 0;
}
0 か 1 を記憶するのに int は必要なく、char でよい。
ビットにすることもできます。

コード:

#include <stdio.h>

short pattern[10] = {
    075557, 011111, 071747, 071717, 055711,   // 7:■■■, 5:■□■
    074717, 074757, 075111, 075757, 075717,   // 4:■□□, 1;□□■
};

int main(void)
{
    int n;
    while (printf("数値を入力して下さい(0~9,終了=0~9以外):"),
            scanf("%d", &n) == 1 && n <= 9u)
        for (int i = 12; i >= 0; i -= 3) {
            int t = pattern[n] >> i;
            for (int j = 2; j >= 0; j--)
                printf(t>>j & 1 ? "■" : "□");
            putchar('\n');
        }
    return 0;
}

あっしゅ

Re: 初心者ですが質問です。

#6

投稿記事 by あっしゅ » 8年前

みけCAT さんが書きました:
あっしゅ さんが書きました:自分なりに1~3の表示の方に直してみたのですが、エラーが発生してしまいました。

どこがおかしいのか教えていただけますでしょうか。
  • 11行目と19行目に全角スペースがある
  • 11行目で定義されていないjが使われている(kの間違い?)
  • 19行目で定義されていないkが使われている(定義が抜けているようである)
  • 11行目のjをkに修正した場合、範囲外であるnum[1][0][3]、num[1][0][4]などに書き込んでしまう
という間違いがありますね。
>みけCATさん

ありがとうございます。
修正したら無事に実行することができました!

あっしゅ

Re: 初心者ですが質問です。

#7

投稿記事 by あっしゅ » 8年前

>かずまさん
理解はできていたもの、ソースが完全に修正できていませんでした。すいません。

教えていただいたソースはとてもすっきりしていてわかりやすいですね。まだ知識が足りてない部分がありますが、色々な方法があるだと感心しています。


新たな質問なのですがよろしいでしょうか。

コード:

#include <stdio.h>
 
void set1(int num[][5][3])
{
    for (int j = 0; j < 5; j++)
        num[0][j][2] = 1;
}
 
void set2(int num[][5][3])
{
  for (int k = 0; k < 5; j++){
        num[1][0][k] = num[1][2][k] = num[1][4][k] = 1;
    }
    num[1][1][2] = num[1][3][0] = 1;
}
 
void set3(int num[][5][3])
{
  for (k = 0; k < 3; k++){
    num[2][0][k] = num[2][2][k] = num[2][4][k] = 1;
    }
    num[2][1][2] = num[2][3][2] = 1 ;
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    set1(num);
    set2(num);
    set3(num);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}

このソースの

void set1(int num[][5][3])
void set2(int num[][5][3])
void set3(int num[][5][3])

この3つをまとめて1つの関数にし(例えばmatomeという関数で宣言して)

set1(num);
set2(num);
set3(num);

ここの場所をmatome();で呼び出すようにすることはできるのでしょうか?

複数の関数を1つにまとめて簡潔にするといいますか…そんな感じにしたいです。
アドバイス宜しくお願いします。

かずま

Re: 初心者ですが質問です。

#8

投稿記事 by かずま » 8年前

あっしゅ さんが書きました:このソースの
みけCATさんに指摘されたところが修正されていませんよ。
あっしゅ さんが書きました: void set1(int num[][5][3])
void set2(int num[][5][3])
void set3(int num[][5][3])

この3つをまとめて1つの関数にし(例えばmatomeという関数で宣言して)

set1(num);
set2(num);
set3(num);

ここの場所をmatome();で呼び出すようにすることはできるのでしょうか?
できます。

コード:

#include <stdio.h>
 
void matome(int num[][5][3])
{
    for (int j = 0; j < 5; j++)
        num[0][j][2] = 1;

    for (int k = 0; k < 3; k++)
        num[1][0][k] = num[1][2][k] = num[1][4][k] = 1;
    num[1][1][2] = num[1][3][0] = 1;

    for (int k = 0; k < 3; k++)
        num[2][0][k] = num[2][2][k] = num[2][4][k] = 1;
    num[2][1][2] = num[2][3][2] = 1 ;
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    matome(num);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}
matome という名前は変ですね。set か init でいいのでは?

かずま

Re: 初心者ですが質問です。

#9

投稿記事 by かずま » 8年前

パターン2とパターン3の設定を共通化できますね。

コード:

void matome(int num[][5][3])
{
    for (int j = 0; j < 5; j++)
        num[0][j][2] = 1;

	for (int i = 1; i < 3; i++)
		for (int j = 0; j < 5; j += 2)
			for (int k = 0; k < 3; k++)
				num[i][j][k] = 1;
    num[1][1][2] = num[1][3][0] = num[2][1][2] = num[2][3][2] = 1;
}

余談ですが、int num[3][5][3]; より
char pattern[3][5][3]; のほうがいいと思います。

あっしゅ

Re: 初心者ですが質問です。

#10

投稿記事 by あっしゅ » 8年前

>かずまさん
細かいご指摘ありがとうございます。見逃さないように気を付けます。
関数のまとめる方法を教えていただきありがとうございます。無事に実行できました。

更に質問なのですが、

コード:

#include <stdio.h>
 
void set(int num[][5][3])
{
    for (int j = 0; j < 5; j++)
        num[0][j][2] = 1;
 
    for (int k = 0; k < 3; k++)
        num[1][0][k] = num[1][2][k] = num[1][4][k] = 1;
    num[1][1][2] = num[1][3][0] = 1;
 
    for (int k = 0; k < 3; k++)
        num[2][0][k] = num[2][2][k] = num[2][4][k] = 1;
    num[2][1][2] = num[2][3][2] = 1 ;
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    set(num);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}
こうした場合はしっかりと結果が実行されるのですが、

コード:

#include <stdio.h>
 
void set(int num[][3])
{
    for (int j = 0; j < 5; j++)
        num[j][2] = 1;
 
    for (int k = 0; k < 3; k++)
        num[0][k] = num[2][k] = num[4][k] = 1;
    num[1][2] = num[3][0] = 1;
 
    for (int k = 0; k < 3; k++)
        num[0][k] = num[2][k] = num[4][k] = 1;
    num[1][2] = num[3][2] = 1 ;
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    set(num);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):\n");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (num[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}
こちらの少しすっきりさせた方では結果が全部□になってしまい原因がわかりません。何故でしょうか。


もう1つ

>余談ですが、int num[3][5][3]; より
char pattern[3][5][3]; のほうがいいと思います。

とありますが、この2つの違いを教えていただけますでしょうか。

宜しくお願いいたします。

かずま

Re: 初心者ですが質問です。

#11

投稿記事 by かずま » 8年前

あっしゅ さんが書きました:

コード:

void set(int num[][3])
{
    for (int j = 0; j < 5; j++)
        num[j][2] = 1;
    :::
}
 
int main(void)
{
    int num[3][5][3] = { 0 };
    int suu = 0;
 
    set(num);
こちらの少しすっきりさせた方では結果が全部□になってしまい原因がわかりません。何故でしょうか。
コンパイル時に警告が出たはずです。
何と出ましたか?
それは無視していいものだと判断したのですか?

本当に全部□ですか?
入力 1 に対してもですか?
あっしゅ さんが書きました: >余談ですが、int num[3][5][3]; より
char pattern[3][5][3]; のほうがいいと思います。

とありますが、この2つの違いを教えていただけますでしょうか。
0 か 1 しか格納しない変数なら、int(通常は 32ビット)でなくて、
char(通常は 8ビット)で十分だからです。
もちろん int でもかまいません。

最初のプログラムのコメントに /* パターン1の設定 */ とあるように
この変数は「パターン」を格納するものですよね。

pattern[num][row][col]
num: 1~3 の数(number)に対応する 0~2
row: 一つの数のパターンの行(row)
col: 一つの数のパターンの列(column)
もちろん num[j][k] でもかまいません。

あっしゅ

Re: 初心者ですが質問です。

#12

投稿記事 by あっしゅ » 8年前

>かずまさん

一応環境がないので、ideoneというブラウザでコンパイルしたのですが警告は特に出ませんでした・・・
ご指摘の通り1で実行してみたところ、6の反対の結果が出ました。

0 か 1 しか格納しない変数なら、int(通常は 32ビット)でなくて、
char(通常は 8ビット)で十分だからです。
もちろん int でもかまいません。。
なるほどですね。長いプログラムになった場合、余計な範囲を使うよりも、
適したデータ型を使用した方が処理速度が速くなるという認識でよろしいでしょうか。
最初のプログラムのコメントに /* パターン1の設定 */ とあるように
この変数は「パターン」を格納するものですよね。

pattern[num][row][col]
num: 1~3 の数(number)に対応する 0~2
row: 一つの数のパターンの行(row)
col: 一つの数のパターンの列(column)
もちろん num[j][k] でもかまいません。


patternを使用した方が一目でわかるので整理しやすいですね。
今度の課題で同じような場面に遭遇したら早速使用してみたいと思います。

前回の続きになるのですが、

コード:

#include <stdio.h>
 
void set(int pattern[][3])
{
    for (int j = 0; j < 5; j++)
        pattern[j][2] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[0][k] = pattern[2][k] = pattern[4][k] = 1;
    pattern[1][2] = pattern[3][0] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[0][k] = pattern[2][k] = pattern[4][k] = 1;
    pattern[1][2] = pattern[3][2] = 1 ;
}
 
int main(void)
{
    int pattern[3][5][3] = { 0 };
    int suu = 0;
 
    set(pattern);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):\n");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (pattern[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}

こうした場合は1以外□で表示されてしまう。

こうしてcharにした場合

コード:

#include <stdio.h>
 
void set(char pattern[][3])
{
    for (int j = 0; j < 5; j++)
        pattern[j][2] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[0][k] = pattern[2][k] = pattern[4][k] = 1;
    pattern[1][2] = pattern[3][0] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[0][k] = pattern[2][k] = pattern[4][k] = 1;
    pattern[1][2] = pattern[3][2] = 1 ;
}
 
int main(void)
{
    int pattern[3][5][3] = { 0 };
    int suu = 0;
 
    set(pattern);
 
    do {
        printf("数値を入力して下さい(1~3,終了=0):\n");
        if (scanf("%d", &suu) != 1) break;
        if (suu >= 1 && suu <= 3) {
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 3; k++)
                    if (pattern[suu - 1][j][k] == 1)
                        printf("■");
                    else
                        printf("□");
                printf("\n");
            }
        }
    } while (suu != 0);
    printf("プログラム終了");
    return 0;
}
1を入力しても全部□になってしまいます。
これはこのソースの[ ][ ]が2つの状態では正しく表示できないのでしょうか。

かずま

Re: 初心者ですが質問です。

#13

投稿記事 by かずま » 8年前

あっしゅ さんが書きました:一応環境がないので、ideoneというブラウザでコンパイルしたのですが警告は特に出ませんでした・・・
ご指摘の通り1で実行してみたところ、6の反対の結果が出ました。
ideon では、エラーが出ないと警告も表示されないのですね。
そこで、最後の行に後に xxx と書いてみました。
すると次のようなエラーメッセージが出ました。

コード:

Compilation error	time: 0 memory: 10320 signal:0
prog.c: In function ‘main’:
prog.c:22:9: warning: passing argument 1 of ‘set’ from incompatible pointer type [-Wincompatible-pointer-types]
     set(pattern);
         ^~~~~~~
prog.c:3:6: note: expected ‘int (*)[3]’ but argument is of type ‘int (*)[5][3]’
 void set(int pattern[][3])
      ^~~
prog.c: At top level:
prog.c:41:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ at end of input
 xxx
 ^~~
 
22行目: 警告: 'set' の第1引数を互換性のないポインタ型で渡している。
3行目: 注意: 'int (*)[3] が期待されるが、引数は 'int (*)[5][3]'の型です。

main では、int pattern[3][5][3]; の 3次元配列なので、
set(pattern); で set を呼び出すとき、この pattern は
int (*)[5][3] の型に変換されて、そのポインタが set に渡されます。

ところが、void set(pattern[][3]) なので、set では、
int (*)[3] の型のポインタを受け取ることになっています。

それで、警告は、互換性のないポインタだと言っているのです。

main では、1文字が 5x3 のパターンを 3文字分持っていて、その先頭の
1個のパターンへのポインタを set に渡しています。
それなのに、set では、1行3列のデータへのポインタをもらって、
それが何行か連続しているというつもりで、5行だけ処理しています。

だから、パターン1用の領域に、1、2、3 の全部のパターンを設定して、

コード:

■■■
□□■
■■■
■□■
■■■
となっています。

main の pattern は 3次元配列で、次のように設定したいんですよね。

コード:

    int pattern[3][5][3] = { // 5x3 が 3文字分
		0, 0, 1,
		0, 0, 1,
		0, 0, 1,
		0, 0, 1,
		0, 0, 1,

		1, 1, 1,
		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,
	};
set では、これを int pattern[15][3] の 2次元配列だと
思うことにして、次のようにすれば正しく設定できます。

コード:

void set(int pattern[][3])
{
    for (int j = 0; j < 5; j++)
        pattern[j][2] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[5+0][k] = pattern[5+2][k] = pattern[5+4][k] = 1;
    pattern[5+1][2] = pattern[5+3][0] = 1;
 
    for (int k = 0; k < 3; k++)
        pattern[10+0][k] = pattern[10+2][k] = pattern[10+4][k] = 1;
    pattern[10+1][2] = pattern[10+3][2] = 1 ;
}

でも、こんなことをするのは邪道です。
すっきりしているとは、とても言えません。

-------------------------------------------------------
あっしゅ さんが書きました:なるほどですね。長いプログラムになった場合、余計な範囲を使うよりも、
適したデータ型を使用した方が処理速度が速くなるという認識でよろしいでしょうか。
いいえ、処理速度というよりも、メモリを無駄に使うと、大きなデータを
扱うときに、プログラムの実行そのものがができなくなることがあると
いうことです。
あっしゅ さんが書きました: こうしてcharにした場合

コード:

#include <stdio.h>
 
void set(char pattern[][3])
{
    :::
}
 
int main(void)
{
    int pattern[3][5][3] = { 0 };
1を入力しても全部□になってしまいます。
これはこのソースの[ ][ ]が2つの状態では正しく表示できないのでしょうか。
set のほうだけ char にすると無茶苦茶になります。
main も char にしてください。

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

Re: 初心者ですが質問です。

#14

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

あっしゅ さんが書きました:一応環境がないので、ideoneというブラウザでコンパイルしたのですが警告は特に出ませんでした・・・
Wandboxを使えば、警告を出してくれます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あっしゅ

Re: 初心者ですが質問です。

#15

投稿記事 by あっしゅ » 8年前

>かずまさん

お返事遅くなってすいません。PCが壊れていました。

ご丁寧に説明ありがとうございます。
C言語の勉強も少しずつ進み、質問した時よりも大分理解できるのがわかります。
助かりました!また何かあれば質問させていただきます。

あっしゅ

Re: 初心者ですが質問です。

#16

投稿記事 by あっしゅ » 8年前

>みけさん
そのようなのもあるのですね!ありがとうございます。
今はVisual Studioを導入したのでもりもり勉強させていただきます。

返信

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