• 締切済み

C言語のプログラムで配列について教えてください

配列の要素の数をscanf文で入力するためにはどうしたらいいのでしょうか。 x[N]のNの部分です。

  • raie
  • お礼率0% (0/3)

みんなの回答

  • y_oku
  • ベストアンサー率62% (25/40)
回答No.3

扱うのが、例えばintの配列ならば、 ------------------------------------------------------- #include<stdio.h> /* printf,scanfとか */ #include<stdlib.h> /* mallocとか */ int main(void){ int i, nb; int *arr=NULL; /* 配列の数入力とか */ printf("nb? >"); scanf("%d", &nb); printf("nb=%d\n", nb); /* メモリ割り当て */ arr = malloc(nb * sizeof(int)); if(!arr){ fprintf(stderr, "can't allocate.\n"); exit(1); } /* 配列の要素入力とか */ for(i=0; i<nb; i++){ printf("arr[%d]? >", i); scanf("%d", &arr[i]); } /* 結果表示 */ for(i=0; i<nb; i++){ printf("arr[%d]=%d\n", i, arr[i]); } } ------------------------------------------------------- みたいにしてやればよいと思いますが、 ただし、scanfの入力に対してエラーチェックを厳重にしないと ひどいことになると思います~。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

C言語上でこのような場合には、配列は使わず 「ポインタ」なるものを使用します。 但し、「ポインタ」の要素数、値などは、 プログラム内部で厳密に管理する必要があります。 「ポインタ」に関しては皆が引っかかる箇所なので しっかり勉強してください。 余談ですが、C++言語では可能です。

回答No.1

C言語では、配列変数の大きさはコンパイル前に決定しておく必要 があります。ですから、配列変数の大きさを実行時に与えることは できません。 しかし、malloc() や calloc() 等で、必要な大きさのメモリを実 行時に確保し、ポインタ変数にその先頭アドレスを与えてやれば、 配列と同じように参照することができます。

