配列の取り出し

[戻る]
貞松 2004/01/08(木) 14:28:04
  count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * *   * * * 
*   *     *   *
*   *       *
*

このような形で配列として取り出したいのですが、方法が分かりません。
本当に宜しくお願いします。
現在*の値を左上から順番(この図ですと)に取り出すところまでできています。

ptr= &A;//ポインタ
ER[count][turn]= *ptr;

貞松 2004/01/08(木) 14:49:33
Aには*が全て格納されています。

for(count=0 ; count<10; count++){
for(turn=0 ; turn<10; turn++){
/*
何らかの処理によってAを計算する。
そのときAは10個以内の値です。
*/ 

ptr= &A;//ポインタ
ER[count][turn]= *ptr;
}
}

貞松 2004/01/08(木) 15:25:12
  count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * *   * * * 
*   *     *   *
*   *       *
*
この隙間を0で埋めることはできるのでしょうか?
宜しくお願いします。

貞松 2004/01/08(木) 16:20:41
ずっとつまっています。
どなたかご教授ください!お願いします。
  count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * *   * * * 
*   *     *   *
*   *       *
*
この配列の隙間を0で埋め以下のようにする方法はありますか?
  count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * * 0 * * * 
* 0 * * 0 0 * *
* 0 0 * 0 0 0 *
* 0 0 0 0 0 0 0

n [E-Mail] 2004/01/08(木) 16:29:33
ERの型は何ですか?

2004/01/08(木) 16:30:52
> どなたかご教授ください!お願いします。

質問内容がよく理解できないのでお答えするのは難しいです。

とりあえず、下記内容を明確にしてはどうでしょう。

1.質問内容に出てくる変数の型(一つも書いてないのでよくわからないです)

2.元になるデータが具体的に、どのように格納されているか不明

3.開発環境が不明(VCのバージョン、MFCの使用有無等)

質問の前提条件が明確になれば、ひょっとしたら回答もくるかもしれません。

貞松 2004/01/08(木) 16:41:09
皆様有難うございます。
ERの方はdoubleです。
>1.質問内容に出てくる変数の型(一つも書いてないのでよくわからないです)

>2.元になるデータが具体的に、どのように格納されているか不明
上に示しましたとおり
Aには*が全て格納されています。
for(count=0 ; count<10; count++){
for(turn=0 ; turn<10; turn++){
/*
for{
何らかの処理によってAを計算する。
そのときAは10個以内の値です。
(ここではAがある値がきたらbreakする。)
}
*/ 

ptr= &A;//ポインタ
ER[count][turn]= *ptr;
}
}

そのためAには1つのデータの時もあれば6つ、5つといった値のときもあります。
そこで、breakしたらそのあとは0にしてすべて同じ個数で統一したいのですが分かりま
せん。

 count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * * 0 * * * 
* 0 * * 0 0 * *
* 0 0 * 0 0 0 *
* 0 0 0 0 0 0 0


本当に申し訳ないです。宜しくお願いします。

>3.開発環境が不明(VCのバージョン、MFCの使用有無等)
windowsXP VC++6.0 コンソールアプリです。

επιστημη [E-Mail] [HomePage] 2004/01/08(木) 16:43:03
最初に全部0で埋めとくというのはダメなんですか?

貞松 2004/01/08(木) 16:46:09
あとすいません。

以下は理想の形で
 count⇒ 
1 2 3 4 5 6 7 8  下:turn 
* * * * * * * *    
* * * * 0 * * * 
* 0 * * 0 0 * *
* 0 0 * 0 0 0 *
* 0 0 0 0 0 0 0

現在は
1
* 
*
*
*
*
2
*
*
0
0
0
3  といったような出力になっています。

貞松 2004/01/08(木) 16:48:01
皆様方いろいろ有難うございます。
>最初に全部0で埋めとくというのはダメなんですか?
0が収束値ではないです。

επιστημη [E-Mail] [HomePage] 2004/01/08(木) 16:52:50
>> 最初に全部0で埋めとくというのはダメなんですか?
> 0が収束値ではないです。

はぁ? あなたのこれまでの説明はウソだったのですか?

隙間を埋める値は0とは限らないということですか?
絶対に用いられない値で埋めておき、あとでその値のとこだけ
すりかえてしまうのは?

