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

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

 詳しくはこちら



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

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


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

No.18346

二次元配列について2
投稿者---ライガー(2004/11/24 18:22:30)


前のレスが長くなったので新規に作りました。
今回は題名とは関係ないのですが・・・goto文について質問です。

for(x=0; x<20; x++){
    for{
        if{
            for{
                if{
                    if{
                    
                    }
                    else{
                        goto LABEL;
                    }
                }
            }
        }
    }
    LABEL;
}

このようにして、最初のループに戻りたいのですが、調べたところ
LABEL;の後に実行文を書かなければコンパイラによってエラーが
出ると聞いたのですが、私のところではエラーとなります。
(エラー内容は「LABELが定義されてません」です。
 参考書を見たら定義はしてなかったのですが)
(ちなみにVisual C++です)
ただ最初のループに戻りたいときは、どんな実行文を書くのですか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:二次元配列について2 18348 ニタチ 2004/11/24 18:31:36
<子記事> Re:二次元配列について2 18350 NykR 2004/11/24 18:52:52
<子記事> Re:二次元配列について2 18352 shu 2004/11/24 18:57:35


No.18348

Re:二次元配列について2
投稿者---ニタチ(2004/11/24 18:31:36)


    LABEL;
セミコロンではなくて、コロン(:)です。



この投稿にコメントする

削除パスワード

No.18349

Re:二次元配列について2
投稿者---ライガー(2004/11/24 18:50:34)


コロンにしたら、エラー内容が
「構文エラー : ';' が '}' の前に必要です。」
になったんですけど・・・


この投稿にコメントする

削除パスワード

No.18351

Re:二次元配列について2
投稿者---monkey(2004/11/24 18:54:51)


>コロンにしたら、エラー内容が
>「構文エラー : ';' が '}' の前に必要です。」
>になったんですけど・・・

ラベルの後には文が必要です。
gotoによるジャンプ先で何もすることがないときは「空文」を書きましょう。
    LABEL:
        ; // 空文
}




この投稿にコメントする

削除パスワード

No.18350

Re:二次元配列について2
投稿者---NykR(2004/11/24 18:52:52)


> 今回は題名とは関係ないのですが・・・

何でそういうことするかな。

|【掲示板ご利用上の注意】
|
| ※題名は具体的に!

って書いてあるでしょ。


> LABEL;の後に実行文を書かなければコンパイラによってエラーが
>     :
> ただ最初のループに戻りたいときは、どんな実行文を書くのですか?

名札付き文の構文は

識別子:文

ですが、この場所で特にすることがない場合は、文のところに何もしない文を書けばいいです。;とか{}とか。

LABEL:;

のような感じで。


この投稿にコメントする

削除パスワード

No.18354

Re:二次元配列について2
投稿者---ニタチ(2004/11/24 19:10:57)


あれれ、今までgoto文について誤った認識をしてたみたい。。。
ってことは、以下がコンパイル&実行できるのはダメってことですよね?
(WindowsXP Borland C++Builder 6)

#include<stdio.h>

int main(void) {
    int x, y;
    
    for (x = 0; x < 10; x++) {
        for(y = 0; y < 10; y++) {
            if (x == 5 && y == 5) {
                printf("%d %d\n", x, y);
                goto LABEL;
            }
        }
    LABEL:
    }

    return 0;
}





この投稿にコメントする

削除パスワード

No.18352

Re:二次元配列について2
投稿者---shu(2004/11/24 18:57:35)


題名が不適切です。

gotoについて聞きたいのなら、そういう題名に!

……
いろいろ考えたのですが、前のスレッドが長くなったのも、
『二次元配列の交換』のみの内容に、しぼらなかったからでしょう。


この投稿にコメントする

削除パスワード

No.18353

Re:二次元配列について2
投稿者---ライガー(2004/11/24 19:06:43)


返信ありがとうございます。
題名については、一応前に質問したプログラムに関係すること
だったのでタイトルを変えるか迷って、これにしました。
次回から気をつけます。



この投稿にコメントする

削除パスワード

No.18365

Re:二次元配列について2
投稿者---ホワイト(2004/11/25 10:24:12)


goto文を使うこと自体オススメしません。
whileやforをうまく使えば必要のないものですから




この投稿にコメントする

削除パスワード

No.18369

