• 締切済み

C言語をなるべく早く教えてください

C言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 入力した行列を表示させるプログラムを作成しなさい。ただし、行列は任意に指定できるものにし、表示のさせ方にも気を付けること。 実行結果例1 N×M行列数を入力してください N=3 M=2 3×2行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 2行1列を入力して下さい 3 2行2列を入力して下さい 4 3行1列を入力して下さい 5 3行2列を入力して下さい 6 入力した3×2行列は次のようなものです 1.00 2.00 3.00 4.00 5.00 6.00 <実行結果例2> N×M行列数を入力してください N=3 M=4 3×4行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 1行3列を入力して下さい 3 1行4列を入力して下さい 4.23 2行1列を入力して下さい 5.1224 2行2列を入力して下さい 92.12 2行3列を入力して下さい 2.12 2行4列を入力して下さい 36.54 3行1列を入力して下さい 2.213 3行2列を入力して下さい 9.56 3行3列を入力して下さい 8 3行4列を入力して下さい 5.23153 入力した3×4行列は次のようなものです 1.00 2.00 3.00 4.23 5.12 92.12 2.12 36.54 2.21 9.56 8.00 5.23

みんなの回答

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.2

最近scanfやpirntfは使わないからなぁ。 でも、フォーマット以外は間違いないと思うけど。 ついでにインクルードファイルぐらいは考えてね。 void main(void) { float d[2][3]:           /* 対象は浮動小数点 */ int n,m;              /* ループは整数 */ for (n = 0; n <3; n++) {      /* 最初の配列 */ for (m = 0; m < 2; m++) {     /* 次の配列 */ scanf("%f",d[n][m]);       /* 配列への入力 これが面倒くさい */ } } for (n = 0; n < 3; n++) {     /* ここから表示ルーチン */ for (m = 0; m < 2; m++) {     /* 次の配列 */ printf("%3.2f ", d[n][m]); /* 空白に注意して */ } printf('\n');           /* ここで改行 */ } }

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

// Matrix.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include <stdio.h> #include <stdlib.h> // 行数 static int RowCount; // 列数 static int ColCount; // 行列にデータを設定します static void SetMatrixData(double vector[], int r, int c, double data) { vector[r * ColCount + c] = data; } // 行列からデータを読み出します static double GetMatrixData(double vector[], int r, int c) { return vector[r * ColCount + c]; } int main(int argc, char* argv[]) { int i; printf("N×M行列数を入力してください\n"); printf("N="); scanf("%d", &RowCount); printf("M="); scanf("%d", &ColCount); printf("%d×%d行列数を入力してください\n", RowCount, ColCount); // 行列用のメモリを確保します // 行列自体はCでは2次元配列で表現できます。 // 本課題では、行数・列数とも可変でなければなりません // // 幾つか、実装案があります // A) 大きめの2次元配列を使う // 例えば100 x 100の2次元配列を確保しておき // 10 x 10 の場合は残りを無駄にする方法です // 101 x 100とかが指定されたらエラーとします // 単純で実装も易しいですが、勝手な上限を設けてよいのか // 疑問が残ります // // B) 動的に確保します // mallocで必要なメモリを動的に確保して使います // 基本的に1次元配列しか確保できないので // 2次元配列としては扱うのが、多少面倒です // メモリの許す範囲内で任意のサイズの行列を扱えます // // 今回は、多少複雑にはなりますが // より厳密に課題を解決できるBを採用します。 double* p = (double*)malloc(sizeof (double) * RowCount * ColCount); if (p == NULL) { printf("メモリ不足です"); return -1; } for (i = 0; i < RowCount; ++i) { int j; for (j = 0; j < ColCount; ++j) { double d; printf("%d行%d列を入力してください\n", i + 1, j + 1); scanf("%lf", &d); SetMatrixData(p, i, j, d); } } // 結果を表示します printf("入力した%d×%d行列は次のようなものです\n", RowCount, ColCount); for (i = 0; i < RowCount; ++i) { int j; for (j = 0; j < ColCount; ++j) { printf("%.2f ", GetMatrixData(p, i, j)); } printf("\n"); } // mallocで確保したメモリは必ずfreeしなければなりません free(p); return 0; }