貞松 2004/01/08(木) 16:56:18
>最初に全部0で埋めとくというのはダメなんですか?
すいません。隙間は0で埋めておきたいです。

2004/01/08(木) 17:06:16
結局やりたい事はわからないのですが、何かの参考になればレベルのサンプルです。

char A[] = { '*', '*', '*', '*', '*', '*', '*', '*',
             '*', '*', '*', '*', ' ', '*', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } ;

int main()
{
    int turn, count ;
    double ER[10][10] ;

    printf(" count⇒ \n");
    printf("1 2 3 4 5 6 7 8  下:turn \n");

    /* Aには*が全て格納されています。 */
    for(turn=0 ; turn<10; turn++){
        for(count=0 ; count<10; count++){

            printf("%c", A[turn*8+count]);

            /*
            for{
            何らかの処理によってAを計算する。
            そのときAは10個以内の値です。
            (ここではAがある値がきたらbreakする。)
            }
            */ 

            /* ptr= &A;//ポインタ     */ /* これはよくわからない */
            /* ER[count][turn]= *ptr; */
        }
        printf("\n") ;
    }
}

※コンパイルとかしてません。

επιστημη [E-Mail] [HomePage] 2004/01/08(木) 17:11:46
>> 最初に全部0で埋めとくというのはダメなんですか?
> すいません。隙間は0で埋めておきたいです。

ワケわかんね。

全部0で埋めておいて、そこにデータを載せていけばいいんじゃないのかなぁ…

貞松 2004/01/08(木) 17:29:06
// 練習1.cpp : コンソール アプリケーション用のエントリ ポイントの定義
//
皆様有難うございます。
皆様すいません。表現力が乏しいので申し訳ないです。
宜しくお願いします。
#include"stdafx.h"

#include <stdio.h>

 
int main()
{
    int turn, count ;
    double ER[10][10] ;

    printf(" count⇒ \n");
    printf("1 2 3 4 5 6 7 8  下:turn \n");

    /* Aには*が全て格納されています。 */
    for(turn=0 ; turn<10; turn++){
        for(count=0 ; count<10; count++){
        
            /*
            for{
            何らかの処理によってAを計算する。
            そのときAは10個以内の値です。
            (ここではAがある値がきたらbreakする。)
            }
            */ 
              ptr= &A;//ここでcountごとに出力されるAを取り出します。 
             ER[count][turn]= *ptr; 
                printf("%c",ER[count][turn]);
//ここで以下のように出力されます。
/*        
1(space)
* 
*
*
*
*
2(space)
*
*
3(space)
count分続く
               
この並びをんさんが書いてくださったような以下のような並びに変換します   */
           
        }
        printf("\n") ;
    }

}//main
/*
char A[] = { '*', '*', '*', '*', '*', '*', '*', '*',
             '*', '*', '*', '*', ' ', '*', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } ;
*にはdoubleの数値が入りましてスペースには0が入るもの
を最終的に出力したいと考えています。

επιστημη [E-Mail] [HomePage] 2004/01/08(木) 17:32:56
…さっぱりわからん。四角く表示したいってこと?
# 単に表示上の問題?

二重ループを抜けてから、再度countとturnを入れ替えた
二重ループを用意し、その中で書けば?

2004/01/08(木) 17:37:37
結局変数 A の型はなんなのですか?
「変数の型を教えてください」としても変数いっこ分しか
教えてもらえないのでは質問内容の理解はできません。

面倒ならばプログラムをここに全て掲載してください。
下手に質問するよりも人に理解してもらえます。

sugar 2004/01/08(木) 18:07:48
「配列の取り出し」というタイトルですが、
取り出したいデータが格納されている配列は、
ERですか、Aですか?

>     double ER[10][10] ;
なのに、
>             ptr= &A;//ここでcountごとに出力されるAを取り出します。 
>             ER[count][turn]= *ptr; 
ってどうなんでしょうね。
ER[x][x]には本当にdouble型の値が入るのでしょうか…。
データ型の認識をキチンと整理した方がいいように思います。

>             printf("%c",ER[count][turn]);
double型を%cでprintfすると、どうなるんだろう…?

PATIO 2004/01/08(木) 19:57:56
思うに貞松さん自身が問題をよく整理できていないような気がします。
よく把握できていない状態で説明しようとしているためにかえって
周りが混乱しているような。

どうしてもうまく説明できないようであれば、
こういうプログラムを作る基になったものを丸のまま載せた方が良いかも
知れないです。

何か、課題とか、練習問題とかなんではないですか?
あと、ここに出てるソースって実際にあなたが作成して動かしたけれど
うまくいかなって言うコードですか?
実際には具体的なコードの提示も出来ていないような気がしますけれど。

貞松 2004/01/08(木) 20:16:39
皆さま
有難うございます。
お手数おかけしています。
以下にソースを提示します。
修正をしていたため時間がかかってしまいました。
申し訳ございません。
宜しくお願いいたします。
#include"stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main()
{
int turn, count ;
double k ,A, *ptr;
double ER[10][10] ;
double B[10];
srand((unsigned int)time(NULL));/**/
    /* Aには*が全て格納されています。 */
 int D=0;k=0;
 for(count=0 ; count<10; count++){  
       
         
        for(turn=0 ; turn<10; turn++){//繰り返し
          
            for (int  isample=0; isample <100; isample++) {
               
               k = (double)(rand()/(double)RAND_MAX - 0.5) * 2;
                B[isample]=k;
            
         //printf("%f\n",B[isample]);
        }      
            
                for(int i=0+D ; i<10+D; i++){
          A=turn+B[i];
                }
             ptr= &A;//ここでcountごとに出力されるAを取り出します。 
             ER[count][turn]= *ptr; 
              printf("%f\n",ER[count][turn]);
    if (A  >4) 
    {
        break;
    }
     
             //ここで以下のように出力されます。
/*        
1(space)
* 
*
*
*
*
2(space)
*
*
3(space)
count分続く
          
  
この並びをんさんが書いてくださったような以下のような並びに変換します   */
           
        }//turn
        printf("\n") ;
  

}//count