Re:二次元配列について2
投稿者---REE(2004/11/25 11:10:55)


>goto文を使うこと自体オススメしません。
>whileやforをうまく使えば必要のないものですから

確かに、goto文を濫用するのはよくありませんが、絶対に使わない方が良いというものでもありません。
2重以上のループから抜けたい時には、gotoを使った方がよい場合はよくあります。
小技でgotoを避けられたとしても、可読性が落ちては無意味です。



この投稿にコメントする

削除パスワード

No.18410

Re:二次元配列について2
投稿者---ホワイト(2004/11/26 18:02:34)


>確かに、goto文を濫用するのはよくありませんが、絶対に使わない方が良いというものでもありません。
>2重以上のループから抜けたい時には、gotoを使った方がよい場合はよくあります。
>小技でgotoを避けられたとしても、可読性が落ちては無意味です。

goto文に関する面白い掲示板がありました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=11153&forum=25&94


この投稿にコメントする

削除パスワード

No.18372

Re:二次元配列について2
投稿者---shu(2004/11/25 12:14:14)


勉強がてら、自分でも作ってみたので、参考にどうぞ。
/*
    赤い部分は、総当りの為のループ。
    
    緑の部分は、重複、例外の為の条件。
    前半は、交換元と交換先の配列が重複しない様に、
    後半は、交換元と交換先のデータ(1か0)が、
    同じなら交換する意味が無いので、条件にいれる。
    (0か1以外のデータが入っていると、
    data[y1][x1] != data[y2][x2]の条件が、正常に動作しないので、
    最初にcheck_data()の処理をいれた。)
    
    青い部分は、評価するデータの渡し方。
    考えてみると、評価が変化するのは、
    交換元の行と、交換先の行だけなので、
    それを、引数として、評価関数に渡す。
    
    評価関数内部について。
    行頭から、2個ずつのデータを比較していく。
    交互にデータ内容が違う状態(理想値)、
    に近づくほど、ポイントが高くなる様にした。
    (このときにも、check_data()が活きてくる。)
*/

#include <stdio.h>

#define NIN 20
#define DAY 20

void check_data( int data[][DAY] );
int hyouka( int y1[], int y2[] );
void swap( int *xy1, int *xy2 );

int main( void )
{
    int data[NIN][DAY] = {0};
    int hyoukas1 = 0, hyoukas2 = 0;
    int x1, x2, y1, y2;
        
    check_data( data );
    
    for (y1 = 0; y1 < NIN; y1++)
    for (x1 = 0; x1 < DAY; x1++)
    for (y2 = 0; y2 < NIN; y2++)
    for (x2 = 0; x2 < DAY; x2++)
        if (x1 != x2 || y1 != y2
            && data[y1][x1] != data[y2][x2]) {
            
            hyoukas1 = hyouka( data[y1], data[y2] );
            
            swap( &data[y1][x1], &data[y2][x2] );
            
            hyoukas2 = hyouka( data[y1], data[y2] );
            
            if (hyoukas1 >= hyoukas2)
                swap( &data[y1][x1], &data[y2][x2] );
        }
    
    return 0;
}
void check_data( int data[][DAY] )
{
    int i, j;
    
    for (i = 0; i < NIN; i++)
        for (j = 0; j < DAY; j++)
            if (data[i][j] != 0 && data[i][j] != 1) {
                fprintf( stderr, "data[%d][%d] is NG\n", i, j );
                exit( 1 );
            }
}
int hyouka( int y1[], int y2[] )
{
    int point1 = 0, point2 = 0;
    int i;
    
    for (i = 0; i < DAY - 1; i++)
        if (y1[i] != y1[i + 1])
            point1++;
            
    for (i = 0; i < DAY - 1; i++)
        if (y2[i] != y2[i + 1])
            point2++;
    
    return point1 + point2;
}
void swap( int *xy1, int *xy2 )
{
    int tmp;
    
    tmp = *xy1;
    *xy1 = *xy2;
    *xy2 = tmp;
}



この投稿にコメントする

削除パスワード

No.18454

Re:二次元配列について2
投稿者---ライガー(2004/11/29 20:51:58)


返信遅くなってすいません。みなさんアドバイスありがとうございます。
syuさんは違うやり方のプログラムまで書いて下さってありがとうございます。
syuさんのやり方だとgoto文も使わないで良いのですね。
早速このやり方でやろうとdata[][]に初期解を入れてやってみたのですが
並び替え後の結果が出てきませんでした。
何か付け足し忘れてますか?