関連するQ&A

  • 非常に困ってます

    C言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 入力した行列の掛け算を行うプログラムを作成しなさい。 ただし、行列数は任意に指定できるものにし、表示のさせ方にも気を付けること。 また、入力した行列の掛け算が行えない場合はエラーを返すようにしなさい。 実行結果例1 行列1:N×M行列数を入力してください N=2 M=2 行列2:O×P行列数を入力してください O=2 P=2 行列1:2×2行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 2行1列を入力して下さい 3 2行2列を入力して下さい 4 行列2:2×2行列を入力して下さい 1行1列を入力して下さい 5 1行2列を入力して下さい 6 2行1列を入力して下さい 7 2行2列を入力して下さい 8 入力した行列1(2×2行列)×行列2(2×2行列)の計算結果は次ようなものです 19.00 22.00 43.00 50.00 実行結果例2 行列1:N×M行列数を入力してください N=2 M=3 行列2:O×P行列数を入力してください O=3 P=4 行列1:2×3行列を入力して下さい 1行1列を入力して下さい 1.21 1行2列を入力して下さい 2.35 1行3列を入力して下さい 2.65 2行1列を入力して下さい 1.2356 2行2列を入力して下さい 5.952165 2行3列を入力して下さい 5.23 行列2:3×4行列を入力して下さい 1行1列を入力して下さい 5.9685 1行2列を入力して下さい 86.3251 1行3列を入力して下さい 2.14 1行4列を入力して下さい 1.415 2行1列を入力して下さい 2 2行2列を入力して下さい 3.1415 2行3列を入力して下さい 0.717 2行4列を入力して下さい 2.36 3行1列を入力して下さい 2 3行2列を入力して下さい 3 3行3列を入力して下さい 8.23 3行4列を入力して下さい 4.956 入力した行列1(2×3行列)×行列2(3×4行列)の計算結果は次ようなものです 17.22 119.79 26.08 20.39 29.74 141.05 49.95 41.72 実行結果例3 行列1:N×M行列数を入力してください N=3 M=2 行列2:O×P行列数を入力してください O=4 P=3 入力した行列の掛け算は出来ません

  • ほかの人が作ったのも見たいのでよろしくお願いします

    if,for,switch,while,do-while文、配列、バブルソートを用いて 入力した行列の掛け算を行うプログラムを作成せよ。 但し、行列数は任意に指定できるものにし、表示のさせ方にも気を付けること。 また、入力した行列の掛け算が行えない場合はエラーを返すようにすること。 <実行結果例1> 行列1:N×M行列数を入力してください N=2 M=2 行列2:O×P行列数を入力してください O=2 P=2 行列1:2×2行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 2行1列を入力して下さい 3 2行2列を入力して下さい 4 行列2:2×2行列を入力して下さい 1行1列を入力して下さい 5 1行2列を入力して下さい 6 2行1列を入力して下さい 7 2行2列を入力して下さい 8 入力した行列1(2×2行列)×行列2(2×2行列)の計算結果は次ようなものです 19.00 22.00 43.00 50.00 <実行結果例2> 行列1:N×M行列数を入力してください N=2 M=3 行列2:O×P行列数を入力してください O=3 P=4 行列1:2×3行列を入力して下さい 1行1列を入力して下さい 1.21 1行2列を入力して下さい 2.35 1行3列を入力して下さい 2.65 2行1列を入力して下さい 1.2356 2行2列を入力して下さい 5.952165 2行3列を入力して下さい 5.23 行列2:3×4行列を入力して下さい 1行1列を入力して下さい 5.9685 1行2列を入力して下さい 86.3251 1行3列を入力して下さい 2.14 1行4列を入力して下さい 1.415 2行1列を入力して下さい 2 2行2列を入力して下さい 3.1415 2行3列を入力して下さい 0.717 2行4列を入力して下さい 2.36 3行1列を入力して下さい 2 3行2列を入力して下さい 3 3行3列を入力して下さい 8.23 3行4列を入力して下さい 4.956 入力した行列1(2×3行列)×行列2(3×4行列)の計算結果は次ようなものです 17.22 119.79 26.08 20.39 29.74 141.05 49.95 41.72 <実行結果例3> 行列1:N×M行列数を入力してください N=3 M=2 行列2:O×P行列数を入力してください O=4 P=3 入力した行列の掛け算は出来ません

  • 行列をベクトルに(C言語)

    行列をベクトルに(C言語) m行n列の行列Aがあったとき、それをm×n行1列の行列(ベクトル)Bに するというプログラムを作りたいです。 これは、行列Aの1列目m行分の要素をそのまま行列Bの1行1列目に持っていき、 それを行列Aのn列の数だけ繰り返す、といった要領です(画像参照) つまり MATRIX B; B.m=A.m*A.n; B.n=1; return B; ということだと思うのですが、なかなかうまいくいきません。 また、構造体も使いたいので、 typedef struct { int m; int n; double *mat; } MATRIX; と宣言しました。 画像は説明のため、一応載せておきました。(例として4列の行列になっています) みなさんよろしくお願いします。

  • c言語

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c=\'m\'; while(c!=\'e\')//eでない限りwhileループを実行する { sum=sum+i; printf(\"\\n1 kara %d madewo tasuto %d desu.\\n\",i,sum); i++; printf(\"nanikakeywo oshitekudasai.owaru tokiha \'e\'\\n\"); c=getch(); } printf(\"loopwo nukemashita\\n\"); getch(); } while(c!=\'e\')をwhile(c>0)にして実行したい場合はcharをintにかえて、scanfを使わなければならないのはわかりますが、どこを変えればよいか分かりません。ちなみに、while(c>0)に変えた場合に、正の数を入力した後に、「次の数を入力してください」という文を表示してからくりかえす方法をおしえてください。

  • C言語のプログラミングについて

    私は大学2年なのですが、現在留年するかしないかというぎりぎりのところに立っています。好意で単位をなんとかしてくれる教授を探し出し、C言語の宿題を出されました。ですが私は根っからの文型で、プログラミングなどしたこともありません。教科書を図書館で借りて読んでみるものの、すぐ理解できるような難易度ではないことだけがわかりました。 そこでもしよろしければ、プログラムを教えてもらいたいです。 1.キーボードから整数の入力を繰り返す。0以下の値が入力されたら終了し、入力した値の中の最小値を表示する。また、それが何番目に入力された値かもあわせて表示する。(6つの整数を入力、最後の整数は0を入力することとする。) 実行結果例 整数を入力: 6 整数を入力: 5 整数を入力: 4 整数を入力: 3 整数を入力: 2 整数を入力: 1 整数を入力: 0 最小値は6番目の1 2.キーボードから整数の入力を4回繰り返し、それらの値を2次元配列Aの各要素に順に代入し、その行列のそれぞれの要素と行列式を表示するプログラムを作成せよ。 実行結果例 1行1列の要素? 6 1行2列の要素? 5 2行1列の要素? 4 2行2列の要素? 3 行列A = 6 5 4 3 行列式 = 2 3.キーボードから西暦年を入力し,その年が閏年のときは「○○年はうるう年です」と表示し,そうでないならば「○○年はうるう年ではありません」と表示するプログラムを作成しなさい. なお,閏年の定義は以下の通りである. ・西暦年が4で割り切れる年は閏年 ・ただし,西暦年が100で割り切れる年は平年 ・ただし,西暦年が400で割り切れる年は閏年 実行結果例 西暦年を入力してください. 1987 1987 年はXXXXXXXX 一時的ではありますが、皆様のお力をお借りしたいです。 もちろん、ここでお答えをもらってもわからないままにせずに、無事進級することができたら独学で勉強しようとは思ってます。 なお、理系の人たちはVisualBasicというソフトを使っているようです。よろしくお願い致します。

  • C言語の問題が解けません

    C言語の問題ができなくて困っています。 これが問題文です。 与えられた表の縦・横の値の平均/合計をそれぞれの行・列ごとに求め出力するプログラムを作成しなさい。ただし、縦・横のデータ数は10個未満とし、それぞれの数字は整数とする。また、出力は右詰め6桁で出力することとし、平均における小数点以下は1桁まで表示する。平均行/列および合計行/列がぶつかる個所は、表全体の平均と合計を計算した結果を表示する。 補足として入力された行列数が10未満であることは、プログラム内でチェックすること。 例:20,3→再入力となる(行が9未満でない)  :2,-5→再入力となる(行が負の値) 実行結果例はこんな感じらしいです。 行数(最大9),列数(最大9)をカンマ区切りで入力(行,列):4,4 データをカンマ区切りで行ごとに入力[4行 4列] 52,96,15,20 86,22,35,45 45,78,54,36 16,86,74,55  52 96 15 20 45.8 183  86 22 35 45 47.0 188  45 78 54 36 53.3 213  16 86 74 55 57.8 231 49.8  70.5 44.5 39.0 50.9 - 199 282 178 156 - 815 自分はここまで自力でやったのですがここからが試行錯誤してもできません。このあとどのようにプログラムを書いていけばいいのですか? よろしくお願いします。 #include <stdio.h> int main(){ int gyou,retu,Loop1=0,Loop2=0; int kazu[8][8]; printf("行数(最大9行)、列数(最大9列)をカンマで区切って入力 (行,列):"); scanf("%d,%d",&gyou,&retu); if((gyou<=9)&&(retu<=9)){ printf("データをカンマ区切りで行ごとに入力 [%d行,%d列]\n",gyou,retu); for(Loop2=0;Loop2<gyou;Loop2++){ for(Loop1=0;Loop1<retu;Loop1++){ scanf("%d\n",&kazu[gyou--][retu--]);

  • C言語です。

    C言語です。 2次元配列を用いて、2つの2行3列の行列 A=[ 1 2 3 4 5 6 ] B=[ 6 3 4 5 1 2 ] の和を表示するプログラムを教えてください。 コンパイル結果 7 5 7 9 6 8

  • C言語について  

    わからないのでよろしくお願いします。何回やってもうまく表示できません。 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ▼10が入力された場合の実行例 ********** #include<stdio.h> int main(void) { int n, kai; scanf("%d",&n); printf("\n nyuryoku=%d",n); while(0<kai){ kai=kai--; printf("*"); } kai=n; printf("\n"); }

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • C言語についていくつか至急教えてください。

    3つほどお聞きしたいことがあります。 1つ目は閏年についてです。 2つの年をmain関数内で入力し、その西暦を引数とする関数CheckYearを使い、結果を出すのですが、条件としては1.西暦年が4で割り切れる閏年。 2.1つ目を満たしていても西暦年が100で割り切れるときは閏年ではない。 3.2つ目を満たしていても西暦年が400で割り切れるならば閏年である。 実行結果として、西暦を入力:2000 西暦を入力:2009  2000年 2004年 2008年 閏年は3回あります。 とあるようにならなければなりません。 2個目は、10進数の値(dec)を読み込み4ケタの2進数に変換するものです。 なお、結果表示にはprintf("(10進数)%d%d%d%d\n",dec,d3,d2,d1,d0);を使います。 実行結果としては、7と入力する場合→(10進数)7=(2進数)0111 となります。 3個目は、棒グラフを表示するものです。 要素5個持っている配列dataに10以下の値を入力する。 関数はputbox(void型)を使用しputboxは1行当たり10個の□や■を表示。 引数の値だけ、□を表示し残りは、■を表示する。 配列の要素の値も表示のこと。 実行結果としては、10,9,8,4,0を入力する場合 1:10 2:9 3:8 4:4 5:0 10 □□□□□□□□□□  9□□□□□□□□□■  8□□□□□□□□■■  4□□□□■■■■■■  0■■■■■■■■■■ となるようにします。 身勝手で尚且つ分かりにくい文章で申し訳ありません。 どうかよろしくお願いいたします。

専門家に質問してみよう