return 0;
}//main
/*
double A[] = { '*', '*', '*', '*', '*', '*', '*', '*',
             '*', '*', '*', '*', ' ', '*', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } ;
*にはdoubleの数値が入りましてスペースには0が入るもの
を最終的に出力したいと考えています。
*/

貞松 2004/01/08(木) 20:18:54
上記のDは消し忘れです。すいません。

PIP 2004/01/08(木) 22:10:34
とりあえずインデントを整理したぞ。

//**************************************************************************
#include "stdafx.h"

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

int main()
{
    int    turn, count;
    double k ,A, *ptr;
    double ER[10][10];
    double B[10];
    
    srand((unsigned int)time(NULL));
    
    /* Aには*が全て格納されています。 */
    k=0;
    
    for(count=0; count<10; count++){
        for(turn=0; turn<10; turn++){//繰り返し
            for (int isample=0; isample <100; isample++) {
                k = (double)(rand()/(double)RAND_MAX - 0.5) * 2;
                B[isample]=k;
            }
            
            for(int i=0; i<10; i++){
                A=turn+B[i];
            }
                
            ptr= &A;//ここでcountごとに出力されるAを取り出します。
            ER[count][turn]= *ptr;
            printf("%f\n",ER[count][turn]);
            
            if (A > 4) {
                break;
            }
            
//ここで以下のように出力されます。
/*        
1(space)
* 
*
*
*
*
2(space)
*
*
3(space)
count分続く


この並びをんさんが書いてくださったような以下のような並びに変換します
*/

        }//turn
    printf("\n");
    }//count

    return 0;
}//main

/*
double A[] = { '*', '*', '*', '*', '*', '*', '*', '*',
             '*', '*', '*', '*', ' ', '*', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', '*', '*',
             '*', ' ', '*', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', '*', ' ', ' ', ' ', '*',
             '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } ;
*にはdoubleの数値が入りましてスペースには0が入るもの
を最終的に出力したいと考えています。
*/

貞松 2004/01/08(木) 22:15:35
RIPさん
有難うございます。

tib 2004/01/08(木) 22:22:00
> double B[10];
> ...
> for (int isample=0; isample <100; isample++) {
>     k = (double)(rand()/(double)RAND_MAX - 0.5) * 2;
>     B[isample]=k;
> }
Bは10個分しか領域を確保していないのに、100まで代入しようとしていますがいいのですか?