この投稿にコメントする

削除パスワード

No.18455

Re:二次元配列について2
投稿者---ライガー(2004/11/29 21:07:20)


一応プログラムをのせておきます。
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <memory.h>

#define NUMBER 400  /* 必要人数*/

#define NIN 20
#define DAY 56

void check_data( int data[][DAY] );
int hyouka( int y1[], int y2[] );
void swap( int *xy1, int *xy2 );

int main( void )
{
    
    int data[NIN][DAY] = {
      {2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,0,0,0,0,0,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,},
      {0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,3,3,2,2,2,2,2,3,3,},
   
  };
    int hyoukas1 = 0, hyoukas2 = 0;
    int x1, x2, y1, y2;
    int i,j,k,counter;

    srand((unsigned)time(NULL));
    for(counter = 0; counter < NUMBER; counter++)
    {
        i = rand() % NIN;
        j = rand() % DAY;

        if(data[i][j] == 0)
        {
            k = data[i][j];
            data[i][j] = 1;
        }
        else
        {
        counter--;
        }

    }  

    printf("---------初期の勤務状況\n"); 
    for (i = 0; i < NIN; i++)
    {
        for (j = 0; j < DAY; j++)
        {
        printf("%d",data[i][j]);
        if(j  == 55)
            printf("\n");
        }      
    } 
        
    check_data( data );
    
    for (y1 = 0; y1 < NIN; y1++)
    for (x1 = 0; x1 < DAY; x1++)
    for (y2 = 0; y2 < NIN; y2++)
    for (x2 = 0; x2 < DAY; x2++)
        if (x1 != x2 || y1 != y2
            && data[y1][x1] != data[y2][x2]) {
            
            hyoukas1 = hyouka( data[y1], data[y2] );
            
            swap( &data[y1][x1], &data[y2][x2] );
            
            hyoukas2 = hyouka( data[y1], data[y2] );
            
            if (hyoukas1 >= hyoukas2)
                swap( &data[y1][x1], &data[y2][x2] );
        }

        printf("---------並び替え後の勤務状況\n"); 
        for (i = 0; i < NIN; i++)
        {
            for (j = 0; j < DAY; j++)
            {
            printf("%d",data[i][j]);
            if(j  == 55)
                printf("\n");
            }     
        } 

    return 0;
}
void check_data( int data[][DAY] )
{
    int i, j;
    
    for (i = 0; i < NIN; i++)
        for (j = 0; j < DAY; j++)
            if (data[i][j] != 0 && data[i][j] != 1) {
                fprintf( stderr, "data[%d][%d] is NG\n", i, j );
                exit( 1 );
            }
}
int hyouka( int y1[], int y2[] )
{
    int point1 = 0, point2 = 0;
    int i;
    
    for (i = 0; i < DAY - 1; i++)
        if (y1[i] != y1[i + 1])
            point1++;
            
    for (i = 0; i < DAY - 1; i++)
        if (y2[i] != y2[i + 1])
            point2++;
    
    return point1 + point2;
}
void swap( int *xy1, int *xy2 )
{
    int tmp;
    
    tmp = *xy1;
    *xy1 = *xy2;
    *xy2 = tmp;
}






この投稿にコメントする

削除パスワード

No.18463

Re:二次元配列について2
投稿者---shu(2004/11/30 17:00:23)


このスレッドは、gotoについて聞きたかったんですよね。
gotoについては、理解できましたか
自分で質問したのなら、理解してください

その上で、gotoを使わない方法に、乗り換えてください。
結果として、gotoについての今回のスレッドは、解決したものと考えます。


おまけ(返信不要)

>何か付け足し忘れてますか?

そう、思ったのなら、何か付け足してください。
参考にならないのなら、使わないでください。
良くわからないまま、使わないでください。責任持てません。
ライガーさんの思い通りの、プログラムを書かなかった私が悪いのでしょうか?

……syuじゃなくて、shuより。


この投稿にコメントする

削除パスワード

No.18456

Re:二次元配列について2
投稿者---shu(2004/11/29 22:43:03)


exit()を使用しているので、

#include <stdlib.h>

が抜けていました。


この投稿にコメントする

削除パスワード

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