• ベストアンサー

配列へのキーボード入力

次のような問題がわからなくて困っています。 まず、キーボード入力により配列の大きさを決め、 その後、先ほど入力した個数のデータをキ-ボードから入力するというものです。 これだけならわかるのですが、条件があって、入力は次のようにするとあります。 2 3 ←配列の大きさ(2行3列) 1 2 3 ←配列に入れるデータ 1行目 4 5 6 ←配列に入れるデータ 2行目 Cプログラミングを始めて間もない初心者です。どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

領域の動的確保のやり方と、それを二次元配列に適用するあたりが分からない んですよね? 大きさが決っていない配列を扱うには malloc() を使います。 また、二次元配列を扱うときには、一次元の配列の配列を順次獲得する 必要があることに注意が必要です。 多分、実物を見た方が分かりが早いんじゃないかなと思います。 #include <stdio.h> #include <stdlib.h> int main(void) {   int** ar; /* 行列 */   int row;  /* 行数 */   int col;  /* 列数 */   int i, j;   /* 行列の入力 */   scanf("%d %d", &row, &col);   ar = malloc(row * sizeof(int*));   for (i = 0 ; i < row ; ++i)   {     ar[i] = malloc(col * sizeof(int));     for (j = 0 ; j < col ; ++j)     {       scanf("%d", &ar[i][j]);     }   }   /* 行列の確認 */   printf("\n");   for (i = 0 ; i < row ; ++i)   {     for (j = 0 ; j < col ; ++j)     {       printf("%d ", ar[i][j]);     }     printf("\n");   }   /* 確保した領域を開放 */   for (i = 0 ; i < row ; ++i)   {     free(ar[i]);   }   free(ar);   return 0; } この実物では、動作上、必須ではないのですが、malloc() で確保した領域を free() で開放しています。開放は確保した順と逆に行うことに注意して。 分からないところがあれば、補足して下さい。

thsame
質問者

お礼

回答ありがとうございます。ソースまで書いていただいたおかげで、何とか理解できました。実は領域の動的確保よりももっと初歩的なところでつまずいていたのですが、それも解決しました。重ねて御礼申し上げます。

その他の回答 (1)

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.1

領域の動的確保と、ポインタ操作ができれば、問題なく解けます。 条件の例でいっているのは、キーボードで2,3,1,2,3,4,5,6と数字キーを押すと、 最初の2個が行と列のサイズ(配列領域として[2][3]分を動的に確保)を指定し、 3個目が1行1列目(配列表現だと[0][0]に位置する箇所)、 4個目が1行2列目(配列表現だと[0][1]に位置する箇所)、 5個目が1行3列目(配列表現だと[0][2]に位置する箇所)、 6個目が2行1列目(配列表現だと[1][0]に位置する箇所)、 7個目が2行2列目(配列表現だと[1][1]に位置する箇所)、 8個目が2行3列目(配列表現だと[1][2]に位置する箇所) に入る(入れる)様にするということです。

thsame
質問者

お礼

回答ありがとうございます。質問の言葉が足りなくて申し訳ありません、わからないところはキーボード入力により、1行目の数値、1 2 3を一度に取り込むというところです。領域の動的確保はだいたい解ると思います。