> for(int i=0; i<10; i++){
>     A=turn+B[i];
> }
iが0〜8の時の計算は全て無視され、iが9の時の計算のみがAに代入されますが、いいので
すか?


結局「*」という文字を出力したいのですか? doubleの数値を出力したいのですか? 後者
ならば「12.345」のように桁数を揃えたい、という事ですか?

tib 2004/01/08(木) 22:45:23
ひとつ付け足し。

> double B[10];
> ...
> for (int isample=0; isample <100; isample++) {
>     k = (double)(rand()/(double)RAND_MAX - 0.5) * 2;
>     B[isample]=k;
> }
> for(int i=0; i<10; i++){
>     A=turn+B[i];
> }
Bは領域がないながらも100個分計算しているのに、それに続くforループでは10個分しか
参照されていません。最初のforループは単に10を100と間違えているだけですか?

tib 2004/01/08(木) 22:47:23
結局こういうことをしたいのでしょうか。
多分、ポイントは「わざわざ配列変数に入れたんだから、計算する部分と出力する部分を
分ける」という事ではないかと。

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

#define    SIZE    10
int main()
{
    int    turn, count;
    double A;
    double ER[SIZE][SIZE];
    double B[SIZE];

    srand((unsigned int)time(NULL));

    //    ERを初期化 (全ての領域にゼロを代入しておく)
    for( count=0; count<SIZE; count++ )
    {
        for( turn=0; turn<SIZE; turn++ )
        {
            ER[count][turn]    =    0.0;
        }
    }

    //    なんらかの計算をして、その結果をERに代入
    for( count=0; count<SIZE; count++ )
    {
        for( turn=0; turn<SIZE; turn++ )
        {
            for( int isample=0; isample<SIZE; isample++ )
            {
                B[isample] = (double)(rand()/(double)RAND_MAX - 0.5) * 2;
            }

            for( int i=0; i<SIZE; i++ )
            {
                A=turn+B[i];
            }

            ER[count][turn]= A;
            if( A > 4 )                break;
        }
    }

    //    ERの出力 (値の入っていない所は0.000で出力する版)
    for( turn=0; turn<SIZE; turn++ )
    {
        for( count=0; count<SIZE; count++ )
        {
            printf( "%6.3f ", ER[count][turn] );
        }
        printf( "\n" );
    }
    printf( "\n" );

    //    ERの出力 (値の入っていない所は空白で出力する版)
    for( turn=0; turn<SIZE; turn++ )
    {
        for( count=0; count<SIZE; count++ )
        {
            if( ER[count][turn] != 0.0 )    printf( "%6.3f ", ER[count][turn] );
            else                            printf( "       " );
        }
        printf( "\n" );
    }
    return 0;
}

PIP 2004/01/08(木) 22:49:25
えーと、
>RIPさん
>有難うございます。
×R
○P
です。


文法的なおかしさはほかの人が突っ込んでくれると思うので、
それ以外のところを。

kの値は+1 or -1なので、double型はすべてintでいいと思います。
for(int isample=0; isample<100; ++i) {
    B[isample] = (rand() % 2 - 1) * 2;
}

PIP 2004/01/08(木) 23:03:27
すいません。間違えました。

>for(int isample=0; isample<100; ++i) {
>    B[isample] = (rand() % 2 - 1) * 2;
>}

for(int isample=0; isample<100; ++i) {
    B[isample] = rand() % 2 * 2 - 1;
}

PATIO 2004/01/09(金) 09:31:03
貞松さんが出したいようにするのであれば、
表示結果でみた時に横一列の並びは一つの文字列に編集して出すべきだと
思います。
貞松さんのソースでは、一文字出力するごとに改行しているので
今の出力結果になるのは当然の話です。
ところで、\nが改行だと言う認識はされているのですよね。

επιστημη [E-Mail] [HomePage] 2004/01/09(金) 10:15:54
要するにひとつの二重ループで値の設定と印字を
やろうとしていたところで躓いたってことかしら?

貞松 2004/01/09(金) 10:56:23
[[解決]]
皆様有難うございました。
初心者のため、表現に苦労しました。
tibさんの書いていただいたことがやりたかったわけです。
本当に感謝します。
有難うございました。

古いスレッドには追加発言できません。