C言語関係掲示板

過去ログ

No823 共用体でベクトル計算

[戻る] [ホームページ]
No.10410

共用体でベクトル計算
投稿者---トト(2003/11/10 18:16:43)


このプログラムを共用体を用いるとどのようになるんですか。
一応共用体の定義だけできたのですがこのあとどうするのかが
よくわかりません。
もしよろしければ教えて下さい。


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

typedef union {
    int number;
    double element;
} Vector;

int raedNumberofElements(int , char *[]);
void vectorSum(int, const double *, const double *, double *);

int main(int argc, char *argv[])
{
    double *vectorA, *vectorB, *vectorC, *p_element;
    int n, i;

    n = raedNumberofElements(argc, argv);
    if (n <= 0) {
        return -1;
    }
    vectorA=(double *)malloc(n*sizeof(double));
    vectorB=(double *)malloc(n*sizeof(double));
    vectorC=(double *)malloc(n*sizeof(double));

    p_element = vectorA;
    printf("ベクトルaの各要素を入力して下さい\n");
    for (i = 0; i < n; i++){
        printf("ベクトルaの%d番目の要素: ", i + 1);
        scanf("%lf", p_element);
        p_element++;
    }
    printf("\n");
    p_element = vectorB;
    printf("ベクトルbの各要素を入力して下さい\n");
    for (i = 0; i < n; i++){
        printf("ベクトルbの%d番目の要素: ", i + 1);
        scanf("%lf", p_element);
        p_element++;
    }
    printf("\n");

    vectorSum(n,vectorA,vectorB,vectorC);
   
    p_element = vectorC;
    printf("ベクトルの和を出力します\n");
    for (i = 0; i < n; i++){    
        printf("和の%d番目の要素: ", i + 1);	
        printf("%10f\n", *p_element);
        p_element++;
    }

    free(vectorA); vectorA = NULL;
    free(vectorB); vectorB = NULL;
    free(vectorC); vectorC = NULL;
    return 0;
}

int raedNumberofElements(int argc, char *argv[])
{
    int n;

    if (argc <= 1) {
        printf("引数がありません\n");
        return -1;
    } else if (argc >= 3) {
        printf("引数が多すぎます。\n");
        return -1;
    } else {
      n=atoi(argv[1]);
      
        if (n <= 0) {
            printf("1以上の整数を指定して下さい\n");
            return -1;
	}
	    
        return n;
    }
}

void vectorSum(int n, const double *vectorA, const double *vectorB, double *vectorC)
{
  int x=0;
  while(x<n)
    {
      *vectorC=*vectorA+*vectorB;    
      vectorA++;
      vectorB++;
      vectorC++;
      x++;
    }
  return;
}



1. 起動時にコマンドラインオプションとして整数を1つとりそれをベクトルの要素数とする。この値をnに代入する。

2. malloc() を使ってVector型のn+1個分のメモリーを2つ用意し、それぞれの先頭アドレスをvectorA, vectorB に入れる。

3. vectorAとvectorBの先頭に要素数を入れ、標準入力からn個の実数を2組読み込み vectorA と vectorB に順次格納する。

4. 関数 vectorSum() を呼び出してベクトルの和を計算する。

5. 計算結果を出力して終了する。

malloc() を使うときは必ず返り値がNULLでないことを確認すること。NULLのときはメモリの確保に失敗したなどと表示してプログラムを終了すること。

No.10438

Re:共用体でベクトル計算
投稿者---たか(2003/11/11 19:02:57)


>このプログラムを共用体を用いるとどのようになるんですか。
>一応共用体の定義だけできたのですがこのあとどうするのかが
>よくわかりません。
>もしよろしければ教えて下さい。

構造体のポインタと同様に扱えばよいと思います。

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

typedef union {
    int number;
    double element;
} Vector;

int raedNumberofElements(int, char *[]);
void vectorSum(const Vector *, const Vector *, Vector *);

int main(int argc, char *argv[])
{
    Vector *vectorA, *vectorB, *vectorC, *p_element;
    int n, i;

    n = raedNumberofElements(argc, argv);
    if (n <= 0) return -1;

    if ((vectorA = (Vector *)malloc((n + 1) * sizeof(Vector))) == NULL 
    ||  (vectorB = (Vector *)malloc((n + 1) * sizeof(Vector))) == NULL
    ||  (vectorC = (Vector *)malloc((n + 1) * sizeof(Vector))) == NULL) {
      printf("メモリが足りません。\n");
      exit(1);
    }

    vectorA->number = vectorB->number = vectorC->number = n;
    p_element = vectorA + 1;
    printf("ベクトルaの各要素を入力して下さい\n");
    for (i = 1; i <= n; i++){
        printf("ベクトルaの%d番目の要素: ", i);
        scanf("%lf", &p_element->element);
        p_element++;
    }
    printf("\n");
    p_element = vectorB + 1;
    printf("ベクトルbの各要素を入力して下さい\n");
    for (i = 1; i <= n; i++){
        printf("ベクトルbの%d番目の要素: ", i);
        scanf("%lf", &p_element->element);
        p_element++;
    }
    printf("\n");

    vectorSum(vectorA, vectorB, vectorC);
   
    p_element = vectorC + 1;
    printf("ベクトルの和を出力します\n");
    for (i = 1; i <= n; i++){    
        printf("和の%d番目の要素: ", i);
        printf("%10f\n", p_element->element);
        p_element++;
    }

    free(vectorA); vectorA = NULL;
    free(vectorB); vectorB = NULL;
    free(vectorC); vectorC = NULL;
    return 0;
}