関連するQ&A

  • キーボードからの入力

    キーボードの1を使い、1を押した回数を配列に入れるというCプログラムを考えています。 例えば、キーボードから1を5回押せば配列[0]に数字の5を、次に1を10回押せば配列[1]に10を、30回押せば30を・・・と言う形です。 押した回数をどう配列に入れればいいのか私には思いつきません。 思いついた方法と言えば、入力した数字を10で割るという方法です。 例えば、1を5回押せばその値は11111ですから、それを10で割り、割った回数に1を足せば配列に5を入れられます。(めんどくさいやり方かもしれませんが。。。) しかしその方法だと、キーボードから入力した値が10桁を越えると長整数の範囲を超えオーバーフローを起こしてしまいます。 どなたか良い方法をご存知であればよろしくお願いします。

  • キーボードの配列がおかしくなりました。。。

    はじめまして。 パソコン初心者です。 接続が途切れてしまうのであれこれいじってるうちに なにかキーボード設定を触ってしまったのか @を押すと「になり、むを押すと¥が出てきます。 文字入力と数字入力は問題なくできるのですが、 記号だけはチグハグに入力されてしまいます。 キーボードが壊れたと思い、 本日安いキーボードを買ってきたのですが同じでした。 あと、左上の半角・漢字などを切り替えるところを押すと ‘が出てきます。 使っているのはWindowsXPです。 何か配列を正しく設定しなおす方法などありましたらお願いします。

  • 配列の要素の入り方

    こんばんは。 現在C言語のプログラミングを勉強しています。 まだまだ初心者で基礎も十分には理解できていないので、とても基本なのかもしれませんが質問させていただきます… 例えば以下のような、配列に文字を入力するだけのプログラムを作ったとします。 --------------------------------- #include<stdio.h> main(){  int data[10];  printf("input - ");  fgets(data,10,stdin); } --------------------------------- これを実行し、 input - abc のように「abc」と入力すると、配列にはどのように入るのですか?  data[0]=a, data[1]=b, data[2]=c となるまではわかるのですが、data[3]からdata[9]には何が入るのでしょうか。配列のクリアはしていない状態です。 改行とnullが入る、というように聞いたのですが、これらはどのような順(?)で配列に入っているのかがわかりません。 よろしくお願いします。

  • 配列の並び替え

    下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。   A B C D E←列      1  1 2 3 4 5←配列番号 2  4 9 8 6 2 3  1 5 7 10 3      ↑ 行    ↓     A B C D E 1  5 4 3 2 1 2  2 6 8 9 4 3  3 10 7 5 1

  • Excel2003、配列から、複数の条件一致する行のデータを取り出す方

    Excel2003、配列から、複数の条件一致する行のデータを取り出す方法 配列は最大で10行、10列程度ですが、このデータはリアルタイム(0.5秒間隔)で更新されますので、 分類等はできません。 A列のデータがZ1のセルのデータと一致し、かつ、B列は、特定の”文字列”と一致し、かつ、C列は数量で、0より大きい(負のデータは無いが、""はあり得る)という条件に合致した行があったら、その行のD列の値をZ2のセルに格納したい。 条件に合致する行は複数あり得るが、そのときは最初に条件が合致した行のデータが必要。 いくつかの関数を調べましたが、つまづいています。

  • 2重配列の使い方について

    教えてください。 プログラミング初心者です。 PHPなどのプログラミングでよくSQLでデータベースから引っ張ってきたデータに対してよく見かけるのですが、2重配列に格納したりするのはどういう使い方なのでしょうか?where文で複数条件で問い合わせたものに対して紐づけたりする時に使ったりするのでしょうか? そもそも2重配列がイメージできていないです。データベースからのデータでなくても使用したりしてるかもしれませんが。宜しくお願いします。

    • ベストアンサー
    • PHP
  • VBAの一次元配列から二次元配列へ

    A列にa1~a100まで数字が入ってます。 それを、b1~b5,c1~c5,…省略 u1~u5までに、データを 5行ずつ移したいのです。 b1にはa1、b2にはa2の値を、u5にはa100の値を入れたいのです。 マクロの自動記録?を使うとできることはできるのですが…。 一次配列→二次配列で、出来ると聞いたことがあるのですが。 ※VBAは全くの初心者です。 コードに説明もつけてくださるとすごく助かります。 どうかよろしくお願いいたします。

  • 配列の座標指定について。

    たとえば、下のような10行10列の配列でdの3を指定したいときにどういう手段で行えばいいのでしょうか? 入力についてですがdと3の間にはスペースは空けません。 困っています。お願いいたします。 行がそろっていません。みにくいですがお許しください。 \\\a b c d e f g h i j  \\\\\\\\\\\\\\\\\\\\\\\\\\\ 0 \ 0 0 0 0 0 0 0 0 0 0 1 \ 0 0 0 0 0 0 0 0 0 0 2 \ 0 0 0 0 0 0 0 0 0 0 3 \ 0 0 0 0 0 0 0 0 0 0 4 \ 0 0 0 0 0 0 0 0 0 0 5 \ 0 0 0 0 0 0 0 0 0 0 6 \ 0 0 0 0 0 0 0 0 0 0 7 \ 0 0 0 0 0 0 0 0 0 0 8 \ 0 0 0 0 0 0 0 0 0 0 9 \ 0 0 0 0 0 0 0 0 0 0

  • 2次元配列について

    プログラミング初心者です。2次元配列のイメージがつかめません。教えてください。 例えばExcelの表があり、A列に名前のデータ、B列にその人の住所のデータがあったとします。プログラミングで1次配列の値だけ取得するような処理が書かれていた場合、名前のデータだけを取得しているのでしょうか?因みに$var[0]というように数字ではなく、何かを示す名前になっています。例えば$var[name0]や$var[name1]のようになっています。これが$var[name0][place0]や$var[name1][place0]みたいになっていたら住所のデータを取得するのでしょうか?

    • ベストアンサー
    • PHP
  • VBAでエクセルのいくつかの表を同じ配列に格納する

    VBA初心者です。 調べてみましたがどうにも情報に行きあたらなく、ご質問をさせていただきます。 添付のようなエクセル上の同一シート上にある3つの表をコピーし、VBAで同じ配列の各列として取り込みをしたいと考えております。 大分類、中分類、小分類のそれぞれの行は同じもののそれぞれの内容を記載しており、 できればこれらを同じ配列の1列目、2列目、3列目に格納をしたいと思っております。 これらの表が1つの表にまとまっていれば、 Dim 配列(1,10) as Variant 配列 =range("A1:C10") で事足りると思うのですが、別々のためこの方法がとれません。 セル指定で行うことも考えましたが、データが10万行を超える場合もあるため、できれば避けたいと思っています。 各表を指定し、配列の1列目、2列目、3列目に一括して代入をご存じでしたらら、どうぞ教えていただきたいと思います。 どうぞよろしくお願いします。

専門家に質問してみよう