関連するQ&A

  • c言語配列拡張

    c言語配列拡張 20個の要素からなる実数配列 x[ ] から、小さい添え字からn個の要素までの 最大値を取り出すプログラムを作成する。計算する要素の数nはキーボード から入力するか乱数で決定するかは乱数により得る。 a. 乱数が奇数の場合はキーボードから入力する。 b.乱数が偶数の場合この乱数の数を用いる。 誰が知ったら教えてください!

  • C言語です。

    C言語について…配列を使うときにa[]を使いますが、例えば要素数を10個とすればa[10]ですよね? ではa[n]としてprintf("n=");scanf("%d",&n);でその度に要素数を変えることはできないのですか?エラーが出てきてしまいます。

  • 配列に関数るCプログラムの問題

    次の問題の解答をお願いします。 配列tree の各要素を表示するプログラムを作成せよ。配列の各要素は0 から999 の整数である。配列で表示に使用する要素の数Nはキーボードで入力す ること。result(出力例) より下の表示を処理する部分は、関数としてモジュール化し、自 分自身を再帰的に呼び出すよう実装すること。 出力例: N を入力して下さい。 15 tree[15]: 8, 9, 5, 11, 7, 6, 12, 15, 20, 3, 1, 4, 14, 17, 18 result: (ただ "___"の部分はスペースです) __________________15 ____________11 __________________20 ________9 __________________3 _____________7 __________________1 8 __________________4 _____________6 __________________14 ________5 __________________17 _____________12 ___________________18

  • C言語、配列の積

    整数型二次元配列x,yに適当な値をキーボードから入力し、次にそれらの行列の積を計算して二次元配列zに代入し、行列x,y,zの要素を出力せよ。但し、配列の大きさは最初にキーボードから入力しておき、変数宣言においては、配列の大きさを大きめに宣言しておき、キーボードから入力する配列の大きさはその範囲内で入力するようにせよ。 という問題です。よろしくお願いいたします

  • C言語

    C言語 10進数n(0<n<256)を2進に変換させろ 配列を使うな do-whileでnを入力させることはできましたが、そこから先がわかりません。 for文を使えと言われたのですが……

  • C言語プログラム

    こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

  • C言語のプログラムについて。

    C言語のプログラミングについて質問です。 入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが下のように書いたのですが、うまく作動しません。どこがいけないのでしょうか...?教えていただきたいです。 #include <stdio.h> void reverse(int *data[], int n); #define MAX 100 int main() { int data[MAX]; int n, i; scanf("%d", &n); if (n >= MAX) n = MAX; for (i = 0; i < n; i ++){ scanf("%d", &data[i]); } reverse(data, n); for (i = 0; i < n; i ++) { printf("%d\n", data[i]); } return 0; } void reverse(int *data[], int n) { int c, i; for (i = 0; i < n; i ++) { c = *data[i]; *data[i] = *data[n - (i + 1)]; *data[n - (i + 1)] = c; } }

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

  • C++言語の配列の呼び方,動的・可変長の違い

    C++言語での配列の名称についての質問です. int Array[10]; みたいに宣言する普通の配列は「静的配列」と呼びますよね.コンパイル時に定数で要素数を指定しておかなければならないからですよね. これに対して,new[]演算子を用いて int *Array = new int[n]; といったように確保する配列はなんと呼ばれるのでしょうか. 実行後に変数を用いてその要素数を動的に指定できるので,「動的配列」と呼ぶ人が周りには多いです(「ポインタ配列」とも).しかし,C言語でのrealloc関数みたいに,直接に配列長を変化させるといったようなことはできませんよね. (改めてnew[]してmemcpy()すれば出来るのでしょうが) そこで,配列長をプログラム中で自在に変化させる方法としてstd::vectorを利用する方法がありますよね.このvectorを「動的配列」と呼ぶ人もいました. 私は,new[]したものは動的に要素数を指定できるがその後の配列長は固定であり,vectorはいつでも配列長が可変なので int Array[10]; ・・・静的固定長配列(静的配列) int n = 10; int *Array = new[n]; ・・・動的固定長配列 std::vector<int> v; ・・・可変長配列 と呼んでいるのですが,一般的にはそれぞれどのように呼ばれるのでしょうか. また,最近はstd::arrayをいうものを知りました.これについてもどのように呼ばれるのか,教えてください. よろしくお願いいたします.

  • 【c言語】配列について

    現在c言語で下記のようなものを作成したのですが、 最大残金月(maxrestn)を最大12ヶ月分表示させるための方法がどうしても思いつきません。 配列を使って表示させるためにはどうしたらよろしいでしょうか?  13月以上になるのは承知の上なのでスルーでお願いします。 #include <stdio.h> main(){ int m,n,N,income[13],rent=50000,food[13],light[13],outgo[13], rest[13],totalrest=0,maxrest=-100000,maxrestn; printf("何月から始めますか?"); scanf("%d",&m); printf("何ヶ月分のデータを入力しますか?"); scanf("%d",&N); printf("\n\n"); for(n=m; n<N+m; n++){ printf("%d月の収入は?",n); scanf("%d",&income[n]); printf("食費は?"); scanf("%d",&food[n]); printf("光熱費は?"); scanf("%d",&light[n]); outgo[n]=rent+food[n]+light[n]; printf("収入は%d円 支出合計は%d円\n",income[n],outgo[n]); if(income[n]>outgo[n]) printf("%d月は黒字でした\n",n); else if(income[n]==outgo[n]) printf("%d月は収支ちょうどでした\n",n); else printf("%d月は赤字でした\n",n); rest[n]=income[n]-outgo[n]; printf("残金は%d円で\n",rest[n]); totalrest=totalrest+rest[n]; printf("全残金は%d円です\n\n",totalrest); if(rest[n]>=maxrest){ maxrest=rest[n]; maxrestn=n; } } printf("最も残金の多かった月は%d月で、その金額は%d円です",maxrestn,maxrest); return 0; }

専門家に質問してみよう