int raedNumberofElements(int argc, char *argv[])
{
  int n;

  if (argc <= 1) {
    printf("引数がありません\n");
    return -1;
  } else if (argc >= 3) {
    printf("引数が多すぎます。\n");
    return -1;
  } else {
    n = atoi(argv[1]);
      
    if (n <= 0) {
      printf("1以上の整数を指定して下さい\n");
      return -1;
    }
    return n;
  }
}

void vectorSum(const Vector *vectorA, const Vector *vectorB, Vector *vectorC)
{
  int x = 0, n = vectorC->number = vectorA->number;
  
  while (x < n) {
      vectorA++;
      vectorB++;
      vectorC++;
      vectorC->element = vectorA->element + vectorB->element;    
      x++;
  }
}


No.10439

Re:共用体でベクトル計算
投稿者---たか(2003/11/11 19:34:06)


ちょっと修正です。

void vectorSum(const Vector *vectorA, const Vector *vectorB, Vector *vectorC)
{
  int x = 0, n = vectorA->number;
  
  while (x < n) {
      vectorA++;
      vectorB++;
      vectorC++;
      vectorC->element = vectorA->element + vectorB->element;    
      x++;
  }
}


No.10472

ほんと助かりました
投稿者---トト(2003/11/13 11:59:31)


返信遅れてすいません。
すごく助かりました。ありがとうございます

No.10508

またまたお願いします。
投稿者---たく(2003/11/15 11:58:40)


malloc() は main() の中で2回、vectorSum() の中で1回呼ぶことになる。といわれたので、たかさんのやり型とは違うみたいなんです。自分で也l津単ですけど下のみたいになってしまいます。何が違いますか?


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

typedef union {
int number;
double element;
} Vector;

int raedNumberofElements(int, char *[]);
Vector vectorSum(const Vector *, const Vector *);

int main(int argc, char *argv[])
{
Vector *vectorA, *vectorB, *vectorC, *p_element;
int n, i;

n = raedNumberofElements(argc, argv);
if (n <= 0)
{
return -1;
}
vectorA->number = vectorB->number = n;

(vectorA = (Vector *)malloc((n + 1) * sizeof(Vector)));
(vectorB = (Vector *)malloc((n + 1) * sizeof(Vector)));

if(vectorA==NULL||vectorB==NULL)
{
printf("メモリの確保に失敗。\n");
return 0;
}

p_element = vectorA + 1;
printf("ベクトルaの各要素を入力して下さい\n");
for (i = 1; i <= n; i++){
printf("ベクトルaの%d番目の要素: ", i);
scanf("%lf", &p_element->element);
p_element++;
}
printf("\n");
p_element = vectorB + 1;
printf("ベクトルbの各要素を入力して下さい\n");
for (i = 1; i <= n; i++){
printf("ベクトルbの%d番目の要素: ", i);
scanf("%lf", &p_element->element);
p_element++;
}
printf("\n");

vectorC = vectorSum(vectorA, vectorB);

p_element = vectorC + 1;
printf("ベクトルの和を出力します\n");
for (i = 1; i <= n; i++){
printf("和の%d番目の要素: ", i);
printf("%10f\n", p_element->element);
p_element++;
}

free(vectorA); vectorA = NULL;
free(vectorB); vectorB = NULL;
free(vectorC); vectorC = NULL;
return 0;
}

int raedNumberofElements(int argc, char *argv[])
{
int n;

if (argc <= 1) {
printf("引数がありません\n");
return -1;
} else if (argc >= 3) {
printf("引数が多すぎます。\n");
return -1;
} else {
n = atoi(argv[1]);

if (n <= 0) {
printf("1以上の整数を指定して下さい\n");
return -1;
}
return n;
}
}

Vector vectorSum(const Vector *vectorA, const Vector *vectorB)
{
Vector *vectorC;
int x,n = vectorC->number = vectorA->number;

x = 1;
vectorC = (Vector *)malloc((vectorA->number + 1) * sizeof(Vector));
if(vectorC == NULL) {
printf ("メモリの確保に失敗\n");
return 0;
}
do
{
vectorC->element = vectorA->element + vectorB->element;
x++;
}
while(x < n);
return vectorC;
}


</pre>

No.10512

Re:またまたお願いします。
投稿者---ceybord(2003/11/15 14:32:57)


mallocを使うときは気をつけてください。
サブルーチン(main関数以外の関数)でmallocを使って、
mallocのエラーが出たときの処理が間違っています。
return 0;ではプログラムが終了しません。場合によっては大変なことになります。
stdlib.hのexit関数を使って終了させてください。(この場合のexitの引数は1にするのが普通です。)

No.10516

Re:またまたお願いします。
投稿者---YuO(2003/11/15 15:58:28)


> malloc() は main() の中で2回、vectorSum() の中で1回呼ぶことになる。
> といわれたので、たかさんのやり型とは違うみたいなんです。自分で也l津単ですけど下のみたいになってしまいます。
> 何が違いますか?

vectorSumの戻り値はVector *でないといけません。
コンパイル時にエラー(or警告)が出ませんでしたか?

そして,mainからvectorSumを呼び出した後,戻り値(=vectorC)が空ポインタでないか調べる必要があります。

#個人的にはこのようなunionの使い方は好ましくないと思う……。


No.10639

またまたお願いします。
投稿者---SAI(2003/11/18 14:18:56)


ありがとうございます。